10

具有 DDR3 双通道内存的 Core 2 处理器的理论最大内存带宽令人印象深刻:根据Wikipedia关于架构的文章,每秒 10+ 或 20+ GB。但是,股票 memcpy() 调用无法达到此目的。(3 GB/s 是我在此类系统上见过的最高值。)这可能是由于操作系统供应商要求 memcpy() 根据处理器的特性针对每条处理器线进行调整,因此库存 memcpy() 实现在广泛的品牌和线路上应该是合理的。

我的问题:是否有可在 C 程序中使用的针对 Core 2 或 Core i7 处理器的免费、高度调整的版本?我敢肯定,我不是唯一一个需要它的人,每个人都对自己的 memcpy() 进行微优化会浪费很大的精力。

4

3 回答 3

7

在测量带宽时,您是否考虑过 memcpy 既是读取又是写入,因此复制的 3 GB/s 内存实际上是 6 GB/s 的带宽?

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

memcpy/memmove 是编译器内在函数,通常会内联到 rep movsd(或者如果您的编译器可以针对该指令,则内联到相应的 SSE 指令)。在此之上改进代码生成可能是不可能的,因为现代 CPU 将非常非常好地处理这样的 rep 指令。

于 2009-03-05T02:33:44.930 回答
6

如果您将 /ARCH:SSE2 指定给 MSVC,它应该为您提供经过调整的 memcpy(至少,我的)。

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

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

于 2009-03-05T01:50:05.957 回答
2

你可以自己写。尝试使用英特尔优化编译器直接针对架构?

英特尔还生产了一种称为VTune(独立于编译器和语言)的东西,用于优化应用程序。

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

于 2009-03-05T01:50:59.010 回答