インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
インテル® Cilk™ Plus は古い機能 (非推奨) です。代わりに、OpenMP* またはインテル® TBB を使用してください。詳細は、「インテル® Cilk™ Plus の代わりに OpenMP* またはインテル® TBB を使用するためのアプリケーションの移行」を参照してください。
インテル® Cilk™ Plus プログラムの実行では、ペディグリー (64 ビット整数の可変長シーケンス) により個々の最大ストランドが識別されます。インテル® Cilk™ Plus は、現在実行中のストランドのペディグリーを問い合わせることができる API を提供しています。
概念的には、プログラムの実行において、現在実行中のストランドのペディグリーは最大ストランド境界で変わります。最大ストランド境界は、cilk_spawn、cilk_sync、および cilk_for の各チャンクで発生します。
ペディグリーには、3 つの主な特性があります。
一意: 実行 DAG 中の各最大ストランドのペディグリーは異なります。
辞書順序: インテル® Cilk™ Plus プログラムのシリアル実行で、ストランドのペディグリーは「辞書」順序で増加します。
決定論性: ストランド不変プログラムにより生成される実行 DAG において、DAG 中の各ストランドのペディグリーは、プログラムを実行するたびに常に同じになります。
例えば、次のインテル® Cilk™ Plus プログラムについて考えてみます。
int fib(int n) { if (n < 2) { return n; } else { int x, y; x = cilk_spawn fib(n-1); y = fib(n-2); cilk_sync; return x+y; } } int main(void) { int ans = fib(4); printf("fib(4) = %d\n", ans); return 0; }
このプログラムは、ラベル A ~ M までの 13 のストランドを含む、実行 DAG を生成します。次に、ストランドにペディグリーを割り当てる 1 つの有効な方法を示します。ストランド H のペディグリーは [0, 0, 2] です。最初の 0 は最上位、最後の 2 は最下位を示します。各ストランドのペディグリーは一意なので特性 1 を満たします。そして、プログラムのシリアル実行は、ストランドをアルファベット順 (A から M の順) に実行し、各ストランドのペディグリーは辞書順序で増加するため、特性 2 も満たします。最後に、このプログラムはストランド不変なので、特性 3 により、プログラムを実行するたび、各ストランドに常に同じペディグリーが割り当てられることが保証されます。