{{위키데이터 속성 추적}}
'''FMA 명령어 집합'''({{Llang|en|FMA instruction set}})은 [[단일 곱셈-누산기]](FMA)계산을 하기위한 [[x86]] 마이크로프로세서 명령어 집합에서의 128비트 SIMD명령어들이다. 여기에는 두가지의 종류가 있다.
* '''FMA3'''는 [[인텔]]의 [[해스웰 (마이크로아키텍처)|해스웰]] 마이크로아키텍처에서부터 지원된다.
* '''FMA4'''는 2011년에 발표하는 [[어드밴스트 마이크로 디바이시스|AMD]]의 AMD 프로세서에서부터 지원될 예정이다.

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

== 호환성 문제 ==
FMA3와 FMA4의 차이점은 명령어가 세개의 피연산자(operand)를 갖느냐 네개의 피연산자를 갖느냐이다. 이 차이점은 호환성 문제를 야기한다. [[단일 곱셈-누산기]](FMA)는 다음과 같은 형태로 이루어진다.

<math>d=a+b\times c</math>

FMA4는 네개의 피연산자가 네개의 [[프로세서 레지스터]]를 사용하고 FMA3는 세개의 피연산자와 세개의 레지스터를 사용한다. 따라서 d 가 a와 같다. FMA3는 코드가 좀 더 짧게 되며 하드웨어의 구현이 좀 더 단순한반면 FMA4는 프로그램의 유연성을 제공한다.

== FMA3 명령어 집합 ==

=== FMA3지원 CPU ===
* [[인텔]]
** 인텔은 22nm공정기술을 사용하는 하스웰부터 지원한다.
* AMD
** FMA3 지원은 호환성을 위해 [[파일드라이버_(마이크로아키텍처)]]부터 시작되었다.<ref>{{웹 인용 | url=http://blogs.amd.com/developer/2009/05/06/striking-a-balance | title=Striking a balance | date=May 7, 2009 | publisher=Dave Christie, AMD Developer blogs | accessdate=2009-05-08 | archiveurl=https://archive.today/20120708101459/http://blogs.amd.com/developer/2009/05/06/striking-a-balance/ | archivedate=2012-07-08 | url-status=live }}</ref><ref>{{웹 인용|last=Maffeo|first=Robin|title=AMD and the Visual Studio 11 Beta|url=http://blogs.amd.com/developer/2012/03/01/amd-and-the-visual-studio-11-beta/|publisher=AMD|accessdate=19 April 2012|archiveurl=https://archive.today/20120707203922/http://blogs.amd.com/developer/2012/03/01/amd-and-the-visual-studio-11-beta/|archivedate=2012년 7월 7일|url-status=live}}</ref> 트리니티를 기반으로 한 2세대 APU는 2012년 5월 15일 이후 출시된 제품에 FMA3 명령어를 지원이 추가되었다. [[파일드라이버_(마이크로아키텍처)]] 기반 2세대 불도저 아키텍처는 2012년 10월 23일부터 출시된 이후 제품부터 FMA3 명령어를 지원한다.

=== Excerpt from FMA3 ===
{| class="wikitable"
|-
! Mnemonic (AT&T)
! 피연산자
! 연산
|-
|VFMADD132PDx
|xmm, xmm, xmm/m128
|$0 = $0*$2 + $1
|-
|VFMADD132PDy
|ymm, ymm, ymm/m256
|$0 = $0*$2 + $1
|-
|VFMADD213PDx
|xmm, xmm, xmm/m128
|$0 = $1*$0 + $2
|-
|VFMADD213PDy
|ymm, ymm, ymm/m256
|$0 = $1*$0 + $2
|-
|VFMADD231PDx
|xmm, xmm, xmm/m128
|$0 = $1*$2 + $0
|-
|VFMADD231PDy
|ymm, ymm, ymm/m256
|$0 = $1*$2 + $0
|-
|VFMADD132PSx
|xmm, xmm, xmm/m128
|$0 = $0*$2 + $1
|-
|VFMADD132PSy
|ymm, ymm, ymm/m256
|$0 = $0*$2 + $1
|-
|VFMADD213PSx
|xmm, xmm, xmm/m128
|$0 = $1*$0 + $2
|-
|VFMADD213PSy
|ymm, ymm, ymm/m256
|$0 = $1*$0 + $2
|-
|VFMADD231PSx
|xmm, xmm, xmm/m128
|$0 = $1*$2 + $0
|-
|VFMADD231PSy
|ymm, ymm, ymm/m256
|$0 = $1*$2 + $0
|-
|VFMADD132SD
|xmm, xmm, xmm/m64
|$0 = $0*$2 + $1
|-
|VFMADD213SD
|xmm, xmm, xmm/m64
|$0 = $1*$0 + $2
|-
|VFMADD231SD
|xmm, xmm, xmm/m64
|$0 = $1*$2 + $0
|-
|VFMADD132SS
|xmm, xmm, xmm/m32
|$0 = $0*$2 + $1
|-
|VFMADD213SS
|xmm, xmm, xmm/m32
|$0 = $1*$0 + $2
|-
|VFMADD231SS
|xmm, xmm, xmm/m32
|$0 = $1*$2 + $0
|}

== FMA4 명령어 집합 ==
=== FMA4지원 CPU ===
* AMD
** 2011년에 양산될 불도저 프로세서 코어<ref>{{웹 인용| url=http://support.amd.com/us/Processor_TechDocs/43479.pdf | 제목=AMD64 Architecture Programmer’s Manual Volume 6: 128-Bit and 256-Bit XOP, FMA4 and CVT16 Instructions | 날짜=May 1, 2009 | 출판사=[[AMD]]}}</ref>.
* 인텔
** 인텔 프로세서에서 FMA4를 지원할지는 미정.

=== Excerpt from FMA4 ===
{| class="wikitable"
|-
! Mnemonic (AT&T)
! 피연산자
! 연산
|-
|VFMADDPDx
|xmm, xmm, xmm/m128, xmm/m128
|$0 = $1*$2 + $3
|-
|VFMADDPDy
|ymm, ymm, ymm/m256, ymm/m256
|$0 = $1*$2 + $3
|-
|VFMADDPSx
|xmm, xmm, xmm/m128, xmm/m128
|$0 = $1*$2 + $3
|-
|VFMADDPSy
|ymm, ymm, ymm/m256, ymm/m256
|$0 = $1*$2 + $3
|-
|VFMADDSD
|xmm, xmm, xmm/m64, xmm/m64
|$0 = $1*$2 + $3
|-
|VFMADDSS
|xmm, xmm, xmm/m32, xmm/m32
|$0 = $1*$2 + $3
|}

== 내력 ==
인텔과 AMD는 양사간에 FMA3와 FMA4의 코딩 기법에 대한 협력없이 서로의 지원 계획을 바꿈으로서 호환성 문제가 발생했다. AMD는 FMA3에서 FMA4로 변경을 했고 이와 거의 동시에 인텔은 FMA4에서 FMA3로 계획을 변경했다. 대략적인 내력은 다음과 같다.
* 2007년 8월: AMD는 FMA3를 지원하는 SSE5 명령어 집합을 발표함. 세 피연산자를 갖는 명령어를 허용하는 새로운 코딩 기법(DREX)이 소개되었다.<ref>{{웹 인용 | url=http://developer.amd.com/SSE5 | 제목=128-Bit SSE5 Instruction Set | 출판사=AMD Developer Central | accessdate=2008-01-28 | archiveurl=https://web.archive.org/web/20080115163416/http://developer.amd.com/SSE5 | archivedate=2008-01-15 | url-status=dead }}</ref>.
* 2008년 4월: [[인텔]]은 FMA4를 포함하는 [[고급 벡터 확장|AVX]]와 FMA명령어 집합을 발표함. 이 명령어들의 코딩은 AMD의 DREX보다 더 유연한 새로운 [[VEX]] 코딩 기법을 사용한다.<ref>{{웹 인용 | url=http://softwarecommunity.intel.com/isn/downloads/intelavx/Intel-AVX-Programming-Reference-31943302.pdf | 제목=Intel Advanced Vector Extensions Programming Reference | 출판사=[[인텔]] | accessdate=2008-04-05 | 보존url=https://web.archive.org/web/20110807135414/http://software.intel.com/file/17976/ | 보존날짜=2011-08-07 | url-status=dead }}</ref>.
* 2008년 12월: 인텔은 FMA명령어 사양을 네개 피연산자에서 세개 피연산자로 변경함. VEX 코딩 기법은 여전히 유효<ref>{{웹 인용 | url=http://software.intel.com/en-us/avx/ | 제목=Intel Advanced Vector Extensions Programming Reference | 출판사=[[인텔]] | accessdate=2009-05-06}}</ref>.
* 2009년 5월: AMD는 FMA명령어 사양을 세개 피연산자에서 네개 피연산자 VEX형태로 변경함. 그렇지만 이것은 2008년 12월 인텔 사양과 호환되는 것이 아니라 2008년 4월 인텔 사양과 호환됨.<ref>{{웹 인용 | url=http://forums.amd.com/devblog/blogpost.cfm?threadid=112934&catid=208 | title=Striking a balance | date=May 7, 2009 | publisher=Dave Christie, AMD Developer blogs | accessdate=2009-05-08 | archive-date=2012-04-05 | archive-url=https://www.webcitation.org/66hmwoiAL?url=http://blogs.amd.com/developer/ }}</ref>.

== 같이 보기 ==
* [[SSE]]
* [[SSE2]]
* [[SSE3]]
* [[SSE4]]
* [[고급 벡터 확장|AVX]]

== 각주 ==
{{각주}}

{{AMD 기술}}

[[분류:X86 명령어]]
[[분류:마이크로프로세서]]
[[분류:SIMD 컴퓨팅]]