指向对齐内存的指针

Sim*_*mon 19 c++ memory-alignment c++11

我经常使用基于编译器的矢量化,例如,用于AVX.我试图#pragma vector aligned通过依赖C++ 11对齐功能,在不依赖基于编译器的扩展(例如Intel )的情况下提出一种更清晰的方法.如果您考虑下面的代码,例如,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];
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*jek 4

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

\n\n

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

\n\n

根据该文件

\n\n
\n

3.2 新功能和变更功能

\n\n

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

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

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

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

\n\n

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

\n\n

但它指出:

\n\n
\n

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

\n
\n\n

我也遇到过这种情况,这可能表明并非一切正常。

\n\n
\n\n

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

\n

  • 我现在在英特尔论坛上收到回复,将我指向[this](https://software.intel.com/en-us/forums/topic/531592)线程,该线程之前已报告过,并被跟踪器接受编号 DPD200361116。自 2014 年 9 月以来没有更新。因此接受此答案。 (2认同)