加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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

发布时间:2020-12-13 20:36:32 所属栏目:Windows 来源:网络整理
导读:我们有配备XP64的Core2机器(Dell T5400). 我们观察到在运行32位进程时, memcpy的性能大约是 1.2GByte /秒;但是在64位进程中是memcpy 达到约2.2GByte / s(或2.4GByte / s) 用英特尔编译器CRT的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没有进行任何计算,因此它总是以读取和写入内存的速度为限.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读