2

さまざまなメモリ バス使用レベルでプログラムをテストしたいと考えています。たとえば、他のプロセスがメモリ バスの 50% を使用しているときに、プログラムが期待どおりに動作するかどうかを確認したいと考えています。この種の障害をどのようにシミュレートしますか?

私の試みは、複数のスレッドでプロセスを実行し、各スレッドがメモリの大きなブロックからランダムに読み取ることでした。これは私のプログラムに大きな影響を与えるようには見えませんでした。私のプログラムには多くのメモリ操作があるため、重大な障害が発生することが予想されます。バスを飽和させたいが、あまり多くの CPU サイクルを使用せずに、パフォーマンスの低下がバスの競合のみによって引き起こされるようにします。

ノート:

  • Xeon E5645 プロセッサ、DDR3 メモリを使用しています
4

3 に答える 3

3

「プロセスがメモリ バスの 50% を使用する」というメンタル モデルは、優れたものではありません。コアを取得し、キャッシュにないメモリにアクセスするスレッドは、メモリ バスを使用します。

バスを飽和させるスレッドを取得するのは簡単です。memcpy() を使用するだけです。最後のキャッシュに収まる量を数回コピーし、複数回実行してウォームアップして、コードを遅くするページ フォールトが発生しないようにします。

于 2012-06-27T13:22:14.670 に答える
1

私の最初の本能は、CPU をあまり使用せずにデータをバウンスするように一連の DMA 操作をセットアップすることです。これはすべて、実行しているオペレーティング システムとハードウェアによって異なります。これは組み込みシステムですか?コメントで詳しく教えていただけると嬉しいです。

于 2012-06-27T13:04:37.667 に答える
0

SSE2 movntps 命令を使用してデータをストリーミングし、同じコア内の他のスレッドのキャッシュ競合を回避します。おそらく、そのループを 16 回アンロールして、メモリ転送あたりの命令数を最小限に抑えます。DMA のアイデアは良さそうですが、リンクされたマニュアルは古く、32 ビット Linux とプロセッサ モデルの場合、おそらく 64 ビット OS を使用していると思われます。また、テスト コードのバグにより、最悪の場合、ハード ドライブが破損する可能性があります。

于 2012-06-27T19:59:20.317 に答える