【问题标题】:Pointer to aligned memory指向对齐内存的指针
【发布时间】: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


【解决方案1】:

对我来说这似乎是一个错误。您的语法完全正确并被最新版本的GCCClang 接受。

首先,您当前使用的Intel C++ Compiler 的版本很重要。

根据this document

3.2 新功能和更改功能

C++ Composer XE 2015 现在包含英特尔® C++ Compiler XE 15.0。这 此版本中新增或显着增强了以下功能:

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

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

首先,请注意列表中存在alignas - 您可以假设从ICC 15.0 开始完全(或至少“与以前的版本相比有所改进”)支持这些功能.其次,如果你问我,“新的或显着增强” 不等于 “完全支持”

This summary 也确认此版本支持对齐功能。

然而,它指出:

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

我还遇到了this,这可能表明并非一切正常。


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

【讨论】:

  • 我确实在使用ICC 15.0
  • 如您所见,从技术上讲,一切都很好。但真正的支持水平似乎低于英特尔声称的。也许在英特尔论坛上发布此内容会提供明确的答案?
  • 好的,我刚刚做了,我会及时通知你任何结果...不过,我在那个论坛上还有另外两个未解决的问题 ;)
  • 我现在在 Intel 论坛上收到了回复,将我指向之前报告过的 this 线程,并以跟踪器编号 DPD200361116 被接受。自 2014 年 9 月以来没有更新。因此,接受此作为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-10
  • 2017-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多