インテル® C++ コンパイラー 19.0 デベロッパー・ガイドおよびリファレンス
インテル® Cilk™ Plus は古い機能 (非推奨) です。代わりに、OpenMP* またはインテル® TBB を使用してください。詳細は、「インテル® Cilk™ Plus の代わりに OpenMP* またはインテル® TBB を使用するためのアプリケーションの移行」 (英語) を参照してください。
従来のシリアルプログラムはコールグラフやクラス階層によって構成され、並列プログラミングはシリアル階層に他のレイヤーを加えて構成されます。インテル® Cilk™ Plus プログラムの並列パフォーマンスを図表化し、理解し、解析するためには、シリアルに実行されるコード領域と並列に実行されるコード領域を切り分ける必要があります。
ストランドとは、プログラムのシリアル領域を示します。より正確には、「並列制御構造を含まない一連の命令」と定義されます。
この定義によると、シリアルプログラムは一連のストランドからなり、それぞれのストランドは、短いものでは 1 命令、長いものではプログラム全体になります。最大ストランドとは、開始ポイントと終了ポイントが並列制御構造である、長いストランドの一部ではないストランドのことです。
インテル® Cilk™ Plus プログラムには、スポーン (spawn) と同期 (sync) という 2 つの並列制御構造があります。(_Cilk_for のような並列ループは、問題をスポーンと同期に分解する便利な方法です。) 次の図は、(A) でスポーンし、(B) で同期する 4 つのストランド (1、2、3、4) から成るプログラムを示します。ここでは、ストランド (2) と (3) のみ並列で実行されます。
ストランドは直線と曲線で、並列制御構造は丸いノードで表されています。このストランドの図は、プログラムのシリアル/並列構造を表す有向非巡回グラフ (DAG) です。
以下に、この構造に対応するインテル® Cilk™ Plus プログラムを示します。
... do_stuff_1(); // ストランド 1 を実行する cilk_spawn func_3(); // A でストランド 3 をスポーンする do_stuff_2(); // ストランド 2 を実行する cilk_sync; // B で同期する do_stuff_4(); // ストランド 4 を実行する ...
インテル® Cilk™ Plus プログラムでは、スポーンは 1 つのストランドを入力とし、2 つのストランドを出力とします。同期は 2 つ以上のストランド入力と 1 つのストランド出力を持ちます。次の図は、2 つのスポーンと 1 つの同期を含む DAG です。このプログラムでは、ストランド (2) と (3)、およびストランド (3)、(4)、(5) がそれぞれ並列に実行される可能性があります。
DAG は、インテル® Cilk™ Plus プログラムの実行のシリアル/並列構造を示します。同じプログラムでも、入力が異なれば DAG が異なることもあります。例えば、スポーンは条件に従って実行される場合があります。
ほとんどのインテル® Cilk™ Plus プログラムはストランド不変です。つまり、指定された入力に対して、プログラムの実行は、使用されるプロセッサー数に関係なく、常に同じ DAG を生成します。ストランド不変プログラムの DAG を特定するには、シングル・プロセッサーでの実行で十分です。実行モデルや利用可能なプロセッサー間での作業の分割方法については、後のセクションで説明します。