指向对齐内存的指针

19
我经常使用基于编译器的向量化,例如AVX。 我正在尝试找到一种更干净的方法,而不依赖于编译器扩展(例如英特尔的#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
@RichardHodges 不,那不起作用,请参见这里 - Simon
有趣,谢谢。 - Richard Hodges
1个回答

4

对我来说,这似乎是一个bug。您的语法完全正确,并被最新版本的GCC和Clang所接受。

首先,重要的是您目前使用的Intel C++编译器的版本。

根据此文档

3.2 新增和改进功能

C++ Composer XE 2015 现在包含 Intel® C++ Compiler XE 15.0。以下功能是此版本中新增或显著增强的:

  • [...]
  • 完整支持 C++11 语言(包括这些新特性 /Qstd=c++11):

    • 值类别 (N3055)
    • alignas 和 alignof (N2341)
    • decltype 扩展 (N3049, N3276)
    • 继承构造函数 (N2540)
    • 用户自定义字面量 (N2765)
    • thread_local (N2659)

首先,注意列表中出现了 alignas - 可以假定从 ICC 15.0 开始完全支持(或至少比之前版本有所改进)。其次,“新增或显著增强”并不等于“完全支持”,如果你问我。

这个摘要 还确认了此版本中对齐功能的支持。

然而,它指出:

在Linux上,完全支持C++11需要gcc 4.8环境或更新版本。

我还遇到了 这个问题,这可能表明还不是所有东西都正常工作。


正如@Simon发现的那样,这是一个已确认的问题(更准确地说,是缺乏支持),并已报告。跟踪器编号为DPD200361116。可以在此线程中找到更多信息。如果其他人遇到此问题,我建议跟踪此页面上的更新,它们肯定会发布。


我确实使用的是 ICC 15.0 - Simon
正如您所看到的,从技术上讲,一切都很好。但是支持的真实水平似乎低于英特尔所声称的水平。也许在英特尔论坛上发布这个问题会提供更清晰的答案? - Mateusz Grzejek
好的,我刚刚完成了,我会随时向您更新任何结果...不过我在那个论坛上还有另外两个未解决的问题 ;) - Simon
2
我现在在英特尔论坛上得到了一个回复,指向这个帖子,在那里它之前已经被报告过,并且被接受并分配了跟踪号码DPD200361116。自2014年9月以来没有更新。因此,我接受这个作为答案。 - Simon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接