インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
インテル® 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 ロックなど)、その他のロック、またはアトミック操作を使用します。
最適化を無効にしたプログラムのほうがデバッグが簡単です。最適化を無効にするとインライン展開が行われず、より正確なコールスタックを参照できます。さらに、コンパイラーによる命令の再配置 (並べ替え) やレジスター割り当ての最適化も行われません。