Ошибка сборки для AVX2

Я пытался скомпилировать программу AVX2 с помощью gcc (g ++). Но это не сработало правильно.

#include<immintrin.h>
....
__m256i _vector256  = _mm256_loadu_si256((__m256i*)pin);
__m256i _vectorMask = _mm256_loadu_si256((__m256i*)mask_hbits);
_vector256 = _mm256_slli_epi32 (_vector256, AVX_LOGDESC); // AVX_LOGDESC == 4
__m256i _vectorRes = _mm256_and_si256(_vector256, _vectorMask);
....

Моя команда компиляции (как одна строка в Makefile):

g++ avx_shift.cpp -c -mavx2

Я также попробовал это:

g++ avx_shift.cpp -c -march=native

Но сообщения об ошибках были такими же:

/tmp/ccSFs6U0.s: Assembler messages:
/tmp/ccSFs6U0.s:1083: Error: suffix or operands invalid for `vpslld'
/tmp/ccSFs6U0.s:1091: Error: suffix or operands invalid for `vpand'
....

Код сборки (добавлен номер строки):

vmovdqa 988(%rsp), %ymm0    # __A, D.48219
movl    984(%rsp), %eax # __B, tmp205
movl    %eax, -120(%rsp)    # tmp205, %sfp
vmovd   -120(%rsp), %xmm6   # %sfp, tmp205
vpslld  %xmm6, %ymm0, %ymm0 # tmp205, D.48219, D.48220      // 1083
....
vmovdqa 668(%rsp), %ymm0    # __B, tmp220
vmovdqa 700(%rsp), %ymm1    # __A, tmp221
vpand   %ymm0, %ymm1, %ymm0 # tmp220, tmp221, D.48215       // 1091
....

Моя версия gcc (g ++) 4.8.0. Моя версия ОС — Centos6.5 X86_64. Я подтвердил, что мой процессор поддерживает инструкции AVX2. Так кто же может помочь мне найти ошибки?

1

Решение

Две строки исходного кода, которые вы вставили, не должны, а на моей машине — не генерировать vpslld или же vpand инструкции. Использовать -S -g -fverbose-asm переключается, чтобы запросить источник сборки и попытаться найти совпадающие строки источника.

3

Другие решения

Других решений пока нет …