0

合計 32 コアのサーバーでデュアル CPU を大幅に高速化するために OpenMP を利用するプログラムがあります。私が使用している入力パラメータでは、CPU を完全にロードすることはできません。

今日、いくつかのコアが別のプログラムによって 100% ロードされました。プログラムを起動すると、CPU の負荷がいつものようにかなり高い (~2500%) 場合でも、非常に遅くなりました。並列命令を削除したところ、パフォーマンスが向上したことに気付きました。

これはメモリ帯域幅の制限によるものでしょうか? 問題をさらに調査し、最終的にコードを改善するにはどうすればよいですか?

4

1 に答える 1

2

パフォーマンスを低下させるのは必ずしもメモリ アクセスではありません。静的スケジューリング (多くの場合デフォルト) を使用する場合、ループはスレッドに割り当てられるチャンクに分割されます。スレッドが既にビジー状態のコアにバインドされている場合、実行時のパフォーマンスが大幅に低下します。リソースの唯一のユーザーであることが保証されていない環境で実行している場合は、動的スケジューリングを使用してパフォーマンスを向上させることができます。

スケジューリング タイプを指定しなかった場合は、次のようにプログラムを実行します。

OMP_SCHEDULE=dynamic  ./my_program

そして、それが役立つかどうかを確認してください。

于 2013-07-29T22:52:53.547 に答える