Add cuda reshape, xcorr and unittest.

This commit is contained in:
sunwen
2023-12-04 17:35:01 +08:00
parent 09d9e52eb0
commit 00a21a37ef
3 changed files with 96 additions and 1 deletions

View File

@@ -1382,3 +1382,54 @@ CudaMatrix Aurora::intersect(const CudaMatrix& aMatrix1, const CudaMatrix& aMatr
aIa = CudaMatrix::fromRawData(iaResult,size);
return result;
}
CudaMatrix Aurora::reshape(const CudaMatrix& aMatrix, int aRows, int aColumns, int aSlices)
{
if(aMatrix.isNull() || (aMatrix.getDataSize() != aRows * aColumns * aSlices))
{
std::cerr<<"reshape diffirent size with cudamatrix"<<std::endl;
return CudaMatrix();
}
return CudaMatrix::copyFromRawData(aMatrix.getData(),aRows,aColumns,aSlices);
}
__global__ void xcorrKernel(float* aInputData1, float* aInputData2,unsigned int aInputSize, float* aOutput, unsigned int aOutputSize)
{
unsigned int idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx < aOutputSize/2 + 1)
{
for(unsigned int i=0; i<=idx; ++i)
{
aOutput[idx] += aInputData1[i] * aInputData2[aInputSize - idx - 1 + i];
}
return;
}
if (idx < aOutputSize)
{
for(int i=0; i<idx-aOutputSize/2; ++i)
{
aOutput[aOutputSize - idx + aOutputSize/2] += aInputData1[aInputSize + i - idx + aOutputSize/2] * aInputData2[i];
}
return;
}
}
CudaMatrix Aurora::xcorr(const CudaMatrix& aMatrix1, const CudaMatrix& aMatrix2)
{
if (aMatrix1.isNull() || aMatrix2.isNull() || aMatrix1.getDataSize() != aMatrix2.getDataSize() || aMatrix1.isComplex() || aMatrix2.isComplex())
{
std::cerr<<"xcorr not surpport with diffirent input size or complex cudamatrix"<<std::endl;
return CudaMatrix();
}
size_t size = aMatrix1.getDataSize() * 2 - 1;
float* data = nullptr;
cudaMalloc((void**)&data, sizeof(float) * size);
cudaMemset(data, 0.0, size);
int blocksPerGrid = (size + THREADS_PER_BLOCK - 1) / THREADS_PER_BLOCK;
xcorrKernel<<<blocksPerGrid, THREADS_PER_BLOCK>>>(aMatrix1.getData(), aMatrix2.getData(), aMatrix1.getDataSize(), data, size);
cudaDeviceSynchronize();
return CudaMatrix::fromRawData(data, size);
}

View File

@@ -77,7 +77,13 @@ namespace Aurora
CudaMatrix intersect(const CudaMatrix& aMatrix1, const CudaMatrix& aMatrix2);
CudaMatrix intersect(const CudaMatrix& aMatrix1, const CudaMatrix& aMatrix2, CudaMatrix& aIa); /**
CudaMatrix intersect(const CudaMatrix& aMatrix1, const CudaMatrix& aMatrix2, CudaMatrix& aIa);
CudaMatrix reshape(const CudaMatrix& aMatrix, int aRows, int aColumns, int aSlices);
CudaMatrix xcorr(const CudaMatrix& aMatrix1, const CudaMatrix& aMatrix2);
/**
* 将所有nan值设置为特定值
* @attention 直接在原数据上进行修改!
* @param aMatrix 向量