2011-06-30 24 views
1

CUDAでこれを行うにはどのような方法が最適ですか?c forループとcudaの置き換え

... 
for(int i=0;i<size;++i)                    
    for(int j=i+1;j<size ;++j)                   
    temp_norm+=exp((train[i]-train[j])/tau); 

これは同等ですか?

ご協力いただければ幸いです。

答えて

2

どのように実装するのが最適なのかは、どれくらい大きいかによって異なります。sizeしかし、それがかなり大きいと仮定すると、例えば。 1000以上...

あなたが示唆するようにするには、atomicAdd()を使用する必要があります。これは、あまりにも多くのスレッドが同じアドレスにアトミックに追加すると高価になります。より良い方法はおそらく並列削減を使用することです。

NVIDIA CUDA SDKの"reduction"サンプルをご覧ください。

YMMVはテストされていないため、あなたのデータサイズはわかりませんが、このようなものはうまくいくはずです。その例の "reduction6"カーネルを使用しますが、計算を最初のwhileループに追加してください。

unsigned int i = blockIdx.x*blockSize + threadIdx.x; 
unsigned int gridSize = blockSize * gridDim.x; 

igridSizeの初期化を置き換える(注、浮動小数点演算が非結合であるため、並列実装の動作の異なる順序を与えることができる

while (i < size) 
{ 
    for (unsigned int j = i+1; j<size; ++j) 
     mySum += exp((train[j]-train[i])/tau); 
    i += gridSize; 
} 

while (i < n)ループを置き換えますあなたは入力データに応じてバランスの取れた木の削減のために少し正確な答えを与えるかもしれません。)

関連する問題