(A ⊕ B) ⊕ C ?? (⊕は何らかの二項演算子) 例: 浮動小数点数はこれを満たさない (Pseudo-Associative) 可換性 (Commutativity) A ⊕ B = B ⊕ A ?? (⊕は何らかの二項演算子) 例: 減算や除算、ベクトルの外積、行列の積などはこれを満たさない 決定性 (Determinism) 実行の度や計算デバイスを変えた際に結果が一致するか否か 結合性にも強く依存する Run-to-Run Determinism: 実行の度に結果が変わらない保証 プリミティブで扱う対象は単純な数値以外にも拡張することができる 例: ベクトル型、AABBなど リダクションやスキャンにおいては主に二項演算子を定義することで任意の型に対応する
• パーティション数 < 1つのスレッドグループで高速に扱えるサイズ • パーティションごとのリダクション、別バッファーに結果を書き込む • パーティションあたりスレッドグループが何度かループ • リダクション結果のスキャン、パーティションごとのオフセットを得る • パーティションごとのスキャン、オフセットとスキャン結果を加算(⊕)して結果出力 • パーティションあたりスレッドグループが何度かループ Input Buffer Dispatch 1: Partition-wise Reduction Reduction Buffer Dispatch 2: Scan b 1 b 2 b 3 b 4 b B-1 b B p 1 p 2 p P Input Buffer p 1 p 2 p P Dispatch 3: Partition-wise Scan + Offset
R R R R X p-8 p-7 p-6 p-5 p-4 p-3 p-2 p-1 p Partition Thread 7 6 5 4 3 2 1 0 スレッドごとにひとつのデスクリプターのステータスを読む • ひとつでもXがあれば待機 • すべてRなら Exclusive Prefixにすべてのリダクション値を累積してさらに前方の複数パーティションを読む • ひとつでもPがあれば 直近のPに該当するInclusive PrefixとそこまでのRに該当するリダクション値の累積 Exclusive Prefixにセットして終了 (これもWave内命令を使って高速に処理できる) P P P R R R R R p-8 p-7 p-6 p-5 p-4 p-3 p-2 p-1 p Partition Thread 7 6 5 4 3 2 1 0 (p-6の値) + (p-5の値) + … + (p-1の値) = (pにおけるExclusive Prefix)