针对Core 2或Core i7架构进行全面优化的memcpy / memmove?

具有DDR3双通道内存的Core 2处理器的理论最大内存带宽令人印象深刻:根据维基百科关于架构的文章 ,每秒10+或20+千兆字节。 但是,库存memcpy()调用不会达到此目的。 (3 GB / s是我在这样的系统上看到的最高。)可能,这是由于OS供应商要求memcpy()根据处理器的特性针对每个处理器线进行调整,因此库存memcpy()实现在众多品牌和产品线上应该是合理的。

我的问题:是否有可以在C程序中使用的Core 2或Core i7处理器的免费高度调整版本? 我确信我不是唯一一个需要一个人的人,对每个人来说微量优化他们自己的memcpy()将是一个很大的浪费。

如果你指定/ ARCH:SSE2到MSVC它应该为你提供一个调整的memcpy(至少,我的)。

如果做不到这一点,自己使用SSE对齐的加载/存储内在函数来复制大块的内存,使用Duff的单词读取设备来处理数据的头部和尾部以使其到达对齐的边界。 您还需要使用缓存管理内在函数来获得良好的性能。

您的限制因素可能是缓存未命中和南桥带宽,而不是CPU周期。 鉴于内存总线上总会有很多其他流量,我通常很乐意在此类操作中获得大约90%的理论内存带宽吞吐量。

在测量带宽时你考虑到memcpy是读还是写,所以3 GB / s的内存复制实际上是6 GB / s的带宽?

请记住,带宽是理论上的最大值 – 实际使用率会低得多。 例如,一个页面错误,您的带宽将降至MB / s。

memcpy / memmove是编译器内在函数,通常会内联到rep movsd(如果你的编译器可以将其作为目标,则可以使用相应的SSE指令)。 由于现代CPU将非常非常好地处理这样的rep指令,因此可能无法改进codegen。

你可以写自己的。 尝试使用intel优化编译器直接定位架构?

英特尔还生产一种名为VTune (编译器和语言无关)的产品,用于优化应用程序

这是一篇关于优化游戏引擎的文章 。