我有这段C ++代码,我想把它移植到CUDA。
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
我想在GPU中计算csum
,ccount
和averageDist
。 csum
和averagedist
是浮点数,ccount
是整数。
这是一个并行减少问题吗?
答案 0 :(得分:1)
我没有完全理解您的代码应该做什么,我也不知道numBins
和numFeatures
的近似值是什么。不过,我会将这个循环并行:for (p = 0; p < xsize*ysize; p++)
,以便每个线程计算其值并将它们存储在全局数组中。拥有特征和距离的这些数组,您可以使用标准并行缩减来计算csum
,ccount
和averageDist
。
图像 for (int im = 0; im < numImages; im++)
的主循环可以通过重复启动内核来计算,也可以通过像素循环使其同时并行。
如果if(ok)
经常不满足,则会发生扭曲分歧(见this)。避免这种情况,您可以为每个像素分配一个线程,但只有一个线程可以在此经线内的线程之间进行扭曲和划分。
答案 1 :(得分:0)
Ya,您可以使用CUDA进行汇总。但是,元素的数量应该足够大,以便在GPU上求和所用的时间应该小于在CPU上求和的时间。 This may help you