インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
インテル® Cilk™ Plus は古い機能 (非推奨) です。代わりに、OpenMP* またはインテル® TBB を使用してください。詳細は、「インテル® Cilk™ Plus の代わりに OpenMP* またはインテル® TBB を使用するためのアプリケーションの移行」を参照してください。
OS スレッドを使用する場合、次の点に注意する必要があります。
ワーカースレッドは OS スレッドである
ランタイムシステムは、ネイティブ OS の機能を使用してワーカースレッドのセットを割り当てます。
インテル® Cilk™ Plus プログラムは常に利用可能なすべてのプロセッサーを 100% 使用するわけではない
インテル® Cilk™ Plus プログラムを実行すると、並列処理がない場合でも、プログラムがシステムのすべてのプロセッサーのリソースを消費しているかのように見えることがあります。特に、Windows* タスク・マネージャーの [パフォーマンス] タブで、1 つのストランドのみ実行している場合に、すべての CPU がビジー状態になることがあります。
実際には、ランタイム・スケジューラーは、CPU をほかのプログラムに譲ります。ただし、プロセッサーを必要としているプログラムがない場合は、スチールする作業を探すために直ちにワーカーが実行され、これにより CPU がビジー状態になります。そのため、プログラムが常にすべてのプロセッサーを使用しているように見えますが、システムやほかのプログラムの妨げとなることはありません。
ネイティブ・スレッド・インターフェイスを使用する場合には注意が必要である
インテル® Cilk™ Plus のストランドは OS スレッドではありません。実行中に、ストランドがワーカー間を移動することはありません。ただし、cilk_spawn、cilk_sync、または cilk_for は 1 つまたは複数のストランドを終了し、1 つまたは複数の新しいストランドを作成するため、これらの文の後にワーカーが変わることがあります。また、特定のストランドを実行するワーカーを制御する方法もありません。
これは、プログラムにいくつかの影響を与えますが、次の点が最も重要です。
Windows* のスレッド・ローカル・ストレージ (TLS) や Linux*/macOS* の Pthread 固有のデータを利用しないでください。これは、OS スレッドは cilk_spawn、cilk_sync、または cilk_for (呼び出された関数を含む) で変わる可能性があるためです。代わりに、前述の holder レデューサーなど、その他のプログラミング手法を使用してください。
OS のロックや mutex は、ロックしたスレッドでないとオブジェクトを解放できないため、cilk_spawn、cilk_sync、または cilk_for 文では使用しないでください。