インテル® C++ コンパイラー XE 13.1 ユーザー・リファレンス・ガイド
従来のシリアルプログラムはコールグラフやクラス階層によって構成され、 並列プログラミングはシリアル階層に他のレイヤーを加えて構成されます。 インテル® 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(); // execute strand 1 _Cilk_spawn func_3(); // spawn strand 3 at A do_stuff_2(); // execute strand 2 _Cilk_sync; // sync at B do_stuff_4(); // execute strand 4 ...
インテル® Cilk™ Plus プログラムでは、スポーンは 1 つのストランドを入力とし、2 つのストランドを出力とします。 同期は 2 つ以上のストランド入力と 1 つのストランド出力を持ちます。 次の図は、2 つのスポーンと 1 つの同期を含む DAG です。 このプログラムでは、ストランド (2) と (3)、およびストランド (3)、(4)、(5) がそれぞれ並列に実行される可能性があります。
DAG は、インテル® Cilk™ Plus プログラムの実行のシリアル/並列構造を示します。 同じプログラムでも、入力が異なれば DAG が異なることもあります。 例えば、スポーンは条件に従って実行される場合があります。
DAG は、プログラムが実行されるプロセッサー・コアの数に依存していません。実際、インテル® Cilk™ Plus プログラムがシングルコア・プロセッサーで実行される場合も判断できます。 実行モデルや利用可能なプロセッサー間での作業の分割方法については、後のセクションで説明します。