在什么地方X86-64的SSE指令(向量指令)胜过正常的指令。 因为我所看到的是,所需要的执行SSE指令频繁加载和存储被抵消我们有什么收益,由于矢量计算。 所以,可能有人给我一个例子SSE代码,它的性能比正常码好。
它也许是因为我单独传递每个参数,像这样...
__m128i a = _mm_set_epi32(pa[0], pa[1], pa[2], pa[3]);
__m128i b = _mm_set_epi32(pb[0], pb[1], pb[2], pb[3]);
__m128i res = _mm_add_epi32(a, b);
for( i = 0; i < 4; i++ )
po[i] = res.m128i_i32[i];
是不是有什么办法可以一气呵成通过所有4个整数,我的意思是通过整个128个字节pa
一气呵成? 和分配res.m128i_i32
到po
一气呵成?
总结注释到一个答案:
你已经基本上陷入映入大多数新手同样的陷阱。 基本上有在你的榜样两个问题:
- 你是滥用
_mm_set_epi32()
- 你有一个非常低的计算/负载存储比率。 (1至3中的例子)
_mm_set_epi32()
是一个非常昂贵的内在。 虽然它的方便使用,它不会编译到一条指令。 一些编译器(如VS2010)可使用时产生的表演代码很差_mm_set_epi32()
相反,由于要装载的内存连续的块,你应该使用_mm_load_si128()
这需要指针对准16个字节。 如果你不能保证这种对齐,可以使用_mm_loadu_si128()
-但有性能损失。 理想情况下,你应该适当调整你的数据,因此不需要诉诸使用_mm_loadu_si128()
在真正有效的与SSE,你也想最大化你的计算/负载存储比率。 我拍摄时目标是3 - 每存储器访问4算术指令。 这是一个相当高的比率。 通常,你必须重构代码或重新设计的算法来提高它。 在数据组合通行证是一种常见的做法。
循环展开往往是必要的,当你有很长的依赖链大循环机构最大限度地提高性能。
成功地使用SSE的SO问题的一些例子来实现加速。
- C代码循环性能 (非矢量化)
- C代码循环性能[续] (矢量)
- 如何实现每个周期4个FLOPS理论最大? (用于实现峰值处理器性能人为的例子)