0

私は、微分方程式を扱うプログラムを並列化するための単純な OpenMP コードを作成するように依頼されたプロジェクトに取り組んでいます。また、コンパイラの最適化を行った場合と行わない場合のコードのパフォーマンスをテストするよう依頼されました。私は Sun CC コンパイラを使用しているので、最適化されたバージョンではオプションを使用しました

-xopenmp -fast

および最適化されていない場合

-xopenmp=noopt

当然のことながら、コンパイラの最適化をオンにした場合の実行時間は、他の場合よりもはるかに短かった. 驚いたことに、最適化されていないバージョンの方がスケーリングのパフォーマンスがはるかに優れています。ここで、パフォーマンスとは、スピードアップ係数を意味します。これは、M 個のプロセッサで実行されたプログラムの実行時間と、1 個のプロセッサで実行されたプログラムの実行時間の比率です。

これは、最適化されたバージョンがメモリにバインドされているのに対し、最適化されていないバージョンは CPU にバインドされているという事実に依存する可能性があることが示唆されました。「境界」がコードのスケーリング機能にどのように影響するかはわかりません。何か提案はありますか?

4

1 に答える 1

0

ほとんどのマルチプロセッサ システムでは、複数の CPU コアがメモリへの 1 つのパスを共有します。特定の出力バイナリには、スレッドごとに特定の固有の計算強度 (アクセスされたバイトあたりの計算) があります。コードを実行しているコアの数が、それをサポートするために必要なメモリ帯域幅を超える操作速度を超えると、コアの追加によるスケーリングが停止します。この種の問題についてどのように推論するかをよく理解するには、「ルーフライン モデル」を参照してください。

最適化を有効にすることで期待できる変化が 2 つあります。そのうちの 1 つは、メモリ アクセスを削減するために最適化によって何らかの種類のループ ブロッキングが提供される場合、計算強度がいくらか増加することです。もう 1 つは、ベクトル化の機会をより適切に特定し、その後の命令の選択とスケジューリングを行うことで、生の操作率が向上することです。これらの 2 つのことは、スケーリング効率に反対の影響を与えるはずですが、後者が明らかに支配的です。

于 2013-01-17T21:43:22.273 に答える