6

假设我有一个 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,平台特定代码是可以的。

4

2 回答 2

5

是的,如果您没有特殊情况(负数、0、1、NaN 等),这应该是可能的,因此代码路径是线性的。

是 IEEE754 双精度函数的通用代码pow,它没有循环结构,所以如果你充实所有的特殊情况,向量化似乎很简单。玩得开心。

于 2012-11-17T00:32:50.530 回答
1

您可以直接循环元素并使用正确的选项 GCC 和 ICC 将使用矢量化pow函数

#include <math.h>
typedef double vnd __attribute__((vector_size(sizeof(double)*2)));

vnd foo(vnd x, vnd y) {
    #pragma omp simd
    for(int i=0; i<2; i++) x[i] = pow(x[i], y[i]); 
    return x;
}

只需-O2ICC 即可轻松生成call __svml_pow2SVML(短向量数学库)是英特尔的向量化数学库。使用-Ofast -fopenmpGCC 生成简单call _ZGVbN2vv___pow_finite的 .

Clang 不会对其进行矢量化。

https://godbolt.org/g/pjpzFX

于 2018-01-18T13:15:51.853 回答