インテル® C++ コンパイラー 19.0 デベロッパー・ガイドおよびリファレンス
インテル® Cilk™ Plus は古い機能 (非推奨) です。代わりに、OpenMP* またはインテル® TBB を使用してください。詳細は、「インテル® Cilk™ Plus の代わりに OpenMP* またはインテル® TBB を使用するためのアプリケーションの移行」 (英語) を参照してください。
レデューサーは、データ競合を引き起こすことなく、並列コードで変数を段階的に更新して値を計算します。概念的には、レデューサーとは、並列に実行している複数のストランドが安全に使用できる変数です。ランタイムシステムは、各ワーカーが変数のプライベート・コピーにアクセスすることを保証し、ロックを使用せずにデータ競合の可能性を排除します。ストランドが同期するときに、それぞれの変数のインスタンスは 1 つの変数にマージ (レデュース) されます。
レデューサーには、いくつかのメリットがあります。
レデューサーにより、データ競合を引き起こすことなく、非ローカル変数へ確実にアクセスできます。
レデューサーはロックを必要としません。そのため、ロックを使用して非ローカル変数を保護する際に発生するロック競合 (およびそれに伴う並列化の損失) を回避できます。
正しく定義および使用された場合、レデューサーはシリアル・セマンティクスを保持します。レデューサーを使用するプログラムの結果は、シリアルバージョンと同じで、プロセッサー・コア数やワーカーのスケジュール方法に影響されません。
レデューサーは、オーバーヘッドを最小限に抑えるように、効率的に実装されています。
レデューサーは、ループなどの特定の制御構造に対して定義される構造とは異なり、プログラムの制御構造と関係なく使用できます。
レデューサーは、既存のコードを大幅に変更しなくても使用できます。
レデューサーは、ランタイムシステムにインターフェイスを提供する C++ テンプレートで定義されます。
独自のレデューサーを記述する場合は、「上級者向けトピック: 新しいレデューサーの記述方法」に詳細があります。