当SIMD更快时,有哪些经验法则? (SSE2,AVX)

时间:2016-12-19 06:36:24

标签: simd avx sse2

我有一些代码一次对3个不对称整数值的3个对称集合进行操作。有大量的条件代码和许多常量。

这已成为一个性能瓶颈,我正在寻找一些经验法则,以确定64位Intel / AMD CPU上的SIMD何时会产生性能优势。代码很长,我之前从未使用过SSE2或AVX,所以如果在我投入时间之前知道是否有可能获胜,那将会很好。

如果您愿意列出经验法则或指向现有的白皮书,我会很感激。

1 个答案:

答案 0 :(得分:2)

标签wiki有几个向量化指南,包括these slides from a talk,它们本身是可理解的,有一些很好的例子可以转换你的数据结构以实现矢量化(以及像{的经典陷阱{1}}将几何向量转换为单个SIMD向量)。

SIMD的经典用例是当有很多独立操作时,即循环内没有串行依赖,如[x,y,z,w]。或者如果有,那么只有关联操作可以让你重新排序。 (例如,对数组或类似的减少进行求和)。

同样重要的是,你可以在没有大量洗牌的情况下做到这一点;理想情况下,从连续内存加载后,所有数据都在向量中“垂直”上升。

对于相邻元素,有许多不同方式的条件通常对SIMD不利。这需要无分支实现,因此您必须完成每个分支的所有工作,以及合并。除非您可以检查矢量中的所有4个(或所有16个或其他)元素是否相同

有些东西可以被矢量化,即使你可能没想到它,因为它们是通常的经验法则的例外。例如converting an IPv4 dotted-quad string into a 32-bit IPv4 address,或将十进制数字字符串转换为整数,即implementing atoi()。这些是通过巧妙地使用多种不同的技巧进行矢量化的,包括PSHUFB的shuffle-mask查找表,其中矢量比较位图作为LUT的索引。

因此,一旦你了解了一些技巧,你总是可以根据一些经验法则快速排除矢量化实现。甚至可以解决串行依赖关系,例如SIMD prefix sums