easier better faster vector

link:http://software.intel.com/file/25820/

gdc2010, intel的一个关于simd programming的文章

cpu端的优化是一个分析问题&test,尝试方案,进一步test,进而迭代的过程,没有一种简单牛x的必杀技。

不过针对不同的情况,有一些常用的解决方案:

  • memory stall:maximize local work
  • instruction stall:inline, unroll
  • latent instructions:choose faster ops:不知道这个具体是什么
  • branch prediction misses:software predication
  • compute bound:use simd

我们可以以很多方式来做simd programming,如下图:

可以根据自己的积累和可用的时间自行选择,不过有几项要依赖intel编译器。

用simd做dot的一个指令执行情况,对比顺序执行,这个图很不错:

但是要注意的是这个只是instruction latency,并不是instruction throughput,simd的dot在throughput上要好很多。

使用soa(structure of array)可以让simd执行的更快,使用shuffle指令可以把aos类的结构弄成soa。

还有一种就是把SOA进一步按照float4进行分割,变成这样:

可以进一步提升效率(cache的效率),因为在sse系列下是float4的进行操作,如果到avx就是另外一种了。

gather/scatter

这个名次常常听到,是指对普通的vector做shuffle转成SOA(gather),计算,最后把结果放回(scatter)。

branch

simd指令集里面也有很多conditional的指令,这些就可以用来vectorize branch类的code。

intel表示用好了可以得到4.5倍的速度。

并且列了一些compiler的特性,可以用一些progma的命令来让compiler检测可以vectorize的部分,也可以给compiler一些tips来做vectorize。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值