벤치리뷰·뉴스·정보/아키텍처·정보분석

[분석정보] NVIDIA 차세대 GPU 아키텍처 Fermi를 발표

tware 2009. 10. 1. 21:00

 

아키텍처를 근본부터 고친 차세대 GPU


 NVIDIA는 차세대 GPU 아키텍처 "Fermi (페르미)"의 개요를 밝혔다. GPU의 내부 아키텍처를 일신, GPU 컴퓨팅의 효율과 프로그래머블 성을 크게 높였다. 또 연산 프로세서인 'CUDA core (기존 Streaming Processor에 해당) "의 수를 GT200 (GeForce GTX 280) 계의 240 개에서 512 개로 배로 늘렸다. 배로 된다는 점에서, AMD (ATI)의 RV770 (Radeon HD 4800) 계에서 Cypress (Radeon HD 5870) 계의 변화와 같지만 그 내용은 꽤나 다르다.

 ATI는 연산 프로세서 수를 2배로 해, 근본 성능을 2 배로 했으나 프로세서 코어나 메모리 계층, 데이터 흐름 등의 "기본 구조"에는 그다지 손을 대지 않았다. 그에 비해 NVIDIA는 프로세서 클러스터의 구조를 일신 메모리 계층과 데이터 흐름을 크게 변경했다. 양사의 접근은 상당히 달라, 아키텍처의 비약이 큰 것이 Fermi 이다.

 NVIDIA는 GPU 아키텍처에 세대마다 물리학자의 이름을 붙이고 있다. 초대 G80과 그 발전 계인 GT200는 Tesla (테슬라) 계에 속하고 제 2세대가 Fermi이다. 즉, NVIDIA는 이번에 아키텍처의 메이저 체인지를 한다.

 

 

 

Fermi의 개요

 


Fermi 아키텍처의 GPU 컴퓨팅에서의 큰 기술 포인트는 아래와 같다.

O 프로세서 코어를 묶은 프로세서 클러스터 "Streaming Multiprocessor (SM)"개혁
프로세서 코어 "CUDA Core"의 수를 SM 당 8개에서 32개로
배정도 부동 소수점 연산 성능을 단정도의 1/2로 확장 (기존 1/8)
명령 유닛 (WARP 스케줄러 / 디스페처)를 2 개로
SM 내부의 쓰기 가능 메모리를 16KB에서 64KB로 확장하고 컨피그러블로

O 메모리 서브 시스템과 메모리 ​​계층의 확장
L1 / L2 캐시 계층을 읽기 전용에서 쓰기 가능으로
온칩 포함해 모든 메모리 ECC를 지원
Atomic (불가분) 메모리 오퍼레이션의 성능을 향상

O "Parallel Thread Execution (PTX)"명령 세트 아키텍처의 확장
모든 메모리 주소 공간을 통합 (C++ 의 풀 서포트 때문에)
IEEE 754-2008 표준으로 단정밀도 / 배정밀도 대응
프레디 케이션을 모든 명령에 확장
OpenCL과 DirectCompute에 최적화
64-bit 메모리 어드레싱 (구현은 40-bit 로지컬 / 피지컬)

O "GigaThread"엔진의 스레드 제어를 확장
애플리케이션 컨텍스트 스위칭을 10배 고속화
복수의 커널 프로그램을 동시에 실행가능
듀얼 오버랩 메모리 전송엔진

 

범용 컴퓨팅을 위해 다방면에 걸쳐 확장


 Fermi의 아키텍처 확장은 광범하게 걸쳐 있어, 대부분의 경우 구조가 변화되고 있다. 현재 밝혀진 것은 GPU 컴퓨팅 부분이며, 그래픽 기능 부분의 확장은 위의 목록에 들어 있지 않다. 예를 들면, 래스터라이저과 테셀레이터 텍스처 유닛, ROP 같은 그래픽 전용 유닛의 확장은 여기에 들어 있지 않다. 그것은 후일 다른 곳에서 리포트 한다.

 

 

 

Fermi와 G80 / GT200 비교

 


 GPU 컴퓨팅으로의 Fermi 아키텍처는 예상됐던 확장이 거의 실현된 것이다. 후술하지만 기존의 Tesla 아키텍처에서는 아직 프로세서 구조가 복잡했던 부분이 간단하며 평면적인 구조로 바뀌었다. GPU 컴퓨팅 애플리케이션의 일부에서 필요로 하는 배정밀도 연산 성능은 단정밀도의 50%로 크게 늘었다. 범용 컴퓨터로 보다 프로그램 하기 쉽고,보다 범용적인 애플리케이션을 쓰기 쉬운 구조가 됐다.

 메모리 계층의 확장도 눈에 띈다. 현재 프로세서는 내부의 컴퓨팅 성능은 성장하지만 메모리 대역은 그에 따라갈 수 없다. 그에 따라 성능을 높이기 위해서는 프로세서 내부의 메모리를 활용해 데이터의 국소성을 살릴 수 밖에 없다. Fermi에서는 메모리 계층을  개량해 쓰기 가능한 L1 / L2 캐시를 마련하는 것으로, 이러한 상황에 대응했다. 또한 데이터 센터의 요구에 부응하기 위해 전체 메모리 계층에서 ECC를 더했다. 더 성능을 끌어내기 쉬운 메모리 구조와 고급 요구에 견딜 신뢰성을 더한 것이다.

 NVIDIA 독자적인 중간 언어형 명령 세트 PTX는 OpenCL과 DirectCompute, 거기에 C++ 등의 새로운 언어 지원을 위해 확장되었다. PTX는 드라이버 런타임으로 GPU 네이티브 명으로 변환된다. PTX 2.0 에서는 새로 책정된 부동 소수점 연산 표준 IEEE 754-2008을 지원하고 적화산의 정밀도가 새로운 업계표준에 맞춰졌다. 더 많은 언어에 대응이나 새로운 표준에 대응이 이루어졌다. 이것은 CUDA 플랫폼에서 언어 지원을 더욱 확대하는 자유도가 늘어난 것을 의미 한다.

 GPU 전체의 효율을 높이는 연구도 더해졌다. NVIDIA GPU의 약점이었던 "무거운"컨텍스트 스위치는 훨씬 빨라졌다. 또 같은 맥락 속의 의존성이 없는 커널 프로그램을 병렬로 실행시킬 수 있게 됐다. CPU의 멀티 스레딩과 어느 정도 비슷한 고효율화를 꾀한 것이다.

 현재 단계에서는 이러한 확장이 그래픽 성능에 얼마나 영향을 미칠지 모른다. 하지만 적어도 범용 컴퓨팅의 측면에서, NVIDIA의 Fermi는 큰 확장을 수행 성능을 향상시키는 것이다.

 이번 기사에서는 먼저 GPU 구조의 개요를 그려보고 싶다.

 


프로세서 클러스터의 구성을 일신해 입도를 확대


 NVIDIA 아키텍처에서는 GPU는 프로세서를 묶은 프로세서 클러스터 Streaming Multiprocessor ​​(SM)를 기본 단위로 구성되어 있다. Tesla 아키텍처의 G80과 GT200에서는 SM의 기본 구조는 거의 동일했다. 그러나 Fermi에서는 SM 자체의 구조가 바뀌고 더 평평한 컴퓨팅의 관점에서 취급하기 쉽고, 더 효율이 높아지도록 설계를 고쳤다.

 Tesla 계에서는 각 SM은 8개의 프로세서 코어 "Streaming Processor ​​(SP)"을 탑재하고 있었다. Fermi에서는 SM의 프로세서 코어는 32 개로 됐다. SM 안의 프로세서 코어는 Tesla는 Streaming Processor ​​(SP)라고 불렀지만, 이번에서 "CUDA core"로 개명 되었다. 다만 엄격한 것이 아닌, NVIDIA 자체도 Fermi 코어를 때때로 SP라고 부른다.

 SM의 프로세서 코어 수는 바뀌었지만 논리상의 벡터장인 (벡터길이) WARP의 스레드 수는 32 인 채로 변하지 않았다. WARP는 "SIMT (Single Instruction, Multiple Thread)"실행, 즉 동기화 같은 명령을 실행하는 스레드의 묶음으로 일반적인 벡터 머신의 벡터장에 해당한다. Fermi에서는 논리 벡터장을 바꾸지 않고, 물리 벡터장만 변경한 것이다.

 Tesla 계에서는 각 SM에 4개의 Special Function Unit (SFU)과 1개의 명령 유닛, 거기에 16KB의 공유 메모리 (스크래치 패드형 쓰기 가능 메모리)가 탑재되어 있었다. 또한 GT200에서는 각 SM에 1개의 배정밀도 부동 소수점 연산 유닛이 추가되었다. 그러나 Fermi에서는 이 구조가 바뀌었다.

 

 

Fermi의 Streaming Multiprocessor

 


 Fermi에서는 SM에 4개의 SFU가 탑재되어 있어 SFU와 프로세서 코어의 비율이 바뀌었다. 명령 유닛은 듀얼이 되고 다른 WARP의 명령을 동시에 발행 할 수 있다. 이것에 대해서는 후의 기사에서 설명하겠지만, Tesla의 기본적인 스케줄러의 흐름을 계승하면서 제어 하는​​ 입도를 높이는 것으로, 상대적인 단순화를 도모하고 있다.

 Fermi에서 배정밀도 부동 소수점 연산은 전용 유닛이 아닌 각 프로세서 코어 CUDA core에서 실행하게 되었다. CUDA core는 단정도 부동 소수점 연산을 1 사이클 throughput로 실행할 수 있지만, 배정 밀도 연산도 2 사이클 throughput로 실행할 수있다. 따라서 Fermi에서는 배정도의 성능은 단 정밀도의 절반이 된다. 일반적인 CPU의 배정밀도와 단정밀도의 비율과 같다. GT200에서는 단정밀도 프로세서 코어 8 개에 배정 단위가 1개로 배정도와 단 정밀도의 적화산 성능 비율은 1/8 이었다.

 CUDA core는 배정밀도 부동 소수점 연산에 대응뿐 아니라 내부 데이터 경로가 2배로 부동 소수점 연산 파이프와 정수 연산 파이프가 분리되었다.

 

 

 

Fermi의 "CUDA Core"

 


메모리 계층은 하드웨어 캐시와 스크래치 패드 메모리의 2 종류


 Tesla 아키텍처에서는 SM은 더 큰 규모의 클러스터로 구성되어 있었다. G80는 2개의 SM에 1개의 Texture / Processor ​​Cluster (TPC)를 GT200 에서는 3개의 SM에 1개의 TPC가 있었다. 로드 스토어 (Load / Store) 유닛과 텍스처 (Texture) 단위는 TPC 내의 SM 전부 공유하고 있었다.

 그러나 Fermi 에서는 로드 스토어 유닛은 각 SM에 부속시켜 SM간에 경합이 없게 되었다. 이 구조에서 텍스처 유닛도 SM에 부속되어 있다고 추측된다. 즉, TPC라는 개념 자체가 없어졌을 가능성이 높다.

 이것은 클러스터의 관리 구조가 단순화 되고 클러스터의 입도가 높아진 것을 의미한다. 즉, GPU에서의 제어 부분은 상대적으로 심플하게 되었다. 예를 들어, GT200 에서는 프로세서 클러스터 SM의 수는 30 이었지만, Fermi에서는 16으로 줄었다.

 Tesla 에서는 각 SM의 내부에 쓰기 가능한 공유 메모리를 16KB 탑재하고 있었다. Fermi에서는 메모리가 64KB로 확장되었을뿐 아니라 컨피규러블 (Configurable)이 됐다. 구체적으로는 48KB의 공유 메모리와 16KB의 쓰기가능 L1 캐시 또는 16KB의 공유 메모리와 48KB의 쓰기가능 L1 캐시의 조합으로 전환 할 수있다.

 

 

Fermi의 메모리 구조


 기존의 GPU의 데이터 캐시는 텍스처용의 읽기전용으로 프로세서 측에서 쓸수 없었다. 그러나 Fermi 에서는 쓰기 가능한 캐시가 되어 모든 SM에서 공유하는 768KB의 공유 L2 캐시와 각 SM에 내장된 L1 캐시 계층이 됐다. 스크래치 패드 형 메모리와 하드웨어 제어 캐시의 2 종류 구조가 되었다.

 따라서 프로세서의 연산 결과가 하드웨어에서 자동으로 캐시되고 다른 프로세서가 그것을 참조하는 등의 CPU 에서는 당연한 것이 가능하게 되었다. 다만 캐시에 친숙하지 않은 데이터와 응용 프로그램도 있기 때문에 NVIDIA는 L1를 컨피규러블 이며 또한 데이터는 캐시에 기록하지 않는 제어도 가능하게 했다. 또한 데이터의 정합성을 취하기 위한 Atomic 오퍼레이션의 강화도 도모했다.

 


플랫 메모리 주소 공간


 Fermi에서는 계층화 된 메모리 주소 공간은 논리상은 플랫한 주소 공간에 통합되어 GPU 내부의 하드웨어에서 물리 메모리 공간에 매핑되는 방식으로 바뀌었다. 지금까지 계층마다 다른 주소 공간에 다른 로드 / 스토어 오퍼레이션이었던 것이 단일 공간에서 단일 종류의 작업으로 통합되었다. 이렇게 하면 동적 주소 포인터의 지원이 용이한 것과 동시에 메모리 계층을 향후 복잡화하는 것도 용이하게 되었다.

 

 

 

Fermi의 메모리 주소 공간


 메모리 어드레싱은 64-bit로 확장되었다. 그러나 CPU와 마찬가지로 구현되는 메모리 어드레싱은 제한된다. Fermi에서는 논리 주소와 물리 주소 모두 40-bit가 구현되었다.

 프레디 케이션도 모든 명령에 확장되었다. GPU에서의 프레디 케이션은 조건 분기시에 분기 테이큰과 노트 테이큰의 두 분기 경로를 직렬로 실행. 조건이 성립한 스레드만 그 연산 결과를 레지스터에 기록하는 기법이다. 조건 분기를 제거 가능하기 때문에 SIMD (Single Instruction, Multiple Data) 형의 실행을 행하는 GPU에서는 일반적으로 구현되어 있다. Fermi에서는 프레디 케이션을 모든 명령에 적용 할 수있게 되어, 결과적으로 분기를 포함한 코드를 더 빠르게 실행할 수 있게 되었다.

 


복수의 커널 프로그램의 병렬 실행이 가능


 눈에 띄지 않지만 큰 확장은 GPU 전체 스레드 실행을 제어하는​​ "GigaThread"엔진의 개량이다.

 지금까지 NVIDIA GPU는 한번에 하나의 커널 프로그램만 실행시킬 수 밖에 없었다. 정확하게는 각 SM은 동일한 커널 프로그램의 다른 부분의 명령을 다른 스레드 블록 군에 대해 실행했다. CPU적인 표현으로 고치면 "싱글 스레드"적인 프로세서였다.

 그러나 Fermi에서는 같은 콘텍스트 안의 의존성이 없는 커널 프로그램을 GPU에서 동시에 실행시킬 수있게 되었다. CPU적인 표현을 하면 "멀티 스레드" 적이다. 따라서 실행하는 스레드 수가 적은 즉 병렬도가 비교적 낮은 커널을 다수 수행하는 경우에도 복수의 커널 실행을 평행시키는 것으로, GPU를 낭비없이 가동할 수 있게 됐다.

Fermi 커널 실행.

(그림만 봐도 인텔 하이퍼스레딩과 (SMT) 비슷한 설명 입니다.

SMT를 모르는 분들을 위해 설명을 하면, 현대 CPU는 여러개의 명령을 동시에 실행 할 수 있는 슈퍼 스칼라 CPU인데, CPU가 가진 최대 명령 실행을 항상 사용하는게 아닙니다. CPU 요구가 많은 경우도 끝까지 사용하지 못하는 경우도 있고, 가벼운 프로그램을 돌린다면 더더욱 CPU의 최대 명령을 쓰지를 않죠. SMT 기술이 들어오면, 컨트롤 레지스터 등을 이중화해서 하나의 코어를 논리적으로 2개의 CPU로 보이게 만들며, 2개의 작업에서 실행해야 할 명령을 동시에 실행하는 기술 입니다. 쉽게 말해서 4명령을 동시에 실행 할 수 있다고 하면, 항상 4명령을 동시에 실행하는게 아니니까 남는 유닛에  두번째 작업의 명령을 동시에 실행하는 하는 것이죠. 다르게 표현하면, 손이 4개이고 머리가 2개인데, 하나의 작업만 할 때 네개의 손을 다 써야 하는 경우도 있고, 한두개의 손만 써도 될 때도 있다고 하면, 또 다른 작업을 줘서 놀고 있는 나머지 손에도 작업을 시켜서 2개의 작업을(태스크,스레드) 동시에 실행하게 만든다고 보면 됩니다.  2 SMT의 경우에 대한 개념 설명 입니다. 어디서 그림으로 하이퍼스레딩 설명을 할 때 손이 여러개다 라고 하던데, 손이 여러개인 것은 슈퍼 스칼라를 설명할 때가 더 타당하고, 하이퍼스레딩 (SMT)은 여기에 머리가 2개다 라고 해야겠죠. 머리가 2개라서 동시에 2개의 작업을 할 수 있다 라구요. 2개의 CPU로 보이구요..)

 


 또한 커널 실행의 백그라운드에서 CPU에서 GPU로 데이터 전송과 GPU에서 CPU로 데이터 전송을 오버랩해 (중첩해서) 실행할 수 있게 되었다. 이것에 의해 커널 전환 대기 시간도 최소화 되었다. 여기에는 "GigaThread Streaming Data Transfer (SDT) Engine " 이라는 이름이 붙지만, 본래부터 양방향인 PCI Express를 유효하게 사용할 수 있게 됐다 정도의 이야기. (간혹 PCI-Ex (PCI-E) 1배속 (1레인)만 으로는 단방향이고 (보내고 받기를 번갈아 가면서 하고, 반이중) , 2레인 (2배속)을 써서 동시에 양방향으로 (전이중) 처리한다고 잘못 알려진 경우가 있는데, PCI-E는 1레인 안에 전용 상향/하향 레인이 들어 있습니다. 1.0(1.1 등) 으로 말하면 1레인 250MB/s 라는 표기는 단방향 표기이고, 1레인 양방향은 500MB/s 입니다.)

 Fermi 아키텍처는 광범위 하게 걸친 대규모 아키텍처 확장이며, NVIDIA GPU는 이 세대 아키텍쳐적으로는 완전히 일신된다. 적어도 병렬 컴퓨팅에서는 최강의 아키텍처 중 하나가되는 것은 틀림 없다. 다만 다채로운 Fermi 아키텍처는 트랜지스터 카운트도 30 억(3billion) 으로 거대해서, 다시 대형 칩 크기가 될 것으로 예상된다.

 

2009년 10월 1일 기사 입니다.

 

 

[분석정보] NVIDIA 차세대 GPU아키텍처 Kepler의 베일을 벗겨