核心2处理器的内存带宽理论上的最大带宽是令人印象深刻的:根据架构上的“10”或每秒20千兆字节。但是,stock memcpy()调用无法实现这一点。(3gb/s是我在这类系统中见过的最高速度)这可能是由于操作系统供应商要求根据处理器的特性为每一个处理器行调整memcpy(),所以在许多品牌和系列上,一个stock memcpy()实现应该是合理的。
我的问题是:是否有一个免费的、高度优化的版本,可以在C程序中使用Core2或CoreI7处理器?我相信我并不是唯一需要的人,对每个人来说微优化自己的memcpy()都是一个巨大的浪费。
最佳答案
如果您将/arch:sse2指定为msvc,那么它应该为您提供一个经过调整的memcpy(至少,我的是这样的)。
否则,您可以自己使用sse对齐的加载/存储内部函数来将内存复制成大块,在需要处理数据头和尾的地方使用duff的word reads设备来将其复制到对齐的边界。您还需要使用缓存管理内部函数来获得良好的性能。
限制因素可能是缓存未命中和南桥带宽,而不是CPU周期。考虑到内存总线上总是会有很多其他流量,我通常很高兴在这样的操作中获得大约90%的理论内存带宽吞吐量。