并行还原技术 我有这段C++代码,我想把它移植到CUDA。< /P> for (int im = 0; im < numImages; im++) { for (p = 0; p < xsize*ysize; p++) { bool ok = false; for (f = 0; f < numFeatures; f++) { if (feature[im][f][p] != 0) { ok = true; break; } } if (ok) { minDist = 1e9; for (i = 0; i < numBins; i++) { dist = 0; for (f = 0; f < numFeatures; f++) { dist += (float)((feature[im][f][p]-clusterPoint[f][i])*(feature[im][f][p]-clusterPoint[f][i])); } if (dist < minDist) { minDist = dist; tmp = i; } }//end for i for (f = 0; f < numFeatures; f++) csum[f][tmp] += feature[im][f][p]; ccount[tmp]++; averageDist[tmp] += sqrt(minDist); } // end if (ok) } //end for p }// end for im for(int im=0;im

并行还原技术 我有这段C++代码,我想把它移植到CUDA。< /P> for (int im = 0; im < numImages; im++) { for (p = 0; p < xsize*ysize; p++) { bool ok = false; for (f = 0; f < numFeatures; f++) { if (feature[im][f][p] != 0) { ok = true; break; } } if (ok) { minDist = 1e9; for (i = 0; i < numBins; i++) { dist = 0; for (f = 0; f < numFeatures; f++) { dist += (float)((feature[im][f][p]-clusterPoint[f][i])*(feature[im][f][p]-clusterPoint[f][i])); } if (dist < minDist) { minDist = dist; tmp = i; } }//end for i for (f = 0; f < numFeatures; f++) csum[f][tmp] += feature[im][f][p]; ccount[tmp]++; averageDist[tmp] += sqrt(minDist); } // end if (ok) } //end for p }// end for im for(int im=0;im,cuda,parallel-processing,Cuda,Parallel Processing,我想在GPU中计算csum,ccount和averageDistcsum和averagedist是浮点数,ccount是整数 这是一个并行归约问题吗?Ya,您可以使用CUDA进行求和。但是,元素的数量应该足够大,这样在GPU上求和所花费的时间应该小于在CPU上求和所花费的时间 我没有完全理解您的代码应该做什么,我也不知道numBins和numFeatures的近似值是多少。尽管如此,我还是要并行这个循环:for(p=0;p

我想在GPU中计算
csum
ccount
averageDist
csum
averagedist
是浮点数,
ccount
是整数


这是一个并行归约问题吗?

Ya,您可以使用CUDA进行求和。但是,元素的数量应该足够大,这样在GPU上求和所花费的时间应该小于在CPU上求和所花费的时间

我没有完全理解您的代码应该做什么,我也不知道
numBins
numFeatures
的近似值是多少。尽管如此,我还是要并行这个循环:
for(p=0;p
,以便每个线程计算其值并将其存储在全局数组中。有了这些特征和距离数组,您可以使用标准并行缩减计算
csum
ccount
averageDist

(int im=0;im可以通过重复启动内核来计算,也可以使其与循环像素同时并行


的情况下,如果(ok)
不够频繁,则会发生扭曲发散(请参阅)。为了避免这种情况,您可以不为每个像素指定一个线程,而是为一个扭曲指定一个线程,并在该扭曲内的线程之间分配剩余的计算。

谢谢您的回答!假设numImages=1,xsize*ysize=307200,numBins=80,numFeatures=7。对不起,我没有说清楚。如果我理解正确,您建议我使用一个内核来存储所有需要的数组,以计算csum Account和averageDist作为设备变量。当第一个内核完成时,然后为我想要的每个数组调用我的并行缩减内核。是这样吗?再次感谢是的。在一个内核中并行计算所需的值,然后在下一个内核中减少数组。