针对Core 2或Core i7体系结构的完全优化memcpy/memmove?

针对Core 2或Core i7体系结构的完全优化memcpy/memmove?,c,optimization,memcpy,C,Optimization,Memcpy,具有DDR3双通道内存的Core 2处理器的理论最大内存带宽令人印象深刻:根据该体系结构上的数据,10+或20+千兆字节/秒。但是,stock memcpy()调用无法实现这一点。(3 GB/s是我在此类系统上见过的最高速度。)很可能,这是因为操作系统供应商要求根据处理器的特性为每个处理器行调整memcpy(),因此在许多品牌和系列上,库存memcpy()实现应该是合理的 我的问题是:是否有一个免费提供的、经过高度调优的版本可用于C程序中的Core2或Corei7处理器?我确信我不是唯一需要它的

具有DDR3双通道内存的Core 2处理器的理论最大内存带宽令人印象深刻:根据该体系结构上的数据,10+或20+千兆字节/秒。但是,stock memcpy()调用无法实现这一点。(3 GB/s是我在此类系统上见过的最高速度。)很可能,这是因为操作系统供应商要求根据处理器的特性为每个处理器行调整memcpy(),因此在许多品牌和系列上,库存memcpy()实现应该是合理的


我的问题是:是否有一个免费提供的、经过高度调优的版本可用于C程序中的Core2或Corei7处理器?我确信我不是唯一需要它的人,对每个人来说,对自己的memcpy()进行微优化都是一大浪费。

如果你指定/ARCH:SSE2到MSVC,它应该为你提供一个经过调优的memcpy(至少我的是这样)

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


您的限制因素可能是缓存未命中和southbridge带宽,而不是CPU周期。考虑到内存总线上总是会有很多其他流量,我通常很乐意在这种操作中达到理论内存带宽吞吐量的90%。

您可以自己编写。是否尝试使用直接针对体系结构

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


这是一个关于优化游戏引擎的问题。

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

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


memcpy/memmove是编译器的内部函数,通常会内联到rep movsd(如果编译器可以针对它,也可以内联到相应的SSE指令)。在这一点上改进codegen可能是不可能的,因为现代CPU将非常非常好地处理这样的rep指令。

与gcc相比,使用相同的优化开关,英特尔编译器提供了多大的改进。。。比如说-O3?上次我试过,大约35%,但那是几年前的事了。当满足这些条件时,MSVC memcpy是矢量化的(大致上,我不是这方面的专家):源地址和目标地址都至少是8字节(64位)对齐的,并且移动大小高于某个阈值。64位对齐来自MSVC的保证,即它自己的
malloc
返回64位对齐。然后,在32位构建上,将使用128位SSE2(如果需要,将使用64位洗牌),在64位构建上,它将使用64位通用寄存器(使用达夫的设备)进行移动,因为当它正确完成时,与SSE2相比,它“足够快”。/arch:最低CPU体系结构要求,其中之一:SSE2-(默认值)允许使用支持SSE2的CPU可用的指令这是visual studio vs2013。更新3的vc++输出。其中SSE2是默认值,基于我的基准,使用/ARCH:SSE2不会提高memcpy性能,而我的基准测试,甚至/ARCH:AVX也不会提高memcpy性能。