Подтвердить что ты не робот

Указатель на выровненную память

Я часто использую векторизацию на основе компилятора, например, для AVX. Я пытаюсь найти более чистый способ, не полагаясь на расширения на основе компилятора (например, Intel #pragma vector aligned), полагаясь на возможности выравнивания С++ 11. Если вы рассмотрите приведенный ниже код, например, aligned::array<double,48> my_array;, я могу объявить массив в стеке с правильным выравниванием, и если он используется в одном модуле перевода, похоже, это распознает компиляторы.

Теперь мой вопрос касается того, как объявить функцию с выровненными параметрами. Моей самой успешной попыткой является, например, aligned::ptr<double>, как используется в функции f() ниже.

gcc компилирует это без предупреждений (используйте -std=c++0x -O3), и цикл векторизован. Intel 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];
}
4b9b3361

Ответ 1

Мне кажется, что это ошибка. Ваш синтаксис совершенно корректен и принят новейшими версиями GCC и Clang.

Прежде всего, важно, какую версию Intel C++ Compiler вы используете в настоящее время.

Согласно этот документ:

3.2 Новые и измененные функции

С++ Composer XE 2015 теперь содержит Intel® С++ Compiler XE 15.0. следующие функции являются новыми или значительно улучшены в этой версии:

  • [...]
  • Полная поддержка языка С++ 11 (включает в себя эту функцию, новую для 15.0) (/Qstd = С++ 11):

    • категории значений (N3055)
    • alignas и alignof (N2341)
    • расширения decltype (N3049, N3276)
    • наследующие конструкторы (N2540)
    • пользовательские литералы (N2765)
    • thread_local (N2659)

Прежде всего, обратите внимание на наличие alignas в списке - вы можете считать полную (или, по крайней мере, "улучшенную по сравнению с предыдущей версией" ) поддержку этих функций, начиная с ICC 15.0. Во-вторых, "новое или значительно усиленное" не соответствует "полностью поддержано", если вы спросите меня.

Это резюме также подтверждает поддержку функций выравнивания в этой версии.

Он отмечает, однако, что:

Для поддержки Full С++ 11 требуется среда gcc 4.8 или новее в Linux.

Я также столкнулся с этим, что может указывать на то, что не все работает должным образом.


Как выяснил @Simon, это подтвержденная проблема (или, точнее, отсутствие поддержки), и было сообщено. Номер трекера DPD200361116. В этой теме можно найти . Если кто-то еще столкнется с этой проблемой, я предлагаю отслеживать обновления на этой странице, они будут опубликованы наверняка.