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

时间:2009-03-05 01:37:47

标签: c optimization memcpy

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

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

3 个答案:

答案 0 :(得分:7)

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

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

memcpy / memmove是编译器内在函数,通常会内联到rep movsd(或者如果你的编译器可以定位那么适当的SSE指令)。由于现代CPU将非常非常好地处理这样的代表指令,因此可能无法改进代码。

答案 1 :(得分:6)

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

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

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

答案 2 :(得分:2)

你可以写自己的。尝试使用intel optimising compiler直接定位架构?

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

这是关于优化游戏引擎的article