首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

CandPointer进入,其他会SSE的大神也come on

2012-07-03 
CandPointer进来,其他会SSE的大神也come onSandy Bridge和Westmere架构,movdqa、paddq、pshufd、psllq的延迟

CandPointer进来,其他会SSE的大神也come on
Sandy Bridge和Westmere架构,movdqa、paddq、pshufd、psllq的延迟都是1个周期,pmuludq是3个周期,pmuludq后面的的指令如果不是pmuludq等SSE/MMX乘法的话可以重叠,所以如下汇编

__asm movdqa xmm2, xmm1\
__asm paddq xmm2, xmm1\
__asm movdqa xmm4, xmm2\
__asm pshufd xmm3, xmm2, 10110001b\
__asm pshufd xmm5, xmm1, 10110001b\
__asm pmuludq xmm3, xmm1\
__asm pmuludq xmm4, xmm5\
__asm pmuludq xmm2, xmm1\
__asm psllq xmm3, 32\
__asm psllq xmm4, 32\
__asm paddq xmm2, xmm1\
__asm paddq xmm2, xmm3\
__asm paddq xmm2, xmm4\

前两个pmuludq后面还是pmuludq,只有__asm pmuludq xmm2, xmm1后面能重叠,因此消耗时钟周期应该是1+1+1+1+1+3+3+1+1+1+1+1+1=17

那按照一开始的原则,避免pmuludq连续,改成如下代码

__asm movdqa xmm2, xmm1\
__asm paddq xmm2, xmm1\
__asm pshufd xmm3, xmm2, 10110001b\
__asm pmuludq xmm3, xmm1\
__asm movdqa xmm4, xmm2\
__asm pshufd xmm5, xmm1, 10110001b\
__asm pmuludq xmm2, xmm1\
__asm psllq xmm3, 32\
__asm pmuludq xmm4, xmm5\
__asm paddq xmm2, xmm1\
__asm paddq xmm2, xmm3\
__asm psllq xmm4, 32\
__asm paddq xmm2, xmm4\

时钟周期应该是1+1+1+1+1+1+2+1+1+1+1+1+1=14,虽说改善不多,但至少不应该比上面的慢

但是我实测的结果,下面的代码略慢于上面的,为什么,还是我理解有误


[解决办法]

探讨

http://topic.csdn.net/u/20120629/23/e30a005d-09ed-4f7a-8403-480e677fd2c0.html?67351
谁在这个帖子回一下,我一并结贴

热点排行