このアルゴリズムについては、次の論文で説明されています: Thread Scheduling for Multiprogrammed Multiprocessors。簡単に言えば、計算はプロセスに分散され、各プロセスにはジョブを実行するためのスレッドのキューがあります。プロセスはスレッドをその両端キューの下部に (から) プッシュ (ポップ) でき、他のプロセスはスレッドを上部からポップすることでそこから盗むことができます。このように、プッシュ操作によって動的にワークを作成することができます。アルゴリズムは以下です。
私の質問は、popTop() のワーク スチール機能に関するものです。すべての場合に適切に機能するとは思いません。たとえば、キュー Q を持つプロセス A と、popTop() を呼び出して Q から作業を盗もうとしているプロセス B を想定します。また、この時点で popTop() の 2 行目以降で B がプリエンプトされ、localBot = X であるとします。A が実行され、popBottom() が Q <= X の最後まで実行された場合、B が実行を再開すると、A によって既に処理されたスレッドが取得されます。
私の考えは正しいですか?CUDAプログラムでワークバランシングを行うために実装するので、検証する必要があります。