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

Я пытаюсь изучить инструкции AVX и при запуске базового кода получаю

Незаконная инструкция (дамп ядра)

Код упомянут ниже, и я компилирую его, используя

g ++ -mavx512f 1.cpp

В чем именно проблема и как ее преодолеть? Спасибо!

#include <immintrin.h>
#include<iostream>
using namespace std;

void add(const float a[], const float b[], float res[], int n)
{
    int i = 0;

    for(; i < (n&(~0x31)) ; i+=32 )
    {
        __m512 x = _mm512_loadu_ps( &a[i] );
        __m512 y = _mm512_loadu_ps( &b[i] );

        __m512 z = _mm512_add_ps(x,y);
        _mm512_stream_ps(&res[i],z);
    }

    for(; i<n; i++) res[i] = a[i] + b[i];
}

int main()
{
    int n = 100000;
    float a[n], b[n], res[n];
    for(int i = 0;i < n; i++)
    {
        a[i] = i;
        b[i] = i+10;
    }
    add(a,b,res,n);
    for(int i=0;i<n;i++) cout<<res[i]<<" ";
    cout<<endl;
    return 0;
}


person prajjwal_jha    schedule 16.06.2019    source источник
comment
Добро пожаловать в Stack Overflow. Трудно помочь вам отладить ваш код, если мы не можем его полностью скомпилировать. Вы должны добавить достаточно кода минимального воспроизводимого примера, чтобы кому-то еще не пришлось создавать другие биты для его тестирования. В настоящее время не стоит тратить время на тестирование вашего кода. В этом случае можете ли вы также убедиться, что ваш процессор поддерживает AVX2 и AVX512. :)   -  person Ahmed Masud    schedule 16.06.2019
comment
Вероятно, ваш процессор не поддерживает AVX512. Используйте g++ -march=native, чтобы включить все, что поддерживает ваш ЦП. Если вы получаете ошибки компиляции, ваш процессор не поддерживает AVX512.   -  person Peter Cordes    schedule 16.06.2019
comment
что позволяет вам думать, что вы можете использовать эту инструкцию на своем процессоре?   -  person OznOg    schedule 16.06.2019
comment
@PeterCordes Я получаю ошибки компиляции. Итак, мой процессор не поддерживает AVX512. Спасибо!   -  person prajjwal_jha    schedule 16.06.2019


Ответы (1)


Вероятно, ваш ЦП вообще не поддерживает AVX512.
Только ЦП этого и более новых поколений support AVX-512:

  • Сервер / рабочая станция: Skylake-SP (Xeon Scalable Performance) и более поздних версий,
    Skylake-X настольный компьютер / рабочая станция высокого класса.
  • Клиент: Ice Lake и более поздние версии, например i5-1035G4 и Rocket Lake, например i5-11600.
    (Также очень ограниченный выпуск чип для ноутбука Cannon Lake)
    У этих версий Celeron / Pentium есть AVX2, но нет AVX-512 1.
  • Вычислительные карты Xeon Phi, 2-го поколения и новее (Knight's Landing).

Параметры компилятора

Используйте clang или g++ -O3 -march=native, чтобы включить все, что поддерживает ваш процессор.

Если вы получаете ошибки компиляции (например, необъявленную функцию _mm512_loadu_ps), ваш ЦП не поддерживает AVX512, поэтому g ++ не поддерживает его, поэтому immintrin.h не будет определять эту встроенную функцию.

(Или другая возможная ошибка - это ошибка при встраивании встроенной функции, которую не допускают целевые параметры.)

Используйте отдельные параметры -mavx512f и -mtune= только в том случае, если вы хотите создать двоичный файл для других процессоров, а не только для машины, на которой вы компилируете.

По теме: Как проверить инструкции AVX-512 с o поддерживаемое оборудование?

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


Подробнее о процессорах без AVX-512

название процессора / значение номера Intel

AMD еще не выпустила процессоров AVX-512 (слухи указывают на Zen4), да и в более старых версиях Intel он также отсутствует.
Skylake-client не имеет AVX-512, только Skylake-server .
Гибридные (big.LITTLE) процессоры Intel Alder Lake не будет AVX-512, только AVX2, даже на больших ядрах.
ЦП с низким энергопотреблением, такие как Silvermont / Tremont, даже не имеют AVX1.

Также обратите внимание, что есть несколько расширений для AVX-512, например AVX-512VPOPCNTDQ, который вводит инструкции SIMD для подсчета установленных битов в каждом элементе SIMD. Проверьте таблицу Википедии ЦП с AVX-512 чтобы узнать, какой процессор что имеет. AVX-512F - это основа, а AVX-512VL позволяет использовать новые крутые инструкции для 128- и 256-битных векторов.

Сноска 1: Pentium / Celeron версии старых процессоров Intel даже не имеют AVX, только SSE4.2. (Также отсутствует BMI1 / 2, потому что они отключили декодирование префиксов VEX).

person Peter Cordes    schedule 16.06.2019