TECH 으로 돌아가기
TECH HACKER NEWS 오늘 6분 읽기 26 READS

인텔 매뉴얼에만 존재하는 유령 명령어 'vfmaddrnd231pd'의 수수께끼

인텔 매뉴얼에만 존재하는 유령 명령어 'vfmaddrnd231pd'의 수수께끼
SOURCE IMAGE · HACKER NEWS

x86 아키텍처를 깊이 다루는 엔지니어라면 인텔 소프트웨어 개발자 매뉴얼(SDM)을 사실상 표준 레퍼런스로 신뢰한다. 그런데 이 방대한 문서에 실제 CPU에서는 동작하지 않는 명령어가 버젓이 기재돼 있다면 어떨까. 한 개발자가 FMA(Fused Multiply-Add) 명령어 집합을 살펴보다 발견한 'vfmaddrnd231pd'가 바로 그런 사례다. SDM은 이 명령어를 "반올림 제어 기능을 갖춘 패킹된 배정밀도 부동소수점 값의 융합 곱셈-덧셈(Fused Multiply-Add … with rounding control)"으로 정의하고, 즉시값(immediate) 바이트가 반올림 방식과 DAZ, FTZ, 예외 억제를 제어하는 여러 비트 필드를 담는다고 설명한다(Table 5-3 참조).

매력적이었던 기능의 약속

이름에 붙은 'rnd'가 핵심이다. 일반적인 FMA 명령어는 'vfmadd231pd'처럼 반올림 제어 표기가 없고, x86의 대다수 부동소수점 명령어는 전역(global) 반올림 모드와 설정을 따른다. 문제는 이 전역 설정을 바꾸는 작업이 상당히 느리다는 점이다. 반면 vfmaddrnd231pd는 명령어 단위로 반올림 모드를 지정할 수 있다고 기술돼 있었다. FMA는 덧셈·뺄셈·곱셈을 모두 흉내 낼 수 있으므로, 이 메커니즘이 실제로 존재한다면 AVX-512 없이도 모든 산술 연산에 반올림 제어를 걸 수 있게 된다. 반올림 동작에 의존하는 수치 알고리즘의 성능을 극적으로 끌어올릴 수 있는 셈이다. 적어도 이론상으로는 그랬다.

실체가 없는 명령어

의심은 도구를 하나씩 확인하면서 시작됐다. GNU 어셈블러는 이 명령어를 인식하지 못한다. SDM이 언급한 인텔 C/C++ 컴파일러 인트린식 _mm_fmaddround_pd와 _mm256_fmaddround_pd는 Clang은 물론 인텔 자사 컴파일러(ICC)에도 존재하지 않는다. SDM의 옵코드 목록을 보고 직접 기계어를 조립하려 하면 더 이상한 대목이 나온다. VEX는 VEX 프리픽스라 치더라도, 함께 적힌 'DDS'가 무엇인지 알 수 없다. DDS는 SDM 전체에서 이 항목에만 등장하며, 한 스택오버플로 답변에 따르면 과거 문서화 용도로만 쓰이다 이후 판에서 삭제된 표기다. 그런 흔적이 여기 남아 있다는 사실 자체가 수상하다. 결정적으로, FMA를 지원하는 하스웰(Haswell) CPU에서 이 명령어를 실제로 실행하면 #UD, 즉 '정의되지 않은 명령어' 예외가 발생한다.

정황은 더 쌓였다. 다른 FMA 명령어들이 pd/ps/sd/ss 자료형과 132/213/231 피연산자 순서 변형을 두루 갖추는 것과 달리, SDM은 유독 vfmaddrnd231pd 하나만 수록하고 나머지 변형은 언급하지 않는다. 결정타는 판본 비교였다. 2024년판 SDM에는 있던 이 명령어가 2026년판에서는 사라졌다.

단순 오타로 보기 어려운 이유

흥미로운 점은 이것이 문서상의 단순 실수로 치부하기 어렵다는 것이다. 오타라면 다른 명령어 설명을 복사하다 생긴 흔적이 남기 마련인데, 이 항목은 다른 어떤 명령어와도 닮지 않은 고유한 표와 의사코드(pseudocode)를 갖추고 있다. 누군가 상당한 공을 들여 작성한 정식 문서라는 뜻이다. 발견자는 인텔이 vfmaddrnd* 계열을 추가하려다 막판에 문제를 발견해 CPU에서는 제거했지만, SDM 수정은 제때 반영하지 못한 것이 아닐까 추정한다. 다만 이를 확인할 방법은 없다고 솔직히 덧붙인다.

이 일화는 한국의 저수준 개발자와 컴파일러·수치 라이브러리 담당자에게 실무적인 교훈을 남긴다. 벤더 매뉴얼은 권위 있는 자료이지만 하드웨어의 실제 동작과 항상 일치하지는 않는다는 점이다. 특히 ISA 확장처럼 설계와 출시 일정이 유동적인 기능은, 문서에 기재됐다는 사실만으로 대상 CPU에서 사용 가능하다고 단정해선 안 된다. 새로운 명령어나 인트린식을 코드에 반영하기 전에는 어셈블러와 컴파일러의 실제 지원 여부, 그리고 타깃 하드웨어에서의 CPUID 확인과 실행 테스트를 거쳐야 한다. 매뉴얼이 약속한 성능 이점이 아무리 매력적이어도, 실행 시 #UD로 돌아올 기능이라면 설계의 전제로 삼을 수 없기 때문이다. vfmaddrnd231pd의 정체는 여전히 미궁에 있지만, 그 자체로 하나의 반면교사가 되는 사례다.

SOURCE · HACKER NEWS
원문 전체 보기 → https://purplesyringa.moe/blog/who-is-vfmaddrnd231pd/
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기 →
처리 중...