Add cuda auroraUnion and unittest.
This commit is contained in:
@@ -5,6 +5,7 @@
|
|||||||
#include "Matrix.h"
|
#include "Matrix.h"
|
||||||
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
#include <cstddef>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <thrust/device_vector.h>
|
#include <thrust/device_vector.h>
|
||||||
#include <thrust/transform.h>
|
#include <thrust/transform.h>
|
||||||
@@ -1232,3 +1233,23 @@ CudaMatrix Aurora::linspaceCuda(float aStart, float aEnd, int aNum)
|
|||||||
cudaDeviceSynchronize();
|
cudaDeviceSynchronize();
|
||||||
return Aurora::CudaMatrix::fromRawData(data,aNum);
|
return Aurora::CudaMatrix::fromRawData(data,aNum);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CudaMatrix Aurora::auroraUnion(const CudaMatrix& aMatrix1, const CudaMatrix& aMatrix2)
|
||||||
|
{
|
||||||
|
if(aMatrix1.isNull() || aMatrix2.isNull() || aMatrix1.isComplex() || aMatrix2.isComplex())
|
||||||
|
{
|
||||||
|
std::cerr<<"auroraUnion not support complex cudamatrix"<<std::endl;
|
||||||
|
return CudaMatrix();
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t size1= aMatrix1.getDataSize();
|
||||||
|
size_t size2= aMatrix2.getDataSize();
|
||||||
|
float* data = nullptr;
|
||||||
|
cudaMalloc((void**)&data, sizeof(float) * (size1 + size2));
|
||||||
|
cudaMemcpy(data, aMatrix1.getData(), sizeof(float) * size1, cudaMemcpyDeviceToDevice);
|
||||||
|
cudaMemcpy(data + size1, aMatrix2.getData(), sizeof(float) * size2, cudaMemcpyDeviceToDevice);
|
||||||
|
thrust::sort(thrust::device, data, data+size1+size2);
|
||||||
|
float* endPointer = thrust::unique(thrust::device, data, data+size1+size2);
|
||||||
|
|
||||||
|
return CudaMatrix::fromRawData(data, endPointer - data);
|
||||||
|
}
|
||||||
|
|||||||
@@ -73,6 +73,8 @@ namespace Aurora
|
|||||||
|
|
||||||
CudaMatrix linspaceCuda(float aStart, float aEnd, int aNum);
|
CudaMatrix linspaceCuda(float aStart, float aEnd, int aNum);
|
||||||
|
|
||||||
|
CudaMatrix auroraUnion(const CudaMatrix& aMatrix1, const CudaMatrix& aMatrix2);
|
||||||
|
|
||||||
// ------compareSet----------------------------------------------------
|
// ------compareSet----------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -950,3 +950,18 @@ TEST_F(Function1D_Cuda_Test, linspace) {
|
|||||||
EXPECT_FLOAT_AE(result1[i], result2[i]);
|
EXPECT_FLOAT_AE(result1[i], result2[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(Function1D_Cuda_Test, auroraUnion) {
|
||||||
|
float* data1 = new float[9]{3,3,2,2,2,1,4,4,7};
|
||||||
|
auto matrix1 = Aurora::Matrix::fromRawData(data1, 9,1,1);
|
||||||
|
float* data2 = new float[8]{6,6,7,7,8,1,2};
|
||||||
|
auto matrix2 = Aurora::Matrix::fromRawData(data2, 7,1,1);
|
||||||
|
|
||||||
|
auto result1 = Aurora::auroraUnion(matrix1, matrix2);
|
||||||
|
auto result2 = Aurora::auroraUnion(matrix1.toDeviceMatrix(), matrix2.toDeviceMatrix()).toHostMatrix();
|
||||||
|
EXPECT_FLOAT_AE(result1.getDataSize(), result2.getDataSize());
|
||||||
|
for(int i=0;i<result1.getDataSize();++i)
|
||||||
|
{
|
||||||
|
EXPECT_FLOAT_AE(result1[i], result2[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user