windows – 32位和64位进程之间的memcpy性能差异

前端之家收集整理的这篇文章主要介绍了windows – 32位和64位进程之间的memcpy性能差异前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们有配备XP64的Core2机器(Dell T5400).

我们观察到在运行32位进程时,
memcpy的性能大约是
1.2GByte /秒;但是在64位进程中是memcpy
达到约2.2GByte / s(或2.4GByte / s)
用英特尔编译器CRT的memcpy).虽然
最初的反应可能只是解释这一点
因为可用的寄存器更宽
在64位代码中,我们观察到我们自己的memcpy之类
SSE汇编代码(应该使用128位
广泛的加载存储,无论32/64位数
该过程)表现出类似的上限
它实现的复制带宽.

我的问题是,实际上这有什么不同
由于 ? 32位进程必须跳过
一些额外的WOW64箍到RAM?是它的东西
与TLB或prefetchers或…做什么?

感谢您的任何见解.

也在Intel forums年筹集.

当然,您需要通过使用调试器进入机器代码来查看在memcpy最内层循环中执行的实际机器指令.其他任何事情都只是猜测.

我的问题是它可能与32位与64位本身没有任何关系;我的猜测是更快的库例程是使用SSE非临时存储编写的.

如果内循环包含传统加载存储指令的任何变体,
然后必须将目标内存读入机器的缓存,修改并写回.由于该读取完全没有必要 – 正在读取的位被立即覆盖 – 您可以通过使用绕过缓存的“非临时”写入指令来节省一半的内存带宽.这样,目的地存储器就被写入单向行程而不是往返行程.

我不知道英特尔编译器的CRT库,所以这只是猜测.没有特别的理由说明为什么32位libCRT不能做同样的事情,但是你引用的加速是通过将movdqa指令转换为movnt来实现的.

由于memcpy没有进行任何计算,因此它总是以读取和写入内存的速度为限.

猜你在找的Windows相关文章