OpenMP* およびシリアルコードの不具合の特定

OpenMP* の並列コード領域の実行をシリアル化して、各領域の実行を 1 スレッドに制限すると、不具合の原因が並列処理にあるのか、アルゴリズムにあるのかを特定するのに役立ちます。コード領域のシリアル化は動的に行うことができるため、OpenMP* アプリケーションの再コンパイルや再起動は必要ありません。

プログラムが並列領域を実行中にシリアル化を行うと、その領域はシリアル化されず、それ以降の領域がシリアル化されます。シリアル化を無効にすると、現在の場所よりも後ろにある領域は並列に戻ります。選択した領域をシリアル化する場合、その領域の前後にブレークポイントを設定すると便利です。これにより、選択した領域が実行される前にシリアル化を有効にし、次の領域が実行される前にシリアル化を無効にできます。選択した領域のみをシリアル化すると、アプリケーションの他の部分は並列のままなので、実行時間を短縮できます。

OpenMP* 並列領域をシリアル化するには、次の操作を行います。

  1. シリアル化するコード領域を表示します。
  2. 領域の前の行と後ろの行にブレークポイントを設定します。 これにより、このコード領域だけをシリアル化することができます。
  3. アプリケーションを実行または再実行します。 アプリケーションが最初のブレークポイントで停止します。
  4. シリアル化を有効にします。[Parallel (並列)] > [Serialize Parallel Regions (並列領域のシリアル化)] を選択します。または、idb set openmp-serialization on と入力します。
  5. デバッグを続けます。 アプリケーションが次のブレークポイントで停止します。該当する領域が 1 つのスレッドによって実行されたことがわかります。
  6. シリアル化を無効にします。[Parallel (並列)] > [Serialize Parallel Regions (並列領域のシリアル化)] を選択します。または、idb set openmp-serialization off と入力します。 これ以降の OpenMP* 並列領域は、再度シリアル化を有効にするまで複数のスレッドによって実行されます。

同じ領域をシリアルで実行するには、毎回最初のブレークポイントでシリアル化を有効にし、次のブレークポイントでシリアル化を無効にする必要があります。

関連情報


このヘルプトピックについてのフィードバックを送信