FMA 명령 세트
FMA instruction set
FMA 명령 세트는 x86 마이크로프로세서 명령 세트의 128비트 및 256비트 스트리밍 SIMD 확장 명령의 확장으로 FMA 작업을 [1]수행합니다.두 가지 종류가 있습니다.
- FMA4는 불도저 아키텍처 이후의 AMD 프로세서에서 지원됩니다.FMA4는 FMA3보다 먼저 하드웨어에서 실행되었습니다.Zen [2]1 이후 FMA4의 지원이 없어졌습니다.
- FMA3는 2014년부터 AMD 프로세서에서 지원되며, 인텔은 Haswell 프로세서 및 Broadwell 프로세서에서 지원되고 있습니다.
지침들
FMA3 명령과 FMA4 명령의 기능은 거의 동일하지만 호환성은 없습니다.양쪽 모두 부동소수점 스칼라 및 SIMD 연산을 위한 Fused Multi-Add(FMA; 다중 추가) 명령이 포함되어 있지만 FMA3 명령에는 3개의 오퍼랜드가 있으며 FMA4 명령에는 4개의 오퍼랜드가 있습니다.FMA 연산은 d = round(a · b + c) 형식입니다. 여기서 라운드 함수는 반올림을 수행하여 대상 내에 너무 많은 유효 비트가 있는 경우 결과를 대상 레지스터 내에 넣을 수 있도록 합니다.
4개의 오퍼랜드 형식(FMA4)에서는 a, b, c 및 d를 4개의 다른 레지스터로 할 수 있지만 3개의 오퍼랜드 형식(FMA3)에서는 d가 a, b 또는 c와 같은 레지스터여야 합니다.3개의 오퍼랜드 형식은 코드를 단축하고 하드웨어 구현을 약간 단순하게 하는 반면 4개의 오퍼랜드 형식은 보다 유연한 프로그래밍을 제공합니다.
Intel과 AMD 간의 호환성 문제에 대한 자세한 내용은 XOP 명령 집합을 참조하십시오.
FMA3 명령 세트
FMA3 탑재 CPU
- AMD
- 스택드라이버(2012) 및 새로운 마이크로아키텍처[3]
- 2세대 APU, '트리니티'(32nm), 2012년 5월 15일
- 2세대 'Buldozer' (bdver2) (2012년 10월 23일, 스택드라이버 코어 탑재)
- 스택드라이버(2012) 및 새로운 마이크로아키텍처[3]
- 인텔(R)
FMA3에서 발췌
지원되는 명령어는 다음과 같습니다.
니모닉 | 작동 | 니모닉 | 작동 |
---|---|---|---|
VFMDD | result = + a · b + c | VFMADSUB | result = a · b + c i = 1, 3, ...의 경우result = a · b − c i = 0, 2, ...의 경우 |
VFNM 추가 | result = − a · b + c | ||
VFMSUB | result = + a · b − c | VFMSUB 추가 | result = a · b − c i = 1, 3, ...의 경우result = a · b + c i = 0, 2, ...의 경우 |
VFNMSUB | result = − a · b − c |
- 메모
- VFNMADD는
result = − a · b + c
,것은 아니다.result = − (a · b + c)
. - VFNMSUB는 모든 입력이 0인 경우 -0을 생성합니다.
오퍼랜드의 명시적 순서는 숫자 "132", "213" 및 "231"을 사용하여 니모닉에 포함됩니다.
포스트픽스 1 | 작동 | 있을 법한 메모리 오퍼랜드 | 덮어쓰기 |
---|---|---|---|
132 | a = a · c + b | c (요인) | a (기타 요인) |
213 | a = b · a + c | c (및) | a (요인) |
231 | a = b · c + a | c (요인) | a (및) |
오퍼랜드 형식(패킹 또는 스칼라) 및 크기(싱글 또는 더블)도 포함됩니다.
포스트픽스 2 | 정확 | 크기 | 포스트픽스 2 | 정확 | 크기 |
---|---|---|---|---|---|
SS | 싱글 | 32비트 | SD | 이중 | x 64 비트 |
PSX | x 32 비트 | PDx | 2 x 64 비트 | ||
PSy | x 32 비트 | PDy | 4 x 64 비트 | ||
PSZ | 16 x 32 비트 | PDZ | 8 x 64 비트 |
그 결과,
부호화 | 니모닉 | 오퍼랜드 | 작동 |
---|---|---|---|
VEX.256.66.0F38.W1 98 /r | VFMADD132PDy | ymm, ymm, ymm/m256 | a = a · c + b |
VEX.256.66.0F38.W0 98 /r | VFMADD132PSy | ||
VEX.128.66.0F38.W1 98 /r | VFMADD132PDx | xmm, xmm, xmm/m128 | |
VEX.128.66.0F38.W0 98 /r | VFMADD132PX | ||
VEX.LIG.66.0F38.W1 99 /r | VFMADD132SD | xmm, xmm, xmm/m64 | |
VEX.LIG.66.0F38.W0 99 /r | VFMADD132SS | xmm, xmm, xmm/m32 | |
VEX.256.66.0F38.W1 A8 /r | VFMADD213PDy | ymm, ymm, ymm/m256 | a = b · a + c |
VEX.256.66.0F38.W0 A8 /r | VFMADD213PSy | ||
VEX.128.66.0F38.W1 A8 /r | VFMADD213PDx | xmm, xmm, xmm/m128 | |
VEX.128.66.0F38.W0 A8 /r | VFMADD213PSX | ||
VEX.LIG.66.0F38.W1 A9 /r | VFMADD213SD | xmm, xmm, xmm/m64 | |
VEX.LIG.66.0F38.W0 A9 /r | VFMADD213SS | xmm, xmm, xmm/m32 | |
VEX.256.66.0F38.W1 B8 /r | VFMADD231PDy | ymm, ymm, ymm/m256 | a = b · c + a |
VEX.256.66.0F38.W0 B8 /r | VFMADD231PSy | ||
VEX.128.66.0F38.W1 B8 /r | VFMADD231PDx | xmm, xmm, xmm/m128 | |
VEX.128.66.0F38.W0 B8 /r | VFMADD231PSX | ||
VEX.LIG.66.0F38.W1 B9 /r | VFMADD231SD | xmm, xmm, xmm/m64 | |
VEX.LIG.66.0F38.W0 B9 /r | VFMADD231SS | xmm, xmm, xmm/m32 |
FMA4 명령 세트
FMA4 탑재 CPU
- AMD
- '중장비' 프로세서
- Zen: WikiChip의 테스트 결과 FMA4는 (테스트 조건 하에서) CPUID에 의해 공식적으로 지원되지 않고 보고되지 않았음에도 불구하고 여전히 작동하고 있는 것으로 나타났습니다.이것은 또한 [8]애그너에 의해 확인되었다.하지만 다른 테스트들은 잘못된 [9]결과를 낳았다.AMD 공식 웹사이트 FMA4 지원 노트 ZEN CPU = AMD ThreadRipper 1900x, R7 Pro 1800, 1700, R5 Pro 1600, 1500, R3 Pro 1300, 1200, R3 2200G, R5 2400G.[10][11][12]
- 후지쯔
- "Riken" 클래스의 SPARC64 프로세서.2010년 이후 모든 Fujitsu Enterprise SPARC64 서버는 FMA4를 지원하며, 일반적인 opcode는 "faddd %f38,%f48,%f46,%f50"이며, 여기서 4개의 개별 레지스터가 사용됩니다.3개는 입력 파라미터용이고 1개는 반환값용입니다.
- IBM
- IBM POWER9 및 POWER10 및 z/Architecture 프로세서.IBM POWER9 또는 POWER10 프로세서 또는 z/Architecture 프로세서(예: IBM 메인프레임 z/OS 시스템)가 장착된 시스템은 모두 하드웨어에 구현된 모든 IEEE 754-2008 부동 소수점 형식과 함께 FMA4 opcode를 방출합니다.IBM FP128 데이터형 또는
__float128
최대 128비트 정밀도와 부동소수점 사양을 엄격하게 준수합니다.
- IBM POWER9 및 POWER10 및 z/Architecture 프로세서.IBM POWER9 또는 POWER10 프로세서 또는 z/Architecture 프로세서(예: IBM 메인프레임 z/OS 시스템)가 장착된 시스템은 모두 하드웨어에 구현된 모든 IEEE 754-2008 부동 소수점 형식과 함께 FMA4 opcode를 방출합니다.IBM FP128 데이터형 또는
- 인텔(R)
- 인텔은 FMA4를 지원하는 CPU를 출시하지 않았습니다.
FMA4에서 발췌
니모닉(AT&T) | 오퍼랜드 | 작동 |
---|---|---|
VFMADDPDx | xmm, xmm, xmm/m128, xmm/m128 | a = b·c + d |
VFMADDPDy | ymm, ymm, ymm/m256, ymm/m256 | |
VFMADDPSx | xmm, xmm, xmm/m128, xmm/m128 | |
VFMADDPSy | ymm, ymm, ymm/m256, ymm/m256 | |
VFMADDSD | xmm, xmm, xmm/m64, xmm/m64 | |
VFMADDSS | xmm, xmm, xmm/m32, xmm/m32 |
역사
인텔의 FMA3와 AMD의 FMA4가 호환되지 않는 것은 양사가 서로 코딩 세부사항을 조정하지 않고 계획을 변경했기 때문입니다.AMD는 FMA3에서 FMA4로, 인텔은 거의 동시에 FMA4에서 FMA3로 계획을 변경했다.이력은 다음과 같이 요약할 수 있습니다.
- 2007년 8월: AMD는 SSE5 명령 세트를 발표합니다.이 명령에는 3개의 오퍼랜드 FMA 명령이 포함되어 있습니다.명령어가 3개의 오퍼랜드를 [13]가질 수 있도록 하기 위해 새로운 코딩 방식(DREX)이 도입되었습니다.
- 2008년 4월: 인텔은 4개의 오퍼랜드 FMA 명령을 포함한 AVX 및 FMA 명령 세트를 발표합니다.이러한 명령의 부호화에는 새로운 VEX 부호화 [14]방식이 사용되며, AMD의 DREX 방식보다 유연합니다.
- 2008년 12월: 인텔은 FMA 명령의 사양을 4 오퍼랜드에서3 오퍼랜드로 변경합니다.VEX 부호화 방식은 [15]아직 사용되고 있습니다.
- 2009년 5월: AMD는 FMA 명령의 사양을 3operand DREX 형식에서4operand VEX 형식으로 변경하여 2008년 12월의 인텔 [16]사양이 아닌 2008년 4월의 인텔 사양에 대응하고 있습니다.
- 2011년 10월: AMD Buldozer 프로세서는 FMA4를 지원합니다.[17]
- 2012년 1월: AMD는 코드명 Trinity 및 Vishera로 명명된 미래의 프로세서에서 FMA3 지원을 발표하였습니다.이러한 프로세서는 Stloodriver [18]아키텍처를 기반으로 합니다.
- 2012년 5월: AMD Stuilledriver 프로세서는 FMA3와 FMA4를 [17]모두 지원합니다.
- 2013년 6월:인텔 Haswell 프로세서는 FMA3를 [19]지원합니다.
- 2017년 2월 1세대 AMD Ryzen 프로세서는 공식적으로 FMA3를 지원하지만 CPUID 지침에 따르면 [2]FMA4는 지원하지 않습니다.이후 [20][21]수정된 GNU Binutils 패키지에 대한 초기 패치의 에러타로 인해 이 프로세서에 FMA4가 구현되었는지 여부에 대한 혼란이 있었습니다.일부 테스트에서는 FMA4 명령이 작동하는 것처럼 보이지만 잘못된 결과를 나타낼 [9]수도 있습니다.게다가 최초의 Ryzen CPU는, FMA3 명령의 특정 시퀀스에 의해서 크래시 되는 일이 있습니다.그 후 CPU [22]마이크로코드의 업데이트로 해결되었습니다.
컴파일러 및 어셈블러 지원
컴파일러에 따라 FMA에 대한 지원 수준이 달라집니다.
- GCC는 버전 4.5.0 이후[23] -mfma4를 사용한FMA4 및 버전 4.7.0 이후 -mfma를 사용한FMA3를 지원합니다.
- Microsoft Visual C++ 2010 SP1은 FMA4 [24]명령을 지원합니다.
- Microsoft Visual C++ 2012는 FMA3 명령을 지원합니다(프로세서가 AVX2 명령 세트 확장도 지원하는 경우).
- VC 2013년 이후 Microsoft Visual C++
- PathScale은 -mfma를 [25]사용하여 FMA4를 지원합니다.
- LLVM 3.1에는 FMA4 [26]지원 및 예비 FMA3 [27]지원이 추가되었습니다.
- Open64 5.0에는 '제한적 지원'이 추가되어 있습니다.
- 인텔 컴파일러는 FMA3 [23]명령만 지원합니다.
- NASM은 버전 2.03 이후의 FMA3 명령과 2.06 이후의 FMA4 명령을 지원합니다.
- FASM은 FMA3 및 FMA4 명령을 모두 지원합니다.
레퍼런스
- ^ "FMA3와 FMA4는 명령 집합이 아니라 개별 명령입니다. 퓨전 다중 덧셈입니다.인텔과 AMD가 어떻게 구현하느냐에 따라 매우 유용할 수 있습니다.Woltmann, George (Prime95). "Intel AVX and GIMPS". mersenneforum.org/index.php. Great Internet Mersenne Prime Search (GIMPS) project. Retrieved 27 July 2011.
- ^ a b "The microarchitecture of Intel, AMD and VIA CPUs An optimization guide for assembly programmers and compiler makers" (PDF). Retrieved 2017-05-02.
- ^ Maffeo, Robin (March 1, 2012). "AMD and the Visual Studio 11 Beta". AMD. Archived from the original on November 9, 2013. Retrieved 2018-11-07.
- ^ "CPU-Z - ID : y5z6gq". Retrieved 2022-05-01.
- ^ "CPU-Z - ID : kr2mlx". Retrieved 2022-05-01.
- ^ "AMD64 Architecture Programmer's Manual Volume 6: 128-Bit and 256-Bit XOP, FMA4 and CVT16 Instructions" (PDF). AMD. May 1, 2009.
- ^ "New "Bulldozer" and "Piledriver" Instructions A step forward for high performance software development" (PDF). AMD. October 2012.
- ^ "Agner's CPU blog - Test results for AMD Ryzen". 2017-05-02.
- ^ a b "Discussion – Ryzen has undocumented support for FMA4". Retrieved 2017-05-10.
- ^ "www.amd.com, FMA4 support model list".
- ^ "www.amd.com, FMA4 support model list".
- ^ "www.amd.com, FMA4 support model list".
- ^ "128-Bit SSE5 Instruction Set". AMD Developer Central. Archived from the original on 2008-01-15. Retrieved 2008-01-28.
- ^ "Intel Advanced Vector Extensions Programming Reference" (PDF). Intel. Retrieved 2008-04-05.[영구 데드링크]
- ^ "Intel Advanced Vector Extensions Programming Reference". Intel. Retrieved 2009-05-06.
- ^ "Striking a balance". Dave Christie, AMD Developer blogs. May 6, 2009. Archived from the original on July 8, 2012. Retrieved 2018-11-07.
- ^ a b "New Bulldozer and Piledriver Instructions" (PDF). AMD. Retrieved 25 July 2013.
- ^ "Software Optimization Guide for AMD Family 15h Processors" (PDF). AMD. Retrieved 19 April 2012.
- ^ "Intel Architecture Instruction Set Extensions Programming Reference" (PDF). Intel. Retrieved 25 July 2013.
- ^ Gopalasubramanian, Ganesh (2015-03-10). "[PATCH] add znver1 processor". Retrieved 2022-05-01.
- ^ Pawar, Amit (2015-08-07). "[PATCH] Remove CpuFMA4 from Znver1 CPU Flags". Retrieved 2022-05-01.
- ^ "AMD Ryzen Machine Crashes to a Sequence of FMA3 Instructions". Retrieved 2017-09-10.
- ^ a b Latif, Lawrence (Nov 14, 2011). "AMD Bulldozer only FMA4 and XOP instructions are supported by GCC Intel still mute". The Inquirer. Archived from the original on November 17, 2011.
{{cite web}}
: CS1 유지보수: 부적합한 URL(링크) - ^ "FMA4 Intrinsics Added for Visual Studio 2010 SP1".
- ^ "EKOPath man doc". Archived from the original on 2016-06-23. Retrieved 2013-07-24.
- ^ "LLVM 3.1 Release Notes".
- ^ "Enable detection of AVX and AVX2 support through CPUID". LLVM. 2012-04-26.