我经常使用基于编译器的向量化,例如AVX。 我正在尝试找到一种更干净的方法,而不依赖于编译器扩展(例如英特尔的
现在我的问题涉及如何声明具有对齐参数的函数。 我最成功的尝试是,例如,
谁是正确的? 我的alignas用法有问题吗? 有更好的方法来实现这一点吗?
#pragma vector aligned
),而是依赖于C ++ 11对齐功能。 如果您考虑以下代码,例如aligned::array<double,48> my_array;
允许我在堆栈中声明一个具有适当对齐的数组,并且如果它在同一翻译单元中使用,则编译器似乎会识别这一点。现在我的问题涉及如何声明具有对齐参数的函数。 我最成功的尝试是,例如,
aligned::ptr<double>
,如下所示的函数f()
中使用。
gcc
编译此代码时没有警告(使用-std=c++0x -O3
),并且循环进行了向量化。 然而,英特尔的icc
给出了一个警告,并且未正确进行向量化(warning #3463: alignas does not apply here; using type alignas(64) = T;
)。谁是正确的? 我的alignas用法有问题吗? 有更好的方法来实现这一点吗?
namespace aligned {
template <class T, int N>
using array alignas(64) = T[N];
template <class T>
using type alignas(64) = T;
template <class T>
using ptr = type<T> *;
}
#ifdef __ICC
#define IVDEP "ivdep"
#else
#define IVDEP "GCC ivdep"
#endif
void f(aligned::ptr<double> x, const aligned::ptr<double> y) {
_Pragma(IVDEP)
for(int i=0; i<4; i++)
x[i] = x[i]*y[i];
}
array = alignas(64) T[N]
吗? - Richard Hodges