14

私が使用していて大量のメモリを必要とするプログラムが、メモリ帯域幅によって制限されているかどうかを知りたいです。

これはいつ起こると思いますか?現実のシナリオであなたに起こったことはありますか?

この問題について議論しているいくつかの記事を見つけました。

最初のリンクは少し古いですが、この効果を確認するには、浮動小数点変数ごとに約 1 ~ 40 未満の浮動小数点演算を実行する必要があることを示唆しています (間違っている場合は修正してください)。

特定のプログラムが使用しているメモリ帯域幅を測定するにはどうすればよいですか? また、システムが提供できる (ピーク) 帯域幅を測定するにはどうすればよいですか?

ここでは、複雑なキャッシュの問題については説明しません。CPUとメモリの間の通信にのみ興味があります。

4

4 に答える 4

9

システムのメモリ パフォーマンスをベンチマークするには、STREAM ベンチマークを試してください。ベンチマーク タスクと得られた結果を注意深く調べてください。それらは、さらに何かを行うために必要なメモリに関する基本的なデータを提供するからです。キャッシュの影響を把握する必要があります-それらを理解する必要があります-帯域幅がピークに達する時期。

プログラムのメモリ パフォーマンスを把握するには、次のようにします。

  1. さまざまな問題サイズの実行時間を測定します。
  2. 同じ範囲の問題サイズで、プログラムがメモリとの間で読み書きするデータ量を手計算します。
  3. メモリ使用量を時間で割ります。

警告: これは大まかなアプローチであり、メモリ帯域幅の問題に注意を払う必要があるかどうかを判断するためにのみ使用してください。大雑把な計算で、プログラムが使用可能なメモリ帯域幅 (当時の STREAM ベンチマークから取得した数値) の 50% 未満を使用していることがわかる場合は、それ以上考えるべきではありません。

この大雑把なアプローチは、プログラムが単純なアクセス パターンで非常に少数の非常に大きなデータ構造を操作する場合に最適です。これは多くの高性能科学プログラムを説明していますが、おそらく他の多くの種類のプログラムについては説明していません。

プログラムが仮想メモリを使用している場合、または実行時に I/O を行っている場合、ディスク帯域幅を整理するまでメモリ帯域幅は問題になりません。

最後に、はい、科学的コードの 1 つを実行するたびに、実行速度はメモリ帯域幅によって制限されます。経験則として、プロセッサの仕様で約束されている FLOPS の 10% をコードが実行できれば満足です。

于 2010-06-02T05:51:42.953 に答える
8

メモリを集中的に使用するアプリケーションまたは大量のメモリを必要とするアプリケーションは、次の制限を受けます。

  1. プロセッサ外の RAM の速度
  2. プロセッサ内のキャッシュの速度
  3. メモリ バスを共有するエンティティの数
  4. 仮想メモリ

残念ながら、これらの制限はプログラムのパフォーマンスの主要な要因ではありません。より大きな効果は次のとおりです。 CPU の量、I/O 操作、およびプログラムで実行されるその他のタスク。これらの項目を変更すると、メモリ帯域幅に影響する項目を変更するよりも、プログラムに大きな影響を与えます。

1. プロセッサ外の RAM の速度
プロセッサはシェルの外に出て、RAM から命令とデータを取得する必要があります。RAM は、セルにアクセスしてビットをプロセッサに戻す速度が異なります。通常、これは Hz 単位でマークされます。メモリが高速であるほど、プロセスが命令とデータのロードに費やす時間が短縮され、プログラムの実行が高速になります。

注:プロセッサの能力を超えてメモリの速度を上げても、パフォーマンスは向上しません。ボトルネックを RAM からプロセッサに変更します。#3も参照してください。

2. プロセッサ内のキャッシュの速度 キャッシュ メモリは、プロセッサのシェル内にあります。これは、利用可能な最も高速なタイプのメモリの 1 つです。プロセッサは、RAM を検索する前にこのメモリを検索します。他のコアもこのメモリにアクセスしていない限り、このメモリの速度と量を改善すると、プロセッサのパフォーマンスが向上します。複数のコアがメモリにアクセスする場合、競合の解決が必要であり、アプリケーションのパフォーマンスが低下する可能性があります。

注:別のプロセッサを入手する以外に、キャッシュ メモリのサイズを高速化または変更するためにできることはありません。キャッシュは、人間やロボットの手で簡単に変更できるものではありません。

3. メモリ バスを共有するエンティティの数
メモリ バスは、エンティティが RAM に到達するために使用する高速道路のようなものです。高速道路と同様に、レーン数が多いほどスループットが速くなります (例: 16 ビット幅と 32 ビット幅)。多くのバスには速度制限もあり、速度制限が高いほどアクセスが速くなります。おそらく最も注目すべき概念は、バスに接続されているエンティティの数です。高速道路と同様に、より多くのユーザーがトラフィックを遅くします。ほとんどのメモリ バスでは、一度に 1 つのエンティティしか使用できません。他のエンティティは待機する必要があります。メモリ バスを使用する必要があるエンティティの数を減らすと、プログラムが高速化されます。

メモリ バスを共有するいくつかの一般的なエンティティ: CPU、DMA コントローラ、ビデオ プロセッサ、サウンド プロセッサ、およびネットワークまたは I/O プロセッサ。

4. 仮想メモリ。 最近のコンピュータの多くは、仮想メモリを採用しています。プログラムが RAM で使用可能なメモリよりも多くのメモリを必要とする場合、オペレーティング システムはメモリのセクションをハード ドライブ上の領域とスワップします。これにより、メモリの動作速度が低下するよりもパフォーマンス時間が長くなります。メモリ集約型プログラムは、必要なすべてのメモリを使用するよりも、割り当てられたメモリのみを使用する方が効率的です。これらの仮想メモリ スワップを減らすと、プログラムが高速化されます。


要約すると、アプリケーションを実行できる最大速度があります。メモリ (内部キャッシュと外部 RAM の両方) が上限の要因となっています。アプリケーションがこの制限に達するのを妨げる大きな要因があります。これらの要因の一部は、I/O 操作、およびその他の同時タスクです。プログラムの設計と実装も速度低下の一因となる可能性があります。メモリ アクセス速度の上限を変更するよりも、I/O 操作、同時実行タスクを排除し、ソフトウェアを再設計することで、より多くのパフォーマンスを得ることができます。これらの制限を変更すると、プログラムのパフォーマンスが向上しますが、他の手法ほど劇的ではありません。

于 2010-06-01T20:03:51.013 に答える
3

あなたの質問の範囲が広く一般的であるため、最も広い意味で回答することはほとんど不可能です.

1 つのキャッシュ ラインのデータを処理するのに必要な CPU サイクル数が、1 つのキャッシュ ラインを読み取るのに必要な CPU サイクル数よりも少なく、処理されるデータ セットが CPU のデータ キャッシュよりもかなり大きい場合、プログラムが CPU バウンドになることが予想されます。 . 画像処理は、これがよくある例の 1 つです。

特定のプログラムが使用しているメモリ帯域幅を測定するにはどうすればよいですか? また、システムが提供できる (ピーク) 帯域幅を測定するにはどうすればよいですか? 1 つ目は、メモリ アクセスが完了するのを待たなければならないために CPU がストールしたサイクル数をカウントするある種のパフォーマンス カウンタが CPU でサポートされている場合にのみ (ソフトウェアで) 測定できます。
2 つ目は簡単に測定できます。通常は、メモリの大きな領域を埋めたりコピーしたりします。使用できるベンチマーク プログラムは無数にあります (私は何年も使用していませんが、SandraPCMarkが思い浮かびます。これを行うフリーウェア ユーティリティもたくさんあるはずです)。

于 2010-06-01T19:03:18.713 に答える
1

メモリ帯域幅によって制限されているプログラムでは、算術/論理演算に対するメモリ参照 (ロードおよび/またはストア操作) が高くなります。例は、daxpy、ddot などの BLAS1 ルーチンです。

コード トップ ルーチン (フラット プロファイルから) にロード/ストアする算術演算が多い場合、メモリ帯域幅の影響はあまりありません。最適化された行列間乗算の LINPACK がその例です。

于 2011-04-19T22:46:52.190 に答える