Add transpose, horzcat, vertcat and Fix repmat threadPerBlock problem.

This commit is contained in:
sunwen
2023-11-30 10:22:06 +08:00
parent 87dd34095c
commit a8c65f21b1
3 changed files with 291 additions and 18 deletions

View File

@@ -280,6 +280,21 @@ TEST_F(Function1D_Cuda_Test, repmat)
}
}
TEST_F(Function1D_Cuda_Test, repmat3d)
{
Aurora::Matrix hostMatrix = Aurora::Matrix::fromRawData(new float[12]{1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9,10,11,12}, 2,3,2);
Aurora::CudaMatrix deviceMatrix = hostMatrix.toDeviceMatrix();
auto result1 = Aurora::repmat3d(hostMatrix,3,6,4);
auto result2 = Aurora::repmat3d(deviceMatrix,3,6,4).toHostMatrix();
EXPECT_EQ(result2.getDataSize(), result1.getDataSize());
EXPECT_EQ(result2.getValueType(), Aurora::Normal);
for(size_t i=0; i<result1.getDataSize(); ++i)
{
EXPECT_EQ(result1[i], result2[i]);
}
}
TEST_F(Function1D_Cuda_Test, log)
{
Aurora::Matrix hostMatrix = Aurora::Matrix::fromRawData(new float[8]{1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8}, 2,4);
@@ -800,3 +815,90 @@ TEST_F(Function1D_Cuda_Test, norm) {
result = Aurora::norm(deviceMatrix,Aurora::NormMethod::NormF);
EXPECT_FLOAT_AE(result,44.3847);
}
TEST_F(Function1D_Cuda_Test, transpose) {
float *data = new float[6]{1,2,3,4,5,6};
auto matrix = Aurora::Matrix::fromRawData(data, 3,2).toDeviceMatrix();
auto result = Aurora::transpose(matrix).toHostMatrix();
EXPECT_FLOAT_EQ(result.getData()[0],1);
EXPECT_FLOAT_EQ(result.getData()[1],4);
EXPECT_FLOAT_EQ(result.getData()[2],2);
EXPECT_FLOAT_EQ(result.getData()[3],5);
EXPECT_FLOAT_EQ(result.getData()[4],3);
EXPECT_FLOAT_EQ(result.getData()[5],6);
EXPECT_FLOAT_EQ(result.getDimSize(0),2);
EXPECT_FLOAT_EQ(result.getDimSize(1),3);
data = new float[12]{1,2,3,4,5,6,7,8,9,10,11,12};
matrix = Aurora::Matrix::fromRawData(data, 3,2,1,Aurora::Complex).toDeviceMatrix();
result = Aurora::transpose(matrix).toHostMatrix();
EXPECT_FLOAT_EQ(result.getData()[0],1);
EXPECT_FLOAT_EQ(result.getData()[1],2);
EXPECT_FLOAT_EQ(result.getData()[2],7);
EXPECT_FLOAT_EQ(result.getData()[3],8);
EXPECT_FLOAT_EQ(result.getData()[4],3);
EXPECT_FLOAT_EQ(result.getData()[5],4);
EXPECT_FLOAT_EQ(result.getData()[6],9);
EXPECT_FLOAT_EQ(result.getData()[7],10);
EXPECT_FLOAT_EQ(result.getData()[8],5);
EXPECT_FLOAT_EQ(result.getData()[9],6);
EXPECT_FLOAT_EQ(result.getData()[10],11);
EXPECT_FLOAT_EQ(result.getData()[11],12);
EXPECT_FLOAT_EQ(result.getDimSize(0),2);
EXPECT_FLOAT_EQ(result.getDimSize(1),3);
EXPECT_FLOAT_EQ(result.getDimSize(0),2);
EXPECT_FLOAT_EQ(result.getDimSize(1),3);
}
TEST_F(Function1D_Cuda_Test, horzcat) {
float *data1 = new float[6]{1,2,3,4,5,6};
auto matrix1 = Aurora::Matrix::fromRawData(data1, 3,2).toDeviceMatrix();
float *data2 = new float[9]{7,8,9,10,11,12,13,14,15};
auto matrix2 = Aurora::Matrix::fromRawData(data2, 3,3).toDeviceMatrix();
auto result = Aurora::horzcat(matrix1,matrix2).toHostMatrix();
EXPECT_FLOAT_EQ(result.getData()[0],1);
EXPECT_FLOAT_EQ(result.getData()[1],2);
EXPECT_FLOAT_EQ(result.getData()[10],11);
EXPECT_FLOAT_EQ(result.getData()[14],15);
EXPECT_FLOAT_EQ(result.getDimSize(0),3);
EXPECT_FLOAT_EQ(result.getDimSize(1),5);
data1 = new float[6]{1,2,3,4,5,6};
matrix1 = Aurora::Matrix::fromRawData(data1, 3,1,1,Aurora::Complex).toDeviceMatrix();
data2 = new float[6]{7,8,9,10,11,12};
matrix2 = Aurora::Matrix::fromRawData(data2, 3,1,1,Aurora::Complex).toDeviceMatrix();
result = Aurora::horzcat(matrix1,matrix2).toHostMatrix();
EXPECT_FLOAT_EQ(result.getData()[0],1);
EXPECT_FLOAT_EQ(result.getData()[1],2);
EXPECT_FLOAT_EQ(result.getData()[8],9);
EXPECT_FLOAT_EQ(result.getData()[9],10);
EXPECT_FLOAT_EQ(result.getDimSize(0),3);
EXPECT_FLOAT_EQ(result.getDimSize(1),2);
}
TEST_F(Function1D_Cuda_Test, vertcat) {
float *data1 = new float[6]{1,2,3,4,5,6};
auto matrix1 = Aurora::Matrix::fromRawData(data1, 2,3).toDeviceMatrix();
float *data2 = new float[9]{7,8,9,10,11,12,13,14,15};
auto matrix2 = Aurora::Matrix::fromRawData(data2, 3,3).toDeviceMatrix();
auto result = Aurora::vertcat(matrix1,matrix2).toHostMatrix();
EXPECT_FLOAT_EQ(result.getData()[0],1);
EXPECT_FLOAT_EQ(result.getData()[1],2);
EXPECT_FLOAT_EQ(result.getData()[10],5);
EXPECT_FLOAT_EQ(result.getData()[14],15);
EXPECT_FLOAT_EQ(result.getDimSize(0),5);
EXPECT_FLOAT_EQ(result.getDimSize(1),3);
data1 = new float[6]{1,2,3,4,5,6};
matrix1 = Aurora::Matrix::fromRawData(data1, 3,1,1,Aurora::Complex).toDeviceMatrix();
data2 = new float[6]{7,8,9,10,11,12};
matrix2 = Aurora::Matrix::fromRawData(data2, 3,1,1,Aurora::Complex).toDeviceMatrix();
result = Aurora::vertcat(matrix1,matrix2).toHostMatrix();
EXPECT_FLOAT_EQ(result.getData()[0],1);
EXPECT_FLOAT_EQ(result.getData()[1],2);
EXPECT_FLOAT_EQ(result.getData()[8],9);
EXPECT_FLOAT_EQ(result.getData()[9],10);
EXPECT_FLOAT_EQ(result.getDimSize(0),6);
EXPECT_FLOAT_EQ(result.getDimSize(1),1);
}