インテル® C++ コンパイラー 19.0 デベロッパー・ガイドおよびリファレンス

インテル® Cilk™ Plus プログラムのデバッグ

インテル® 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 では、並列プログラムのデバッグをできるだけ簡単にするよう設計されています。並列プログラムをデバッグする場合は、シリアル化してシリアルプログラムのデバッグから始めると良いでしょう。

並列プログラムにおける問題を最小限に抑えるために、次のガイドラインに従ってください。

最適化を無効にしたプログラムのほうがデバッグが簡単です。最適化を無効にするとインライン展開が行われず、より正確なコールスタックを参照できます。さらに、コンパイラーによる命令の再配置 (並べ替え) やレジスター割り当ての最適化も行われません。