Add functions to 1D(nan, finite, padding, not)

This commit is contained in:
kradchen
2023-11-28 14:26:46 +08:00
parent 1716b139c4
commit 3438121b0c
4 changed files with 178 additions and 5 deletions

View File

@@ -326,6 +326,78 @@ CudaMatrix Aurora::sign(const CudaMatrix&& aMatrix)
return Aurora::CudaMatrix::fromRawData(data, aMatrix.getDimSize(0), aMatrix.getDimSize(1), aMatrix.getDimSize(2), aMatrix.getValueType());
}
void Aurora::nantoval(CudaMatrix& aMatrix,float val){
auto lambda = [=] __host__ __device__ (const float& x){
return ::isnan(x)?val:x;
};
thrust::transform(thrust::device,aMatrix.getData(),
aMatrix.getData()+aMatrix.getDataSize(),aMatrix.getData(),lambda);
}
CudaMatrix Aurora::isnan(const CudaMatrix& aMatrix){
size_t size = aMatrix.getDataSize() * aMatrix.getValueType();
float* data = nullptr;
cudaMalloc((void**)&data, sizeof(float) * size);
auto lambda = [=] __host__ __device__ (const float& x){
return ::isnan(x)?1.0:0;
};
thrust::transform(thrust::device,aMatrix.getData(),aMatrix.getData()+aMatrix.getDataSize(),
data,lambda);
return Aurora::CudaMatrix::fromRawData(data, aMatrix.getDimSize(0),
aMatrix.getDimSize(1), aMatrix.getDimSize(2), aMatrix.getValueType());
}
CudaMatrix Aurora::isfinite(const CudaMatrix& aMatrix){
size_t size = aMatrix.getDataSize() * aMatrix.getValueType();
float* data = nullptr;
cudaMalloc((void**)&data, sizeof(float) * size);
auto lambda = [=] __host__ __device__ (const float& x){
return ::isfinite(x)?1.0:0;
};
thrust::transform(thrust::device,aMatrix.getData(),aMatrix.getData()+aMatrix.getDataSize(),
data,lambda);
return Aurora::CudaMatrix::fromRawData(data, aMatrix.getDimSize(0),
aMatrix.getDimSize(1), aMatrix.getDimSize(2), aMatrix.getValueType());
}
void Aurora::padding(CudaMatrix& aMatrix, int aIndex, float aValue){
if(aMatrix.isNull() || !aMatrix.isVector() || aMatrix.isComplex())
{
std::cerr<<"padding only support real vector"<<std::endl;
return;
}
if (aMatrix.getDataSize()>aIndex){
aMatrix.setValue(aIndex, aValue);
return;
}
//长度不足需补齐
size_t size = (aIndex+1) ;
float* data = nullptr;
cudaMalloc((void**)&data, sizeof(float) * size);
cudaMemcpy(data, aMatrix.getData(), aMatrix.getDataSize(), cudaMemcpyDeviceToDevice);
thrust::fill_n(thrust::device, data+aMatrix.getDataSize(),size-aMatrix.getDataSize(),aValue);
aMatrix=CudaMatrix::fromRawData(data,size,1,1,aMatrix.getValueType());
}
CudaMatrix Aurora::auroraNot(const CudaMatrix& aMatrix){
return auroraNot(std::forward<CudaMatrix&&>(aMatrix.deepCopy()));
}
CudaMatrix Aurora::auroraNot(CudaMatrix&& aMatrix){
size_t size = aMatrix.getDataSize() * aMatrix.getValueType();
float* data = nullptr;
cudaMalloc((void**)&data, sizeof(float) * size);
auto lambda = [=] __host__ __device__ (const float& x){
return x<=0?1.0:0;
};
thrust::transform(thrust::device,aMatrix.getData(),aMatrix.getData()+aMatrix.getDataSize(),
data,lambda);
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)
{