AVX-512

**AVX-512**는 고급 벡터 확장의 256비트 SIMD 명령어 집합을 512비트로 확장한 것으로, 인텔이 2013년 7월에 x86 명령어 집합(명령어 집합 아키텍처 (ISA))으로 제안했으며, 2016년 인텔 제온 파이 x200(나이츠 랜딩)에 처음 구현되었고,access-date=20 August 2013 이후 많은 AMD 및 다른 인텔 CPU에 구현되었다(아래 목록 참조). AVX-512는 독립적으로 구현될 수 있는 여러 확장 기능으로 구성된다.p=223 이 정책은 전체 명령어 블록을 구현해야 했던 이전 요구 사항에서 벗어난 것이다. 핵심 확장인 AVX-512F(AVX-512 재단)만이 모든 AVX-512 구현에 필요하다. 대부분의 256비트 명령어를 확장하는 것 외에도, 이 확장 기능은 새로운 데이터 변환, 스캐터(scatter) 작업 및 순열과 같은 다양한 새로운 연산을 도입한다.p=223 AVX 레지스터의 개수는 16개에서 32개로 증가하고, 새로운 "마스크 레지스터" 8개가 추가되어 명령어 결과의 변수 선택 및 혼합이 가능하다. 벡터 길이(VL) 확장 기능이 포함된 CPU(대부분의 AVX-512 지원 프로세서에 포함되어 있다. AVX-512를 사용하는 CPU 참조)에서는 이러한 명령어를 128비트 및 256비트 벡터 크기에도 사용할 수 있다. AVX-512는 인텔이 프로세서에 도입한 첫 번째 512비트 SIMD 명령어 집합이 아니다. 인텔의 라라비 프로젝트에서 파생된 1세대 제온 파이 코프로세서에서 사용된 이전 512비트 SIMD 명령어는 유사하지만 바이너리 호환성이 없으며 소스 호환성이 부분적으로만 있다. AVX-512의 후속은 2023년 7월에 발표된 AVX10이다.access-date=2024-08-21 AVX10은 지원되는 명령어 감지를 간소화하기 위해 명령어 집합 버전을 도입했으며, 후속 버전은 이전 버전의 모든 명령어를 포함한다. 초기 AVX10 사양 수정에서는 512비트 벡터 지원이 선택 사항으로 지정되어 E-코어에서 지원할 수 있도록 했다. 이후 수정에서는 인텔이 512비트 벡터를 필수로 지정하여 P-코어와 E-코어 모두에서 512비트 벡터를 지원할 의도를 나타냈다. 초기 버전 1의 AVX10은 AVX-512에 비해 새로운 명령어를 추가하지 않으며, 512비트 벡터를 지원하는 프로세서의 경우 AVX-512와 동일하다(사파이어 래피즈 프로세서에서 인텔이 지원하는 집합 기준). 이후 AVX10 버전에서는 새로운 기능을 도입할 예정이다.
# 명령어 집합
AVX-512 명령어 집합은 각각 고유한 CPUID 기능 비트를 갖는 여러 개별 집합으로 구성된다. 그러나 일반적으로 이러한 명령어 집합은 구현하는 프로세서 세대에 따라 그룹화된다. **F, CD, ER, PF:** 제온 파이 x200 (나이츠 랜딩) 및 제온 스케일러블(스카이레이크 SP "펄리")에서 도입되었으며, 마지막 두 개(ER 및 PF)는 나이츠 랜딩 및 나이츠 밀에 특화되어 있다. * AVX-512 재단(F)Snd은 대부분의 32비트 및 64비트 기반 AVX 명령어를 EVEX 코딩 체계로 확장하여 512비트 레지스터, 연산 마스크, 매개변수 브로드캐스팅, 내장 반올림 및 예외 제어를 지원하며, 나이츠 랜딩 및 스카이레이크 제온에 의해 구현되었다. * AVX-512 충돌 감지 명령어(CD)Snd는 효율적인 충돌 감지를 통해 더 많은 루프가 벡터화될 수 있도록 하며, 나이츠 랜딩 및 스카이레이크 X에 의해 구현되었다. * AVX-512 지수 및 역수 명령어(ER)Snd는 초월함수 연산을 구현하는 데 도움이 되는 지수 및 역수 연산을 포함하며, 나이츠 랜딩에 의해 구현되었다. * AVX-512 프리페치 명령어(PF)Snd는 새로운 프리페치 기능을 포함하며, 나이츠 랜딩에 의해 구현되었다. **4VNNIW, 4FMAPS:** 나이츠 밀에 도입되었으며 특화되어 있다.date=14 October 2016 * AVX-512 벡터 신경망 명령어 단어 가변 정밀도(4VNNIW) – 딥 러닝을 위한 벡터 명령어, 향상된 단어, 가변 정밀도. * AVX-512 융합 곱셈 누적 압축 단정밀도(4FMAPS) – 딥 러닝을 위한 벡터 명령어, 부동 소수점, 단정밀도. **VL, DQ, BW:** 스카이레이크-X/SP 및 캐넌 레이크에 도입되었다. * AVX-512 벡터 길이 확장(VL)Snd은 대부분의 AVX-512 연산을 XMM(128비트) 및 YMM(256비트) 레지스터에서도 작동하도록 확장한다. * AVX-512 더블워드 및 쿼드워드 명령어(DQ)Snd는 새로운 32비트 및 64비트 AVX-512 명령어를 추가한다. * AVX-512 바이트 및 워드 명령어(BW)Snd는 AVX-512를 8비트 및 16비트 정수 연산으로 확장한다.access-date=3 August 2014 **IFMA, VBMI:** 캐넌 레이크에 도입되었다.access-date=2015-03-17 * AVX-512 정수 융합 곱셈 덧셈 (IFMA) – 52비트 정밀도를 사용하는 정수의 융합 곱셈 덧셈. * AVX-512 벡터 바이트 조작 명령어(VBMI)는 AVX-512BW에 없었던 벡터 바이트 순열 명령어를 추가한다. **VNNI:** 캐스케이드 레이크에 도입되었다. * AVX-512 벡터 신경망 명령어(VNNI) – 딥 러닝을 위한 벡터 명령어. **VPOPCNTDQ:** 벡터 개수 명령어. 나이츠 밀 및 아이스레이크에 도입되었다. **VBMI2, BITALG:** 아이스레이크에 도입되었다. * AVX-512 벡터 바이트 조작 명령어 2(VBMI2) – 바이트/워드 로드, 저장 및 시프트와 연결. * AVX-512 비트 알고리즘(BITALG) – VPOPCNTDQ를 확장하는 바이트/워드 비트 조작 명령어. **VP2INTERSECT:** 타이거 레이크에 도입되었다. * AVX-512 벡터 쌍 교차를 마스크 레지스터 쌍으로(VP2INTERSECT). **GFNI, VPCLMULQDQ, VAES:** 아이스레이크에 도입되었다. * 이들은 AVX-512 기능 자체는 아니다. AVX-512와 함께, 이들은 EVEX 인코딩된 GFNI, PCLMULQDQ 및 AES 명령어 버전을 활성화한다.
# 인코딩 및 기능
AVX 및 AVX2에서 사용되는 VEX 접두사는 유연하지만, 인텔이 AVX-512에 추가하려 했던 기능을 위한 공간이 충분하지 않았다. 이로 인해 인텔은 EVEX라는 새로운 접두사를 정의하게 되었다. VEX와 비교하여 EVEX는 다음과 같은 이점을 추가한다.access-date=2014-01-29 * 32개의 512비트 레지스터를 허용하는 확장된 레지스터 인코딩. * 대부분의 AVX-512 명령어를 마스킹하기 위한 새로운 8개의 연산 마스크 레지스터 추가. * 자동으로 브로드캐스트를 수행하는 새로운 스칼라 메모리 모드 추가. * 각 명령어에 명시적인 반올림 제어를 위한 공간 추가. * 새로운 압축된 변위 메모리 주소 지정 방식 추가. AVX-512의 확장된 레지스터, SIMD 폭 비트 및 연산 마스크 레지스터는 필수이며 OS의 모든 지원이 필요하다.
## SIMD 모드
AVX-512 명령어는 성능 저하 없이 128/256비트 AVX/AVX2 명령어와 혼합되도록 설계되었다. 그러나 AVX-512VL 확장을 사용하면 AVX-512 명령어를 128/256비트 레지스터 XMM/YMM에서 사용할 수 있으므로 대부분의 SSE 및 AVX/AVX2 명령어는 EVEX 접두사로 인코딩된 새로운 AVX-512 버전을 가지고 있어 연산 마스크 및 추가 레지스터와 같은 새로운 기능에 액세스할 수 있다. AVX-256과 달리 새로운 명령어에는 새로운 니모닉이 없지만 AVX와 네임스페이스를 공유하므로 소스 코드에서 명령어의 VEX 및 EVEX 인코딩된 버전의 구분이 모호하다. AVX-512F는 32비트 및 64비트 값에서만 작동하므로 바이트 또는 워드에서 작동하는 SSE 및 AVX/AVX2 명령어는 AVX-512BW 확장(바이트 및 워드 지원)에서만 사용할 수 있다. {| class="wikitable plainrowheaders" |- ! scope="col" | 이름 ! scope="col" | 확장
집합 ! scope="col" | 레지스터 ! scope="col" | 유형 |- ! scope="row" | 레거시 SSE | SSE–SSE4.2 | xmm0–xmm15 | 단정밀도 부동소수점
SSE2부터: 바이트, 워드, 더블워드, 쿼드워드 및 배정밀도 부동소수점 |- ! scope="row" | AVX-128 (VEX) | AVX, AVX2 | xmm0–xmm15 | 바이트, 워드, 더블워드, 쿼드워드, 단정밀도 부동소수점 및 배정밀도 부동소수점 |- ! scope="row" | AVX-256 (VEX) | AVX, AVX2 | ymm0–ymm15 | 단정밀도 부동소수점 및 배정밀도 부동소수점
AVX2부터: 바이트, 워드, 더블워드, 쿼드워드 |- ! scope="row" | AVX-128 (EVEX) | AVX-512VL | xmm0–xmm31
(k0–k7) | 더블워드, 쿼드워드, 단정밀도 부동소수점 및 배정밀도 부동소수점
AVX512BW 포함: 바이트 및 워드
AVX512-FP16 포함: 하프 부동소수점 |- ! scope="row" | AVX-256 (EVEX)
AVX10/256 | AVX-512VL | ymm0–ymm31
(k0–k7) | 더블워드, 쿼드워드, 단정밀도 부동소수점 및 배정밀도 부동소수점
AVX512BW 포함: 바이트 및 워드
AVX512-FP16 포함: 하프 부동소수점 |- ! scope="row" | AVX-512 (EVEX)
AVX10/512 | AVX-512F | zmm0–zmm31
(k0–k7) | 더블워드, 쿼드워드, 단정밀도 부동소수점 및 배정밀도 부동소수점
AVX512BW 포함: 바이트 및 워드
AVX512-FP16 포함: 하프 부동소수점 |}
## 확장 레지스터
{| class="wikitable floatright" |+ | x64 AVX-512 레지스터 체계는 x64 AVX (YMM0–YMM15) 및 x64 SSE (XMM0–XMM15) 레지스터의 확장이다. |- | | 511 256 | | 255 128 | | 127 0 |- | | | | | | |- | | ZMM0 | | YMM0 | | XMM0 |- | | ZMM1 | | YMM1 | | XMM1 |- | | ZMM2 | | YMM2 | | XMM2 |- | | ZMM3 | | YMM3 | | XMM3 |- | | ZMM4 | | YMM4 | | XMM4 |- | | ZMM5 | | YMM5 | | XMM5 |- | | ZMM6 | | YMM6 | | XMM6 |- | | ZMM7 | | YMM7 | | XMM7 |- | | ZMM8 | | YMM8 | | XMM8 |- | | ZMM9 | | YMM9 | | XMM9 |- | | ZMM10 | | YMM10 | | XMM10 |- | | ZMM11 | | YMM11 | | XMM11 |- | | ZMM12 | | YMM12 | | XMM12 |- | | ZMM13 | | YMM13 | | XMM13 |- | | ZMM14 | | YMM14 | | XMM14 |- | | ZMM15 | | YMM15 | | XMM15 |- | | ZMM16 | | YMM16 | | XMM16 |- | | ZMM17 | | YMM17 | | XMM17 |- | | ZMM18 | | YMM18 | | XMM18 |- | | ZMM19 | | YMM19 | | XMM19 |- | | ZMM20 | | YMM20 | | XMM20 |- | | ZMM21 | | YMM21 | | XMM21 |- | | ZMM22 | | YMM22 | | XMM22 |- | | ZMM23 | | YMM23 | | XMM23 |- | | ZMM24 | | YMM24 | | XMM24 |- | | ZMM25 | | YMM25 | | XMM25 |- | | ZMM26 | | YMM26 | | XMM26 |- | | ZMM27 | | YMM27 | | XMM27 |- | | ZMM28 | | YMM28 | | XMM28 |- | | ZMM29 | | YMM29 | | XMM29 |- | | ZMM30 | | YMM30 | | XMM30 |- | | ZMM31 | | YMM31 | | XMM31 |} SIMD 레지스터 파일의 너비는 256비트에서 512비트로 증가했으며, 16개에서 총 32개의 레지스터 ZMM0–ZMM31로 확장되었다. 이 레지스터는 AVX 확장의 256비트 YMM 레지스터 및 스트리밍 SIMD 확장의 128비트 XMM 레지스터로 주소 지정할 수 있으며, 레거시 AVX 및 SSE 명령어는 EVEX 인코딩 형식을 사용할 때 추가 16개의 레지스터 XMM16-XMM31 및 YMM16-YMM31에서 작동하도록 확장될 수 있다.
# 연산 마스크 레지스터
AVX-512 벡터 명령어는 대상에 기록되는 값을 제어하기 위해 연산 마스크 레지스터를 지정할 수 있다. 명령어 인코딩은 이 필드에 대해 0-7을 지원하지만, 연산 마스크 레지스터 k1-k7(k0-k7 중)만 값 1-7에 해당하는 마스크로 사용할 수 있으며, 값 0은 연산 마스크 레지스터가 사용되지 않음을 나타내기 위해 예약되어 있다. 즉, 마스킹되지 않은 연산을 나타내기 위해 하드 코딩된 상수('k0' 대신)가 사용된다. 특별한 연산 마스크 레지스터 'k0'는 여전히 작동하는 유효한 레지스터이며, 연산 마스크 레지스터 조작 명령어에서 사용하거나 대상 연산 마스크 레지스터로 사용할 수 있다.website=GitHub 플래그는 연산 마스크 동작을 제어하며, 이는 "제로"로 설정되어 마스크에 의해 선택되지 않은 모든 것을 0으로 만들거나, "병합"으로 설정되어 선택되지 않은 모든 것을 그대로 둔다. 병합 동작은 블렌드 명령어와 동일하다. 연산 마스크 레지스터는 일반적으로 16비트 너비이지만, AVX-512BW 확장을 사용하면 최대 64비트까지 가능하다. 하지만 실제로 사용되는 비트 수는 마스킹된 명령어의 벡터 유형에 따라 달라진다. 32비트 단정밀도 또는 더블워드의 경우, 16비트가 512비트 레지스터의 16개 요소를 마스킹하는 데 사용된다. 배정밀도 및 쿼드워드의 경우 최대 8개의 마스크 비트가 사용된다. 연산 마스크 레지스터는 AVX-512에서 요소 너비가 없었던 몇 가지 비트 연산 명령어가 추가된 이유이다. 예를 들어, 비트 AND, OR 또는 128비트 셔플은 이제 최종 마스킹에서만 차이가 나는 더블워드 및 쿼드워드 변형으로 존재한다.
## 새로운 연산 마스크 명령어
연산 마스크 레지스터는 직접 작동하는 새로운 미니 확장 명령어 집합을 가지고 있다. 나머지 AVX-512 명령어와 달리, 이 명령어들은 모두 VEX 인코딩된다. 초기 연산 마스크 명령어는 모두 16비트(워드) 버전이다. AVX-512DQ에는 8 64비트 값의 마스킹 요구 사항을 더 잘 맞추기 위해 8비트(바이트) 버전이 추가되었고, AVX-512BW에는 최대 64 8비트 값을 마스킹할 수 있도록 32비트(더블) 및 64비트(쿼드) 버전이 추가되었다. KORTEST 및 KTEST 명령어는 마스크 레지스터를 기반으로 x86 플래그를 설정하는 데 사용할 수 있으므로 SIMD가 아닌 x86 분기 및 조건부 명령어와 함께 사용할 수 있다. {| class="wikitable plainrowheaders" |- ! scope="col" | 명령어 ! scope="col" | 확장
집합 ! scope="col" | 설명 |- ! scope="row" | `KAND` | F | 비트 논리 AND 마스크 |- ! scope="row" | `KANDN` | F | 비트 논리 AND NOT 마스크 |- ! scope="row" | `KMOV` | F | 마스크 레지스터 또는 범용 레지스터에서 이동 |- ! scope="row" | `KUNPCK` | F | 마스크 레지스터 언팩 |- ! scope="row" | `KNOT` | F | NOT 마스크 레지스터 |- ! scope="row" | `KOR` | F | 비트 논리 OR 마스크 |- ! scope="row" | `KORTEST` | F | OR 마스크 및 플래그 설정 |- ! scope="row" | `KSHIFTL` | F | 마스크 레지스터 왼쪽 시프트 |- ! scope="row" | `KSHIFTR` | F | 마스크 레지스터 오른쪽 시프트 |- ! scope="row" | `KXNOR` | F | 비트 논리 XNOR 마스크 |- ! scope="row" | `KXOR` | F | 비트 논리 XOR 마스크 |- ! scope="row" | `KADD` | BW/DQ | 두 마스크 추가 |- ! scope="row" | `KTEST` | BW/DQ | 비트 비교 및 플래그 설정 |}
# AVX-512 재단의 새로운 명령어
많은 AVX-512 명령어는 단순히 이전 SSE 또는 AVX 명령어의 EVEX 버전이다. 그러나 몇 가지 새로운 명령어가 있으며, 새로운 AVX-512 버전으로 대체된 이전 명령어가 있다. 새롭거나 대폭 수정된 명령어는 아래에 나열되어 있다. 이러한 재단 명령어에는 AVX-512VL 및 AVX-512BW의 확장 기능도 포함되어 있다. 이러한 확장 기능은 새로운 명령어가 아닌 이러한 명령어의 새로운 버전을 추가할 뿐이기 때문이다.
## 마스크를 사용한 혼합
SSE4의 블렌드 명령어에 EVEX 접두사가 붙은 버전은 없다. 대신 AVX-512는 마스크 레지스터를 선택기로 사용하는 새로운 블렌딩 명령어 집합을 가지고 있다. 아래의 일반적인 비교를 마스크로 변환하는 명령어와 함께, 이들은 XOP의 VPCMOV와 유사하게 일반적인 삼항 연산 또는 cmov를 구현하는 데 사용될 수 있다. 블렌딩은 EVEX 인코딩의 필수 부분이므로 이러한 명령어는 기본 이동 명령어로도 간주될 수 있다. 제로화 블렌드 모드를 사용하면 마스킹 명령어로도 사용할 수 있다. {| class="wikitable plainrowheaders" |- ! scope="col" | 명령어 ! scope="col" | 확장
집합 ! scope="col" | 설명 |- ! scope="row" | `VBLENDMPD` | F | 연산 마스크 제어를 사용하여 float64 벡터를 혼합 |- ! scope="row" | `VBLENDMPS` | F | 연산 마스크 제어를 사용하여 float32 벡터를 혼합 |- ! scope="row" | `VPBLENDMD` | F | 연산 마스크 제어를 사용하여 int32 벡터를 혼합 |- ! scope="row" | `VPBLENDMQ` | F | 연산 마스크 제어를 사용하여 int64 벡터를 혼합 |- ! scope="row" | `VPBLENDMB` | BW | 연산 마스크 제어를 사용하여 바이트 정수 벡터를 혼합 |- ! scope="row" | `VPBLENDMW` | BW | 연산 마스크 제어를 사용하여 워드 정수 벡터를 혼합 |}
## 마스크로 비교
AVX-512F에는 네 가지 새로운 비교 명령어가 있다. 이들은 XOP 명령어와 유사하게 즉시 필드를 사용하여 8가지 다른 비교를 선택한다. 그러나 XOP 명령어와 달리 결과를 마스크 레지스터에 저장하고 처음에는 더블워드 및 쿼드워드 비교만 지원한다. AVX-512BW 확장은 바이트 및 워드 버전을 제공한다. 이 명령어에는 두 개의 마스크 레지스터를 지정할 수 있다는 점에 유의해야 한다. 하나는 쓰기 위한 대상이고 다른 하나는 일반 마스킹을 선언하기 위한 것이다. {| class="wikitable floatright" |- ! scope="col" | 즉시-
필드 ! scope="col" | 비교 ! scope="col" | 설명 |- | 0 | EQ | 같음 |- | 1 | LT | 미만 |- | 2 | LE | 이하 |- | 3 | FALSE | 0으로 설정 |- | 4 | NEQ | 같지 않음 |- | 5 | NLT | 이상 |- | 6 | NLE | 초과 |- | 7 | TRUE | 1로 설정 |} {| class="wikitable plainrowheaders" |- ! scope="col" | 명령어 ! scope="col" | 확장
집합 ! scope="col" | 설명 |- | `VPCMPD`, `VPCMPUD` | F | 부호 있는/없는 더블워드를 마스크로 비교 |- | `VPCMPQ`, `VPCMPUQ` | F | 부호 있는/없는 쿼드워드를 마스크로 비교 |- | `VPCMPB`, `VPCMPUB` | BW | 부호 있는/없는 바이트를 마스크로 비교 |- | `VPCMPW`, `VPCMPUW` | BW | 부호 있는/없는 워드를 마스크로 비교 |}
## 논리적 마스크 설정
마스크를 설정하는 마지막 방법은 논리적 마스크 설정을 사용하는 것이다. 이 명령어는 AND 또는 NAND를 수행한 다음 결과 값이 0 또는 0이 아닌지를 기반으로 대상 연산 마스크를 설정한다. 비교 명령어와 마찬가지로 이 명령어는 두 개의 연산 마스크 레지스터를 사용한다. 하나는 대상이고 다른 하나는 일반 연산 마스크이다. {| class="wikitable" |- ! scope="col" | 명령어 ! scope="col" | 확장
집합 ! scope="col" | 설명 |- | `VPTESTMD`, `VPTESTMQ` | F | 32 또는 64비트 정수의 논리적 AND 및 마스크 설정. |- | `VPTESTNMD`, `VPTESTNMQ` | F | 32 또는 64비트 정수의 논리적 NAND 및 마스크 설정. |- | `VPTESTMB`, `VPTESTMW` | BW | 8 또는 16비트 정수의 논리적 AND 및 마스크 설정. |- | `VPTESTNMB`, `VPTESTNMW` | BW | 8 또는 16비트 정수의 논리적 NAND 및 마스크 설정. |}
## 압축 및 확장
압축 및 확장 명령어는 APL의 동일한 이름의 연산과 일치한다. 이들은 다른 AVX-512 명령어와 약간 다른 방식으로 연산 마스크를 사용한다. 압축은 마스크에 표시된 값만 저장하지만, 표시되지 않은 값에 대한 공간을 건너뛰고 예약하지 않고 압축하여 저장한다. 확장은 반대 방식으로 작동하며, 마스크에 표시된 만큼의 값을 로드한 다음 선택된 위치로 확산시킨다. {| class="wikitable" |- ! scope="col" | 명령어 ! scope="col" | 설명 |- | `VCOMPRESSPD`, `VCOMPRESSPS` | 희소 압축 배정밀도/단정밀도 부동 소수점 값을 밀집 메모리에 저장 |- | `VPCOMPRESSD`, `VPCOMPRESSQ` | 희소 압축 더블워드/쿼드워드 정수 값을 밀집 메모리/레지스터에 저장 |- | `VEXPANDPD`, `VEXPANDPS` | 밀집 메모리에서 희소 압축 배정밀도/단정밀도 부동 소수점 값을 로드 |- | `VPEXPANDD`, `VPEXPANDQ` | 밀집 메모리/레지스터에서 희소 압축 더블워드/쿼드워드 정수 값을 로드 |}
## 순열
완전한 두 입력 순열을 위한 새로운 순열 명령어 집합이 추가되었다. 이들은 모두 세 개의 인수, 두 개의 소스 레지스터와 하나의 인덱스를 사용한다. 결과는 첫 번째 소스 레지스터 또는 인덱스 레지스터를 덮어쓰는 방식으로 출력된다. AVX-512BW는 명령어를 16비트(워드) 버전으로 확장하며, AVX-512_VBMI 확장은 명령어의 바이트 버전을 정의한다. {| class="wikitable" |- ! scope="col" | 명령어 ! scope="col" | 확장
집합 ! scope="col" | 설명 |- | `VPERMB` | VBMI | 압축된 바이트 요소 순열. |- | `VPERMW` | BW | 압축된 워드 요소 순열. |- | `VPERMT2B` | VBMI | 첫 번째 소스를 덮어쓰는 전체 바이트 순열. |- | `VPERMT2W` | BW | 첫 번째 소스를 덮어쓰는 전체 워드 순열. |- | `VPERMI2PD`, `VPERMI2PS` | F | 인덱스를 덮어쓰는 전체 단정밀도/배정밀도 부동 소수점 순열. |- | `VPERMI2D`, `VPERMI2Q` | F | 인덱스를 덮어쓰는 전체 더블워드/쿼드워드 순열. |- | `VPERMI2B` | VBMI | 인덱스를 덮어쓰는 전체 바이트 순열. |- | `VPERMI2W` | BW | 인덱스를 덮어쓰는 전체 워드 순열. |- | `VPERMT2PS`, `VPERMT2PD` | F | 첫 번째 소스를 덮어쓰는 전체 단정밀도/배정밀도 부동 소수점 순열. |- | `VPERMT2D`, `VPERMT2Q` | F | 첫 번째 소스를 덮어쓰는 전체 더블워드/쿼드워드 순열. |- | `VSHUFF32x4`, `VSHUFF64x2`,
`VSHUFI32x4`, `VSHUFI64x2` | F | 압축된 128비트 라인 네 개 셔플. |- | `VPMULTISHIFTQB` | VBMI | 쿼드워드 소스에서 압축된 정렬되지 않은 바이트 선택. |}
## 비트와이즈 삼항 논리
추가된 두 개의 새로운 명령어는 세 개의 입력 사이에서 가능한 모든 비트와이즈(bit-wise) 연산을 논리적으로 구현할 수 있다. 이들은 세 개의 레지스터를 입력으로 받고 8비트 즉시 필드를 사용한다. 출력의 각 비트는 세 개의 해당 입력 비트를 찾아 8비트 즉시의 8개 위치 중 하나를 선택하는 방식으로 생성된다. 세 개의 비트를 사용하여 가능한 조합은 8개뿐이므로 가능한 모든 3개 입력 비트와이즈 연산을 수행할 수 있다. 이들은 AVX-512F의 유일한 비트와이즈 벡터 명령어이다. AVX-512DQ에서는 두 소스 SSE 및 AVX 비트와이즈 벡터 명령어 AND, ANDN, OR 및 XOR의 EVEX 버전이 추가되었다. 더블워드 및 쿼드워드 버전의 차이는 연산 마스크의 적용뿐이다. {| class="wikitable" |- ! scope="col" | 명령어 ! scope="col" | 설명 |- | `VPTERNLOGD`, `VPTERNLOGQ` | 비트와이즈 삼항 논리 |} {| class="wikitable" |+ 비트와이즈 삼항 논리 진리표 |- ! scope="col" | A0 ! scope="col" | A1 ! scope="col" | A2 ! scope="col" | 더블 AND
(0x80) ! scope="col" | 더블 OR
(0xFE) ! scope="col" | 비트와이즈 블렌드
(0xCA) |- | 0 || 0 || 0 || 0 || 0 || 0 |- | 0 || 0 || 1 || 0 || 1 || 1 |- | 0 || 1 || 0 || 0 || 1 || 0 |- | 0 || 1 || 1 || 0 || 1 || 1 |- | 1 || 0 || 0 || 0 || 1 || 0 |- | 1 || 0 || 1 || 0 || 1 || 0 |- | 1 || 1 || 0 || 0 || 1 || 1 |- | 1 || 1 || 1 || 1 || 1 || 1 |}
## 변환
많은 변환 또는 이동 명령어가 추가되었다. 이들은 SSE2에서 사용할 수 있는 변환 명령어 집합을 완성한다. {| class="wikitable" |- ! scope="col" | 명령어 ! scope="col" | 확장
집합 ! scope="col" | 설명 |- | | `VPMOVQD`, `VPMOVSQD`, `VPMOVUSQD`,
`VPMOVQW`, `VPMOVSQW`, `VPMOVUSQW`,
`VPMOVQB`, `VPMOVSQB`, `VPMOVUSQB`,
`VPMOVDW`, `VPMOVSDW`, `VPMOVUSDW`,
`VPMOVDB`, `VPMOVSDB`, `VPMOVUSDB` | F | 쿼드워드 또는 더블워드를 더블워드, 워드 또는 바이트로 다운 변환; 포화되지 않은, 포화된 또는 부호 없는 포화된. SSE4.1의 부호/제로 확장 명령어의 역. |- | `VPMOVWB`, `VPMOVSWB`, `VPMOVUSWB` | BW | 워드를 바이트로 다운 변환; 포화되지 않은, 포화된 또는 부호 없는 포화된. |- | `VCVTPS2UDQ`, `VCVTPD2UDQ`,
`VCVTTPS2UDQ`, `VCVTTPD2UDQ` | F | 잘림 유무에 관계없이 변환, 압축된 단정밀도 또는 배정밀도 부동 소수점을 압축된 부호 없는 더블워드 정수로. |- | `VCVTSS2USI`, `VCVTSD2USI`,
`VCVTTSS2USI`, `VCVTTSD2USI` | F | 잘림 유무에 관계없이 변환, 스칼라 단정밀도 또는 배정밀도 부동 소수점을 부호 없는 더블워드 정수로. |- | `VCVTPS2QQ`, `VCVTPD2QQ`,
`VCVTPS2UQQ`, `VCVTPD2UQQ`,
`VCVTTPS2QQ`, `VCVTTPD2QQ`,
`VCVTTPS2UQQ`, `VCVTTPD2UQQ` | DQ | 잘림 유무에 관계없이 변환, 압축된 단정밀도 또는 배정밀도 부동 소수점을 압축된 부호 있는 또는 부호 없는 쿼드워드 정수로. |- | `VCVTUDQ2PS`, `VCVTUDQ2PD` | F | 압축된 부호 없는 더블워드 정수를 압축된 단정밀도 또는 배정밀도 부동 소수점으로 변환. |- | `VCVTUSI2PS`, `VCVTUSI2PD` | F | 스칼라 부호 없는 더블워드 정수를 단정밀도 또는 배정밀도 부동 소수점으로 변환. |- | `VCVTUSI2SD`, `VCVTUSI2SS` | F | 스칼라 부호 없는 정수를 단정밀도 또는 배정밀도 부동 소수점으로 변환. |- | `VCVTUQQ2PS`, `VCVTUQQ2PD` | DQ | 압축된 부호 없는 쿼드워드 정수를 압축된 단정밀도 또는 배정밀도 부동 소수점으로 변환. |- | `VCVTQQ2PD`, `VCVTQQ2PS` | F | 압축된 쿼드워드 정수를 압축된 단정밀도 또는 배정밀도 부동 소수점으로 변환. |}
## 부동 소수점 분해
AVX-512F의 고유한 새로운 기능 중에는 부동 소수점 값을 분해하고 특수 부동 소수점 값을 처리하는 명령어가 포함되어 있다. 이러한 방법은 완전히 새로운 것이므로 스칼라 버전도 존재한다. {| class="wikitable" |- ! scope="col" | 명령어 ! scope="col" | 설명 |- | `VGETEXPPD`, `VGETEXPPS` | 압축된 fp 값의 지수 성분을 fp 값으로 변환 |- | `VGETEXPSD`, `VGETEXPSS` | 스칼라 fp 값의 지수를 fp 값으로 변환 |- | `VGETMANTPD`, `VGETMANTPS` | float32/float64 벡터에서 정규화된 가수의 벡터 추출 |- | `VGETMANTSD`, `VGETMANTSS` | float32/float64 스칼라에서 정규화된 가수의 float32/float64 추출 |- | `VFIXUPIMMPD`, `VFIXUPIMMPS` | 특수 압축 float32/float64 값 수정 |- | `VFIXUPIMMSD`, `VFIXUPIMMSS` | 특수 스칼라 float32/float64 값 수정 |}
## 부동 소수점 산술
이것은 새로운 부동 소수점 방법의 두 번째 집합으로, 새로운 스케일링과 역수 및 제곱근 역수의 근사 계산이 포함되어 있다. 근사 역수 명령어는 상대 오차가 최대 2−14임을 보장한다. {| class="wikitable" |- ! scope="col" | 명령어 ! scope="col" | 설명 |- | `VRCP14PD`, `VRCP14PS` | 압축된 float32/float64 값의 근사 역수 계산 |- | `VRCP14SD`, `VRCP14SS` | 스칼라 float32/float64 값의 근사 역수 계산 |- | `VRNDSCALEPS`, `VRNDSCALEPD` | 압축된 float32/float64 값을 주어진 소수부 비트 수를 포함하도록 반올림 |- | `VRNDSCALESS`, `VRNDSCALESD` | 스칼라 float32/float64 값을 주어진 소수부 비트 수를 포함하도록 반올림 |- | `VRSQRT14PD`, `VRSQRT14PS` | 압축된 float32/float64 값의 제곱근의 근사 역수 계산 |- | `VRSQRT14SD`, `VRSQRT14SS` | 스칼라 float32/float64 값의 제곱근의 근사 역수 계산 |- | `VSCALEFPS`, `VSCALEFPD` | 압축된 float32/float64 값을 float32/float64 값으로 스케일링 |- | `VSCALEFSS`, `VSCALEFSD` | 스칼라 float32/float64 값을 float32/float64 값으로 스케일링 |}
## 브로드캐스트
{| class="wikitable" |- ! scope="col" | 명령어 ! scope="col" | 확장
집합 ! scope="col" | 설명 |- | `VBROADCASTSS`, `VBROADCASTSD` | F, VL | 단정밀도/배정밀도 부동 소수점 값 브로드캐스트 |- | `VPBROADCASTB`, `VPBROADCASTW`,
`VPBROADCASTD`, `VPBROADCASTQ` | F, VL, DQ, BW |바이트/워드/더블워드/쿼드워드 정수 값 브로드캐스트 |- |`VBROADCASTI32X2`, `VBROADCASTI64X2`,
`VBROADCASTI32X4`, `VBROADCASTI32X8`,
`VBROADCASTI64X4` | F, VL, DQ, BW |두 개 또는 네 개의 더블워드/쿼드워드 정수 값 브로드캐스트 |}
## 기타
{| class="wikitable" |- ! scope="col" | 명령어 ! scope="col" | 확장
집합 ! scope="col" | 설명 |- | `VALIGND`, `VALIGNQ` | F, VL | 더블워드 또는 쿼드워드 벡터 정렬 |- | `VDBPSADBW` | BW | 부호 없는 바이트에 대한 더블 블록 압축 절대 차이 합계 (SAD) |- | `VPABSQ` | F | 압축된 절대값 쿼드워드 |- | `VPMAXSQ`, `VPMAXUQ` | F | 압축된 부호 있는/없는 쿼드워드의 최댓값 |- | `VPMINSQ`, `VPMINUQ` | F | 압축된 부호 있는/없는 쿼드워드의 최솟값 |- | `VPROLD`, `VPROLVD`, `VPROLQ`, `VPROLVQ`,
`VPRORD`, `VPRORVD`, `VPRORQ`, `VPRORVQ` | F | 비트와이즈 왼쪽 또는 오른쪽 회전 |- | `VPSCATTERDD`, `VPSCATTERDQ`,
`VPSCATTERQD`, `VPSCATTERQQ` | F | 부호 있는 더블워드 및 쿼드워드 인덱스를 사용하여 압축된 더블워드/쿼드워드 스캐터 |- | `VSCATTERDPS`, `VSCATTERDPD`,
`VSCATTERQPS`, `VSCATTERQPD` | F | 부호 있는 더블워드 및 쿼드워드 인덱스를 사용하여 압축된 float32/float64 스캐터 |}
# 집합별 새로운 명령어

## 충돌 감지
AVX-512 충돌 감지(AVX-512CD) 명령어는 일반적으로 안전하게 벡터화할 수 없는 루프에서 요소의 충돌 없는 부분집합을 효율적으로 계산하는 데 도움이 되도록 설계되었다.access-date= 25 February 2014 {| class="wikitable" |- ! scope="col" | 명령어 ! scope="col" | 이름 ! scope="col" | 설명 |- | `VPCONFLICTD`,
`VPCONFLICTQ` | 압축된 더블워드 또는 쿼드워드 값 벡터 내 충돌 감지 | 첫 번째 소스의 각 요소를 두 번째 소스의 동일하거나 이전 위치의 모든 요소와 비교하고 결과의 비트 벡터를 형성한다. |- | `VPLZCNTD`,
`VPLZCNTQ` | 압축된 더블워드 또는 쿼드워드 값의 선행 0 비트 수 세기 | 벡터화된 `LZCNT` 명령어 |- | `VPBROADCASTMB2Q`,
`VPBROADCASTMW2D` | 마스크를 벡터 레지스터로 브로드캐스트 | 8비트 마스크를 쿼드워드 벡터로 또는 16비트 마스크를 더블워드 벡터로 |}
## 지수 및 역수
AVX-512 지수 및 역수(AVX-512ER) 명령어는 AVX-512 재단에 있는 것보다 더 정확한 근사 역수 명령어를 포함한다. 상대 오차는 최대 2−28이다. 또한 상대 오차가 최대 2−23인 두 가지 새로운 지수 함수를 포함한다. {| class="wikitable" |- ! scope="col" | 명령어 ! scope="col" | 설명 |- | `VEXP2PD`, `VEXP2PS` | 압축된 단정밀도 또는 배정밀도 부동 소수점 값의 근사 지수 2x 계산 |- | `VRCP28PD`, `VRCP28PS` | 압축된 단정밀도 또는 배정밀도 부동 소수점 값의 근사 역수 계산 |- | `VRCP28SD`, `VRCP28SS` | 스칼라 단정밀도 또는 배정밀도 부동 소수점 값의 근사 역수 계산 |- | `VRSQRT28PD`, `VRSQRT28PS` | 압축된 단정밀도 또는 배정밀도 부동 소수점 값의 제곱근의 근사 역수 계산 |- | `VRSQRT28SD`, `VRSQRT28SS` | 스칼라 단정밀도 또는 배정밀도 부동 소수점 값의 제곱근의 근사 역수 계산 |}
## 프리페치
AVX-512 프리페치(AVX-512PF) 명령어는 AVX2 및 AVX-512에 도입된 새로운 스캐터 및 gather 기능을 위한 새로운 프리페치 연산을 포함한다. `T0` 프리페치는 레벨 1 캐시로 프리페치하는 것을 의미하고 `T1`은 레벨 2 캐시로 프리페치하는 것을 의미한다. {| class="wikitable" |- ! scope="col" | 명령어 ! scope="col" | 설명 |- | `VGATHERPF0DPS`, `VGATHERPF0QPS`,
`VGATHERPF0DPD`, `VGATHERPF0QPD` | 부호 있는 dword/qword 인덱스를 사용하여 opmask k1 및 T0 힌트를 사용하여 단정밀도/배정밀도 데이터를 포함하는 희소 바이트 메모리 위치 프리페치. |- | `VGATHERPF1DPS`, `VGATHERPF1QPS`,
`VGATHERPF1DPD`, `VGATHERPF1QPD` | 부호 있는 dword/qword 인덱스를 사용하여 opmask k1 및 T1 힌트를 사용하여 단정밀도/배정밀도 데이터를 포함하는 희소 바이트 메모리 위치 프리페치. |- | `VSCATTERPF0DPS`, `VSCATTERPF0QPS`,
`VSCATTERPF0DPD`, `VSCATTERPF0QPD` | 부호 있는 dword/qword 인덱스를 사용하여 writemask k1 및 T0 힌트를 사용하여 단정밀도/배정밀도 데이터를 포함하는 희소 바이트 메모리 위치 프리페치 (쓰기 의도 포함). |- | `VSCATTERPF1DPS`, `VSCATTERPF1QPS`,
`VSCATTERPF1DPD`, `VSCATTERPF1QPD` | 부호 있는 dword/qword 인덱스를 사용하여 writemask k1 및 T1 힌트를 사용하여 단정밀도/배정밀도 데이터를 포함하는 희소 바이트 메모리 위치 프리페치 (쓰기 의도 포함). |}
## 4FMAPS 및 4VNNIW
두 명령어 집합은 여러 번의 처리 반복을 수행한다. 이들은 일반적으로 Xeon Phi 제품에서만 발견된다. {| class="wikitable" |- ! scope="col" | 명령어 ! scope="col" | 확장
집합 ! scope="col" | 설명 |- | `V4FMADDPS`,
`V4FMADDSS` | 4FMAPS | 압축된/스칼라 단정밀도 부동 소수점 융합 곱셈 덧셈 (4회 반복) |- | `V4FNMADDPS`,
`V4FNMADDSS` | 4FMAPS | 압축된/스칼라 단정밀도 부동 소수점 융합 곱셈 덧셈 및 부정 (4회 반복) |- | `VP4DPWSSD` | 4VNNIW | 부호 있는 워드와 더블 워드 누적의 점곱 (4회 반복) |- | `VP4DPWSSDS` | 4VNNIW | 부호 있는 워드와 더블 워드 누적 및 포화의 점곱 (4회 반복) |}
## BW, DQ 및 VBMI
AVX-512DQ는 새로운 더블워드 및 쿼드워드 명령어를 추가한다. AVX-512BW는 동일한 명령어의 바이트 및 워드 버전을 추가하고, AVX-512F의 더블워드/쿼드워드 명령어의 바이트 및 워드 버전을 추가한다. AVX-512BW에서 워드 형식만 얻는 몇 가지 명령어는 AVX-512_VBMI 확장에서 바이트 형식을 얻는다(`VPERMB`, `VPERMI2B`, `VPERMT2B`, `VPMULTISHIFTQB`). 마스크 명령어 집합에 두 개의 새로운 명령어가 추가되었다: `KADD` 및 `KTEST` (AVX-512DQ에는 B 및 W 형식, AVX-512BW에는 D 및 Q 형식). 워드 형식만 있던 나머지 마스크 명령어는 AVX-512DQ에서 바이트 형식, AVX-512BW에서 더블워드/쿼드워드 형식을 얻었다. `KUNPCKBW`는 AVX-512BW에 의해 `KUNPCKWD` 및 `KUNPCKDQ`로 확장되었다. AVX-512DQ에 의해 추가된 명령어 중에는 AVX-512F에서 AVX-512 버전을 얻지 못한 몇 가지 SSE 및 AVX 명령어가 포함되어 있다. 이 중에는 모든 두 입력 비트와이즈 명령어 및 정수 추출/삽입 명령어가 있다. 완전히 새로운 명령어는 아래에 설명되어 있다.
### 부동 소수점 명령어
세 가지 새로운 부동 소수점 연산이 도입되었다. 이들은 AVX-512뿐만 아니라 새로운 것이므로 압축/SIMD 및 스칼라 버전 모두 존재한다. `VFPCLASS` 명령어는 부동 소수점 값이 8가지 특수 부동 소수점 값 중 하나인지 테스트하며, 8가지 값 중 어떤 값이 출력 마스크 레지스터의 비트를 트리거할지는 즉시 필드의 값에 의해 제어된다. `VRANGE` 명령어는 즉시 필드의 값에 따라 최소 또는 최대 연산을 수행하며, 이는 연산이 절대적인지 여부와 부호가 별도로 처리되는 방식을 제어할 수 있다. `VREDUCE` 명령어는 단일 소스에서 작동하며, 소수점 부분에 즉시 필드에 지정된 비트 수를 더한 소스 값의 정수 부분을 뺀다. {| class="wikitable" |- ! scope="col" | 명령어 ! scope="col" | 확장
집합 ! scope="col" | 설명 |- | `VFPCLASSPS`, `VFPCLASSPD` | DQ | 압축된 단정밀도 및 배정밀도 부동 소수점 값의 유형 테스트. |- | `VFPCLASSSS`, `VFPCLASSSD` | DQ | 스칼라 단정밀도 및 배정밀도 부동 소수점 값의 유형 테스트. |- | `VRANGEPS`, `VRANGEPD` | DQ | 압축된 부동 소수점 값의 범위 제한 계산. |- | `VRANGESS`, `VRANGESD` | DQ | 스칼라 부동 소수점 값의 범위 제한 계산. |- | `VREDUCEPS`, `VREDUCEPD` | DQ | 압축된 부동 소수점 값에 대한 감소 변환 수행. |- | `VREDUCESS`, `VREDUCESD` | DQ | 스칼라 부동 소수점 값에 대한 감소 변환 수행. |}
### 기타 명령어
{| class="wikitable" |- ! scope="col" | 명령어 ! scope="col" | 확장
집합 ! scope="col" | 설명 |- | `VPMOVM2D`, `VPMOVM2Q` | DQ | 마스크 레지스터를 더블워드 또는 쿼드워드 벡터 레지스터로 변환. |- | `VPMOVM2B`, `VPMOVM2W` | BW | 마스크 레지스터를 바이트 또는 워드 벡터 레지스터로 변환. |- | `VPMOVD2M`, `VPMOVQ2M` | DQ | 더블워드 또는 쿼드워드 벡터 레지스터를 마스크 레지스터로 변환. |- | `VPMOVB2M`, `VPMOVW2M` | BW | 바이트 또는 워드 벡터 레지스터를 마스크 레지스터로 변환. |- | `VPMULLQ` | DQ | 압축된 쿼드워드 곱셈 낮은 결과 저장. VPMULLD의 쿼드워드 버전. |}
## VBMI2
VPCOMPRESS 및 VPEXPAND를 바이트 및 워드 변형으로 확장. 시프트 명령어는 새로운 명령어이다. {| class="wikitable" |- ! scope="col" | 명령어 ! scope="col" | 설명 |- | `VPCOMPRESSB`, `VPCOMPRESSW` | 희소 압축된 바이트/워드 정수 값을 밀집된 메모리/레지스터에 저장 |- | `VPEXPANDB`, `VPEXPANDW` | 밀집된 메모리/레지스터에서 희소 압축된 바이트/워드 정수 값을 로드 |- | `VPSHLD` | 압축된 데이터를 왼쪽으로 논리적으로 연결하고 시프트 |- | `VPSHLDV` | 압축된 데이터를 왼쪽으로 논리적으로 연결하고 변수 시프트 |- | `VPSHRD` | 압축된 데이터를 오른쪽으로 논리적으로 연결하고 시프트 |- | `VPSHRDV` | 압축된 데이터를 오른쪽으로 논리적으로 연결하고 변수 시프트 |}
## VNNI
벡터 신경망 명령어:access-date=2021-10-11 AVX512-VNNI는 아래 설명된 EVEX 코드화된 명령어를 추가한다. AVX-512F를 사용하면 이 명령어는 512비트 벡터에서 작동할 수 있으며, AVX-512VL은 128비트 및 256비트 벡터에 대한 지원을 추가한다. 이후 AVX-VNNI 확장은 이 명령어에 VEX 인코딩을 추가하여 128비트 또는 256비트 벡터에서만 작동할 수 있도록 한다. AVX-VNNI는 AVX-512 제품군의 일부가 아니며 AVX-512F를 요구하지 않고 독립적으로 구현될 수 있다. {| class="wikitable" |- ! scope="col" | 명령어 ! scope="col" | 설명 |- | `VPDPBUSD` | 부호 없는 및 부호 있는 바이트 곱셈 및 추가 |- | `VPDPBUSDS` | 포화된 부호 없는 및 부호 있는 바이트 곱셈 및 추가 |- | `VPDPWSSD` | 부호 있는 워드 정수 곱셈 및 추가 |- | `VPDPWSSDS` | 포화된 워드 정수 곱셈 및 추가 |}
## IFMA
정수 융합 곱셈-덧셈 명령어. AVX512-IFMA는 아래 설명된 EVEX 코드화된 명령어를 추가한다. 별도의 AVX-IFMA 명령어 집합 확장은 이 명령어의 VEX 인코딩을 정의한다. 이 확장은 AVX-512 제품군의 일부가 아니며 독립적으로 구현될 수 있다. {| class="wikitable" |- ! scope="col" | 명령어 ! scope="col" | 확장
집합 ! scope="col" | 설명 |- | `VPMADD52LUQ` | IFMA | 부호 없는 52비트 정수 곱셈 및 낮은 52비트 곱을 64비트 누적기에 추가 |- | `VPMADD52HUQ` | IFMA | 부호 없는 52비트 정수 곱셈 및 높은 52비트 곱을 64비트 누적기에 추가 |}
## VPOPCNTDQ 및 BITALG
{| class="wikitable" |- ! scope="col" | 명령어 ! scope="col" | 확장 집합 ! scope="col" | 설명 |- | `VPOPCNTD`, `VPOPCNTQ` | VPOPCNTDQ | 더블워드/쿼드워드에서 1로 설정된 비트 수 반환 |- | `VPOPCNTB`, `VPOPCNTW` | BITALG | 바이트/워드에서 1로 설정된 비트 수 반환 |- | `VPSHUFBITQMB` | BITALG | 바이트 인덱스를 사용하여 쿼드워드 요소에서 마스크로 비트 셔플 |}
## VP2INTERSECT
{| class="wikitable" |- ! scope="col" | 명령어 ! scope="col" | 확장 집합 ! scope="col" | 설명 |- | `VP2INTERSECTD`,
`VP2INTERSECTQ` | VP2INTERSECT | 더블워드/쿼드워드 간의 교차를 마스크 레지스터 쌍으로 계산 |}
## GFNI
갈루아 체의 새로운 명령어는 암호화에 유용하다.language=en 이는 AES, 카멜리아, SM4에서 사용되는 것과 같은 리옌달 스타일 S-박스를 구현하는 데 사용될 수 있기 때문이다.quote=신형 x86-64 프로세서 또한 갈루아 체 새로운 명령어(GFNI)를 지원하며, 이는 카멜리아 S-박스를 더 간단하게 구현하고 더 나은 성능을 제공한다. 이러한 명령어는 네트워킹 및 신호 처리에 대한 비트 조작에도 사용될 수 있다. GFNI는 독립 실행형 명령어 집합 확장이며 AVX 또는 AVX-512와 별도로 활성화될 수 있다. CPU에서 AVX 및 AVX-512F 지원이 표시되는지에 따라 GFNI 지원은 128, 256 또는 512비트 벡터에서 작동하는 레거시(SSE), VEX 또는 EVEX 코드화된 명령어를 활성화한다. {| class="wikitable" |- ! scope="col" | 명령어 ! scope="col" | 설명 |- | `VGF2P8AFFINEINVQB` | 갈루아 체 아핀 변환 역변환 |- | `VGF2P8AFFINEQB` | 갈루아 체 아핀 변환 |- | `VGF2P8MULB` | 갈루아 체 바이트 곱셈 |}
## VPCLMULQDQ
AVX-512F가 포함된 VPCLMULQDQ는 PCLMULQDQ 명령어의 EVEX 인코딩된 512비트 버전을 추가한다. AVX-512VL을 사용하면 EVEX 인코딩된 256비트 및 128비트 버전을 추가한다. VPCLMULQDQ 단독으로(즉, 비-AVX512 CPU에서)는 VEX 인코딩된 256비트 버전만 추가한다. (VEX 인코딩된 128비트 버전의 가용성은 다른 CPUID 비트인 PCLMULQDQ 및 AVX에 의해 표시된다.) 128비트보다 넓은 명령어 변형은 입력 레지스터의 각 128비트 부분에 대해 동일한 연산을 수행하지만, 서로 다른 128비트 필드에서 쿼드워드를 선택하도록 확장하지는 않는다(imm8 피연산자의 의미는 동일하다. 128비트 필드의 낮은 또는 높은 쿼드워드가 선택된다). {| class="wikitable" |- ! scope="col" | 명령어 ! scope="col" | 설명 |- | `VPCLMULQDQ` | 캐리 없는 쿼드워드 곱셈 |}
## VAES
VEX 및 EVEX 인코딩된 AES 명령어. 128비트보다 넓은 명령어 변형은 입력 레지스터의 각 128비트 부분에 대해 동일한 연산을 수행한다. VEX 버전은 AVX-512 지원 없이 사용할 수 있다. {| class="wikitable" |- ! scope="col" | 명령어 ! scope="col" | 설명 |- | `VAESDEC` | AES 복호화 흐름의 한 라운드 수행 |- | `VAESDECLAST` | AES 복호화 흐름의 마지막 라운드 수행 |- | `VAESENC` | AES 암호화 흐름의 한 라운드 수행 |- | `VAESENCLAST` | AES 암호화 흐름의 마지막 라운드 수행 |}
## BF16
Bfloat16 숫자에 대한 AI 가속 명령어. {| class="wikitable" |- ! scope="col" | 명령어 ! scope="col" | 설명 |- | `VCVTNE2PS2BF16` | 압축된 단정밀도 숫자 두 벡터를 압축된 Bfloat16 숫자 한 벡터로 변환 |- | `VCVTNEPS2BF16` | 압축된 단정밀도 숫자 한 벡터를 압축된 Bfloat16 숫자 한 벡터로 변환 |- | `VDPBF16PS` | 두 Bfloat16 쌍의 점곱 계산 및 결과를 압축된 단정밀도 숫자 하나에 누적 |}
## FP16
이전 F16C 명령어 집합의 확장으로, binary16 부동 소수점 숫자(FP16, float16 또는 하프 정밀도 부동 소수점 숫자로도 알려짐)에 대한 포괄적인 지원을 추가한다. 새로운 명령어는 이전에 단정밀도 및 배정밀도 부동 소수점 숫자에 대해 사용할 수 있었던 대부분의 연산을 구현하며, 새로운 복소수 명령어 및 변환 명령어 또한 도입한다. 스칼라 및 압축된 연산이 지원된다. 단정밀도 및 배정밀도 형식 명령어와 달리, 하프 정밀도 피연산자는 조건부로 0으로 플러시되지 않거나(FTZ) 조건부로 0으로 취급되지 않는다(DAZ) `MXCSR` 설정에 기반한다. 비정규 값은 하드웨어에 의해 전체 속도로 처리되어 FP16 숫자의 전체 동적 범위를 사용하는 것을 용이하게 한다. FP32 및 FP64 숫자를 생성하는 명령어는 여전히 `MXCSR.FTZ` 비트를 따른다.access-date=2021-07-04
### 산술 명령어
{| class="wikitable" |- ! scope="col" | 명령어 ! scope="col" | 설명 |- | `VADDPH`, `VADDSH` | 압축된/스칼라 FP16 숫자 추가. |- | `VSUBPH`, `VSUBSH` | 압축된/스칼라 FP16 숫자 빼기. |- | `VMULPH`, `VMULSH` | 압축된/스칼라 FP16 숫자 곱셈. |- | `VDIVPH`, `VDIVSH` | 압축된/스칼라 FP16 숫자 나누기. |- | `VSQRTPH`, `VSQRTSH` | 압축된/스칼라 FP16 숫자의 제곱근 계산. |- | `VFMADD{132, 213, 231}PH`,
`VFMADD{132, 213, 231}SH` | 압축된/스칼라 FP16 숫자 곱셈-덧셈. |- | `VFNMADD{132, 213, 231}PH`,
`VFNMADD{132, 213, 231}SH` | 압축된/스칼라 FP16 숫자 곱셈-덧셈 및 부정. |- | `VFMSUB{132, 213, 231}PH`,
`VFMSUB{132, 213, 231}SH` | 압축된/스칼라 FP16 숫자 곱셈-빼기. |- | `VFNMSUB{132, 213, 231}PH`,
`VFNMSUB{132, 213, 231}SH` | 압축된/스칼라 FP16 숫자 곱셈-빼기 및 부정. |- | `VFMADDSUB{132, 213, 231}PH` | 압축된 FP16 숫자 곱셈-덧셈 (홀수 벡터 요소) 또는 곱셈-빼기 (짝수 벡터 요소). |- | `VFMSUBADD{132, 213, 231}PH` | 압축된 FP16 숫자 곱셈-빼기 (홀수 벡터 요소) 또는 곱셈-덧셈 (짝수 벡터 요소). |- | `VREDUCEPH`, `VREDUCESH` | 압축된/스칼라 FP16 숫자의 감소 변환 수행. |- | `VRNDSCALEPH`, `VRNDSCALESH` | 압축된/스칼라 FP16 숫자를 주어진 소수부 비트 수로 반올림. |- | `VSCALEFPH`, `VSCALEFSH` | 압축된/스칼라 FP16 숫자를 2의 거듭제곱으로 곱하여 스케일링. |}
### 복소수 산술 명령어
{| class="wikitable" |- ! scope="col" | 명령어 ! scope="col" | 설명 |- | `VFMULCPH`, `VFMULCSH` | 압축된/스칼라 복소수 FP16 숫자 곱셈. |- | `VFCMULCPH`, `VFCMULCSH` | 압축된/스칼라 복소수 FP16 숫자 곱셈. 연산의 복소수 공액 형태. |- | `VFMADDCPH`, `VFMADDCSH` | 압축된/스칼라 복소수 FP16 숫자 곱셈-덧셈. |- | `VFCMADDCPH`, `VFCMADDCSH` | 압축된/스칼라 복소수 FP16 숫자 곱셈-덧셈. 연산의 복소수 공액 형태. |}
### 근사 역수 명령어
{| class="wikitable" |- ! scope="col" | 명령어 ! scope="col" | 설명 |- | `VRCPPH`, `VRCPSH` | 압축된/스칼라 FP16 숫자의 근사 역수 계산. 근사값의 최대 상대 오차는 2−11 \+ 2−14 미만이다. |- | `VRSQRTPH`, `VRSQRTSH` | 압축된/스칼라 FP16 숫자의 근사 제곱근 역수 계산. 근사값의 최대 상대 오차는 2−14 미만이다. |}
### 비교 명령어
{| class="wikitable" |- ! scope="col" | 명령어 ! scope="col" | 설명 |- | `VCMPPH`, `VCMPSH` | 압축된/스칼라 FP16 숫자 비교 및 결과를 마스크 레지스터에 저장. |- | `VCOMISH` | 스칼라 FP16 숫자 비교 및 결과를 플래그 레지스터에 저장. 소스 피연산자가 QNaN 또는 SNaN이면 예외를 신호한다. |- | `VUCOMISH` | 스칼라 FP16 숫자 비교 및 결과를 플래그 레지스터에 저장. 소스 피연산자가 SNaN인 경우에만 예외를 신호한다. |- | `VMAXPH`, `VMAXSH` | 소스 압축된/스칼라 FP16 숫자의 각 수직 쌍의 최댓값 선택. |- | `VMINPH`, `VMINSH` | 소스 압축된/스칼라 FP16 숫자의 각 수직 쌍의 최솟값 선택. |- | `VFPCLASSPH`, `VFPCLASSSH` | 압축된/스칼라 FP16 숫자를 특수 범주(NaN, 무한대, 음의 0 등)로 테스트하고 결과를 마스크 레지스터에 저장. |}
### 변환 명령어
{| class="wikitable" |- ! scope="col" | 명령어 ! scope="col" | 설명 |- | `VCVTW2PH` | 압축된 부호 있는 16비트 정수를 FP16 숫자로 변환. |- | `VCVTUW2PH` | 압축된 부호 없는 16비트 정수를 FP16 숫자로 변환. |- | `VCVTDQ2PH` | 압축된 부호 있는 32비트 정수를 FP16 숫자로 변환. |- | `VCVTUDQ2PH` | 압축된 부호 없는 32비트 정수를 FP16 숫자로 변환. |- | `VCVTQQ2PH` | 압축된 부호 있는 64비트 정수를 FP16 숫자로 변환. |- | `VCVTUQQ2PH` | 압축된 부호 없는 64비트 정수를 FP16 숫자로 변환. |- | `VCVTPS2PHX` | 압축된 FP32 숫자를 FP16 숫자로 변환. F16C의 `VCVTPS2PH`와 달리, `VCVTPS2PHX`는 브로드캐스팅도 지원하는 다른 인코딩을 가지고 있다. |- | `VCVTPD2PH` | 압축된 FP64 숫자를 FP16 숫자로 변환. |- | `VCVTSI2SH` | 스칼라 부호 있는 32비트 또는 64비트 정수를 FP16 숫자로 변환. |- | `VCVTUSI2SH` | 스칼라 부호 없는 32비트 또는 64비트 정수를 FP16 숫자로 변환. |- | `VCVTSS2SH` | 스칼라 FP32 숫자를 FP16 숫자로 변환. |- | `VCVTSD2SH` | 스칼라 FP64 숫자를 FP16 숫자로 변환. |- | `VCVTPH2W`, `VCVTTPH2W` | 압축된 FP16 숫자를 부호 있는 16비트 정수로 변환. `VCVTPH2W`는 `MXCSR` 레지스터에 따라 값을 반올림한다. `VCVTTPH2W`는 0으로 반올림한다. |- | `VCVTPH2UW`, `VCVTTPH2UW` | 압축된 FP16 숫자를 부호 없는 16비트 정수로 변환. `VCVTPH2UW`는 `MXCSR` 레지스터에 따라 값을 반올림한다. `VCVTTPH2UW`는 0으로 반올림한다. |- | `VCVTPH2DQ`, `VCVTTPH2DQ` | 압축된 FP16 숫자를 부호 있는 32비트 정수로 변환. `VCVTPH2DQ`는 `MXCSR` 레지스터에 따라 값을 반올림한다. `VCVTTPH2DQ`는 0으로 반올림한다. |- | `VCVTPH2UDQ`, `VCVTTPH2UDQ` | 압축된 FP16 숫자를 부호 없는 32비트 정수로 변환. `VCVTPH2UDQ`는 `MXCSR` 레지스터에 따라 값을 반올림한다. `VCVTTPH2UDQ`는 0으로 반올림한다. |- | `VCVTPH2QQ`, `VCVTTPH2QQ` | 압축된 FP16 숫자를 부호 있는 64비트 정수로 변환. `VCVTPH2QQ`는 `MXCSR` 레지스터에 따라 값을 반올림한다. `VCVTTPH2QQ`는 0으로 반올림한다. |- | `VCVTPH2UQQ`, `VCVTTPH2UQQ` | 압축된 FP16 숫자를 부호 없는 64비트 정수로 변환. `VCVTPH2UQQ`는 `MXCSR` 레지스터에 따라 값을 반올림한다. `VCVTTPH2UQQ`는 0으로 반올림한다. |- | `VCVTPH2PSX` | 압축된 FP16 숫자를 FP32 숫자로 변환. F16C의 `VCVTPH2PS`와 달리, `VCVTPH2PSX`는 브로드캐스팅도 지원하는 다른 인코딩을 가지고 있다. |- | `VCVTPH2PD` | 압축된 FP16 숫자를 FP64 숫자로 변환. |- | `VCVTSH2SI`, `VCVTTSH2SI` | 스칼라 FP16 숫자를 부호 있는 32비트 또는 64비트 정수로 변환. `VCVTSH2SI`는 `MXCSR` 레지스터에 따라 값을 반올림한다. `VCVTTSH2SI`는 0으로 반올림한다. |- | `VCVTSH2USI`, `VCVTTSH2USI` | 스칼라 FP16 숫자를 부호 없는 32비트 또는 64비트 정수로 변환. `VCVTSH2USI`는 `MXCSR` 레지스터에 따라 값을 반올림한다. `VCVTTSH2USI`는 0으로 반올림한다. |- | `VCVTSH2SS` | 스칼라 FP16 숫자를 FP32 숫자로 변환. |- | `VCVTSH2SD` | 스칼라 FP16 숫자를 FP64 숫자로 변환. |}
### 분해 명령어
{| class="wikitable" |- ! scope="col" | 명령어 ! scope="col" | 설명 |- | `VGETEXPPH`, `VGETEXPSH` | 압축된/스칼라 FP16 숫자의 지수 성분을 FP16 숫자로 추출. |- | `VGETMANTPH`, `VGETMANTSH` | 압축된/스칼라 FP16 숫자의 가수 성분을 FP16 숫자로 추출. |}
### 이동 명령어
{| class="wikitable" |- ! scope="col" | 명령어 ! scope="col" | 설명 |- | `VMOVSH` | 스칼라 FP16 숫자를 메모리에서/으로 또는 벡터 레지스터 간 이동. |- | `VMOVW` | 스칼라 FP16 숫자를 메모리에서/으로 또는 범용 레지스터로 이동. |}
# AVX-512를 사용하는 CPU
* 인텔 ** 나이츠 랜딩 (제온 파이 x200):access-date=12 October 2016 AVX-512 F, CD, ER, PF ** 나이츠 밀 (제온 파이 x205):publisher=인텔 AVX-512 F, CD, ER, PF, 4FMAPS, 4VNNIW, VPOPCNTDQ ** 스카이레이크-SP, 스카이레이크-X:language=en-usaccess-date=2016-10-20url-status=dead AVX-512 F, CD, VL, DQ, BW ** 캐넌 레이크: AVX-512 F, CD, VL, DQ, BW, IFMA, VBMI ** 캐스케이드 레이크: AVX-512 F, CD, VL, DQ, BW, VNNI ** 쿠퍼 레이크: AVX-512 F, CD, VL, DQ, BW, VNNI, BF16 ** 아이스레이크, 로켓레이크:date=30 March 2021website=gcc.gnu.org AVX-512 F, CD, VL, DQ, BW, IFMA, VBMI, VBMI2, VPOPCNTDQ, BITALG, VNNI, VPCLMULQDQ, GFNI, VAES ** 타이거 레이크 (펜티엄 및 셀러론 제외, 하지만 일부 리뷰어는 AVX-512를 지원하는 셀러론 6305의 CPU-Z 스크린샷을 가지고 있다archive-date=2020-10-18):publisher=GNU AVX-512 F, CD, VL, DQ, BW, IFMA, VBMI, VBMI2, VPOPCNTDQ, BITALG, VNNI, VPCLMULQDQ, GFNI, VAES, VP2INTERSECT ** 앨더레이크 (인텔에서 공식적으로 지원되지 않으며, 최신 CPU에서는 완전히 제거됨주 1):access-date=5 November 2021access-date=2021-11-08 AVX-512 F, CD, VL, DQ, BW, IFMA, VBMI, VBMI2, VPOPCNTDQ, BITALG, VNNI, VPCLMULQDQ, GFNI, VAES, BF16, VP2INTERSECT, FP16 ** 사파이어 래피즈access-date=2023-01-19 및 이후 P-코어 전용 제온 프로세서: AVX-512 F, CD, VL, DQ, BW, IFMA, VBMI, VBMI2, VPOPCNTDQ, BITALG, VNNI, VPCLMULQDQ, GFNI, VAES, BF16, FP16 * Centaur Technology ** "CNS" 코어 (8c/8t):date=2 August 2022website=users.atw.hu AVX-512 F, CD, VL, DQ, BW, IFMA, VBMI * AMD ** 젠 4:language=en-USlanguage=en-uslanguage=en-uslanguage=en-usdate=2022-09-26 AVX-512 F, CD, VL, DQ, BW, IFMA, VBMI, VBMI2, VPOPCNTDQ, BITALG, VNNI, VPCLMULQDQ, GFNI, VAES, BF16 ** 젠 5:language=en-US AVX-512 F, CD, VL, DQ, BW, IFMA, VBMI, VBMI2, VPOPCNTDQ, BITALG, VNNI, VPCLMULQDQ, GFNI, VAES, BF16, VP2INTERSECT

{| class="wikitable" ! 부분집합 ! F ! CD ! ER ! PF ! 4FMAPS ! 4VNNIW ! VPOPCNTDQ ! VL ! DQ ! BW ! IFMA ! VBMI ! VNNI ! BF16 ! VBMI2 ! BITALG ! VPCLMULQDQ ! GFNI ! VAES ! VP2INTERSECT ! FP16 |- | 나이츠 랜딩 (제온 파이 x200, 2016) | colspan="2" rowspan="9" Yes | colspan="2" rowspan="2" Yes | colspan="17" 아니요 |- | 나이츠 밀 (제온 파이 x205, 2017) | colspan="3" Yes | colspan="14" 아니요 |- | 스카이레이크-SP, 스카이레이크-X (2017) | colspan="4" rowspan="11" 아니요 | rowspan="4" 아니요 | colspan="3" rowspan="4" Yes | colspan="11" 아니요 |- | 캐넌 레이크 (2018) | colspan="2" Yes | colspan="9" 아니요 |- | 캐스케이드 레이크 (2019) | rowspan="2" colspan="2" 아니요 | rowspan="2" Yes | colspan="8" 아니요 |- | 쿠퍼 레이크 (2020) | Yes | colspan="7" 아니요 |- | 아이스레이크 (2019) | colspan="7" rowspan="3" Yes | rowspan="3" 아니요 | colspan="5" rowspan="3" Yes | colspan="2" 아니요 |- | 타이거 레이크 (2020) | Yes | 아니요 |- | 로켓레이크 (2021) | colspan="2" 아니요 |- | 앨더레이크 (2021) | colspan="2" 주 1 | colspan="15" 주 1 |- | 젠 4 (2022) | colspan="2" rowspan="3" Yes | colspan="13" rowspan="3" Yes | colspan="2" 아니요 |- | 사파이어 래피즈 (2023) | 아니요 | Yes |- | 젠 5 (2024) | Yes | 아니요 |}

주 1: 인텔은 앨더레이크 마이크로프로세서에서 AVX-512 명령어 제품군을 공식적으로 지원하지 않는다. 2022년 초에 인텔은 AVX-512 활성화를 방지하기 위해 앨더레이크 마이크로프로세서에서 AVX-512를 실리콘 수준에서 비활성화(퓨징 오프)하기 시작했다.language=en 일부 레거시 BIOS 및 마이크로코드 개정판을 사용하는 구형 앨더레이크 계열 CPU에서는 AVX-512를 지원하는 실리콘을 포함하지 않는 모든 효율성 코어를 비활성화하면 AVX-512 계열 명령어를 실행할 수 있었다.date=2021-08-19language=en
# 성능
인텔 벡터화 어드바이저 (2017 버전부터)는 네이티브 AVX-512 성능 및 벡터 코드 품질 분석을 지원한다("코어", 제온 및 인텔 제온 파이 프로세서에 대해). 전통적인 핫스팟 프로필, 어드바이저 권장 사항 및 인텔 컴파일러 벡터화 진단 기능의 "원활한" 통합과 함께, 어드바이저 서베이 분석은 AVX-512 ISA 메트릭 및 새로운 AVX-512 특정 "특성", 예: 스캐터, 압축/확장, 마스크 활용도 등을 제공한다.access-date=2016-10-20access-date=2016-10-20 일부 프로세서(아이스레이크 이전 인텔 프로세서가 대부분)에서는 AVX-512 명령어가 이전 명령어보다 더 큰 주파수 조절을 유발하여 혼합 작업에 불이익을 줄 수 있다. 추가적인 다운클럭은 512비트 벡터 폭에 의해 트리거되며 실행되는 명령어의 종류에 따라 달라진다. AVX-512의 128비트 또는 256비트 부분(AVX-512VL)을 사용하면 트리거되지 않는다. 결과적으로 gcc 및 클랭은 인텔 타겟에 대해 기본적으로 256비트 벡터를 사용하는 것을 선호한다.website=스택 오버플로우website=스택 오버플로우url=https://releases.llvm.org/10.0.0/docs/ReleaseNotes.html#changes-to-the-x86-target C/C++ 컴파일러는 또한 AVX-512를 가장 효과적으로 사용하기 위해 루프 언롤링 및 파이프라인 정지 방지를 자동으로 처리한다. 이는 언어 내장 함수를 사용하여 AVX-512 사용을 강제하려는 프로그래머가 소스 코드에 평범하게 작성된 루프를 만났을 때 컴파일러가 생성하는 코드에 비해 성능이 더 나빠지는 결과를 초래할 수 있음을 의미한다.publisher=C++Now 다른 경우에는 C/C++ 코드에서 AVX-512 내장 함수를 사용하면 평범하게 작성된 C/C++에 비해 성능 향상을 가져올 수 있다.arxiv=2212.05098
# 반응
미디어 처리, 암호화, 비디오 게임,access-date=2023-10-11 신경망,doi=10.1109/ISCC53001.2021.9631464 그리고 OpenJDK와 같은 AVX-512 애플리케이션의 많은 예가 있다. OpenJDK는 정렬을 위해 AVX-512를 사용한다.access-date=2023-10-11 2020년에 많이 인용된 리누스 토르발스의 발언에서 그는 "AVX-512가 고통스럽게 죽고 인텔이 잘 보이는 벤치마크를 만들기 위해 마법 같은 명령어를 만들려고 하는 대신 실제 문제를 해결하기 시작하기를 바란다"고 말했다.access-date=2023-10-11 그는 트랜지스터 예산이 추가적인 코어와 정수 성능에 사용되는 것을 선호하며, 부동 소수점 벤치마크를 "혐오한다"고 언급했다.access-date=2023-10-11 누멘타는 "고도로 희소한"access-date=2023-10-11 신경망 기술을 자랑하며, 이 기술을 통해 GPU가 필요 없어지는데, 이는 그들의 알고리즘이 AVX-512가 탑재된 CPU에서 실행되기 때문이라고 말한다.access-date=2023-10-11 그들은 A100에 비해 10배의 속도 향상을 주장하는데, 이는 주로 SET(Sparse Evolutionary Training) 알고리즘과bibcode=2018NatCo...9.2383M 포어사이트 프루닝과 같은 기법을 통해 정확도를 유지하면서 신경망의 크기를 줄이기 때문이라고 한다.access-date=2023-10-11