インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
インテル® Cilk™ Plus は古い機能 (非推奨) です。代わりに、OpenMP* またはインテル® TBB を使用してください。詳細は、「インテル® Cilk™ Plus の代わりに OpenMP* またはインテル® TBB を使用するためのアプリケーションの移行」を参照してください。
__cilkrts_get_pedigree(void);
この関数は、現在のペディグリー (系図) の最下位ノードを返します。
インテル® Cilk™ Plus は、ペディグリー (そのストランドになる計算のスポーンと同期の履歴を反映する 64 ビット整数のシーケンス) における実行ストランドを識別します。2 つのストランドには常に別々のペディグリーが含まれます。ストランドの現在のペディグリーは cilk_spawn、cilk_sync、または cilk_for で変更され、cilk_for ループの粒度が異なります。現在のペディグリーは __clkrts_bump_worker_rank() の呼び出しの後にも変更されます。
ペディグリーは、ペディグリー・ノード (型 __cilkrts_pedigree) のリンクリストで表現されます。このリストはシングルリンクで、ペディグリー・ノードを逆順 (つまり、最下位のノードから最上位のノード) にストアします。各ペディグリー・ノードは、64 ビット整数ランクと次の (より上位の) ペディグリー・ノードへの const "親" ポインター (ノードがリストの最後の場合は null) が含まれる構造体です。この関数の戻り値は、現在のペディグリーの最下位ノード (つまり、リストの先頭) のコピーです。
プログラムのシリアル実行では、ペディグリーはストランドの移行ごとに辞書順で増加します。シリアル実行と同じストランド群を生成するプログラムの並列実行では、それぞれの実行で対応するストランドのペディグリーが一致する必要があります。
以下は、__cilkrts_get_pedigree() のガイドラインです。
ペディグリーを検査するアプリケーションは、__cilkrts_pedigree ノードのリンクリストを調べてランク値を保存してください。
アプリケーションで __cilkrts_pedigree リストのエントリーを修正しないでください。リストは __cilkrts_get_pedigree() を呼び出した関数の最後まで有効です。
アプリケーションで __cilkrts_pedigree エントリーへのポインターを保存しないでください。ペディグリーを保存するには、ペディグリーのランク値を自身の構造体にコピーします。
インテル® Cilk™ Plus ランタイム以外で生成された複数の OS スレッドを実行するインテル® Cilk™ Plus プログラムでは、異なる OS スレッドで実行するストランドは最上位ペディグリー・ノードが異なります。ランタイムは、このようなプログラムの実行で最上位ペディグリー・ノードが同じになることを保証しません。
アプリケーションは、ペディグリーの特定のランク値ではなく、2 つのペディグリーを比較した結果にのみ依存すべきです。異なるフラグを利用してプログラムをコンパイルすると、冗長または暗黙の cilk_sync 文が最適化中に削除され、ペディグリーのランク値が変わることがあります。