修复因为 分块错误的 GPU计算错误

pull/1/head
陈增辉 2024-12-01 14:44:12 +08:00
parent 696a3e5004
commit 44e485381b
3 changed files with 73 additions and 43 deletions

View File

@ -11,7 +11,7 @@
</rect>
</property>
<property name="windowTitle">
<string>Custom Dialog</string>
<string>RTPC回波仿真</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
@ -90,7 +90,7 @@
</size>
</property>
<property name="text">
<string>D:/Programme/vs2022/RasterMergeTest/TestData/landcover_aligned.tiff</string>
<string>D:/Programme/vs2022/RasterMergeTest/TestData/landcover_aligned2</string>
</property>
</widget>
</item>

View File

@ -202,6 +202,7 @@ ErrorCode RTPCProcessCls::DEMPreprocess()
double rowidx = 0;
double colidx = 0;
for (int max_rows_ids = 0; max_rows_ids < demds.height; max_rows_ids = max_rows_ids + line_invert) {
Eigen::MatrixXd demdata = demds.getData(max_rows_ids, 0, line_invert, demds.width, 1);
Eigen::MatrixXd xyzdata_x = demdata.array() * 0;
@ -239,7 +240,7 @@ ErrorCode RTPCProcessCls::DEMPreprocess()
line_invert = 1000;
long start_ids = 0;
long dem_rows = 0, dem_cols = 0;
for (start_ids = 1; start_ids < demds.height; start_ids = start_ids + line_invert) {
Eigen::MatrixXd demdata = demds.getData(start_ids - 1, 0, line_invert + 2, demxyz.width, 1);
long startlineid = start_ids;
@ -437,6 +438,7 @@ ErrorCode RTPCProcessCls::RTPCMainProcess(long num_thread)
float* h_TantPattern = (float*)mallocCUDAHost(sizeof(float) * Tthetanum * Tphinum);
float* d_TantPattern = (float*)mallocCUDADevice(sizeof(float) * Tthetanum * Tphinum);
for (long i = 0; i < Tthetanum; i++) {
for (long j = 0; j < Tphinum; j++) {
h_TantPattern[i*Tphinum+j] = TransformPattern->getGainLearThetaPhi(TstartTheta + i * Tdtheta, TstartPhi + j * Tdphi);
@ -461,6 +463,7 @@ ErrorCode RTPCProcessCls::RTPCMainProcess(long num_thread)
float* h_RantPattern = (float*)mallocCUDAHost(sizeof(float) * Rthetanum * Rphinum);
float* d_RantPattern = (float*)mallocCUDADevice(sizeof(float) * Rthetanum * Rphinum);
for (long i = 0; i < Rthetanum; i++) {
for (long j = 0; j < Rphinum; j++) {
h_RantPattern[i * Rphinum + j] = ReceivePattern->getGainLearThetaPhi(RstartTheta + i * Rdtheta, RstartPhi + j * Rdphi);
@ -540,8 +543,8 @@ ErrorCode RTPCProcessCls::RTPCMainProcess(long num_thread)
cuComplex* h_echoAmp = (cuComplex*)mallocCUDAHost(sizeof(cuComplex) * blokline * tempDemCols);
cuComplex* d_echoAmp = (cuComplex*)mallocCUDADevice(sizeof(cuComplex) * blokline * tempDemCols);
long* h_echoAmpFID = (long*)mallocCUDAHost(sizeof(long) * blokline * tempDemCols);
long* d_echoAmpFID = (long*)mallocCUDADevice(sizeof(long) * blokline * tempDemCols);
int* h_echoAmpFID = (int*)mallocCUDAHost(sizeof(int) * blokline * tempDemCols);
int* d_echoAmpFID = (int*)mallocCUDADevice(sizeof(int) * blokline * tempDemCols);
Eigen::MatrixXd landcover= Eigen::MatrixXd::Zero(blokline, tempDemCols);// 地面覆盖类型
@ -595,8 +598,8 @@ ErrorCode RTPCProcessCls::RTPCMainProcess(long num_thread)
h_echoAmp = (cuComplex*)mallocCUDAHost(sizeof(cuComplex) * newblokline * tempDemCols);;
d_echoAmp = (cuComplex*)mallocCUDADevice(sizeof(cuComplex) * newblokline * tempDemCols);;
h_echoAmpFID = (long*)mallocCUDAHost(sizeof(long) * newblokline * tempDemCols);
d_echoAmpFID = (long*)mallocCUDADevice(sizeof(long) * newblokline * tempDemCols);
h_echoAmpFID = (int*)mallocCUDAHost(sizeof(int) * newblokline * tempDemCols);
d_echoAmpFID = (int*)mallocCUDADevice(sizeof(int) * newblokline * tempDemCols);
}
{ // 处理 dem -> 数量
@ -641,58 +644,84 @@ ErrorCode RTPCProcessCls::RTPCMainProcess(long num_thread)
HostToDevice((void*)h_demsloper_angle, (void*)d_demsloper_angle, sizeof(float) * newblokline * tempDemCols);
HostToDevice((void*)h_demcls, (void*)d_demcls, sizeof(float) * newblokline * tempDemCols);//地表覆盖
long pixelcount = newblokline * tempDemCols;
// 临时文件声明
float antpx =0;
float antpy =0;
float antpz =0;
float antvx =0;
float antvy =0;
float antvz =0;
float antdirectx =0;
float antdirecty =0;
float antdirectz =0;
float antXaxisX =0;
float antXaxisY =0;
float antXaxisZ =0;
float antYaxisX =0;
float antYaxisY =0;
float antYaxisZ =0;
float antZaxisX =0;
float antZaxisY =0;
float antZaxisZ = 0;
int pixelcount = newblokline * tempDemCols;
std::cout << " GPU Memory init finished!!!!" << std::endl;
for (long prfid = 0; prfid < pluseCount; prfid++) {
{// 计算
std::cout << "\r[" << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz").toStdString() << "] dem:\t" << startline << "\t-\t" << startline + newblokline << "\t:\t pluse :\t" << prfid << " / " << pluseCount << std::endl;
// 天线位置
float antpx = sateOirbtNodes[prfid].Px;
float antpy = sateOirbtNodes[prfid].Py;
float antpz = sateOirbtNodes[prfid].Pz;
float antvx = sateOirbtNodes[prfid].Vx;
float antvy = sateOirbtNodes[prfid].Vy;
float antvz = sateOirbtNodes[prfid].Vz; //6
float antdirectx = sateOirbtNodes[prfid].AntDirecX;
float antdirecty = sateOirbtNodes[prfid].AntDirecY;
float antdirectz = sateOirbtNodes[prfid].AntDirecZ; // 9 天线指向
float antXaxisX = sateOirbtNodes[prfid].AntXaxisX;
float antXaxisY = sateOirbtNodes[prfid].AntXaxisY;
float antXaxisZ = sateOirbtNodes[prfid].AntXaxisZ;//12 天线坐标系
float antYaxisX = sateOirbtNodes[prfid].AntYaxisX;
float antYaxisY = sateOirbtNodes[prfid].AntYaxisY;
float antYaxisZ = sateOirbtNodes[prfid].AntYaxisZ;//15
float antZaxisX = sateOirbtNodes[prfid].AntZaxisX;
float antZaxisY = sateOirbtNodes[prfid].AntZaxisY;
float antZaxisZ = sateOirbtNodes[prfid].AntZaxisZ;//18
antpx = sateOirbtNodes[prfid].Px;
antpy = sateOirbtNodes[prfid].Py;
antpz = sateOirbtNodes[prfid].Pz;
antvx = sateOirbtNodes[prfid].Vx;
antvy = sateOirbtNodes[prfid].Vy;
antvz = sateOirbtNodes[prfid].Vz; //6
antdirectx = sateOirbtNodes[prfid].AntDirecX;
antdirecty = sateOirbtNodes[prfid].AntDirecY;
antdirectz = sateOirbtNodes[prfid].AntDirecZ; // 9 天线指向
antXaxisX = sateOirbtNodes[prfid].AntXaxisX;
antXaxisY = sateOirbtNodes[prfid].AntXaxisY;
antXaxisZ = sateOirbtNodes[prfid].AntXaxisZ;//12 天线坐标系
antYaxisX = sateOirbtNodes[prfid].AntYaxisX;
antYaxisY = sateOirbtNodes[prfid].AntYaxisY;
antYaxisZ = sateOirbtNodes[prfid].AntYaxisZ;//15
antZaxisX = sateOirbtNodes[prfid].AntZaxisX;
antZaxisY = sateOirbtNodes[prfid].AntZaxisY;
antZaxisZ = sateOirbtNodes[prfid].AntZaxisZ;//18
//CUDATestHelloWorld(1, 20);
std::cout << "\r[" << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz").toStdString() << "] GPU :\t" << std::endl;
CUDA_RTPC_SiglePRF(
antpx, antpy, antpz,// 天线坐标
antXaxisX, antXaxisY, antXaxisZ, // 天线坐标系
antYaxisX, antYaxisY, antYaxisZ, //
antZaxisX, antZaxisY, antZaxisZ,
antdirectx, antdirecty, antdirectz,// 天线指向
d_dem_x, d_dem_y, d_dem_z, d_demcls, // 地面坐标
d_dem_x, d_dem_y, d_dem_z,
d_demcls, // 地面坐标
d_demsloper_x, d_demsloper_y, d_demsloper_z, d_demsloper_angle,// 地面坡度
d_TantPattern, TstartTheta,TstartPhi, Tdtheta, Tdphi, Tthetanum, Tphinum,// 天线方向图相关
d_RantPattern, RstartTheta, RstartPhi, Rdtheta, Rdphi, Rthetanum,Rphinum,// 天线方向图相关
lamda, Fs, NearRange, Pt, PlusePoint, // 参数
d_clsSigmaParam, clamapid,// 地表覆盖类型-sigma插值对应函数-ulaby
d_echoAmp, d_echoAmpFID,
pixelcount
);
newblokline,tempDemCols);
DeviceToHost(h_echoAmpFID, d_echoAmpFID, sizeof(long)* newblokline* tempDemCols);
DeviceToHost(h_echoAmp, d_echoAmp, sizeof(long)* newblokline* tempDemCols);
std::cout << "\r[" << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz").toStdString() << "] GPU SIGMA:\t" << std::endl;
for (long i = 0; i < pixelcount; i++) {
echo.get()[prfid*PlusePoint+ h_echoAmpFID[i]] =std::complex<double>(h_echoAmp[i].x, h_echoAmp[i].y);
echo.get()[prfid*PlusePoint+ h_echoAmpFID[i]] = echo.get()[prfid * PlusePoint + h_echoAmpFID[i]]
+std::complex<double>(h_echoAmp[i].x, h_echoAmp[i].y);
}
//for (long i = 0; i < PlusePoint; i++) {
// std::cout << echo.get()[prfid * PlusePoint + i] << std::endl;
//}
if (prfid % 100 == 0) {
std::cout << "\r[" << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz").toStdString() << "] dem:\t" << startline << "\t-\t" << startline + newblokline << "\t:\t pluse :\t" << prfid << " / " << pluseCount << std::endl;
}
}
}

View File

@ -23,6 +23,12 @@ SigmaDatabase::SigmaDatabase()
this->VH_sigmaParam.clear();
this->VV_sigmaParam.clear();
//0
this->HH_sigmaParam.insert(std::pair<long, SigmaParam>(0, SigmaParam{ 0,0,0, 0, 0,0 }));
this->HV_sigmaParam.insert(std::pair<long, SigmaParam>(0, SigmaParam{ 0,0,0, 0, 0,0 }));
this->VH_sigmaParam.insert(std::pair<long, SigmaParam>(0, SigmaParam{ 0,0,0, 0, 0,0 }));
this->VV_sigmaParam.insert(std::pair<long, SigmaParam>(0, SigmaParam{ 0,0,0, 0, 0,0 }));
//12
this->HH_sigmaParam.insert(std::pair<long, SigmaParam>(12, SigmaParam{ -21.1019701821713, 9.00621457243906, 6.52932182540331, - 1.11157376729893, - 15.8022895411007, 11.4690828129602 }));
this->HV_sigmaParam.insert(std::pair<long, SigmaParam>(12, SigmaParam{ -30.0103645753547, 27.1700862271921, 11.8007376386356, - 0.933835390422269, - 16.4640776105300, 11.8318838032267 }));
@ -70,10 +76,6 @@ SigmaDatabase::SigmaDatabase()
this->HV_sigmaParam.insert(std::pair<long, SigmaParam>(90, SigmaParam{ -26.8776515733889, 10.4251866500052, 8.43273666535992, 4.33165922141213, 8.68204389555939, - 2.51718779582920 }));
this->VH_sigmaParam.insert(std::pair<long, SigmaParam>(90, SigmaParam{ -26.8776515733889, 10.4251866500052, 8.43273666535992, 4.33165922141213, 8.68204389555939, - 2.51718779582920 }));
this->VV_sigmaParam.insert(std::pair<long, SigmaParam>(90, SigmaParam{ -20.1761798059391, 13.2752519275021, 2.74667225608397, 3.63052241744923, 8.99932188120922, 34.8246533269446 }));
}
SigmaDatabase::~SigmaDatabase()
@ -82,7 +84,6 @@ SigmaDatabase::~SigmaDatabase()
this->HV_sigmaParam.clear();
this->VH_sigmaParam.clear();
this->VV_sigmaParam.clear();
}
double SigmaDatabase::getAmpHH(long cls, double angle)