Нелегальная инструкция с mm_cmpeq_epi8_mask - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь запустить код, подобный следующему

#include <immintrin.h>
void foo() {
    __m128i a = _mm_set_epi8 (0,0,6,5,4,3,2,1,8,7,6,5,4,3,2,1);
    __m128i b = _mm_set_epi8 (0,0,0,0,0,0,0,1,8,7,6,5,4,3,2,1);
    __mmask16 m = _mm_cmpeq_epi8_mask(a,b); // supposedly requires avx512vl and avx512bw
    std::cout<<m<<std::endl;
}
void bar() {
    int dataa[8] = {1,0,1,0,1,0,1,0};
    __m256i points = _mm256_lddqu_si256((__m256i *)&dataa[0]); // requires just mavx
    (void)points;
}

Однако я продолжаю сталкиваться с ошибкой Illegal instruction (core dumped)

Я компилирую код с

g ++ -std = c ++ 11 -march = broadwell -mavx -mavx512vl -mavx512bw tests.cpp

Согласно встроенной документации Intel, этих флагов должно быть достаточно для запуска foo и bar. Однако при выполнении foo или bar появляется то же сообщение об ошибке.

Однако, если я удалю foo и скомпилирую БЕЗ -mavx512vl, я смогу без проблем запустить bar.

Я уже проверил, что мой процессор поддерживает флаги mno-avx512vl и mno-avx512bw, поэтому он должен поддерживать mavx512vl и mavx512bw, верно?

Какие флаги я должен включить, чтобы запустить обе функции? Или я что-то упускаю?

Ответы [ 3 ]

3 голосов
/ 25 июня 2019

Боюсь, ваш метод определения возможностей процессора не очень надежный. Тот факт, что ваш компилятор gcc поддерживает AVX-512, не подразумевает что ваш процессор поддерживает AVX-512.

В командной строке Linux введите more /proc/cpuinfo и проверьте флаги раздел, чтобы увидеть, какие наборы команд поддерживаются вашим процессором.

В окнах: 1. Откройте настройки, 2. Нажмите Система, 3. Нажмите О. Это покажет вам тип процессора. Google intel ark 'processor type' например Google intel ark core i3 7100. Затем перейдите по ссылке на страницу процессора на сайте Intel и выберите Advanced Technologies -> Расширения набора инструкций item.

Существует много уровней поддержки AVX-512. AVX-512_BW AVX-512_VL являются стандартными процессорами с поддержкой AVX-512, если вы не работаете с процессором Knights Landing или Mill. См https://en.wikipedia.org/wiki/AVX-512#CPUs_with_AVX-512 или https://en.wikichip.org/wiki/x86/avx-512#Implementation.

2 голосов
/ 26 июня 2019

Для ISA Intel общее правило состоит в том, что последняя архитектура является надмножеством первой. Поскольку AVX512 является последним из упомянутых вами, вам не нужно использовать -mavx . Использование -march = broadwell бесполезно, так как вы не можете оптимизировать процессор, который не имеет AVX512 ISA.

Ваша командная строка должна выглядеть как

g++ -std=c++11 -march=skylake-avx512 tests.cpp

Кроме того, утверждение "мой ЦП поддерживает эти флаги компилятора" является странным. Я предполагаю, что вы имеете в виду «код, который я создал с этими флагами, работает на моем процессоре», но, как уже упоминалось, префикс «1010 * no » означает, что NOT генерирует код для такого ISA.

Итак, ваши флаги компилятора в порядке, это то, что у вашего процессора нет поддержки требуемого ISA.

2 голосов
/ 26 июня 2019

Компилировать с gcc -march=native.Если вы получаете ошибки компиляции, ваш источник попытался использовать то, что ваш процессор не поддерживает.

Похожие: Получение недопустимых инструкций при выполнении базового кода Avx512


Я уже проверил, что мой процессор поддерживает флаги mno-avx512vl и mno-avx512bw, поэтому он должен поддерживать mavx512vl и mavx512bw, верно?

Это противоположно тому, как GCCпараметры работают.

-mno-avx512vl отключает -mavx512vl, если какой-либо более ранний параметр (например, -march=skylake-avx512 или -mavx512vl сам по себе) установил его.

-march=broadwell не включает инструкции AVX512, потому что процессоры Broadwell не могут выполнять их изначально.Таким образом, -mno-avx512vl имеет нулевой эффект в конце g++ -std=c++11 -march=broadwell -mavx ...

Многие опции имеют длинные имена, начинающиеся с '-f' или с '-W', например, -fmove-loop-инварианты, -формат и так далее. Большинство из них имеют как положительные, так и отрицательные формы;Отрицательной формой -ffoo является -fno-foo. В этом руководстве документируется только одна из этих двух форм, в зависимости от того, какая из них не используется по умолчанию.

из руководства GCC, введенного в разделе 3: Вызов GCC 3

(параметры -m соответствуют тому же соглашению, что и параметры -f и -W long.)

Этот стиль fooпротив no-foo не является уникальным для GCC;это довольно часто.


Ошибка на _mm256_lddqu_si256 после компиляции с -mavx512vl

GCC тупой и использует кодировку EVEX для нагрузки (вероятно, vmovdqu64) вместо более короткой кодировки VEX.Но вы сказали, что AVX512VL был доступен, так что это только проблема оптимизации, а не корректность.

Если вы скомпилировали функцию только с включенным AVX, она, конечно, будет использовать только инструкции AVX.

...