並列実行することで、実行順序、メモリー割り当て、メモリーの初期化などが変更され、それまではなかったバグがプログラムで見つかる可能性があります。
そのようなバグは、シリアル (シングルスレッド) アプリケーションと同じ方法でデバッグできますが、次のような課題があります。
プログラムが毎回同じ順番で実行されません。考えられる原因は次のとおりです。
ロックを最初に取得するスレッドが異なる可能性があります。
new と malloc で返されるポインターが、実行ごと異なる可能性があります。
スレッドが取得する乱数シーケンスが、シリアルバージョンと異なるか、または実行のたびに異なる可能性があります。
スレッドによって削除される共有リストの項目が、実行ごとに異なる可能性があります。
スレッドの動作にデバッガーが影響を及ぼすことがあります。
スレッドは最後にヒットした場合にのみブレークポイントを通過するにもかかわらず、複数回ヒットしたかのように見えることがあります。
スレッド・ローカル・ストレージを調査するのは困難です。
シングルスレッドでバグを再現できるか確認するため、並列バージョンのプログラムのスレッド数を 1 に制限して、シリアルプログラムとして実行します。プログラムを実行する前に環境変数を設定するか、インテル® oneAPI スレッディング・ビルディング・ブロック (oneTBB) の tbb::task_scheduler_init init(1); オブジェクトを使用します。
並列コードのデバッグに貴重な時間を費やす前に、並列ループとその他の並列構造をシリアルコードとして逆の順番で実行してみることを推奨します。これにより、並列プログラムをデバッグしなくても、文の実行順序に依存するプログラムのバグを見つけることができます。
プログラムがシリアルモードで動作し、さらに並列構造がシリアルモードで逆順に動作することを確認したら、インテル® Inspector ツールを使用してほかの競合問題を検出します。