私はこの本を読んで、CUDAの概念を深く研究しています。SIMTの概念を紹介する章の1つに、
SIMTの制御フロー分岐のオプションは、SSEと比較して、プログラマーが制御フローを処理するために追加の命令を使用するための要件も簡素化します。
このステートメントは、SSEがSIMD実装手法で動作し、CUDAスレッドがSIMTの原理で動作するという事実に基づいて作成されていることを知っていますが、例を使用してこの文を詳しく説明することはできます。前もって感謝します。
SIMDでは、一部の要素を他の要素とは異なる方法で処理する必要があるルーチンがある場合、正しい要素にのみ適用されるように、マスキング操作を明示的に処理する必要があります。CUDAのSIMTアーキテクチャを使用すると、各スレッドで制御フローの錯覚が発生するため、操作を明示的にマスキングする必要はありません。もちろん、これは「内部」で発生しますが、プログラマーの負担は軽減されます。
例:すべての負の要素をゼロに設定するとします。CUDAの場合:
if (X[tid] < 0)
X[tid] = 0; // NB: CUDA core steps through this instruction but only executes
// it if the preceding condition was true
SIMD(SSE)の場合:
__m128 mask = _mm_cmpge_ps(X, _mm_set1_ps(0)); // generate mask for all elements >= 0
X = _mm_and_ps(X, mask); // clear all elements which are < 0