#include #include #include #include "AuroraDefs.h" #include "Matrix.h" #include "CudaMatrix.h" #include "Function.h" #include "Function1D.h" #include "Function2D.h" #include "Function3D.h" class CudaMatrix_Test : public ::testing::Test { protected: static void SetUpCudaMatrixTester() { } static void TearDownTestCase() { } void SetUp() { } void TearDown() { } }; TEST_F(CudaMatrix_Test, MatrixAddScalar) { { auto A = Aurora::zeros(257,257,1); auto B = Aurora::zeros(257,257,1); size_t size = 257*257; for (size_t i = 0; i < size; i++) { A[i] = -1; B[i] = i; } printf("Test CudaMatrix operator+(const CudaMatrix &aMatrix) const \r\n"); //CudaMatrix operator+(const CudaMatrix &aMatrix) const auto C = A+B; auto dA = A.toDeviceMatrix(); auto dB = B.toDeviceMatrix(); auto dC = (dA+dB); auto dhC = dC.toHostMatrix(); EXPECT_EQ(257, dC.getDimSize(0)); EXPECT_EQ(257, dC.getDimSize(1)); EXPECT_EQ(1, dC.getDimSize(2)); for (size_t i = 0; i < size; i++) { EXPECT_FLOAT_EQ(C[i],dhC[i]); } printf("Test CudaMatrix operator+(float aScalar) const \r\n"); //CudaMatrix operator+(float aScalar) const auto D = C+0.5; auto dD = dC+0.5; auto dhD = dD.toHostMatrix(); EXPECT_EQ(257, dD.getDimSize(0)); EXPECT_EQ(257, dD.getDimSize(1)); EXPECT_EQ(1, dD.getDimSize(2)); for (size_t i = 0; i < size; i++) { EXPECT_FLOAT_EQ(D[i],dhD[i]); } printf("Test CudaMatrix operator+(float aScalar, const CudaMatrix &aMatrix) \r\n"); // CudaMatrix operator+(float aScalar, const CudaMatrix &aMatrix) dD = 0.5 + dC; dhD = dD.toHostMatrix(); EXPECT_EQ(257, dD.getDimSize(0)); EXPECT_EQ(257, dD.getDimSize(1)); EXPECT_EQ(1, dD.getDimSize(2)); for (size_t i = 0; i < size; i++) { EXPECT_FLOAT_EQ(D[i],dhD[i]); } printf("Test CudaMatrix &operator+(float aScalar, CudaMatrix &&aMatrix) \r\n"); // CudaMatrix &operator+(float aScalar, CudaMatrix &&aMatrix) { auto dD2 = 0.5 + (dA+dB); dhD = dD2.toHostMatrix(); EXPECT_EQ(257, dD2.getDimSize(0)); EXPECT_EQ(257, dD2.getDimSize(1)); EXPECT_EQ(1, dD2.getDimSize(2)); for (size_t i = 0; i < size; i++) { EXPECT_FLOAT_EQ(D[i],dhD[i]); } } printf("Test CudaMatrix &operator+(CudaMatrix &&aMatrix, float aScalar) \r\n"); // CudaMatrix &operator+(CudaMatrix &&aMatrix, float aScalar) { auto dD2 = (dA+dB)+0.5; dhD = dD2.toHostMatrix(); EXPECT_EQ(257, dD2.getDimSize(0)); EXPECT_EQ(257, dD2.getDimSize(1)); EXPECT_EQ(1, dD2.getDimSize(2)); for (size_t i = 0; i < size; i++) { EXPECT_FLOAT_EQ(D[i],dhD[i]); } } //CudaMatrix operator+(CudaMatrix &&aMatrix) const printf("Test CudaMatrix operator+(CudaMatrix &&aMatrix) const \r\n"); { auto D = A+C; auto dD2 = dA+(dA+dB); dhD = dD2.toHostMatrix(); EXPECT_EQ(257, dD2.getDimSize(0)); EXPECT_EQ(257, dD2.getDimSize(1)); EXPECT_EQ(1, dD2.getDimSize(2)); for (size_t i = 0; i < size; i++) { EXPECT_FLOAT_EQ(D[i],dhD[i]); } } //CudaMatrix operator+(CudaMatrix &&aMatrix,CudaMatrix &aOther) printf("Test CudaMatrix operator+(CudaMatrix &&aMatrix,CudaMatrix &aOther) \r\n"); { auto D = A+C; auto dD2 = (dA+dB)+dA; dhD = dD2.toHostMatrix(); EXPECT_EQ(257, dD2.getDimSize(0)); EXPECT_EQ(257, dD2.getDimSize(1)); EXPECT_EQ(1, dD2.getDimSize(2)); for (size_t i = 0; i < size; i++) { EXPECT_FLOAT_EQ(D[i],dhD[i]); } } } { float *dataA = new float[10000]; float *dataB = new float[10000]; for (size_t i = 0; i < 10000; i++) { dataA[i] = 8; dataB[i] = -1; } auto A = Aurora::Matrix::fromRawData(dataA, 50,100,1,Aurora::Complex); auto B = Aurora::Matrix::fromRawData(dataB, 50,100,1,Aurora::Complex); auto C = A+B; std::complex scalar(-1,-1); auto dA = A.toDeviceMatrix(); //complex matrix + complex scalar auto dC = (dA+scalar); EXPECT_TRUE(dC.isComplex()); EXPECT_EQ(50, dC.getDimSize(0)); EXPECT_EQ(100, dC.getDimSize(1)); EXPECT_EQ(1, dC.getDimSize(2)); for (size_t i = 0; i < C.getDataSize()*2; i++) { EXPECT_FLOAT_EQ(C[i],dC.getValue(i)); } //complex Matrix&& + complex scalar dC = A.toDeviceMatrix()+scalar; EXPECT_TRUE(dC.isComplex()); EXPECT_EQ(50, dC.getDimSize(0)); EXPECT_EQ(100, dC.getDimSize(1)); EXPECT_EQ(1, dC.getDimSize(2)); for (size_t i = 0; i < C.getDataSize()*2; i++) { EXPECT_FLOAT_EQ(C[i],dC.getValue(i)); } //complex scalar + complex Matrix&& dC = scalar+A.toDeviceMatrix(); EXPECT_TRUE(dC.isComplex()); EXPECT_EQ(50, dC.getDimSize(0)); EXPECT_EQ(100, dC.getDimSize(1)); EXPECT_EQ(1, dC.getDimSize(2)); for (size_t i = 0; i < C.getDataSize()*2; i++) { EXPECT_FLOAT_EQ(C[i],dC.getValue(i)); } //complex scalar + complex matrix dC = scalar+dA; EXPECT_TRUE(dC.isComplex()); EXPECT_EQ(50, dC.getDimSize(0)); EXPECT_EQ(100, dC.getDimSize(1)); EXPECT_EQ(1, dC.getDimSize(2)); for (size_t i = 0; i < C.getDataSize()*2; i++) { EXPECT_FLOAT_EQ(C[i],dC.getValue(i)); } //complex matrix + real scalar C = A+1; dC = (dA+1); EXPECT_TRUE(dC.isComplex()); EXPECT_EQ(50, dC.getDimSize(0)); EXPECT_EQ(100, dC.getDimSize(1)); EXPECT_EQ(1, dC.getDimSize(2)); for (size_t i = 0; i < C.getDataSize()*2; i++) { EXPECT_FLOAT_EQ(C[i],dC.getValue(i))<<"index"< scalar(-1,-1); auto dA = A.toDeviceMatrix(); //real matrix + complex scalar auto dC = (dA+scalar); EXPECT_TRUE(dC.isComplex()); EXPECT_EQ(50, dC.getDimSize(0)); EXPECT_EQ(100, dC.getDimSize(1)); EXPECT_EQ(1, dC.getDimSize(2)); for (size_t i = 0; i < C.getDataSize()*2; i++) { EXPECT_FLOAT_EQ(C[i],dC.getValue(i)); } //real Matrix&& + complex scalar dC = A.toDeviceMatrix()+scalar; EXPECT_TRUE(dC.isComplex()); EXPECT_EQ(50, dC.getDimSize(0)); EXPECT_EQ(100, dC.getDimSize(1)); EXPECT_EQ(1, dC.getDimSize(2)); for (size_t i = 0; i < C.getDataSize()*2; i++) { EXPECT_FLOAT_EQ(C[i],dC.getValue(i)); } //complex scalar + real Matrix&& dC = scalar+A.toDeviceMatrix(); EXPECT_TRUE(dC.isComplex()); EXPECT_EQ(50, dC.getDimSize(0)); EXPECT_EQ(100, dC.getDimSize(1)); EXPECT_EQ(1, dC.getDimSize(2)); for (size_t i = 0; i < C.getDataSize()*2; i++) { EXPECT_FLOAT_EQ(C[i],dC.getValue(i)); } //complex scalar + real Matrix dC = scalar+dA; EXPECT_TRUE(dC.isComplex()); EXPECT_EQ(50, dC.getDimSize(0)); EXPECT_EQ(100, dC.getDimSize(1)); EXPECT_EQ(1, dC.getDimSize(2)); for (size_t i = 0; i < C.getDataSize()*2; i++) { EXPECT_FLOAT_EQ(C[i],dC.getValue(i)); } } } TEST_F(CudaMatrix_Test, MatrixAddmm) { //real { auto A = -Aurora::ones(4096,23519,1); auto B = Aurora::ones(4096,23519,1)*8; auto C = B-1; auto dA = A.toDeviceMatrix(); auto dB = B.toDeviceMatrix(); //Matrix& + Matrix& auto dC = (dA+dB); EXPECT_TRUE(!dC.isComplex()); EXPECT_EQ(4096, dC.getDimSize(0)); EXPECT_EQ(23519, dC.getDimSize(1)); EXPECT_EQ(1, dC.getDimSize(2)); #pragma omp parallel for for (size_t i = 0; i < C.getDataSize(); i++) { EXPECT_FLOAT_EQ(C[i],dC.getValue(i)); } //Matrix&& + Matrix& dC = A.toDeviceMatrix()+dB; EXPECT_TRUE(!dC.isComplex()); EXPECT_EQ(4096, dC.getDimSize(0)); EXPECT_EQ(23519, dC.getDimSize(1)); EXPECT_EQ(1, dC.getDimSize(2)); // #pragma omp parallel for // for (size_t i = 0; i < C.getDataSize(); i++) // { // EXPECT_FLOAT_EQ(C[i],dC.getValue(i)); // } //Matrix& + Matrix&& dC = dB+A.toDeviceMatrix(); EXPECT_TRUE(!dC.isComplex()); EXPECT_EQ(4096, dC.getDimSize(0)); EXPECT_EQ(23519, dC.getDimSize(1)); EXPECT_EQ(1, dC.getDimSize(2)); // #pragma omp parallel for // for (size_t i = 0; i < C.getDataSize(); i++) // { // EXPECT_FLOAT_EQ(C[i],dC.getValue(i)); // } } //complex { float *dataA = Aurora::random(4096*23519*2); float *dataB = Aurora::random(4096*23519*2); auto A = Aurora::Matrix::fromRawData(dataA, 4096,23519,1,Aurora::Complex); auto B = Aurora::Matrix::fromRawData(dataB, 4096,23519,1,Aurora::Complex); auto C = B+A; auto dA = A.toDeviceMatrix(); auto dB = B.toDeviceMatrix(); //Matrix& + Matrix&, auto dC = (dA+dB); EXPECT_TRUE(dC.isComplex()); EXPECT_EQ(4096, dC.getDimSize(0)); EXPECT_EQ(23519, dC.getDimSize(1)); EXPECT_EQ(1, dC.getDimSize(2)); #pragma omp parallel for for (size_t i = 0; i < C.getDataSize(); i++) { EXPECT_FLOAT_EQ(C[i],dC.getValue(i)); } //Matrix&& + Matrix&, dC = A.toDeviceMatrix()+dB; EXPECT_TRUE(dC.isComplex()); EXPECT_EQ(4096, dC.getDimSize(0)); EXPECT_EQ(23519, dC.getDimSize(1)); EXPECT_EQ(1, dC.getDimSize(2)); // #pragma omp parallel for // for (size_t i = 0; i < C.getDataSize(); i++) // { // EXPECT_FLOAT_EQ(C[i],dC.getValue(i)); // } //Matrix& + Matrix&&, dC = dB+A.toDeviceMatrix(); EXPECT_TRUE(dC.isComplex()); EXPECT_EQ(4096, dC.getDimSize(0)); EXPECT_EQ(23519, dC.getDimSize(1)); EXPECT_EQ(1, dC.getDimSize(2)); // #pragma omp parallel for // for (size_t i = 0; i < C.getDataSize(); i++) // { // EXPECT_FLOAT_EQ(C[i],dC.getValue(i)); // } } } TEST_F(CudaMatrix_Test, MatrixAddmv) { //real { auto A = Aurora::zeros(100,100,1); auto B = Aurora::ones(100,1,1); auto C = A+1; auto dA = A.toDeviceMatrix(); auto dB = B.toDeviceMatrix(); //Matrix& + Matrix&, col mode auto dC = (dA+dB); for (size_t i = 0; i < C.getDataSize(); i++) { EXPECT_FLOAT_EQ(C[i],dC.getValue(i)); } //Matrix&& + Matrix&, col mode dC = A.toDeviceMatrix()+dB; for (size_t i = 0; i < C.getDataSize(); i++) { EXPECT_FLOAT_EQ(C[i],dC.getValue(i)); } //Matrix& + Matrix&&, col mode dC = dB+A.toDeviceMatrix(); for (size_t i = 0; i < C.getDataSize(); i++) { EXPECT_FLOAT_EQ(C[i],dC.getValue(i)); } //Matrix& + vec&&, col mode dC = dA+B.toDeviceMatrix(); for (size_t i = 0; i < C.getDataSize(); i++) { EXPECT_FLOAT_EQ(C[i],dC.getValue(i)); } //vec&& + Matrix&&, col mode dC = B.toDeviceMatrix()+dA; for (size_t i = 0; i < C.getDataSize(); i++) { EXPECT_FLOAT_EQ(C[i],dC.getValue(i)); } dB.forceReshape(1, 100, 1); //Matrix& + Matrix&, row mode dC = (dA+dB); for (size_t i = 0; i < C.getDataSize(); i++) { EXPECT_FLOAT_EQ(C[i],dC.getValue(i))<<"index:"< scalar(-1,-1); auto dA = A.toDeviceMatrix(); auto dC = (dA*scalar); for (size_t i = 0; i < C.getDataSize()*2; i++) { EXPECT_FLOAT_EQ(C[i],dC.getValue(i)); } dC = A.toDeviceMatrix()*scalar; for (size_t i = 0; i < C.getDataSize()*2; i++) { EXPECT_FLOAT_EQ(C[i],dC.getValue(i)); } dC = scalar*A.toDeviceMatrix(); for (size_t i = 0; i < C.getDataSize()*2; i++) { EXPECT_FLOAT_EQ(C[i],dC.getValue(i)); } C = A*2; dC = (dA*2); for (size_t i = 0; i < C.getDataSize()*2; i++) { EXPECT_FLOAT_EQ(C[i],dC.getValue(i))<<"index"< scalar(-1,-1); auto dA = A.toDeviceMatrix(); auto dC = (dA-scalar); for (size_t i = 0; i < C.getDataSize()*2; i++) { EXPECT_FLOAT_EQ(C[i],dC.getValue(i)); } dC = A.toDeviceMatrix()-scalar; for (size_t i = 0; i < C.getDataSize()*2; i++) { EXPECT_FLOAT_EQ(C[i],dC.getValue(i)); } C = B-A; dC = scalar-A.toDeviceMatrix(); for (size_t i = 0; i < C.getDataSize()*2; i++) { EXPECT_FLOAT_EQ(C[i],dC.getValue(i)); } C = A-1; dC = (dA-1); for (size_t i = 0; i < C.getDataSize()*2; i++) { EXPECT_FLOAT_EQ(C[i],dC.getValue(i))<<"index"< scalar(-2,-2); auto dA = A.toDeviceMatrix(); auto dC = (dA/scalar); for (size_t i = 0; i < C.getDataSize()*2; i++) { EXPECT_FLOAT_EQ(C[i],dC.getValue(i)); } dC = A.toDeviceMatrix()/scalar; for (size_t i = 0; i < C.getDataSize()*2; i++) { EXPECT_FLOAT_EQ(C[i],dC.getValue(i)); } C = B/A; dC = scalar/A.toDeviceMatrix(); for (size_t i = 0; i < C.getDataSize()*2; i++) { EXPECT_FLOAT_EQ(C[i],dC.getValue(i)); } C = A/2.0; dC = (dA/2.0); for (size_t i = 0; i < C.getDataSize()*2; i++) { EXPECT_FLOAT_EQ(C[i],dC.getValue(i))<<"index"<B); auto dhR = (dA>dB).toHostMatrix(); for (size_t i = 0; i < 1000; i++) { EXPECT_FLOAT_EQ(R[i],dhR[i]); } } { auto R= (A<=B); auto dhR = (dA<=dB).toHostMatrix(); for (size_t i = 0; i < 1000; i++) { EXPECT_FLOAT_EQ(R[i],dhR[i]); } } { auto R= (A>=B); auto dhR = (dA>=dB).toHostMatrix(); for (size_t i = 0; i < 1000; i++) { EXPECT_FLOAT_EQ(R[i],dhR[i]); } } { auto R= (A==B); auto dhR = (dA==dB).toHostMatrix(); for (size_t i = 0; i < 1000; i++) { EXPECT_FLOAT_EQ(R[i],dhR[i]); } } { auto R= (A!=B); auto dhR = (dA!=dB).toHostMatrix(); for (size_t i = 0; i < 1000; i++) { EXPECT_FLOAT_EQ(R[i],dhR[i]); } } { auto R= (9B); auto dhR = (9>dB).toHostMatrix(); for (size_t i = 0; i < 1000; i++) { EXPECT_FLOAT_EQ(R[i],dhR[i]); } } { auto R= (9<=B); auto dhR = (9<=dB).toHostMatrix(); for (size_t i = 0; i < 1000; i++) { EXPECT_FLOAT_EQ(R[i],dhR[i]); } } { auto R= (9>=B); auto dhR = (9>=dB).toHostMatrix(); for (size_t i = 0; i < 1000; i++) { EXPECT_FLOAT_EQ(R[i],dhR[i]); } } { auto R= (9==B); auto dhR = (9==dB).toHostMatrix(); for (size_t i = 0; i < 1000; i++) { EXPECT_FLOAT_EQ(R[i],dhR[i]); } } { auto R= (9!=B); auto dhR = (9!=dB).toHostMatrix(); for (size_t i = 0; i < 1000; i++) { EXPECT_FLOAT_EQ(R[i],dhR[i]); } } } TEST_F(CudaMatrix_Test, matrixfunction) { printf("Test CudaMatrix block(int aDim,int aBeginIndx, int aEndIndex) const\r\n"); { float *dataA = new float[9]{1,6,9,4,1,0,5,8,1}; float *dataB = new float[3]{1,2,3}; Aurora::CudaMatrix A = Aurora::Matrix::fromRawData(dataA, 3, 3).toDeviceMatrix(); Aurora::CudaMatrix B = Aurora::Matrix::fromRawData(dataB, 1, 3).toDeviceMatrix(); Aurora::Matrix block1 = A.block(0, 1, 2).toHostMatrix(); Aurora::Matrix block2 = A.toHostMatrix().block(0, 1, 2); for (size_t i = 0; i < block1.getDataSize(); i++) { EXPECT_FLOAT_EQ(block1[i], block2[i]); } block2 = A.toHostMatrix(); A.setBlockValue(0, 1, 2,-1); block1 = A.toHostMatrix(); block2.setBlockValue(0, 1, 2,-1); for (size_t i = 0; i < block1.getDataSize(); i++) { EXPECT_FLOAT_EQ(block1[i], block2[i]); } Aurora::CudaMatrix C = Aurora::zeros(2,3).toDeviceMatrix(); EXPECT_TRUE(A.setBlock(0, 0, 1, C)); block1 = A.block(0, 0, 1).toHostMatrix(); block2 = C.toHostMatrix(); for(size_t i = 0; i < C.getDataSize(); i++) { EXPECT_FLOAT_EQ(block1[i], block2[i]); } } }