0

一般に、アプリケーションでスレッド同期を使用することはあまりありませんでした。この機能はあまり必要としなかったからです。私は C/C++ の上級プログラマではありませんが、初心者でもありません。CPU のパワーと比較して、最近の GPU のパワーに興奮して CUDA C を学び始めました。そして、CUDA プログラミングは主に並列スレッド実行に関するものであり、時には適切なスレッド同期が必要であることに気づきました。実際、C や C++ でスレッド同期を適用する方法もまだ知りません。最後に同期を使用したのは約 2 年前で、Java で次のような単純なアプリを作成していました。

synchronized returnType functionName(parameters)
{
    ...
}

'functionName' を一度に 1 つのスレッドだけで実行できるようにするもの - つまり、この関数は異なるスレッドによって交互に実行されます。CUDA C に戻ります。たとえば、ブロック内に while ループ内でコードを実行する 200 のスレッドがあるとします。

while(some_condition)
{
    ...
}

スレッド <0 - 99> を互いに同期させ、スレッド <100 - 199> も互いに同期させるにはどうすればよいでしょうか。最初の 100 スレッドが「while」の内容を実行し、その後、次の 100 スレッドが「while」の内容を実行するなど)?

4

1 に答える 1

4

cuda についてもっと学ぶ必要があるかもしれません。以前に学んだプログラミング パラダイムをここで適用する必要があると考える罠に陥っている可能性があります。そうであるかどうかはわかりません。

しかし、あなたの質問に答えるために、最初に、CUDA でのスレッド同期はスレッドブロック内でのみ可能であることを指摘させてください。したがって、私のコメントはそこにのみ適用されます。

デバイス コードの主な同期メカニズムは__syncthreads()です。あなたが説明した行に沿って大まかに使用するには、次のようにコーディングできます。

__syncthreads();
if (threadIdx.x < 100){
   // code in this block will only be executed by threads 0-99, all others do nothing
  }
__syncthreads();
if ((threadIdx.x > 99) && (threadIdx.x < 200)){
  // code in this block will only be executed by threads 100-199, all others do nothing
  }
// all threads can begin executing at this point

スレッドブロック内のスレッドでさえ、すべてがロックステップで実行されているわけではないことに注意してください。SM (CUDA GPU のスレッドブロック処理ユニット) は通常、スレッドブロックをワープと呼ばれる 32 個のスレッドのグループに分割し、これらのワープは実際には (多かれ少なかれ) ロックステップで実行されます。ただし、何らかの理由でそれを実行したい場合、スレッドのグループ間で実行を順序付けするという点で、上にリストしたコードには、説明した効果があります。

于 2013-05-23T22:52:14.607 に答える