GN⁺: AVX 비트 논리 삼항 연산 명령어 결함
(arnaud-carre.github.io)대상 독자
- SIMD CPU 프로그래밍에 관심 있는 사람
- Amiga 프로그래머로서 "minterm" blitter 값을 계산하는 방법을 알고 싶어하는 사람
AVX-512 비트 논리 삼항 연산 명령어
- AVX-512 ISA 설계에 대한 Tom Forsyth의 발표에서 영감을 얻음
- vpternlogd 명령어는 세 개의 입력 소스를 사용하여 비트 논리 연산을 수행하는 명령어
- 512비트 레지스터를 입력으로 사용하여 복잡한 논리 연산을 단일 명령어로 수행 가능
- 8비트 즉시 값을 사용하여 구체적인 비트 논리 연산을 정의함
Amiga 블리터 커스텀 칩
- 1980년대 컴퓨터는 그래픽 처리를 위한 커스텀 칩을 보유
- Commodore Amiga 500의 블리터 칩은 비트맵 그래픽을 이동시키고 논리 연산을 수행
- 8비트 값인 "minterm"을 설정하여 논리 조합을 제어
- 많은 Amiga 프로그래머들이 minterm 값을 계산하는 방법을 몰랐음
minterm 값 쉽게 계산하는 방법
- 8비트 값을 논리 연산자 집합으로 이해할 필요 없음
- 단순히 조회 테이블로 이해할 수 있음
- 예를 들어, 세 개의 입력 비트 중 정확히 두 개가 1일 때 결과가 1이 되도록 설정
- 8비트 값을 아래에서 위로 읽어 0x68을 얻음
재미있는 우연
- Amiga에서 자주 사용되는 minterm 값 0xE2는 마스크된 2D 스프라이트 렌더링에 사용
- Intel 문서에서 #imm8 값 예제로 0xE2를 선택한 것은 우연의 일치일 수 있음
결론
- Intel 문서 예제 팀에 Amiga 팬이 있을지도 모름
- 약간의 레트로 영향은 나쁠 것이 없음
GN⁺의 정리
- AVX-512의 vpternlogd 명령어는 복잡한 비트 논리 연산을 단일 명령어로 수행할 수 있는 강력한 도구임
- Amiga의 블리터 칩과의 유사성은 역사적인 관점에서 흥미로움
- 이 글은 현대 프로그래밍과 레트로 기술 간의 연결을 보여주며, 프로그래머들에게 유용한 통찰을 제공함
- 비슷한 기능을 가진 프로젝트로는 Intel의 AVX-512와 AMD의 Zen 아키텍처가 있음
Hacker News 의견
-
특정 표현식을 계산하는 간단한 방법이 있음. 예를 들어
(NOT A) OR ((NOT B) XOR (C AND A))
를 계산하고 싶다면,_MM_TERNLOG_A
,_MM_TERNLOG_B
,_MM_TERNLOG_C
상수를 사용하여 표현식을 작성하면 됨- GCC와 Clang에서는 intrinsic 헤더에 정의된 상수를 사용하여 즉시 계산 가능함
- MSVC에서는 직접 상수를 정의해야 함
-
제목이 명령어가 제대로 작동하지 않는다고 말하는 줄 알았으나, 실제로는 작동 방식을 설명하는 것임
-
하드웨어 매뉴얼을 이해하려고 노력했으나 실패했던 경험이 있음. 나중에 대학에서 계산 논리 과목에서 A+를 받았음
-
"삼항 논리"는 보통 세 가지 진리값을 가진 논리를 의미하지만, 이 글은 세 입력을 가진 모든 이진 논리 게이트를 처리하는 컴파일러 명령어에 대해 다루고 있음
-
문서의 예시 함수 "E2"는 3개의 입력을 가진 가장 기본적인 불리언 함수로, A가 B일 때 C를 선택하는 MUX로 불림. 보편적임
-
FPGA가 임의의 논리 함수를 구현하는 방법과 동일하게, 조회 테이블(LUT)을 사용함
-
학부 시절 이산 수학 수업에 집중한 것 같음
-
sandpile.org에서 VPTERNLOG를 찾아보면, 바이트 및 워드 마스킹(AVX512BITALG2)과 관련된 Intel의 과거 계획을 볼 수 있음
-
Nvidia SASS에도 유사한 명령어(LOP3.LUT)가 있음
-
비트 연산을 정수로 패킹하는 또 다른 예로 win32의 GDI ROP 코드가 있음