并行还原技术

时间:2013-01-28 09:10:06

标签: cuda parallel-processing

我有这段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中计算csumccountaverageDistcsumaveragedist是浮点数,ccount是整数。

这是一个并行减少问题吗?

2 个答案:

答案 0 :(得分:1)

我没有完全理解您的代码应该做什么,我也不知道numBinsnumFeatures的近似值是什么。不过,我会将这个循环并行:for (p = 0; p < xsize*ysize; p++),以便每个线程计算其值并将它们存储在全局数组中。拥有特征距离的这些数组,您可以使用标准并行缩减来计算csumccountaverageDist

图像 for (int im = 0; im < numImages; im++)的主循环可以通过重复启动内核来计算,也可以通过像素循环使其同时并行。

如果if(ok)经常不满足,则会发生扭曲分歧(见this)。避免这种情况,您可以为每个像素分配一个线程,但只有一个线程可以在此经线内的线程之间进行扭曲和划分。

答案 1 :(得分:0)

Ya,您可以使用CUDA进行汇总。但是,元素的数量应该足够大,以便在GPU上求和所用的时间应该小于在CPU上求和的时间。 This may help you