0

たとえば、特定のスレッドが同じワープにある方がよいように、CUDA プログラムで動的分析が行われたとします。

たとえば、1024 個の cuda スレッドと 32 のワープ サイズがあるとします。動的分析の結果、スレッド 989、243、819、...、42 (リストされている合計 32 個のスレッド) が同じワープ上にあることがわかります。コードの実行にほとんどまたはまったく相違がないため、これらは同じワープにある必要があると判断しました (CUDA プログラムの動的解析を実行するときに、必ずしも同じワープにあるとは限りません)。

CUDA でスレッドを制御してスケジューリングをワープする方法はありますか? そうでない場合、この明示的なワープ スケジューリングを提供する別の GPU プログラミング言語はありますか。そうでない場合、何ができるでしょうか (おそらく、この問題を解決するための非常に低レベルのアプローチでさえ)? ハードウェア レベルでワープ スケジューリングが行われない限り、CUDA がおそらくどのように実装されたのか、この最後の質問に対する答えが少なくともあることを願っています。ありがとう!

4

1 に答える 1

2

いいえ、ワープへのスレッドの割り当てを選択することはできません。このステートメントのサポートについては、こちらで説明しています

ただし、スレッドの動作に特定の文字を持たせるのは、ハードウェアにロックされているものではなく、記述したスレッド コードです。それがデータ アクセス パターンであろうと、制御フローを通る特定のパスであろうと、すべてプログラマによって制御されます。

CUDA スレッドがその性質を引き継ぐ主な方法の 1 つは、グローバルに一意のスレッド ID を生成することです。これは、CUDA コードの典型的なボイラープレートです。

int idx=threadIdx.x+blockDim.x*blockIdx.x;

スレッドごとに、標準的でグローバルに一意な 1D スレッド インデックスを作成します。

しかし、そうしなければならない特別な理由はありません。私は同じように簡単に行うことができます:

int private_idx = threadIdx.x+blockDim.x*blockIdx.x;
int idx = desired_idx[private_idx];

スレッドには任意の順序で番号を付けることができます。あなたdesired_idxが提案したように配列に数字のグループがあった場合:

989, 243, 819, ..., 42

次に、それらの隣接するスレッドは、その順序と一致する動作を行います。

于 2017-03-24T22:27:55.090 に答える