【发布时间】:2015-07-13 12:07:41
【问题描述】:
我经常使用基于编译器的矢量化,例如用于 AVX。我试图通过依赖 C++11 对齐功能来提出一种更简洁的方法,而不依赖于基于编译器的扩展(例如 Intel 的 #pragma vector aligned)。如果您考虑下面的代码,例如,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]吗? -
@RichardHodges 不,这不起作用,另请参阅here
-
有意思,谢谢。
标签: c++ c++11 memory-alignment