4

時々大量のメモリを複製しなければならないリアルタイムシステムを設計しています。メモリは非小さな領域で構成されているため、コピーのパフォーマンスは、関連するコンポーネント(CPU、RAM、MB)が実行できる最大帯域幅にかなり近いと思います。これにより、現代のコモディティマシンはどのような生のメモリ帯域幅を集めることができるのだろうかと思いました。

私の古いCore2Duoは、1つのスレッドを使用すると1.5 GB / sにmemcpy()なります(両方のコアを同時に使用する場合は当然少なくなりmemcpy()ます)。1.5GBはかなりの量のデータですが、作業中のリアルタイムアプリケーションには1/50秒のようなもので、30MBを意味します。基本的に、ほとんど何もありません。そしておそらく最悪の場合、複数のコアを追加すると、必要な複製ステップのパフォーマンスを向上させることなく、より多くのデータを処理できます。

しかし、最近のローエンドのCore2Dueは必ずしもホットなものではありません。現在および近い将来のハードウェアのrawメモリ帯域幅に関する実際のベンチマークなどの情報を提供しているサイトはありますか?

さらに、メモリ内の大量のデータを複製するためのショートカットはありますか、それともmemcpy()それが得られるのと同じくらい良いですか?

短時間でできるだけ多くのメモリを複製する以外に何もすることがないコアの束を考えると、私ができる最善のことは何ですか?

編集:私はまだ生のメモリコピーのパフォーマンスに関する良い情報を探しています。古いmemcpy()ベンチマークを実行しました。同じマシンと設定で、2.5GB/秒になります...

4

2 に答える 2

2

Nehalemなどの新しいCPU、およびOpteron以降のAMDでは、メモリは1つのCPUに対して「ローカル」であり、1つのCPUに複数のコアが含まれる場合があります。つまり、コアがCPUに接続されているローカルメモリにアクセスするのに一定の時間がかかり、コアがリモートメモリにアクセスするのにさらに時間がかかります。リモートメモリは他のCPUにローカルなメモリです。これは、不均一メモリアクセスまたはNUMAと呼ばれます。最高のmemcpyパフォーマンスを得るには、BIOSをNUMAモードに設定し、スレッドをコアに固定し、常にローカルメモリにアクセスする必要があります。ウィキペディアでNUMAの詳細をご覧ください。

残念ながら、最近のCPUとチップセットでのmemcpyのパフォーマンスに関するサイトや最近の論文を知りません。おそらく自分でテストするのが最善の策です。

パフォーマンスに関してmemcpy()は、実装によってさまざまなバリエーションがあります。たとえば、 Intel Cライブラリ(またはコンパイラ自体)には、memcpy()VisualStudio2005で提供されているライブラリよりもはるかに高速なライブラリがあります。少なくともIntelマシンでは。

実行できる最適なメモリコピーは、データの配置、ベクトル命令を使用できるかどうか、ページサイズなどによって異なります。優れた実装memcpy()は驚くほど複雑なので、できるだけ多くの実装を見つけてテストすることをお勧めします。自分で書く前に、できるだけ。配置やサイズなど、コピーの詳細を知っている場合は、Intelよりも高速に実装できる可能性memcpy()があります。詳細を知りたい場合は、IntelとAMDの最適化ガイド、またはAgnerFogのソフトウェア最適化ページから始めることができます。

于 2010-03-18T01:50:01.350 に答える
1

あなたは間違った方法で問題に取り組んでいると思います。目標は、リアルタイムのパフォーマンスを損なうことなく、データの一貫したスナップショットをエクスポートすることだと思います。ハードウェアを使わず、アルゴリズムを使用してください。

やりたいことは、データの上にジャーナリング システムを定義することです。メモリ内転送を開始すると、2 つのスレッドができます。元のスレッドは機能し、データを変更していると見なされます (ただし、実際にはジャーナルに書き込むだけです)。新しいスレッドは、古い (ジャーナル化されていない) データをゆっくりと書き出せるように別の場所に置きます。

新しいスレッドが完了したら、ジャーナルが空になるまでデータ セットをジャーナルとマージして作業を開始します。完了すると、古いスレッドは、ジャーナルが変更されたバージョンを介して読み取り/書き込みを行う代わりに、データとの直接対話に戻ることができます。

最後に、新しいスレッドはコピーされたデータに移動し、ゆっくりとリモート ソースに渡し始めることができます。

このようにシステムをセットアップすると、ジャーナルがいっぱいになってリアルタイム システムが使用できるようになる前にインメモリ コピーを完了することができる限り、実行中のシステムで任意に大量のデータのスナップショットを本質的に瞬時に取得できます。その処理要求についていけません。

于 2010-03-18T22:42:50.883 に答える