Add cuda matrix function1d function compare set
This commit is contained in:
@@ -6,9 +6,12 @@
|
||||
#include <thrust/device_vector.h>
|
||||
#include <thrust/transform.h>
|
||||
#include <thrust/iterator/constant_iterator.h>
|
||||
#include <thrust/iterator/counting_iterator.h>
|
||||
#include <thrust/complex.h>
|
||||
#include <cuda_runtime.h>
|
||||
|
||||
using namespace Aurora;
|
||||
using namespace thrust::placeholders;
|
||||
|
||||
namespace
|
||||
{
|
||||
@@ -247,7 +250,7 @@ CudaMatrix Aurora::abs(const CudaMatrix& aMatrix)
|
||||
float* data = nullptr;
|
||||
cudaMalloc((void**)&data, sizeof(float) * size);
|
||||
int blocksPerGrid = (size + THREADS_PER_BLOCK - 1) / THREADS_PER_BLOCK;
|
||||
absKernel<<<blocksPerGrid, THREADS_PER_BLOCK>>>(aMatrix.getData(), data, size, aMatrix.isComplex());
|
||||
absKernel<<<blocksPerGrid,THREADS_PER_BLOCK >>>(aMatrix.getData(), data, size, aMatrix.isComplex());
|
||||
cudaDeviceSynchronize();
|
||||
return Aurora::CudaMatrix::fromRawData(data, aMatrix.getDimSize(0), aMatrix.getDimSize(1), aMatrix.getDimSize(2));
|
||||
}
|
||||
@@ -313,6 +316,268 @@ CudaMatrix Aurora::sign(const CudaMatrix&& aMatrix)
|
||||
return Aurora::CudaMatrix::fromRawData(data, aMatrix.getDimSize(0), aMatrix.getDimSize(1), aMatrix.getDimSize(2), aMatrix.getValueType());
|
||||
}
|
||||
|
||||
|
||||
void Aurora::compareSet(CudaMatrix& aValueMatrix,float compareValue, float newValue,CompareOp op)
|
||||
{
|
||||
switch (op)
|
||||
{
|
||||
case GT:
|
||||
{
|
||||
auto lambda = [=] __host__ __device__ (const float& x){
|
||||
return x>compareValue?newValue:x;
|
||||
};
|
||||
thrust::transform(thrust::device,aValueMatrix.getData(),aValueMatrix.getData()+aValueMatrix.getDataSize(),aValueMatrix.getData(),lambda);
|
||||
break;
|
||||
}
|
||||
case NG:{
|
||||
auto lambda = [=] __host__ __device__ (const float& x){
|
||||
return x<=compareValue?newValue:x;
|
||||
};
|
||||
thrust::transform(thrust::device,aValueMatrix.getData(),aValueMatrix.getData()+aValueMatrix.getDataSize(),aValueMatrix.getData(),lambda);
|
||||
break;
|
||||
}
|
||||
case EQ:{
|
||||
auto lambda = [=] __host__ __device__ (const float& x){
|
||||
return x==compareValue?newValue:x;
|
||||
};
|
||||
thrust::transform(thrust::device,aValueMatrix.getData(),aValueMatrix.getData()+aValueMatrix.getDataSize(),aValueMatrix.getData(),lambda);
|
||||
break;
|
||||
}
|
||||
case NE:{
|
||||
auto lambda = [=] __host__ __device__ (const float& x){
|
||||
return x!=compareValue?newValue:x;
|
||||
};
|
||||
thrust::transform(thrust::device,aValueMatrix.getData(),aValueMatrix.getData()+aValueMatrix.getDataSize(),aValueMatrix.getData(),lambda);
|
||||
break;
|
||||
}
|
||||
case NL:{
|
||||
auto lambda = [=] __host__ __device__ (const float& x){
|
||||
return x>=compareValue?newValue:x;
|
||||
};
|
||||
thrust::transform(thrust::device,aValueMatrix.getData(),aValueMatrix.getData()+aValueMatrix.getDataSize(),aValueMatrix.getData(),lambda);
|
||||
break;
|
||||
}
|
||||
case LT:{
|
||||
auto lambda = [=] __host__ __device__ (const float& x){
|
||||
return x<compareValue?newValue:x;
|
||||
};
|
||||
thrust::transform(thrust::device,aValueMatrix.getData(),aValueMatrix.getData()+aValueMatrix.getDataSize(),aValueMatrix.getData(),lambda);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void Aurora::compareSet(CudaMatrix& aValueMatrix,CudaMatrix& aCompareMatrix,float compareValue, float newValue,CompareOp op){
|
||||
switch (op)
|
||||
{
|
||||
case GT:
|
||||
{
|
||||
auto lambda = [=] __host__ __device__ (const float& x, const float& y){
|
||||
return x>compareValue?newValue:y;
|
||||
};
|
||||
thrust::transform(thrust::device,aCompareMatrix.getData(),
|
||||
aCompareMatrix.getData()+aValueMatrix.getDataSize(),
|
||||
aValueMatrix.getData(), aValueMatrix.getData(),
|
||||
lambda);
|
||||
break;
|
||||
}
|
||||
case NG:{
|
||||
auto lambda = [=] __host__ __device__ (const float& x, const float& y){
|
||||
return x<=compareValue?newValue:y;
|
||||
};
|
||||
thrust::transform(thrust::device,aCompareMatrix.getData(),
|
||||
aCompareMatrix.getData()+aValueMatrix.getDataSize(),
|
||||
aValueMatrix.getData(), aValueMatrix.getData(),
|
||||
lambda);
|
||||
break;
|
||||
}
|
||||
case EQ:{
|
||||
auto lambda = [=] __host__ __device__ (const float& x, const float& y){
|
||||
return x==compareValue?newValue:y;
|
||||
};
|
||||
thrust::transform(thrust::device,aCompareMatrix.getData(),
|
||||
aCompareMatrix.getData()+aValueMatrix.getDataSize(),
|
||||
aValueMatrix.getData(), aValueMatrix.getData(),
|
||||
lambda);
|
||||
break;
|
||||
}
|
||||
case NE:{
|
||||
auto lambda = [=] __host__ __device__ (const float& x, const float& y){
|
||||
return x!=compareValue?newValue:y;
|
||||
};
|
||||
thrust::transform(thrust::device,aCompareMatrix.getData(),
|
||||
aCompareMatrix.getData()+aValueMatrix.getDataSize(),
|
||||
aValueMatrix.getData(), aValueMatrix.getData(),
|
||||
lambda);
|
||||
break;
|
||||
}
|
||||
case NL:{
|
||||
auto lambda = [=] __host__ __device__ (const float& x, const float& y){
|
||||
return x>=compareValue?newValue:y;
|
||||
};
|
||||
thrust::transform(thrust::device,aCompareMatrix.getData(),
|
||||
aCompareMatrix.getData()+aValueMatrix.getDataSize(),
|
||||
aValueMatrix.getData(), aValueMatrix.getData(),
|
||||
lambda);
|
||||
break;
|
||||
}
|
||||
case LT:{
|
||||
auto lambda = [=] __host__ __device__ (const float& x, const float& y){
|
||||
return x<compareValue?newValue:y;
|
||||
};
|
||||
thrust::transform(thrust::device,aCompareMatrix.getData(),
|
||||
aCompareMatrix.getData()+aValueMatrix.getDataSize(),
|
||||
aValueMatrix.getData(), aValueMatrix.getData(),
|
||||
lambda);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void Aurora::compareSet(CudaMatrix& aDesAndCompareMatrix,CudaMatrix& aOtherCompareMatrix, float newValue,CompareOp op){
|
||||
switch (op)
|
||||
{
|
||||
case GT:
|
||||
{
|
||||
auto lambda = [=] __host__ __device__ (const float& x, const float& y){
|
||||
return x>y?newValue:x;
|
||||
};
|
||||
thrust::transform(thrust::device,aDesAndCompareMatrix.getData(),
|
||||
aDesAndCompareMatrix.getData()+aDesAndCompareMatrix.getDataSize(),
|
||||
aOtherCompareMatrix.getData(), aDesAndCompareMatrix.getData(),
|
||||
lambda);
|
||||
break;
|
||||
}
|
||||
case NG:{
|
||||
auto lambda = [=] __host__ __device__ (const float& x, const float& y){
|
||||
return x<=y?newValue:x;
|
||||
};
|
||||
thrust::transform(thrust::device,aDesAndCompareMatrix.getData(),
|
||||
aDesAndCompareMatrix.getData()+aDesAndCompareMatrix.getDataSize(),
|
||||
aOtherCompareMatrix.getData(), aDesAndCompareMatrix.getData(),
|
||||
lambda);
|
||||
break;
|
||||
}
|
||||
case EQ:{
|
||||
auto lambda = [=] __host__ __device__ (const float& x, const float& y){
|
||||
return x==y?newValue:x;
|
||||
};
|
||||
thrust::transform(thrust::device,aDesAndCompareMatrix.getData(),
|
||||
aDesAndCompareMatrix.getData()+aDesAndCompareMatrix.getDataSize(),
|
||||
aOtherCompareMatrix.getData(), aDesAndCompareMatrix.getData(),
|
||||
lambda);
|
||||
break;
|
||||
}
|
||||
case NE:{
|
||||
auto lambda = [=] __host__ __device__ (const float& x, const float& y){
|
||||
return x!=y?newValue:x;
|
||||
};
|
||||
thrust::transform(thrust::device,aDesAndCompareMatrix.getData(),
|
||||
aDesAndCompareMatrix.getData()+aDesAndCompareMatrix.getDataSize(),
|
||||
aOtherCompareMatrix.getData(), aDesAndCompareMatrix.getData(),
|
||||
lambda);
|
||||
break;
|
||||
}
|
||||
case NL:{
|
||||
auto lambda = [=] __host__ __device__ (const float& x, const float& y){
|
||||
return x>=y?newValue:x;
|
||||
};
|
||||
thrust::transform(thrust::device,aDesAndCompareMatrix.getData(),
|
||||
aDesAndCompareMatrix.getData()+aDesAndCompareMatrix.getDataSize(),
|
||||
aOtherCompareMatrix.getData(), aDesAndCompareMatrix.getData(),
|
||||
lambda);
|
||||
break;
|
||||
}
|
||||
case LT:{
|
||||
auto lambda = [=] __host__ __device__ (const float& x, const float& y){
|
||||
return x<y?newValue:x;
|
||||
};
|
||||
thrust::transform(thrust::device,aDesAndCompareMatrix.getData(),
|
||||
aDesAndCompareMatrix.getData()+aDesAndCompareMatrix.getDataSize(),
|
||||
aOtherCompareMatrix.getData(), aDesAndCompareMatrix.getData(),
|
||||
lambda);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void Aurora::compareSet(CudaMatrix& aCompareMatrix,float compareValue, CudaMatrix& aNewValueMatrix,CompareOp op)
|
||||
{
|
||||
switch (op)
|
||||
{
|
||||
case GT:
|
||||
{
|
||||
auto lambda = [=] __host__ __device__ (const float& x, const float& y){
|
||||
return x>compareValue?y:x;
|
||||
};
|
||||
thrust::transform(thrust::device,aCompareMatrix.getData(),
|
||||
aCompareMatrix.getData()+aCompareMatrix.getDataSize(),
|
||||
aNewValueMatrix.getData(), aCompareMatrix.getData(),
|
||||
lambda);
|
||||
break;
|
||||
}
|
||||
case NG:{
|
||||
auto lambda = [=] __host__ __device__ (const float& x, const float& y){
|
||||
return x<=compareValue?y:x;
|
||||
};
|
||||
thrust::transform(thrust::device,aCompareMatrix.getData(),
|
||||
aCompareMatrix.getData()+aCompareMatrix.getDataSize(),
|
||||
aNewValueMatrix.getData(), aCompareMatrix.getData(),
|
||||
lambda);
|
||||
break;
|
||||
}
|
||||
case EQ:{
|
||||
auto lambda = [=] __host__ __device__ (const float& x, const float& y){
|
||||
return x==compareValue?y:x;
|
||||
};
|
||||
thrust::transform(thrust::device,aCompareMatrix.getData(),
|
||||
aCompareMatrix.getData()+aCompareMatrix.getDataSize(),
|
||||
aNewValueMatrix.getData(), aCompareMatrix.getData(),
|
||||
lambda);
|
||||
break;
|
||||
}
|
||||
case NE:{
|
||||
auto lambda = [=] __host__ __device__ (const float& x, const float& y){
|
||||
return x!=compareValue?y:x;
|
||||
};
|
||||
thrust::transform(thrust::device,aCompareMatrix.getData(),
|
||||
aCompareMatrix.getData()+aCompareMatrix.getDataSize(),
|
||||
aNewValueMatrix.getData(), aCompareMatrix.getData(),
|
||||
lambda);
|
||||
break;
|
||||
}
|
||||
case NL:{
|
||||
auto lambda = [=] __host__ __device__ (const float& x, const float& y){
|
||||
return x>=compareValue?y:x;
|
||||
};
|
||||
thrust::transform(thrust::device,aCompareMatrix.getData(),
|
||||
aCompareMatrix.getData()+aCompareMatrix.getDataSize(),
|
||||
aNewValueMatrix.getData(), aCompareMatrix.getData(),
|
||||
lambda);
|
||||
break;
|
||||
}
|
||||
case LT:{
|
||||
auto lambda = [=] __host__ __device__ (const float& x, const float& y){
|
||||
return x<compareValue?y:x;
|
||||
};
|
||||
thrust::transform(thrust::device,aCompareMatrix.getData(),
|
||||
aCompareMatrix.getData()+aCompareMatrix.getDataSize(),
|
||||
aNewValueMatrix.getData(), aCompareMatrix.getData(),
|
||||
lambda);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
__global__ void repMatKernel(float* aInputData, float* aOutput, unsigned int aInputSize, bool aIsComplex)
|
||||
{
|
||||
unsigned int idX = blockIdx.x * blockDim.x + threadIdx.x;
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#define AURORA_CUDA_FUNCTION1D_H
|
||||
|
||||
#include "CudaMatrix.h"
|
||||
#include "Function1D.h"
|
||||
|
||||
namespace Aurora
|
||||
{
|
||||
@@ -33,6 +34,8 @@ namespace Aurora
|
||||
CudaMatrix sqrt(const CudaMatrix&& aMatrix);
|
||||
|
||||
CudaMatrix abs(const CudaMatrix& aMatrix);
|
||||
CudaMatrix abs2(const CudaMatrix& aMatrix);
|
||||
|
||||
|
||||
CudaMatrix abs(const CudaMatrix&& aMatrix);
|
||||
|
||||
@@ -47,6 +50,16 @@ namespace Aurora
|
||||
CudaMatrix repmat3d(const CudaMatrix& aMatrix,int aRowTimes, int aColumnTimes, int aSliceTimes);
|
||||
|
||||
CudaMatrix log(const CudaMatrix& aMatrix, int aBaseNum = -1);
|
||||
|
||||
|
||||
|
||||
// ------compareSet----------------------------------------------------
|
||||
|
||||
|
||||
void compareSet(CudaMatrix& aValueMatrix,float compareValue, float newValue,CompareOp op);
|
||||
void compareSet(CudaMatrix& aValueMatrix,CudaMatrix& aCompareMatrix,float compareValue, float newValue,CompareOp op);
|
||||
void compareSet(CudaMatrix& aDesAndCompareMatrix,CudaMatrix& aOtherCompareMatrix, float newValue,CompareOp op);
|
||||
void compareSet(CudaMatrix& aCompareMatrix,float compareValue, CudaMatrix& aNewValueMatrix,CompareOp op);
|
||||
}
|
||||
|
||||
#endif //AURORA_CUDA_FUNCTION1D_H
|
||||
Reference in New Issue
Block a user