【发布时间】:2012-11-05 15:54:48
【问题描述】:
假设我有一个 2 元素向量定义如下(使用 GCC 语法打包向量)
// packed vector of 2-elements
typedef double v2d __attribute__((vector_size(sizeof(double)*2)));
v2d x = ...;
double y = ...;
x[0] = pow(x[0], y)
x[1] = pow(x[1], y)
我想知道是否有更快的方法来使用向量运算进行两次幂计算。架构是 x86-64 上的 GCC,平台特定的代码是可以的。
【问题讨论】:
-
实现一个通用的幂函数很困难,因为你可能需要
exp()和log()。可能有太多的分支无法通过矢量化获得有价值的加速。但我只是在猜测。 -
不,SIMD 指令集没有任何允许加速 pow() 的操作。 SSE2 只有 add、sub、mul、div、max、min 和 sqrt。甚至没有针对它的非矢量化指令。
-
如果 "y" 被限制为 unsigned int 而不是 double,可能会有一些希望。实际上,使用经典的“移位和乘法”算法,可以并行评估两个向量的元素。只是我的猜测。
标签: c performance optimization gcc sse