インテル® C++ コンパイラー 17.0 デベロッパー・ガイドおよびリファレンス
ホルダーは、異なる並列ストランドからの変更を保持する必要がない場合に、共通変数の並列使用を分離するハイパーオブジェクトです。レデューサーと同じように、各並列ストランドはホルダーの異なるビューを確認して操作します。
ホルダーはスレッド・ローカル・ストレージに似ていますが、インテル® Cilk™ Plus の fork-join 構造で動作するように特別に設計されたものです。
ホルダーには次の特性があります。
関数内の最初のスポーン前のホルダーのビューは、(レデューサーの場合のように) それぞれの同期後のビューと同じです。
関数の最初にスポーンした子 (または同期後に最初にスポーンした子) 内のホルダーのビューは、関数へのエントリー時点のビューと同じです。
cilk_for ループに入る前のホルダーのビューは、ループの最初の反復のビューおよびループの最後のビューと同じです。
スポーンの継続処理、または cilk_for ループの任意の反復の最初にホルダーのビューに格納されている値は非決定的です。 一般的にこのような状況では、ホルダーを明示的に既知の状態にすることが推奨されます。
ホルダーは大規模なリファクタリングを行うことなくローカル以外の変数を置き換えることができるため、引数の引き渡しの代わりとして使用することができます。多くの場合、スポーンの後や並列 for ループの反復間においてホルダーのビューは変わりません (ただし、スチールは除く)。ホルダーはこの利点を利用しています。ホルダーのビューが大きなオブジェクトで、構築にコストがかかる場合、ビューごとに個別のローカル・オブジェクトを作成しないようにすることで時間を大幅に節約できます。
さらに、最後の値を保持するホルダーでは、同じプログラムのシリアル部分と同期後の値が同じになります。この特性により、プログラムは値を再計算しなくて済みます。