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。