内存拷贝用单核快还是双核快?(多核社区解惑月400高分悬赏帖!)

捺捺 2007-09-19 10:17:53
加精
注:本贴为“英特尔多核技术社区解惑月”选中的问题,以400高分悬赏征集答案。凡积极参与,提供有效回答者,将平分这400分。

> > >原贴内容:

假设要做一段内存的拷贝操作,内存块大小为1K左右。
两种方案:
1、用单线程拷贝全部1K内存
2、采用双线程,每个线程各拷贝512字节

两种方案那个更快一些?如果内存块大小为100M呢?

-------------------------

原发贴者:jamesking (您将获赠300可用分,其中100分在于奖励您提出了1个有效的问题,另外200分在于您的问题被选中作为征集答案的问题。)

关于本次活动详情请看活动页面:http://events.csdn.net/isn/jhy_mc/index.htm

整个活动结束后,所有分数和奖品将会统一发放或寄送,请各位届时查收:)
...全文
1003 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
zklhp 2011-05-15
  • 打赏
  • 举报
回复
http://www.x64asm.com/asmbbs/thread-1232-1-1.html

这贴或许有帮助

帖一遍大概内容罢

经过测试 我得出的一点结论

1 对于内存复制来说 各种方法用时差别不大(只有百分之几)

2 所谓的MMX SSE2优化内存复制是不切实际的 因为经过测试提升很小 有时反而慢

3 movsd 和 movsd 区别不大(和我预计的不一样 原因不明)

4 大内存情况下 movsb性能稍好(和我预计的不一样 原因不明)

5 对于效率相关(或者说是极端优化)的程序 尽量减少内存的使用是王道

6 一般写程序(当然不是用汇编啦。。) 用环境自带的内存复制函数性能就很好 比如用C memcpy就是最优选择 因为会有优化 而 使用什么所谓的SSE加速 收益很小 当然 如果是特定情况下 优化提升的这百分之几很关键 也可以用嘛。。。。

以上是结论根据本程序得出的 欢迎讨论

程序+源码 下载

MemCopy_Test.zip (29.13 KB)

某次测试的结果 不好发图片 你们可以自己试

by zklhp Email:zklhp#sina.com(#==@) QQ:493165744
Usage:console 数据块长度(单位KB 即千字节) 循环次数
例如 console 10240 100 则分配10MB内存循环100次供测试
善意的提醒:测试程序强制性不高 数据块大小太大太小都不好 有可能出错的
注意:本程序需申请物理内存 需要锁定内存中页面的权限 如

AllocateUserPhysicalPages有1314错误则需启用
具体可以看MSDN:http://msdn.microsoft.com/zh-cn/library/ms190730(中文的)
Allocated only 400000 pages.(1 page = 4096 bytes = 4 KB)
测试数据为两个 800000 KB的物理内存进行复制 结果如下:
***********************************************************
RtlMoveMemory 2446685 MicroSecond
memcpy 2424361 MicroSecond
rep movsd 2424357 MicroSecond
rep movsb 2429301 MicroSecond
memcpy_sse2_align 2485165 MicroSecond
memcpyMMX 2511669 MicroSecond
SSE_Copy_16bytes_align 2476686 MicroSecond
***********************************************************
***********************************************************
RtlMoveMemory 2418823 MicroSecond
memcpy 2429876 MicroSecond
rep movsd 2417805 MicroSecond
rep movsb 2415204 MicroSecond
memcpy_sse2_align 2478441 MicroSecond
memcpyMMX 2503898 MicroSecond
SSE_Copy_16bytes_align 2475844 MicroSecond
***********************************************************
***********************************************************
RtlMoveMemory 2414346 MicroSecond
memcpy 2426489 MicroSecond
rep movsd 2420959 MicroSecond
rep movsb 2420464 MicroSecond
memcpy_sse2_align 2475373 MicroSecond
memcpyMMX 2507619 MicroSecond
SSE_Copy_16bytes_align 2475526 MicroSecond
***********************************************************
***********************************************************
RtlMoveMemory 2425497 MicroSecond
memcpy 2417941 MicroSecond
rep movsd 2434072 MicroSecond
rep movsb 2413697 MicroSecond
memcpy_sse2_align 2474931 MicroSecond
memcpyMMX 2512142 MicroSecond
SSE_Copy_16bytes_align 2476819 MicroSecond
***********************************************************
***********************************************************
RtlMoveMemory 2418599 MicroSecond
memcpy 2418517 MicroSecond
rep movsd 2413637 MicroSecond
rep movsb 2429412 MicroSecond
memcpy_sse2_align 2476802 MicroSecond
memcpyMMX 2505525 MicroSecond
SSE_Copy_16bytes_align 2480774 MicroSecond
***********************************************************
平均用时(整除的 不精确)依次为:
2424790 MicroSecond
2423436 MicroSecond
2422166 MicroSecond
2421615 MicroSecond
2478142 MicroSecond
2508170 MicroSecond
2477129 MicroSecond

1.6G的结果哦 我只有2G内存。。

关于AWE 可以看windows核心编程或MSDN相关章节 我把MSDN里面的例子代码打包了

这个AWE 我觉得挺靠谱(我尝试申请很大的物理内存 发现实际给的和任务管理器显示的可用物理内存大小差不多 当然这个有待研究)
zenny_chen 2010-06-22
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 analyst 的回复:]

全都在yy,这个问题写一个测试程序测试一下就知道了。
根据我的经验,在单核上用SSE指令是可以接近内存理论带宽值的。
[/Quote]
呵呵,光SSE是不够的。现在memcpy是Intel C++ Compiler做得最好。
里面除了使用movdqa以外其实还做了很多缺页丢失而引起的预取操作,另外还有prefetch,其实也真正最好memcpy难度是非常大的。而且拷贝1KB和1MB的方法是完全不同的。
鸵鸟 2010-06-18
  • 打赏
  • 举报
回复
拷贝不走总线DMA么?和几个核有啥关系?
Analyst 2010-06-18
  • 打赏
  • 举报
回复
全都在yy,这个问题写一个测试程序测试一下就知道了。
根据我的经验,在单核上用SSE指令是可以接近内存理论带宽值的。
zenny_chen 2010-06-18
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 asuka 的回复:]

拷贝不走总线DMA么?和几个核有啥关系?
[/Quote]
走不了。
因为在现代OS中带有存储器页表,几百兆字节的内容估计会有很多缺页中断,这个东东是DMA无法处理的,呵呵呵。
不过现在有Plat 64bit Mode,在这种情况下可以考虑使用DMA。不过还是有一定风险。毕竟PC不是嵌入式系统啊,呵呵呵。
zenny_chen 2010-06-18
  • 打赏
  • 举报
回复
要看怎么用。
一般来说给单核去完成,另外一个核可以乘机做其他计算。
因为1KB的数据量非常小,这里再要用双核分岔开来的话估计分岔所带来的开销都能把这些数据给传好了,呵呵呵。
memeng2003 2010-06-01
  • 打赏
  • 举报
回复
这个我最近研究过,单核比多核快很多。

但和编译器有关,intel C++ compiler比 MS VC快不少。

lllsui 2010-06-01
  • 打赏
  • 举报
回复
单核快
mymtom 2010-05-31
  • 打赏
  • 举报
回复
CPU的速度比内存快一个数量级,双核有什么用
zyx0507 2007-11-11
  • 打赏
  • 举报
回复
影响内存拷贝速度的因素很多,有处理器的速度,还有缓存有大小.内存的拷贝时的主要影响因素我觉得与缓存的大小有关.
因为拷贝不是一个大量处理的过程,所以处理器自然就不是影响拷贝速度的主要因素.相反,缓存的大小对拷贝的速度有直接的关系.
所以,我觉得双核的拷贝速度会比单核快,但是效果不会非常的明显.
vc_asm 2007-11-11
  • 打赏
  • 举报
回复
多个CPU同时读写相同内存页面会造成不必要的其它CPU的缓存失效,缓存读写比直接内存读写快的多,而现在的CPU缓存远比1k字节多的多,加上CPU的并行处理与流水线处理,如for (int i=0;i<64;i++){(DOWRD)dest[0]=(DWORD)source[0];(DOWRD)dest[1]=(DWORD)source[1];(DOWRD)dest[2]=(DWORD)source[2];(DOWRD)dest[3]=(DWORD)source[3];dest+=4;source+=4;}把1k次的字节考贝转化成了64次的四字节同时考贝,充分利用了CPU的并行处理能力,同时顺序处理双比转移处理快,循环次数少,流水线机构效率越高,这里还没考虑利用多媒体指令集的优化。同时CPU的按页读取内存的特性大大加快了CPU的速度,而由于成本与复杂性原因这些优化在多CPU同时读写相同页面时,同步机制将使这些优化特性大打折扣。但是如果是大内存考贝的话,双通道技术又会使多CPU的同时读写不同页面的内存成为了可能,如第一个CPU负责考贝前512k内容,第二个CPU负责考贝后512k内容,使速度大大加快。所以1k内存,单CPU快,1m内存多CPU快。我想LZ考的可能是CPU缓存的特性的问题。
vc_asm 2007-11-11
  • 打赏
  • 举报
回复
多个CPU同时读写相同内存页面会造成不必要的CPU缓存失效,缓存读写比直接内存读写快的多,而现在的CPU缓存远比1k字节多的多,加上CPU的并行处理与流水线处理,如for (int i=0;i<64;i++){(DOWRD)dest[0]=(DWORD)source[0];(DOWRD)dest[1]=(DWORD)source[1];(DOWRD)dest[2]=(DWORD)source[2];(DOWRD)dest[3]=(DWORD)source[3];}把1k次的字节考贝转化成了64次的四字节同时考贝,充分利用了CPU的并行处理能力,同时顺序处理双比转移处理快,循环次数少,流水线机构效率越高。同时CPU的按页读取内存的特性大大加快了CPU的速度,而由于成本与复杂性原因这些优化在多CPU同时读写相同页面时,同步机制将使这些优化特性大打折扣。但是如果是大内存考贝的话,双通道技术又会使多CPU的同时读写不同页面的内存成为了可能,如第一个CPU负责考贝前512k内容,第二个CPU负责考贝后512k内容,使速度大大加快。所以1k内存,单CPU快,1m内存多CPU快。
  • 打赏
  • 举报
回复
我个人认为是不需要的,原因前面已经说过了。
manbaum 2007-11-11
  • 打赏
  • 举报
回复
28楼说4条,前3条是不是设置源一条、设置目的一条、设置长度一条,再加执行移动一条?就这4条,需要分线程么?
  • 打赏
  • 举报
回复
1条搞不定,至少要4条。

wuweiliuming 2007-11-10
  • 打赏
  • 举报
回复
关于超线成技术的问题在于内存达到机器达到一定数量时,能够突破数据的系统设计值时,能够改变原来的系统数据和一些原始数据的改变修改数据的连接,比如默认值改为自己需要的数据值才能实现超线成的功能.
manbaum 2007-11-10
  • 打赏
  • 举报
回复
复制内存块?一条汇编指令就搞掂了的,一条指令还分线程?吃饱了撑的吧?!
  • 打赏
  • 举报
回复
在共享主存结构下,不论几个处理器/核心,内存拷贝,单线程都要快于双线程。
很简单的原因:所有访问内存的操作都会被内存控制器串行化。
如果是双通道内存,有两个内存控制器,那么双线程拷贝的速度会接近于单线程,但是仍然要慢一些,因为调度线程的开销。
看起来很多程序员对于计算机系统结构没有一个清晰的认识(如果我的知识老化了请尽管骂我 :)。
benzlim 2007-11-10
  • 打赏
  • 举报
回复
要看内存的工作频率。
同等条件下,当然是双核的快了
yisheng2002 2007-11-10
  • 打赏
  • 举报
回复
[code=XAML]
[/code]
加载更多回复(22)

566

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧