0

以下のお手伝いをお願いします。

入力として配列を持つカーネル関数があり、計算後、それらの配列の1つがその値を変更します。これをdev_arrayと呼びます。

カーネル計算の入力としてdev_arrayを約80回使用して、後でメインで使用されるdev_arrayの正しい結果を取得できるようにします。

どうやってやるの?スレッド条件の前に、カーネル内でループを使用してみました。

while(i<80){
   i++;
  if(tidx<N){`
  //calculating dev_array then using it again at the beginning of while
}
}

しかし、それは機能しませんでした。無限ループになっているように見えました。

メインからカーネルを80回呼び出し、常にmemcopyを実行するだけでは不十分です。

while(i<80){
i++;
cudaMemcpy(dev_array,cudaMemcpyHostToDevice);
kernel<<<grid,block>>>(dev_array);
cudaMemcpy(dev_array,cudaMemcpyDeviceToHost);
}

助けてくれてありがとう

4

1 に答える 1

1

常に memcopy する必要はありません。カーネルの実行後、データはデバイス メモリに残り、dev_arrayポインタは常に正しいポイントを指します。

カーネルをループして、関数を実行する回数を繰り返すか、結果を 2 番目のカーネルに渡すことさえできます。

カーネルを次々に呼び出すと、それらがキューで実行され、必要な同期が行われることを保証できます。これは、カーネルが同じ Cudaストリームに属している場合に有効です。ここでは、ストリームとその仕組みについて詳しく知ることができます。

カーネル内で同期を取り、forループを使用する方法を管理できる場合、たとえば__shared__メモリを使用する場合にのみ高速になり、(低速の)グローバルメモリへの読み取りとコピーを常に回避できます。ただし、読み取りと書き込みの競合を回避したい場合、すべてのブロックにバリアを配置する方法はありません。ブロックのスレッドにのみ__syncthreads()使用できます。

于 2013-01-18T13:45:16.920 に答える