페르미 (마이크로아키텍처)

right|섬네일|아키텍처의 이름이 된 엔리코 페르미의 사진
**페르미**(Fermi)는 엔비디아가 개발한 그래픽 처리 장치(GPU) 마이크로아키텍처의 코드네임으로, 테슬라 마이크로아키텍처의 후속으로 2010년 4월에 소매점에 처음 출시되었다. 이 아키텍처는 주로 지포스 400 시리즈와 500 시리즈에 사용되었다. 데스크톱 페르미 GPU는 모두 40nm 공정으로 제조되었으며, 모바일 페르미 GPU는 40nm 및 28nm 공정으로 제조되었다. 페르미는 마이크로소프트의 렌더링 API Direct3D 12 feature_level 11을 지원하는 엔비디아의 가장 오래된 마이크로아키텍처이다.

페르미는 케플러에 의해 계승되었으며, 지포스 600 시리즈, 지포스 700 시리즈, 지포스 800 시리즈에서는 케플러와 함께 사용되었는데, 후자 두 시리즈에서는 모바일 GPU에만 사용되었다.

워크스테이션 시장에서 페르미는 쿼드로 x000 시리즈, 쿼드로 NVS 모델, 엔비디아 테슬라 컴퓨팅 모듈에 사용되었다.

이 아키텍처는 이탈리아의 물리학자인 엔리코 페르미의 이름을 따서 명명되었다.

## 개요
섬네일|right|페르미 마이크로아키텍처(GF100-375-A3)를 특징으로 하는 첫 번째 세대인 지포스 400 시리즈의 엔비디아 지포스 GTX 480
섬네일|right|그림 1. 엔비디아 페르미 아키텍처<br />그림의 관례: 주황색 - 스케줄링 및 디스패치; 녹색 - 실행; 하늘색 - 레지스터 및 캐시.
섬네일|지포스 GTX 470 카드에 탑재된 GF100 GPU 다이 사진
페르미 그래픽 처리 장치(GPU)는 30억 개의 트랜지스터를 특징으로 하며, 그 구성은 그림 1에 스케치되어 있다.
* 스트리밍 멀티프로세서(SM): 32개의 CUDA 코어(스트리밍 멀티프로세서 및 CUDA 코어 섹션 참조)로 구성된다.
* 기가스레드 글로벌 스케줄러: 스레드 블록을 SM 스레드 스케줄러에 배포하고 실행 중 스레드 간의 컨텍스트 스위치를 관리한다(워크 스케줄링 섹션 참조).
* 호스트 인터페이스: PCI-Express v2 버스(최대 전송 속도 8 GB/s)를 통해 GPU를 CPU에 연결한다.
* DRAM: 64비트 주소 지정 기능 덕분에 최대 6GB의 GDDR5 DRAM 메모리를 지원한다(메모리 아키텍처 섹션 참조).
* 클럭 주파수: 1.5 GHz (엔비디아에서 공식 발표하지 않았지만, Insight 64에서 추정).
* 최고 성능: 1.5 TFlops.
* 글로벌 메모리 클럭: 2 GHz.
* DRAM 대역폭: 192 GB/s.
* H.264 FHD 디코드 지원.

## 스트리밍 멀티프로세서
각 SM은 32개의 단정밀 CUDA 코어, 16개의 로드/스토어 유닛, 4개의 특수 기능 유닛(SFU), 고속 온칩 메모리 64 KB 블록(L1+공유 메모리 하위 섹션 참조), L2 캐시 인터페이스(L2 캐시 하위 섹션 참조)를 특징으로 한다.

### 로드/스토어 유닛
클럭당 16개의 스레드에 대한 소스 및 대상 주소를 계산할 수 있다. 캐시 또는 DRAM에서 데이터를 로드 및 저장한다.

### 특수 기능 유닛 (SFU)
sin, cosine, reciprocal, square root와 같은 초월 함수 명령을 실행한다. 각 SFU는 클럭당 스레드별로 하나의 명령을 실행하며, 워프는 8클럭에 걸쳐 실행된다. SFU 파이프라인은 디스패치 유닛과 분리되어 있어 SFU가 사용 중인 동안 디스패치 유닛이 다른 실행 유닛으로 명령을 발행할 수 있다.

## CUDA 코어
### 정수 산술 논리 장치 (ALU)
표준 프로그래밍 언어 요구 사항과 일치하는 모든 명령에 대해 완벽한 32비트 정밀도를 지원한다. 또한 워크스테이션 및 서버 모델에서 64비트를 효율적으로 지원하도록 최적화되었지만, 소비자 버전에서는 인위적으로 기능이 제한되었다.

### 부동 소수점 장치 (FPU)
새로운 IEEE 754-2008 부동 소수점 표준을 구현하여 단정밀도 및 배정밀도 연산을 위한 fused multiply-add (FMA) 명령을 제공한다. 클럭당 SM당 최대 16개의 배정밀도 fused multiply-add 연산을 수행할 수 있다.

## Fused multiply-add
Fused multiply-add (FMA)는 곱셈과 덧셈(즉, A*B+C)을 최종 반올림 단계 한 번으로 수행하여 덧셈의 정밀도 손실을 방지한다. FMA는 연산을 개별적으로 수행하는 것보다 더 정확하다.

## 워프 스케줄링
페르미 아키텍처는 두 단계의 분산 스레드 스케줄러를 사용한다.

각 SM은 구성도 그림 1에 표시된 네 개의 녹색 실행 열 중 두 개를 사용하는 명령을 발행할 수 있다. 예를 들어, SM은 첫 번째 열의 16개 코어의 16개 연산과 두 번째 열의 16개 코어의 16개 연산을 혼합하거나, 로드/스토어 유닛의 16개 연산과 SFU의 4개 연산을 혼합하거나, 프로그램에서 지정한 다른 조합을 혼합할 수 있다.

64비트 부동 소수점 연산은 처음 두 실행 열을 모두 필요로 하므로 32비트 연산 속도의 절반으로 실행된다.

### 듀얼 워프 스케줄러
SM 수준에서 각 워프 스케줄러는 32개 스레드의 워프를 해당 실행 유닛에 분배한다. 각 SM은 두 개의 워프 스케줄러와 두 개의 명령 디스패치 유닛을 특징으로 하며, 두 개의 워프가 동시에 발행되고 실행될 수 있다. 듀얼 워프 스케줄러는 두 개의 워프를 선택하고, 각 워프에서 하나의 명령을 16개의 코어 그룹, 16개의 로드/스토어 유닛 또는 4개의 SFU에 발행한다.
대부분의 명령은 듀얼 발행이 가능하다. 두 개의 정수 명령, 두 개의 부동 명령, 또는 정수, 부동 소수점, 로드, 스토어 및 SFU 명령의 혼합이 동시에 발행될 수 있다.
배정밀도 명령은 다른 연산과 듀얼 디스패치를 지원하지 않는다.

## 성능
페르미 GPU의 이론적 단정밀도 처리 능력(GFLOPS)은 2 (CUDA 코어당 FMA 명령당 사이클당 연산) × CUDA 코어 수 × 셰이더 클럭 속도(GHz)로 계산된다. 이전 세대 테슬라는 CUDA 코어와 SFU에 MAD+MUL을 병렬로 듀얼 발행할 수 있었지만, 페르미는 SM당 사이클당 32개 명령만 발행할 수 있어 32개의 CUDA 코어만 완전히 활용하게 되어 이 기능을 잃었다. 따라서 SFU를 활용하여 CUDA 코어당 사이클당 2개 이상의 연산을 달성하는 것은 불가능하다.

페르미 GPU의 이론적 배정밀도 처리 능력은 GF100/110에서 단정밀도 성능의 절반이다. 그러나 실제로 이 배정밀도 능력은 전문가용 쿼드로 및 테슬라 카드에서만 사용할 수 있으며, 소비자용 지포스 카드는 1/8로 제한된다.

## 메모리
SM당 L1 캐시와 모든 연산(로드, 스토어 및 텍스처)을 처리하는 통합 L2 캐시.

### 레지스터
각 SM은 32비트 레지스터 32K를 가진다. 각 스레드는 다른 스레드의 레지스터가 아닌 자신의 레지스터에 접근할 수 있다. CUDA 커널이 사용할 수 있는 최대 레지스터 수는 63개이다. 사용 가능한 레지스터 수는 작업량(및 이에 따른 자원 요구 사항)이 스레드 수에 따라 증가함에 따라 63개에서 21개로 점진적으로 감소한다. 레지스터는 약 8,000 GB/s의 매우 높은 대역폭을 가진다.

### L1+공유 메모리
개별 스레드의 데이터를 캐시하거나(레지스터 스필링/L1 캐시) 여러 스레드 간에 데이터를 공유하는 데 사용할 수 있는 온칩 메모리이다.
이 64 KB 메모리는 공유 메모리 48 KB와 L1 캐시 16 KB 또는 공유 메모리 16 KB와 L1 캐시 48 KB로 구성할 수 있다.
공유 메모리는 동일한 스레드 블록 내의 스레드가 협력하도록 하며, 온칩 데이터의 광범위한 재사용을 용이하게 하고, 오프칩 트래픽을 크게 줄인다.
공유 메모리는 동일한 스레드 블록의 스레드에 의해 접근할 수 있다. 낮은 지연 시간 접근(10-20 사이클)과 매우 높은 대역폭(1,600 GB/s)을 중간 정도의 데이터(계산 시리즈의 중간 결과, 행렬 연산의 한 행 또는 열 데이터, 비디오 라인 등)에 제공한다.
데이비드 패터슨은 이 공유 메모리가 로컬 스크래치패드의 아이디어를 사용한다고 말한다.

### 로컬 메모리
로컬 메모리는 "스필링된" 레지스터를 저장하는 데 사용되는 메모리 위치로 의도되었다. 레지스터 스필링은 스레드 블록이 SM에서 사용 가능한 것보다 더 많은 레지스터 저장 공간을 요구할 때 발생한다.
로컬 메모리는 일부 자동 변수(장치 코드에서  한정자 없이 선언된 변수)에만 사용된다. 일반적으로 자동 변수는 다음의 경우를 제외하고 레지스터에 상주한다. (1) 컴파일러가 상수 값으로 인덱싱되는 배열임을 확인할 수 없는 경우; (2) 너무 많은 레지스터 공간을 차지할 큰 구조체 또는 배열; 커널이 SM에서 사용 가능한 것보다 더 많은 레지스터를 사용할 때 컴파일러가 로컬 메모리로 스필링하기로 결정한 모든 변수.

### L2 캐시
16개의 SM에서 공유되는 통합 768 KB L2 캐시는 CPU 호스트와의 복사를 포함하여 글로벌 메모리로의 모든 로드 및 스토어 연산과 텍스처 요청을 처리한다.
L2 캐시 하위 시스템은 스레드 블록 또는 심지어 커널 간에 공유되어야 하는 데이터 접근을 관리하는 데 사용되는 원자적 연산도 구현한다.

### 글로벌 메모리
글로벌 메모리(VRAM)는 모든 스레드가 직접 접근할 수 있으며 PCIe 버스를 통해 호스트 시스템도 접근할 수 있다. 400-800 사이클의 높은 지연 시간을 가진다.

## 비디오 압축/압축
엔비디아 NVDEC(이전에는 NVCUVID라고 불림) 및 엔비디아 퓨어비디오를 참조하십시오.

엔비디아 NVENC 기술은 아직 사용할 수 없었지만, 후속 제품인 케플러에 도입되었다.

## 페르미 칩
* GF100
* GF104
* GF106
* GF108
* GF110
* GF114
* GF116
* GF117
* GF119

## 같이 보기
* 퀄컴 아드레노
* CUDA
* 엔비디아 GPU 마이크로아키텍처의 이름 목록
* 엔비디아 그래픽 처리 장치 목록
* 스케일러블 링크 인터페이스 (SLI)

## 각주

### 일반

* N. Brookwood, "엔비디아가 GPU 컴퓨팅 퍼즐을 해결하다."
* P.N. Glaskowsky, "엔비디아 페르미: 최초의 완전한 GPU 컴퓨팅 아키텍처."
* N. Whitehead, A. Fit-Florea, "정밀도 및 성능: 엔비디아 GPU를 위한 부동 소수점 및 IEEE 754 준수.", 2011.
* 
* R. Farber, "CUDA 애플리케이션 설계 및 개발," 모건 코프만, 2011.
* 엔비디아 애플리케이션 노트 "페르미를 위한 CUDA 애플리케이션 튜닝".

## 외부 링크
* Orange Owl Solutions의 엔비디아 페르미 아키텍처 

분류:엔비디아 마이크로아키텍처
분류:그래픽스 마이크로아키텍처