我们有配备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 – 32位和64位进程之间的memcpy性能差异的更多相关文章

  1. Ubuntu 获取 imu 数据

  2. 使用ltp编译出来的cws_cmdline,cp到其他机器上执行报错:/lib64/libc.so.6: version `GLIBC_2.14′ not found

    这主要是由于编译环境的glibc的版本高于运行时的glibc版本导致。

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

    我们有配备XP64的Core2机器.我们观察到在运行32位进程时,memcpy的性能大约是1.2GByte/秒;但是在64位进程中是memcpy达到约2.2GByte/s用英特尔编译器CRT的memcpy).虽然最初的反应可能只是解释这一点因为可用的寄存器更宽在64位代码中,我们观察到我们自己的memcpy之类SSE汇编代码表现出类似的上限它实现的复制带宽.我的问题是,实际上这有什么不同由于?

  4. C memcpy从double数组到float数组

    是否可以将double数组的memcpy安全地保存到float数组?解决方法取决于你想要什么值得肯定不会被保留.如果需要,请使用std::copy.

  5. c – C别名规则和memcpy

    在回答另一个问题时,我想到了以下例子:第1行打破混叠规则.然而,第2行是OKwrt.混叠规则.问题是:为什么?编译器是否具有关于memcpy等功能的特殊内置知识,还是有一些使memcpyOK的其他规则?有没有办法在标准C中实现类似memcpy的函数,而不会破坏别名规则?

  6. memcpy和指针

    我很困惑如何读取使用memcpy在数组中复制的指针.以下是我尝试过的,但不行.基本上,我已经分配了内存块,我正在复制类似于数组时尚的指针,但在重试期间它不工作.虽然这适用于基本数据类型我想在元素块中存储任何东西,它可以是整数或指针.在上面的代码中,f1_int工作正常,但f2_int_ptr不起作用.解决方法f2_int_ptr()需要成为:注意memcpy()参数的微妙变化.注意:我真的,真的,不会写这样的代码!这是难以置信的.

  7. opencv – 了解memcpy()完成的复制

    我必须创建一个图像,其列数是原始图像的两倍.因此,我将新图像的宽度保持为原始图像的宽度的两倍.虽然这是一个非常简单的任务,但我已经完成了,但我想知道使用memcpy()执行此任务所获得的奇怪结果.我的代码:原始图片:结果预期成绩:问题:当得到的图像只是原始图像的两倍时,为什么4个原始图像被复制到新图像?

  8. c – 位字段和字节序

    我已经定义了以下结构来表示IPv4标头:我现在还使用Wireshark捕获了一个IP帧.作为数组文字,它看起来像这样:我的问题是:如何使用数组数据创建IPv4Header对象?由于不兼容的字节顺序,这不起作用:我知道像ntohs和ntohl这样的函数,但它无法弄清楚如何正确使用它们:有人可以帮忙吗?解决方法最便携的方法是一次一个字段,对于长度超过一个字节的类型使用memcpy().您不必担心字节长度字段的字节顺序:

  9. c – 如何从原始数组到std :: vector执行等效的memcpy?

    我有一个类有一个指向unsignedchar的指针,它被删除并重新分配以存储来自另一个数组的一些数据.这是通过一个功能完成的我根本不喜欢这个代码,我真的想用std::vector替换指针.我的问题是,我将如何执行memcpy方面?如果我将一个向量作为参数传递给我的函数,我可以使用迭代器复制它,但我无法控制参数参数类型,所以我坚持使用unsignedchar*.有没有办法使用迭代器,或者将矢量调整到合适的大小,然后访问其内部数组,以便我仍然可以使用memcpy复制数据?

  10. c – 为什么在解析二进制数据时memcpy比reinterpret_cast慢?

    TLDR:我忘了启用编译器优化.启用优化后,性能(几乎)相同.原帖从二进制数据读取整数时,我注意到memcpy比铸造解决方案慢.版本1:reinterpret_cast,由于潜在的对齐问题而臭,但也更快(?>如果是,那么为什么v2会变慢?

随机推荐

  1. static – 在页面之间共享数据的最佳实践

    我想知道在UWP的页面之间发送像’selectedItem’等变量的最佳做法是什么?创建一个每个页面都知道的静态全局变量类是一个好主意吗?

  2. .net – 为Windows窗体控件提供百分比宽度/高度

    WindowsForm开发的新手,但在Web开发方面经验丰富.有没有办法为Windows窗体控件指定百分比宽度/高度,以便在用户调整窗口大小时扩展/缩小?当窗口调整大小时,可以编写代码来改变控件的宽度/高度,但我希望有更好的方法,比如在HTML/CSS中.在那儿?

  3. 使用Windows Azure查询表存储数据

    我需要使用特定帐户吗?>将应用程序部署到Azure服务后,如何查询数据?GoogleAppEngine有一个数据查看器/查询工具,Azure有类似的东西吗?>您可以看到的sqlExpressintance仅在开发结构中,并且一旦您表示没有等效,所以请小心使用它.>您可以尝试使用Linqpad查询表格.看看JamieThomson的thispost.

  4. windows – SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

    有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?您似乎必须指定DIGCF_ALLCLASSES标志以查找与给定设备实例ID匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT标志.这对我有用:带输出:

  5. Windows Live ID是OpenID提供商吗?

    不,WindowsLiveID不是OpenID提供商.他们使用专有协议.自从他们的“测试版”期结束以来,他们从未宣布计划继续它.

  6. 如果我在代码中进行了更改,是否需要重新安装Windows服务?

    我写了一个Windows服务并安装它.现在我对代码进行了一些更改并重新构建了解决方案.我还应该重新安装服务吗?不,只需停止它,替换文件,然后重新启动它.

  7. 带有双引号的字符串回显使用Windows批处理输出文件

    我正在尝试使用Windows批处理文件重写配置文件.我循环遍历文件的行并查找我想要用指定的新行替换的行.我有一个’函数’将行写入文件问题是%Text%是一个嵌入双引号的字符串.然后失败了.可能还有其他角色也会导致失败.如何才能使用配置文件中的所有文本?尝试将所有“在文本中替换为^”.^是转义字符,因此“将被视为常规字符你可以尝试以下方法:其他可能导致错误的字符是:

  8. .net – 将控制台应用程序转换为服务?

    我正在寻找不同的优势/劣势,将我们长期使用的控制台应用程序转换为Windows服务.我们为ActiveMQ使用了一个叫做java服务包装器的东西,我相信人们告诉我你可以用它包装任何东西.这并不是说你应该用它包装任何东西;我们遇到了这个问题.控制台应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的.任何推荐?我们应该在VisualStudio中将其重建为服务吗?我使用“-install”/“-uninstall”开关执行此操作.例如,seehere.

  9. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  10. windows – 当我试图批量打印变量时,为什么我得到“Echo is on”

    我想要执行一个简单的批处理文件脚本:当我在XP中运行时,它给了我预期的输出,但是当我在Vista或Windows7中运行它时,我在尝试打印值时得到“EchoisOn”.以下是程序的输出:摆脱集合表达式中的空格.等号(=)的两侧可以并且应该没有空格BTW:我通常在@echo关闭的情况下启动所有批处理文件,并以@echo结束它们,所以我可以避免将代码与批处理文件的输出混合.它只是使您的批处理文件输出更好,更清洁.

返回
顶部