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。

你可能感兴趣的:(easier better faster vector)