Wavefront が実行されると、きめ細かなマルチスレッドが提供されます。この結果の 1 つは、次のスライドに示すように、分岐予測の要件がないことです。
しかし、私はこれを理解することができません。誰かがこれを簡単に説明できますか?
Wavefront が実行されると、きめ細かなマルチスレッドが提供されます。この結果の 1 つは、次のスライドに示すように、分岐予測の要件がないことです。
しかし、私はこれを理解することができません。誰かがこれを簡単に説明できますか?
一部の詳細は、実際の GPU アーキテクチャによって異なります。しかし、Trudbert が既に (+1) を与えた答えに加えて、単純化された例:
このようなブランチの場合
if (data[threadIndex] > 0.5) {
data[threadIndex] = 1.0;
}
true
ステートメントが であるスレッドのセットと、ステートメントがであるスレッドの別のセットが存在する場合がありfalse
ます。ステートメントが であるスレッドは、他のスレッドが作業を完了するまでfalse
単に待機しているように想像できます。
同様に、このようなブランチの場合
if (data[threadIndex] > 0.5) {
data[threadIndex] = 1.0;
} else {
data[threadIndex] = 0.0;
}
これは、すべてのスレッドがブランチの両方のパスを実行し、「間違った」パスからの結果が確実に無視されるようにすることを想像できます。これは「予測実行」と呼ばれます。
(これに関するより詳細な情報はGPU Gems 2 の第 34 章にあります)
したがって、「正しい」分岐を予測するメリットがないため (すべてのスレッドがすべての分岐を取得する必要があるため)、分岐予測を導入する理由はありません。