インテル® C++ コンパイラー 19.0 デベロッパー・ガイドおよびリファレンス
インテル® Cilk™ Plus は古い機能 (非推奨) です。代わりに、OpenMP* またはインテル® TBB を使用してください。詳細は、「インテル® Cilk™ Plus の代わりに OpenMP* またはインテル® TBB を使用するためのアプリケーションの移行」 (英語) を参照してください。
デフォルトでは、ワーカースレッドの数はホストシステム上のコア数に設定されます。ほとんどの場合、デフォルト値で適切に動作します。さらに、各コアで同時マルチスレッディングをサポートするシステムでは、インテル® Cilk™ Plus はすべての利用可能なハードウェア・スレッドを使用します。ただし、インテル® Xeon Phi™ プロセッサーおよびコプロセッサーは例外で、利用可能なハードウェア・スレッド数の半分を使用します。
環境変数を使用してワーカーの数を増減できます。テスト実行やほかのプログラムのリソースを確保するため、利用可能なコア数よりも少ない数のワーカーを使用することができます。場合によっては、オーバーサブスクライブ状態を再現するため、利用可能なコア数よりも多いワーカーを使用することもできます。これは、ワーカーがロックで待機している場合や、シングルコアのマシンで並列プログラムをテストする場合に便利です。
環境変数
環境変数 CILK_NWORKERS にワーカースレッドの数を指定します。
Windows*: set CILK_NWORKERS=4
Linux* および macOS*: export CILK_NWORKERS=4
プログラム制御
プログラムの中で最初のタスクスポーン (cilk_spawn または cilk_for) が実行される前に、__cilkrts_set_param("nworkers","N") を呼び出してワーカー数を指定できます。N は、10 進、16 進 (0x)、または 8 進 (0) で指定できます。この呼び出しは、CILK_NWORKERS 環境変数に設定されている値を上書きします。__cilkrts_set_param を使用する場合は、プログラムで #include <cilk/cilk_api.h> を指定する必要があります。
例:
if (0!= __cilkrts_set_param("nworkers","4")) { printf("Failed to set worker count\n"); return 1; }
インテル® Cilk™ Plus は古い機能 (非推奨) です。代わりに、OpenMP* またはインテル® TBB を使用してください。詳細は、「インテル® Cilk™ Plus の代わりに OpenMP* またはインテル® TBB を使用するためのアプリケーションの移行」 (英語) を参照してください。
キーワードには対応するシリアル・セマンティクスが用意されています。つまり、すべてのインテル® Cilk™ Plus プログラムには、並列化する前の C/C++ プログラムがあります。このような C/C++ プログラムをシリアル・セマンティクスで実行することをシリアル化と呼びます。シリアル化は、インテル® Cilk™ Plus プログラムをデバッグする場合に役立ちます。
シリアル化の方法
ヘッダーファイル cilk_stub.h には、インテル® Cilk™ Plus のキーワードとライブラリーの呼び出しをシリアル形式に再定義するマクロが含まれています。シリアル化するには、次の操作を行います。
インテル® Cilk™ Plus は古い機能 (非推奨) です。代わりに、OpenMP* またはインテル® TBB を使用してください。詳細は、「インテル® Cilk™ Plus の代わりに OpenMP* またはインテル® TBB を使用するためのアプリケーションの移行」 (英語) を参照してください。
並列プログラムのデバッグは、シリアルプログラムに比べると難しくなりがちです。インテル® Cilk™ Plus では、並列プログラムのデバッグをできるだけ簡単にするよう設計されています。並列プログラムをデバッグする場合は、シリアル化してシリアルプログラムのデバッグから始めると良いでしょう。
並列プログラムにおける問題を最小限に抑えるために、次のガイドラインに従ってください。
既存の C/C++ プログラムを並列化する場合は、事前にシリアルプログラムのデバッグとテストを行います。
インテル® Cilk™ Plus を実装したら、最初にシリアル化によってテストとデバッグを行います。シリアルプログラムとインテル® Cilk™ Plus プログラムのシリアル化によるプログラムは、シングルスレッドの C/C++ プログラムなので、既存のデバッグツールや手法を活用できます。
1 つのワーカーで実行します。これは、並列コードで発生している問題の検出や、アルゴリズムの問題の検出に役立ちます。
インテル® Cilk™ Plus プログラムに対応するように拡張されている標準のデバッガー (Linux* および macOS* の場合は gdb、Windows* の場合は Microsoft* Visual Studio* のデバッガー) を使用できます。
並列化したプログラムがシリアル化または 1 つのワーカーでは正しく動作し、複数のワーカーでは正しく動作しない場合は、データ競合の可能性があります。インテル® Cilk™ のデータ競合検出ツール (cilkplus.org Web サイトから入手できるインテル® Cilk™ Plus SDK に含まれています) またはインテル® Inspector を使用してデータ競合を検出します。データ競合が検出された場合、次の操作を行ってみてください。
コードを変更して競合を排除します。
レデューサーを使用します。
相互排他ロック (インテル® スレッディング・ビルディング・ブロックで利用可能な mutex ロックなど)、その他のロック、またはアトミック操作を使用します。
最適化を無効にしたプログラムのほうがデバッグが簡単です。最適化を無効にするとインライン展開が行われず、より正確なコールスタックを参照できます。さらに、コンパイラーによる命令の再配置 (並べ替え) やレジスター割り当ての最適化も行われません。