1

問題のプログラムは、単一の入力データ ファイルと単一の出力データ ファイルで動作します。入力からデータ ユニットを取得し、データのいくつかの統計的特性を計算し、特性を出力に入れます。

プログラムが CPU バウンドであることが発見されました。CPU 使用率は常に 99% であり、読み取りと書き込みよりも計算に時間がかかります。ハードウェアに 32 個の CPU が搭載されているため、OpenMP を使用してプログラムを並列処理版に変換することにしました。ただし、複数の並列スレッドが単一の出力に書き込みたい場合があるため、書き込み競合状態につながる可能性があることは明らかです。

そのような種類のプログラムを OpenMP 対応および OpenMp セーフにするために必要な手順は何ですか? コードを変更せずに OpenMP* プラグマだけで簡単に実現できますか? または、以前に実装されたロック メカニズムが必要ですか?

4

1 に答える 1

1

コードを並列化する難しさは、ほとんどの時間を消費するルーチンの複雑さに大きく依存します。

並列計算を行う前に最初に行うべきことは、コードのプロファイリングを行い、CPU 時間の大部分を正確に引き起こしている関数を特定することです。

それができたら、次の質問を自問する必要があります。

  • データの依存関係はありますか?
  • はいの場合、特定の手頃な価格のデータ構造のコピーを作成することでそれらを取り除くことができますか?
  • そうでない場合、それらは読み取り/書き込みまたは読み取り専用ですか?
  • それらが読み取り/書き込みである場合、それらがアクセスされる頻度-それに応じて適切なロックメカニズムを選択してください。
  • 読み書き可能なグローバル変数はありますか? はいの場合 - それらをスレッドローカルにすることはできますか? そうでない場合は、それらを取り除きます。
  • すべてをソートしたら、入力をスレッドに分割する最善の方法を決定します (詳細については、OpenMP スケジューリングを参照してください)。
  • プラグマの作成、コードの再配置、関数のスレッドセーフ/再入可能化を開始します。
  • 最後のバスト: デバッグ、デバッグ、デバッグ。マルチスレッド アプリケーションで再現可能な入出力の小さな例を設計するようにしてください。

最後の質問に答えるには:stdioライブラリ呼び出しはすべてスレッド セーフです。それらは内部ロックを使用します。

最初の 1 つのヒント#pragma omp parallel: デフォルトでは、すべての変数が共有され、それらを使用不可として定義し、変数ごとに個別に共有/非公開を指定します。それ以外の場合、これはバグの一般的な落とし穴です。

#pragma omp parallel default(none)
于 2013-09-12T08:03:11.467 に答える