맨위로가기

FMA 명령어 집합

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

FMA 명령어 집합은 부동소수점 연산과 SIMD 연산을 위한 융합 곱셈-덧셈(FMA) 명령어들의 집합으로, FMA3와 FMA4로 나뉜다. FMA3는 인텔이 주도적으로 개발하고 하스웰 마이크로아키텍처부터 지원하며, 3개의 피연산자를 사용한다. FMA4는 AMD가 개발하고 불도저 마이크로아키텍처부터 지원하며, 4개의 피연산자를 사용한다. FMA3와 FMA4는 기능은 거의 동일하지만 호환되지 않으며, 인텔과 AMD의 상호 다른 지원 계획으로 인해 호환성 문제가 발생했다.

더 읽어볼만한 페이지

  • SIMD 컴퓨팅 - SSE2
    SSE2는 인텔이 개발한 x86 아키텍처의 SIMD 명령어 집합 확장으로, MMX 명령어의 정수 벡터 연산을 확장하고 XMM 레지스터를 사용하여 부동 소수점 연산 성능을 향상시키며, AMD64 아키텍처에서도 지원된다.
  • SIMD 컴퓨팅 - SSE3
    SSE3는 인텔에서 개발한 스트리밍 SIMD 확장 3 명령어 세트로, 부동 소수점 연산, 디지털 신호 처리, 3차원 컴퓨터 그래픽 처리 성능 향상을 위해 기존 SSE2 명령어 세트에 몇 가지 새로운 명령어를 추가한 것이다.
  • X86 명령어 - 스트리밍 SIMD 확장
    스트리밍 SIMD 확장(SSE)은 x86 아키텍처의 SIMD 명령어 집합으로, 128비트 XMM 레지스터를 사용하여 데이터 병렬 처리를 통해 성능을 향상시키며, 인텔 펜티엄 III 프로세서에 처음 도입되어 여러 후속 버전으로 발전했다.
  • X86 명령어 - SSE2
    SSE2는 인텔이 개발한 x86 아키텍처의 SIMD 명령어 집합 확장으로, MMX 명령어의 정수 벡터 연산을 확장하고 XMM 레지스터를 사용하여 부동 소수점 연산 성능을 향상시키며, AMD64 아키텍처에서도 지원된다.
  • 마이크로프로세서 - 중앙 처리 장치
    중앙 처리 장치(CPU)는 컴퓨터 시스템의 핵심 부품으로, 프로그램 명령어를 해석하고 실행하여 데이터를 처리하는 장치이다.
  • 마이크로프로세서 - ARM 아키텍처
    ARM 아키텍처는 저전력 설계로 모바일 기기에서 널리 쓰이는 RISC 기반 프로세서 아키텍처로서, IP 코어 라이선스 모델과 ARM Flexible Access를 통해 다양한 분야로 확장되고 있다.
FMA 명령어 집합
개요
종류x86 명령어 집합 확장
개발사인텔
소개FMA (Fused Multiply-Add, 융합 곱셈-덧셈) 명령어 집합은 특정 마이크로프로세서 아키텍처에서 단일 명령어로 곱셈과 덧셈을 결합한 연산을 수행하는 기술임.
중요성FMA는 계산 성능을 향상시키고 전력 소비를 줄이는 데 기여함. 특히 과학 계산, 그래픽 처리, 딥 러닝과 같은 분야에서 큰 효과를 발휘함.
FMA 버전별 특징
FMA4개발: AMD
특징: 4-operand 명령어 지원
FMA3개발: 인텔
특징: FMA4와 유사한 기능 제공, 3-operand 명령어 사용
AVX설명: Advanced Vector Extensions의 약자.
추가 사항: 부동 소수점 연산과 관련된 128비트 XMM 레지스터를 256비트 YMM 레지스터로 확장.
AVX2설명: Advanced Vector Extensions 2의 약자.
추가 사항: 정수 연산 기능 강화
활용 분야
주요 활용 분야과학 계산
그래픽 처리
딥 러닝
기타 활용 분야HPC (고성능 컴퓨팅)
금융 모델링
데이터 분석
장점
성능 향상단일 명령어로 곱셈과 덧셈을 수행하여 전체적인 계산 시간을 단축
전력 효율성명령어 실행에 필요한 전력 소비를 줄임
코드 최적화복잡한 수식을 더 효율적으로 표현 가능

2. FMA 명령어 집합의 종류

FMA 명령어 집합은 크게 FMA3와 FMA4로 나뉜다. 이 둘은 기능면에서는 거의 동일하지만 상호 호환은 되지 않는다. FMA3와 FMA4는 모두 부동 소수점 연산과 SIMD 연산을 위한 단일 곱셈-누산기(FMA) 명령어이다.

FMA3와 FMA4의 주요 차이점은 명령어가 사용하는 피연산자의 개수이다. FMA3는 세 개의 피연산자를 사용하는 반면, FMA4는 네 개의 피연산자를 사용한다. 이러한 차이는 호환성 문제를 야기한다. 단일 곱셈-누산기(FMA)는 `d = a + b * c` 형태로 이루어진다. FMA4는 네 개의 피연산자가 네 개의 프로세서 레지스터를 사용하는 반면, FMA3는 세 개의 피연산자와 세 개의 레지스터를 사용하며, d는 a와 같다. FMA3는 코드가 더 짧고 하드웨어 구현이 단순하지만, FMA4는 프로그래밍 유연성을 제공한다.

FMA3 및 FMA4 명령어에 대한 자세한 내용은 하위 섹션을 참조하면 된다.

2. 1. FMA3 명령어 집합

FMA3 명령어 집합은 부동 소수점 연산과 SIMD 연산을 위한 단일 곱셈-누산기(FMA) 명령어이다. FMA3는 세 개의 피연산자를 가지는 반면, FMA4는 네 개의 피연산자를 가진다. FMA3는 FMA4보다 코드가 짧고 하드웨어 구현이 단순하지만, 프로그래밍 유연성은 낮다.

FMA3 명령어의 기본 형태는 다음과 같다.

:d=a+b\times c

인텔은 하스웰부터, AMD는 파일드라이버_(마이크로아키텍처)부터 FMA3를 지원한다.[30][31]

FMA3 명령어의 종류는 다음과 같다.

Mnemonic (AT&T)피연산자연산
VFMADD132PDxxmm, xmm, xmm/m128$0 = $0*$2 + $1
VFMADD132PDyymm, ymm, ymm/m256$0 = $0*$2 + $1
VFMADD213PDxxmm, xmm, xmm/m128$0 = $1*$0 + $2
VFMADD213PDyymm, ymm, ymm/m256$0 = $1*$0 + $2
VFMADD231PDxxmm, xmm, xmm/m128$0 = $1*$2 + $0
VFMADD231PDyymm, ymm, ymm/m256$0 = $1*$2 + $0
VFMADD132PSxxmm, xmm, xmm/m128$0 = $0*$2 + $1
VFMADD132PSyymm, ymm, ymm/m256$0 = $0*$2 + $1
VFMADD213PSxxmm, xmm, xmm/m128$0 = $1*$0 + $2
VFMADD213PSyymm, ymm, ymm/m256$0 = $1*$0 + $2
VFMADD231PSxxmm, xmm, xmm/m128$0 = $1*$2 + $0
VFMADD231PSyymm, ymm, ymm/m256$0 = $1*$2 + $0
VFMADD132SDxmm, xmm, xmm/m64$0 = $0*$2 + $1
VFMADD213SDxmm, xmm, xmm/m64$0 = $1*$0 + $2
VFMADD231SDxmm, xmm, xmm/m64$0 = $1*$2 + $0
VFMADD132SSxmm, xmm, xmm/m32$0 = $0*$2 + $1
VFMADD213SSxmm, xmm, xmm/m32$0 = $1*$0 + $2
VFMADD231SSxmm, xmm, xmm/m32$0 = $1*$2 + $0


2. 1. 1. FMA3 지원 CPU


  • 인텔
  • 하스웰 (2013) 및 이후 프로세서. 단, 펜티엄셀러론 제외.[3][4]
  • AMD
  • 파일드라이버 (2012) 및 이후 마이크로아키텍처[2]
  • 2세대 APU "트리니티" (32nm), 2012년 5월 15일[30][31]
  • 파일드라이버 코어를 사용한 2세대 "불도저" (bdver2), 2012년 10월 23일[30][31]

2. 2. FMA4 명령어 집합

FMA4는 4개의 피연산자(operand)를 사용하는 FMA 명령어 집합이다. 단일 곱셈-누산기(FMA)는 `d = a + b * c` 형태로 이루어진다. FMA4는 4개의 피연산자가 4개의 프로세서 레지스터를 사용하는 반면, FMA3는 3개의 피연산자와 3개의 레지스터를 사용하며, d는 a와 같다. FMA3는 코드가 더 짧고 하드웨어 구현이 단순하지만, FMA4는 프로그래밍 유연성을 높여준다.[32]

FMA3와 FMA4 명령어는 기능은 거의 같지만 호환되지 않는다. 둘 다 융합 곱셈-덧셈(FMA) 명령을 사용해 부동 소수점 스칼라 및 SIMD 연산을 수행하지만, FMA3는 3개, FMA4는 4개의 피연산자를 가진다. FMA 연산은 `d = round(a * b + c)` 형태이며, 여기서 round 함수는 대상 레지스터에 맞춰 반올림을 수행한다. 4개 피연산자 형식(FMA4)은 `a`, `b`, `c`, `d`를 서로 다른 레지스터로 사용할 수 있지만, 3개 피연산자 형식(FMA3)에서는 `d`가 `a`, `b`, `c` 중 하나와 같아야 한다.

인텔과 AMD의 호환성 문제는 XOP 명령어 집합 문서를 참조하라.

Mnemonic (AT&T)피연산자연산
VFMADDPDxxmm, xmm, xmm/m128, xmm/m128$0 = $1*$2 + $3
VFMADDPDyymm, ymm, ymm/m256, ymm/m256$0 = $1*$2 + $3
VFMADDPSxxmm, xmm, xmm/m128, xmm/m128$0 = $1*$2 + $3
VFMADDPSyymm, ymm, ymm/m256, ymm/m256$0 = $1*$2 + $3
VFMADDSDxmm, xmm, xmm/m64, xmm/m64$0 = $1*$2 + $3
VFMADDSSxmm, xmm, xmm/m32, xmm/m32$0 = $1*$2 + $3


2. 2. 1. FMA4 지원 CPU


  • AMD
  • "Heavy Equipment" 프로세서
  • 불도저 기반 프로세서 (2011년 10월 12일)[5]
  • 파일드라이버 기반 프로세서[6]
  • 스팀롤러 기반 프로세서
  • 익스케베이터 기반 프로세서 ("v2" 포함)
  • : WikiChip 테스트에서는 FMA4가 공식적으로 지원되지 않고 CPUID에서 보고되지 않음에도 (테스트 조건에서) 작동하는 것으로 나타났다. Agner Fog도 이를 확인했다.[7] 그러나 다른 테스트에서는 잘못된 결과를 보였다.[21] AMD 공식 웹사이트 FMA4 지원 노트에 따르면, 젠 CPU 중에서는 AMD 쓰레드리퍼 1900x, R7 Pro 1800, 1700, R5 Pro 1600, 1500, R3 Pro 1300, 1200, R3 2200G, R5 2400G가 FMA4를 지원한다.[8][9][10]
  • 인텔
  • 인텔은 FMA4를 지원하는 CPU를 출시하지 않았다.

3. FMA3와 FMA4의 호환성 문제

FMA3와 FMA4 명령어 집합은 기능적으로 거의 동일하지만, 피연산자 개수의 차이 때문에 서로 호환되지 않는다. FMA3는 세 개의 피연산자를 사용하고 FMA4는 네 개의 피연산자를 사용한다. 단일 곱셈-누산기(FMA)는 `d=a+b\times c` 와 같은 형태로 이루어지는데, FMA4에서는 네 개의 피연산자가 네 개의 프로세서 레지스터를 사용할 수 있지만, FMA3에서는 세 개의 피연산자가 세 개의 레지스터를 사용하므로 d는 a와 같아야 한다. FMA3는 코드가 더 짧고 하드웨어 구현이 단순하지만, FMA4는 프로그래밍 유연성이 더 높다.[33][34][35][36]

인텔AMD는 FMA 명령어 집합 개발 과정에서 서로 협력하지 않고 각자의 설계를 채택하면서 호환성 문제가 발생했다. AMD는 처음에 FMA3를 지원할 계획이었으나, 이후 FMA4로 변경했다. 인텔은 처음에 FMA4를 발표했으나, 이후 FMA3로 변경했다. 이러한 변경 과정은 다음과 같이 요약될 수 있다.[33][34][35][36]

시기내용
2007년 8월AMD, FMA3를 지원하는 SSE5 명령어 집합 발표. 세 피연산자 명령어 허용을 위한 DREX 코딩 기법 도입.[33]
2008년 4월인텔, FMA4를 포함하는 AVX 및 FMA 명령어 집합 발표. AMD의 DREX보다 유연한 VEX 코딩 기법 사용.[34]
2008년 12월인텔, FMA 명령어 사양을 네 피연산자에서 세 피연산자로 변경. VEX 코딩 기법은 유지.[35]
2009년 5월AMD, FMA 명령어 사양을 세 피연산자에서 네 피연산자 VEX 형태로 변경. 2008년 12월 인텔 사양이 아닌 2008년 4월 인텔 사양과 호환.[36]
2011년 10월AMD Bulldozer 프로세서, FMA4 지원.
2012년 1월AMD, 코드명 Trinity 및 Vishera인 미래 프로세서에서 FMA3 지원 발표. 이들은 Piledriver 아키텍처 기반.
2012년 5월AMD Piledriver 프로세서, FMA3과 FMA4 모두 지원.
2013년 6월인텔 Haswell 프로세서, FMA3 지원.
2017년 2월AMD Ryzen 프로세서 1세대, CPUID 명령어에 따르면 FMA3 공식 지원, FMA4는 미지원. 초기 Ryzen CPU는 특정 FMA3 명령어 시퀀스에 의해 충돌될 수 있었지만, 업데이트된 CPU 마이크로코드로 해결됨.
2019년 7월AMD Zen 2 및 이후 Ryzen 프로세서는 FMA4를 전혀 지원하지 않음. FMA3은 계속 지원. Zen 1 및 Zen+만 비공식 FMA4 지원.


4. FMA 명령어의 역사

AMD인텔은 FMA3와 FMA4 명령어 코딩 기법에 대해 서로 협력 없이 지원 계획을 변경하면서 호환성 문제가 발생했다. AMD는 FMA3에서 FMA4로, 인텔은 거의 동시에 FMA4에서 FMA3로 변경했다.[33][34][35][36] FMA 명령어의 역사는 다음과 같다.

연도내용
2007년 8월AMD가 FMA3을 지원하는 SSE5 명령어 집합을 발표했다. 세 개의 피연산자를 허용하는 새로운 코딩 기법(DREX)이 도입되었다.[33]
2008년 4월인텔이 FMA4를 포함하는 AVX 및 FMA 명령어 집합을 발표했다. AMD의 DREX보다 유연한 새로운 VEX 코딩 기법이 사용되었다.[34]
2008년 12월인텔이 FMA 명령어 사양을 네 개 피연산자에서 세 개 피연산자로 변경했다. VEX 코딩 기법은 여전히 유효하다.[35]
2009년 5월AMD가 FMA 명령어 사양을 세 개 피연산자에서 네 개 피연산자 VEX 형태로 변경했다. 2008년 12월 인텔 사양이 아닌 2008년 4월 인텔 사양과 호환된다.[36]
2011년 10월AMD 불도저 프로세서가 FMA4를 지원한다.
2012년 1월AMD는 코드명 Trinity 및 Vishera인 미래 프로세서에서 FMA3 지원을 발표했다. 이들은 파일드라이버 아키텍처를 기반으로 한다.
2012년 5월AMD 파일드라이버 프로세서가 FMA3과 FMA4를 모두 지원한다.
2013년 6월인텔 하스웰 프로세서가 FMA3을 지원한다.
2017년 2월AMD Ryzen 프로세서 1세대는 공식적으로 FMA3을 지원한다. (FMA4는 비공식적 지원)
2019년 7월AMD Zen 2 및 이후 Ryzen 프로세서는 FMA3을 지원한다. (FMA4 미지원)


5. 컴파일러 및 어셈블러 지원


  • GCC는 버전 4.5.0부터 `-mfma4`를 사용하여 FMA4를 지원하고,[25] 버전 4.7.0부터 `-mfma`를 사용하여 FMA3를 지원한다.
  • 마이크로소프트 비주얼 C++ 2010 SP1은 FMA4 명령어를 지원한다.[26]
  • 마이크로소프트 비주얼 C++ 2012는 FMA3 명령어를 지원한다 (프로세서가 AVX2 명령어 집합 확장을 지원하는 경우).
  • 마이크로소프트 비주얼 C++ VC 2013부터 지원한다.
  • PathScale은 `-mfma`를 사용하여 FMA4를 지원한다.[27]
  • LLVM 3.1은 FMA4 지원을 추가했으며,[28] 예비 FMA3 지원도 추가했다.[29]
  • Open64 5.0은 "제한적인 지원"을 추가한다.
  • 인텔 컴파일러는 FMA3 명령어만 지원한다.[25]
  • NASM은 버전 2.03부터 FMA3 명령어를 지원하고, 2.06부터 FMA4 명령어를 지원한다.
  • FASM은 FMA3 및 FMA4 명령어를 모두 지원한다.

참조

[1] 웹사이트 Intel AVX and GIMPS http://www.mersennef[...] Great Internet Mersenne Prime Search (GIMPS) project 2011-07-27
[2] 웹사이트 AMD and the Visual Studio 11 Beta http://developer.amd[...] AMD 2012-03-01
[3] 웹사이트 CPU-Z - ID : y5z6gq https://valid.x86.fr[...] 2022-05-01
[4] 웹사이트 CPU-Z - ID : kr2mlx https://valid.x86.fr[...] 2022-05-01
[5] 웹사이트 AMD64 Architecture Programmer's Manual Volume 6: 128-Bit and 256-Bit XOP, FMA4 and CVT16 Instructions http://support.amd.c[...] AMD 2009-05-01
[6] 웹사이트 New "Bulldozer" and "Piledriver" Instructions A step forward for high performance software development http://developer.amd[...] AMD 2012-10
[7] 웹사이트 Agner's CPU blog - Test results for AMD Ryzen https://www.agner.or[...] 2017-05-02
[8] 웹사이트 www.amd.com, FMA4 support model list https://products.amd[...]
[9] 웹사이트 www.amd.com, FMA4 support model list https://products.amd[...]
[10] 웹사이트 www.amd.com, FMA4 support model list https://products.amd[...]
[11] 웹사이트 128-Bit SSE5 Instruction Set http://developer.amd[...] AMD Developer Central 2008-01-28
[12] 웹사이트 Intel Advanced Vector Extensions Programming Reference http://softwarecommu[...] Intel 2008-04-05
[13] 웹사이트 Intel Advanced Vector Extensions Programming Reference http://software.inte[...] Intel 2009-05-06
[14] 웹사이트 Striking a balance http://blogs.amd.com[...] Dave Christie, AMD Developer blogs 2009-05-06
[15] 웹사이트 New Bulldozer and Piledriver Instructions http://developer.amd[...] AMD 2013-07-25
[16] 웹사이트 Software Optimization Guide for AMD Family 15h Processors http://support.amd.c[...] AMD 2012-04-19
[17] 웹사이트 Intel Architecture Instruction Set Extensions Programming Reference http://software.inte[...] Intel 2013-07-25
[18] 웹사이트 The microarchitecture of Intel, AMD and VIA CPUs An optimization guide for assembly programmers and compiler makers http://www.agner.org[...] 2017-05-02
[19] 웹사이트 "[PATCH] add znver1 processor." https://sourceware.o[...] 2022-05-01
[20] 웹사이트 "[PATCH] Remove CpuFMA4 from Znver1 CPU Flags" https://sourceware.o[...] 2022-05-01
[21] 웹사이트 Discussion – Ryzen has undocumented support for FMA4 https://www.reddit.c[...] 2017-05-10
[22] 웹사이트 Stack Overflow comment by Mysticial https://stackoverflo[...] 2023-09-01
[23] 웹사이트 AMD Ryzen Machine Crashes to a Sequence of FMA3 Instructions https://www.techpowe[...] 2017-09-10
[24] 웹사이트 Stack Overflow comment by Mysticial https://stackoverflo[...] 2023-09-01
[25] 웹사이트 AMD Bulldozer only FMA4 and XOP instructions are supported by GCC Intel still mute http://www.theinquir[...] 2011-11-14
[26] 웹사이트 FMA4 Intrinsics Added for Visual Studio 2010 SP1 http://msdn.microsof[...] 2013-02-04
[27] 웹사이트 EKOPath man doc http://www.pathscale[...] 2013-07-24
[28] 웹사이트 LLVM 3.1 Release Notes http://llvm.org/rele[...]
[29] 웹사이트 Enable detection of AVX and AVX2 support through CPUID http://llvm.org/view[...] 2012-04-26
[30] 웹인용 Striking a balance http://blogs.amd.com[...] Dave Christie, AMD Developer blogs 2009-05-08
[31] 웹인용 AMD and the Visual Studio 11 Beta http://blogs.amd.com[...] AMD 2012-04-19
[32] 웹인용 AMD64 Architecture Programmer’s Manual Volume 6: 128-Bit and 256-Bit XOP, FMA4 and CVT16 Instructions http://support.amd.c[...] AMD 2009-05-01
[33] 웹인용 128-Bit SSE5 Instruction Set http://developer.amd[...] AMD Developer Central 2008-01-28
[34] 웹인용 Intel Advanced Vector Extensions Programming Reference http://softwarecommu[...] 인텔 2008-04-05
[35] 웹인용 Intel Advanced Vector Extensions Programming Reference http://software.inte[...] 인텔 2009-05-06
[36] 웹인용 Striking a balance http://forums.amd.co[...] Dave Christie, AMD Developer blogs 2009-05-07



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com