#include #include #include "AuroraDefs.h" #include "CudaMatrix.h" #include "Function.h" #include "Matrix.h" #include "TestUtility.h" #include "Function2D.h" #include "Function2D.cuh" class Function2D_Cuda_Test:public ::testing::Test { protected: static void SetUpFunction2DCudaTester(){ } static void TearDownTestCase(){ } public: Aurora::Matrix B; Aurora::CudaMatrix dB; void SetUp(){ } void TearDown(){ } }; TEST_F(Function2D_Cuda_Test, min) { // big data for test // Aurora::Matrix Aurora::max(const Aurora::Matrix &aMatrix, // Aurora::FunctionDirection direction, long &rowIdx, long &colIdx) { float *dataB = Aurora::random(4096*41472); B = Aurora::Matrix::fromRawData(dataB, 4096, 41472); dB = B.toDeviceMatrix(); long r,c; auto ret1 = Aurora::min(B, Aurora::Column,r,c); auto ret2 = Aurora::min(dB, Aurora::Column,r,c); ASSERT_EQ(ret1.getDimSize(0),ret2.getDimSize(0)); ASSERT_EQ(ret1.getDimSize(1),ret2.getDimSize(1)); ASSERT_EQ(ret1.getDimSize(2),ret2.getDimSize(2)); for (size_t i = 0; i < ret1.getDataSize(); i++) { ASSERT_FLOAT_EQ(ret1[i], ret2.getValue(i))<<", index at :"<* result = (std::complex*)fftrettH.getData(); //检验fft结果与matlab是否对应 EXPECT_FLOAT_EQ(0.0729, fourDecimalRound(result[1].real())); EXPECT_FLOAT_EQ(2.4899, fourDecimalRound(result[2].imag())); EXPECT_FLOAT_EQ(0.0729, fourDecimalRound(result[11].real())); EXPECT_FLOAT_EQ(2.4899, fourDecimalRound(result[12].imag())); //检验fft的结果是否共轭 EXPECT_FLOAT_EQ(0, result[4].imag()+result[6].imag()); EXPECT_FLOAT_EQ(0, result[4].real()-result[6].real()); auto ret= Aurora::ifft(fftrett); auto retH = ret.toHostMatrix(); std::complex* ifftResult = (std::complex*)retH.getData(); EXPECT_FLOAT_EQ(fourDecimalRound(ifftResult[1].real()),1.0); EXPECT_FLOAT_EQ(fourDecimalRound(ifftResult[3].real()),2.0); EXPECT_FLOAT_EQ(fourDecimalRound(ifftResult[11].real()),1.0); EXPECT_FLOAT_EQ(fourDecimalRound(ifftResult[13].real()),2.0); // Aurora::fftshift(fftrett); // EXPECT_FLOAT_EQ(0.0729, fourDecimalRound(result[6].real())); // EXPECT_FLOAT_EQ(2.4899, fourDecimalRound(result[7].imag())); // EXPECT_FLOAT_EQ(-2., fourDecimalRound(result[10].real())); // EXPECT_FLOAT_EQ(-0.2245, fourDecimalRound(result[11].imag())); auto fftrett2 = Aurora::fft(ma,5); auto fftrett2H =fftrett2.toHostMatrix(); auto result2 = (std::complex*)fftrett2H.getData(); //检验fft结果与matlab是否对应 EXPECT_FLOAT_EQ(0.3090, fourDecimalRound(result2[1].real())); EXPECT_FLOAT_EQ(-1.3143, fourDecimalRound(result2[2].imag())); EXPECT_FLOAT_EQ(-0.8090, fourDecimalRound(result2[7].real())); EXPECT_FLOAT_EQ(1.3143, fourDecimalRound(result2[8].imag())); auto fftrett3 = Aurora::fft(ma,12); auto fftrett3H = fftrett3.toHostMatrix(); auto result3 = (std::complex*)fftrett3H.getData(); //检验fft结果与matlab是否对应 EXPECT_FLOAT_EQ(-1.0, fourDecimalRound(result3[1].real())); EXPECT_FLOAT_EQ(-3.4641, fourDecimalRound(result3[4].imag())); EXPECT_FLOAT_EQ(-1.0, fourDecimalRound(result3[13].real())); EXPECT_FLOAT_EQ(-3.4641, fourDecimalRound(result3[16].imag())); } { float *input = new float[20]{1,1,0,2,2,0,1,1,0,2,1,1,0,2,2,0,1,1,0,2}; auto ma = Aurora::Matrix::fromRawData(input,10,2); auto maD = ma.toDeviceMatrix(); auto ret1 = Aurora::ifft(Aurora::fft(ma),12); auto ret2 = Aurora::ifft(Aurora::fft(maD),12); for (size_t i = 0; i < ret1.getDataSize(); i++) { EXPECT_FLOAT_AE(ret1[i], ret2.getValue(i)); } ret1 = Aurora::ifft(Aurora::fft(ma),8); ret2 = Aurora::ifft(Aurora::fft(maD),8); for (size_t i = 0; i < ret1.getDataSize(); i++) { EXPECT_FLOAT_AE(ret1[i], ret2.getValue(i)); } } { float * data = new float[36]; for (size_t i = 0; i < 18; i++) { data[i*2] = i%9+1; data[i*2+1] = 1; } auto fm = Aurora::Matrix::fromRawData(data,9,2,1,Aurora::Complex); auto fmD = fm.toDeviceMatrix(); Aurora::fftshift(fm); Aurora::fftshift(fmD); for (size_t i = 0; i < fm.getDataSize()*2; i++) { EXPECT_FLOAT_AE(fm[i], fmD.getValue(i)); } Aurora::ifftshift(fm); Aurora::ifftshift(fmD); for (size_t i = 0; i < fm.getDataSize()*2; i++) { EXPECT_FLOAT_AE(fm[i], fmD.getValue(i)); } } { float * data = new float[250000]; for (size_t i = 0; i < 250000; i++) { data[i] = i%500; } auto fm = Aurora::Matrix::fromRawData(data,500,250,1,Aurora::Complex); auto fmD = fm.toDeviceMatrix(); Aurora::fftshift(fm); Aurora::fftshift(fmD); for (size_t i = 0; i < fm.getDataSize()*2; i++) { EXPECT_FLOAT_AE(fm[i], fmD.getValue(i)); } Aurora::ifftshift(fm); Aurora::ifftshift(fmD); for (size_t i = 0; i < fm.getDataSize()*2; i++) { EXPECT_FLOAT_AE(fm[i], fmD.getValue(i)); } } { float * data = new float[333*500]; for (size_t i = 0; i < 333*500; i++) { data[i] = i%333; } auto fm = Aurora::Matrix::fromRawData(data,333,250,1,Aurora::Complex); auto fmD = fm.toDeviceMatrix(); Aurora::fftshift(fm); Aurora::fftshift(fmD); for (size_t i = 0; i < fm.getDataSize()*2; i++) { ASSERT_FLOAT_EQ(fm[i], fmD.getValue(i))<<"index:"<(dI1,std::default_delete()),std::vector{4}); float* dI2= new float[4]{2,2,1,1}; Aurora::Matrix I2(std::shared_ptr(dI2,std::default_delete()),std::vector{4}); float* dI4= new float[4]{1,1,2,2}; Aurora::Matrix I3(std::shared_ptr(dI4,std::default_delete()),std::vector{4}); float* dsz= new float[3]{2,2,2}; Aurora::Matrix sz(std::shared_ptr(dsz,std::default_delete()),std::vector{3}); auto result1 = Aurora::sub2ind(sz, {I1, I2, I3}); auto result2 = Aurora::sub2ind(sz.toDeviceMatrix(), {I1.toDeviceMatrix(), I2.toDeviceMatrix(), I3.toDeviceMatrix()}).toHostMatrix(); EXPECT_FLOAT_EQ(result1.getDataSize(), result2.getDataSize()); for(unsigned int i=0; i