0

この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

csum、GPUで計算ccountしたい。は浮動小数点数であり、整数です。averageDistcsumaveragedistccount

これは並列削減の問題ですか?

4

2 に答える 2

1

numBinsあなたのコードが何をすべきかを完全には理解していませんでしnumFeaturesた。for (p = 0; p < xsize*ysize; p++)それにもかかわらず、各スレッドがその値を計算してグローバル配列に格納するために、この loop: を並列化します。これらのフィーチャ距離の配列を計算してcsum、標準の並列削減を使用ccountできます。averageDist

カーネルを繰り返し起動することで画像 上の主なループfor (int im = 0; im < numImages; im++)を計算したり、ピクセル上のループで一気に並列化することも可能です。

if(ok)が頻繁に満たされない場合、ワープ発散が発生します (これ参照)。これを回避するには、各ピクセルに 1 つのスレッドを割り当てずに 1 つのワープを割り当て、残りの計算をこのワープ内のスレッド間で分割します。

于 2013-01-28T14:52:16.793 に答える
0

はい、合計にはCUDAを使用できます。ただし、GPU での合計にかかる時間が CPU での合計にかかる時間よりも短くなるように、要素の数は十分に大きくする必要があります。これはあなたを助けるかもしれません

于 2013-01-28T14:27:14.560 に答える