インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
SIMD レーンの論理的な順序でシリアルに実行すべきループのコードブロックまたは SIMD 対応関数を指定します。
#pragma simdoff |
structured-block
なし。
simdoff ブロックは、1 つの SIMD レーンを使用して、ループの反復または SIMD 対応関数の論理的なレーンの順序で操作を実行します。ブロック内の操作の順序が保持され、囲まれた SIMD 構造の反復空間に関連付けられます。simd ブロックは、各 SIMD レーンまたは各ループ反復順に実行されます。simd または simdoff ブロック内の操作は、オリジナルの実行セマンティクスが保持される限り、最適化によって並べ替えることができます。
simdoff ブロックは、SIMD 実行を妨げている状況の切り離しと解決を可能にします。これには、反復間のデータ依存関係、副作用のある関数呼び出し (OpenMP*、インテル® TBB、およびネイティブ・スレッドの同期プリミティブなど) が含まれます。
simdoff セクションは、データ並列計算で繰り返し間の依存関係を解決するのに役立ちます。例えば、次のように、simdoff セクションでヒストグラムをアップデートすることができます。
例 |
---|
#pragma simd for (int i = 0; i < N; i++) { float amount = compute_amount(i); int cluster = compute_cluster(i); #pragma simdoff { totals[cluster] += amount; // 同じクラスターの複数のアップデートを処理するため順序設定が必要 } } |