DDR3デュアルチャネルメモリを搭載したCore 2プロセッサの理論的な最大メモリ帯域幅は印象的です。アーキテクチャ上のWikipedia articleによれば、1秒あたり10+または20+ギガバイトです。しかし、ストックmemcpy()呼び出しはこれを達成しません。おそらく、これはプロセッサの特性に基づいてすべてのプロセッサラインに対してmemcpy()を調整する必要があるOSベンダーの要件に起因するので、ストックmemcpy()の実装幅広い数のブランドとラインで合理的でなければなりません。Core 2またはCore i7アーキテクチャのmemcpy/memmoveを完全に最適化しましたか?
私の質問:Cプログラムで利用できるCore 2またはCore i7プロセッサ用に、自由に利用できる高度にチューニングされたバージョンがありますか?私は、私が自分を必要としている唯一の人ではないと確信しています。そして、みんなが自分のmemcpy()を最適化するための努力の大きな無駄でしょう。
これらの条件が満たされると、MSVC memcpyはベクトル化されます(大体私はこれに関する熟練者ではありません)。ソースアドレスと宛先アドレスは少なくとも8バイト(64ビット)で整列されており、一定の閾値。 64ビットアラインメントは、MSVCが独自の 'malloc'が64ビットアライメントを返すという保証から来ています。次に、32ビットビルドでは、必要に応じて64ビットシャッフルで128ビットSSE2が使用され、64ビットビルドでは、64ビット汎用レジスタ(Duffのデバイス付き)を使用して移動が行われますSSE2に比べると「十分に速い」ため、正しく実行されているからです。 – rwong
/アーチ:最小CPUアーキテクチャの要件の1: SSE2 - 有効SSE2で使用可能な命令の使用を可能にする(デフォルト)のCPU これは視覚的なスタジオvs2013.update3のVC++出力。/ARCH:SSE2はmemcpyのパフォーマンスを改善しません。また、/ ARCH:AVXはベンチマークしましたが、memcpyのパフォーマンスは向上しません。 –
zhaorufei