具有DDR3双通道内存的Core 2处理器的理论最大内存带宽令人印象深刻:根据维基百科关于架构的文章,每秒10+或20+千兆字节.但是,库存memcpy()调用不会达到此目的.(3 GB/s是我在这样的系统上看到的最高.)可能,这是由于OS供应商要求memcpy()根据处理器的特性针对每个处理器线进行调整,因此库存memcpy()实现在众多品牌和产品线上应该是合理的.
我的问题:是否可以在C程序中使用Core 2或Core i7处理器的免费高度调整版本?我敢肯定,我不是唯一一个需要一个人的人,每个人微量优化他们自己的memcpy()将是一个很大的浪费.
在测量带宽时你考虑到memcpy是读还是写,所以3 GB/s的内存复制实际上是6 GB/s的带宽?
请记住,带宽是理论上的最大值 - 实际使用率会低得多.例如,一个页面错误,您的带宽将降至MB/s.
memcpy/memmove是编译器内在函数,通常会内联到rep movsd(或者如果你的编译器可以定位那么适当的SSE指令).由于现代CPU将非常非常好地处理这样的代表指令,因此可能无法改进代码.
如果你指定/ ARCH:SSE2到MSVC它应该为你提供一个调整的memcpy(至少,我的).
如果做不到这一点,请自己使用SSE对齐的加载/存储内在函数来复制大块内存,使用Duff的单词读取设备来处理数据的头部和尾部以使其到达对齐的边界.您还需要使用缓存管理内在函数来获得良好的性能.
您的限制因素可能是缓存未命中和南桥带宽,而不是CPU周期.鉴于内存总线上总会有很多其他流量,我通常很乐意在此类操作中获得大约90%的理论内存带宽吞吐量.