wordpress   发布时间:2022-04-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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汇编
我们有配备XP64的Core2机器(Dell T5400).

我们观察到在运行32位进程时,@H_880_16@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 – 32位和64位进程之间的memcpy性能差异全部内容,希望文章能够帮你解决windows – 32位和64位进程之间的memcpy性能差异所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。