10

DDR3 デュアル チャネル メモリを搭載した Core 2 プロセッサのメモリ帯域幅の理論上の最大値は印象的です。アーキテクチャに関するウィキペディアの記事によると、 1 秒あたり 10+ または 20+ ギガバイトです。ただし、標準の memcpy() 呼び出しではこれを達成できません。(3 GB/s は、このようなシステムで見た中で最高です。) おそらく、これは、プロセッサの特性に基づいてすべてのプロセッサ ラインに対して memcpy() を調整するという OS ベンダーの要件によるものです。幅広いブランドやラインで妥当なはずです。

私の質問: C プログラムで利用できる、Core 2 または Core i7 プロセッサ用に高度に調整された自由に利用できるバージョンはありますか? これを必要としているのは私だけではないと確信しており、誰もが自分の memcpy() をマイクロ最適化するのは大変な労力の無駄です。

4

3 に答える 3

7

帯域幅を測定するとき、memcpy が読み取りと書き込みの両方であることを考慮に入れましたか?コピーされた 3 GB/秒のメモリは、実際には 6 GB/秒の帯域幅ですか?

帯域幅は理論上の最大値であることを忘れないでください。実際の使用量ははるかに低くなります。たとえば、ページ フォールトが 1 回発生すると、帯域幅は MB/秒に低下します。

memcpy/memmove はコンパイラの組み込み関数であり、通常、rep movsd (またはコンパイラがそれをターゲットにできる場合は適切な SSE 命令) にインライン化されます。最新の CPU はこのような rep 命令を非常にうまく処理するため、codegen をこれ以上改善することは不可能かもしれません。

于 2009-03-05T02:33:44.930 に答える
6

/ARCH:SSE2 を MSVC に指定すると、調整された memcpy が提供されるはずです (少なくとも、私の場合はそうです)。

それができない場合は、SSE アラインされたロード/ストア組み込み関数を自分で使用してメモリを大きなチャンクにコピーし、必要に応じてワード読み取りの Duff's Device を使用してデータの先頭と末尾を処理し、データをアラインされた境界に到達させます。優れたパフォーマンスを得るには、キャッシュ管理組み込み関数も使用する必要があります。

制限要因は、CPU サイクルではなく、おそらくキャッシュ ミスとサウスブリッジ帯域幅です。メモリ バスには常に多くの他のトラフィックが存在することを考えると、通常、このような操作で理論上のメモリ帯域幅スループットの約 90% に到達できれば満足です。

于 2009-03-05T01:50:05.957 に答える
2

自分で書くことができます。Intel 最適化コンパイラを使用して、アーキテクチャを直接ターゲットにしてみてください。

Intel は、アプリケーションを最適化するためにVTune (コンパイラと言語に依存しない) と呼ばれるものも作成しています。

ゲームエンジンの最適化に関する記事はこちらです。

于 2009-03-05T01:50:59.010 に答える