Компилятор Intel не распознает идентификаторы из gcc 'avxintrin.h - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь включить инструкции AVX в моем проекте.Я могу собрать его с помощью gcc ( gcc -mavx ), но не с помощью компилятора Intel ( icpc -maxv ), который завершается с ошибкой в ​​заголовке gcc avxintrin.h со следующими ошибками:

  • нет объявления для идентификатора "__m256d"
  • "__ builtin_ia32_loadupd256" не определено

Просто для справки, вот код из avxintrin.h:

extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) _mm256_loadu_pd (double const *__P) { return (__m256d) __builtin_ia32_loadupd256 (__P); }

Насколько я понимаю, эти идентификаторы являются встроенными функциями в gcc, поэтому icc не распознает их;и я думаю, мне следует как-то скрыть заголовок avxintrin.h от icc и заставить его использовать свои собственные встроенные модули («встроенные функции»).Я прав, и как я могу заставить работать icpc?

gcc 4.4.7, icpc 17.0

1 Ответ

0 голосов
/ 07 февраля 2019

Почему вы используете заголовки из такой старой версии gcc с ICC?Серия GCC 4.4 предшествует AVX.(4.4.7 с 2012 года, но все еще относительно древний).Текущий GCC составляет 8,2 или 7,4 для старой стабильной.(Если вас интересует, насколько хорошо GCC настраивается для современных процессоров, особенно с AVX, используйте более новый GCC, который знает -march=skylake и -march=znver1).

ICC зависит от заголовков GCCпо какой-то причине, видимо, в том числе и за immintrin.h.IDK, почему ICC не в полной мере предоставляет свои собственные определения встроенных функций Intel.

Рабочая установка ICC17 понимает , что встроенная функция GCC после вас #include <immintrin.h>.https://godbolt.org/z/PKumZx. Но я думаю, что с более поздним immintrin.h.

И в отличие от ICC17, ICC19 скомпилирует __builtin_ia32_loadupd256(p) для double*p даже без каких-либо объявлений или включений.

ICC жалуется, если вы объявляете, что владеете __m256d, если вы не указали __attribute__ в правильном порядке и т. Д. В любом случае, попробуйте извлечь заголовки из более нового gcc, ваш ICC может быть слишком новым для этого gcc .


Кроме того, не включайте avxintrin.h напрямую, включите immintrin.h.

avxintrin.h из gcc8.2 имеет ifdef для # error "Never use <avxintrin.h> directly; include <immintrin.h> instead.".Может быть, ваша старая версия GCC отсутствует.

...