インテル® C++ コンパイラー 17.0 デベロッパー・ガイドおよびリファレンス

simdoff

SIMD レーンの論理的な順序でシリアルに実行すべきループのコードブロックまたは SIMD 対応関数を指定します。

構文

#pragma simdoff

structured-block

引数

なし。

説明

simdoff ブロックは、1 つの SIMD レーンを使用して、ループの反復または SIMD 対応関数の論理的なレーンの順序で操作を実行します。 ブロック内の操作の順序が保持され、囲まれた SIMD 構造の反復空間に関連付けられます。 ordered simd ブロックは、各 SIMD レーンまたは各ループ反復順に実行されます。 ordered 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; // 同じクラスターの複数のアップデートを処理するため順序設定が必要
    }
}