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

[분석정보] 피크성능에서 실효성능으로 포커스가 바뀐 AMD의 GPU 아키텍처

tware 2012. 2. 1. 18:00

 

연산 유닛의 구성이 바뀐 AMD의 GPU 아키텍처


 AMD는 일찍이 GPU의 피크연산 성능을 노래불렀다. NVIDIA의 동세대 GPU와 비교하면 배 이상도 높은 연산 성능으로, 다이 당 성능 효율을 강조했다. 이것은 AMD GPU가 연산 프로세서에 대한, 명령 제어 등의 유닛의 비율이 극단적으로 낮아, 따라서 GPU에 더 많은 연산 유닛을 넣어, 피크성능을 높이는 것이 가능한 것이었다. (엔비디아나 AMD의 그래픽 카드가 사양에 표시하는 32bit 단정밀도 성능.)

 그러나 AMD의 그러한 접근은 끝을 맞이하고 있다. 왜냐하면 AMD는 피크성능을 끌어 올리기 보다 범용 컴퓨팅시의 실효성능을 추구하는 방향으로 돌아섰기 때문이다. AMD는 NVIDIA와 비교하면 여전히 그래픽 쪽이지만, 새로운 GPU "Radeon HD 7900"(Tahiti : 타히티) 패밀리에서는 기존보다 훨씬 범용 컴퓨팅 쪽이 되었다. 그 결과, 트랜지스터 수의 증가에 비하면 연산유닛 수나 피크성능은 오르지 않았다. 그러나 범용 처리시 효율은 아키텍처상으로는 크게 개선되었다.

 Tahiti 세대의 그래픽 코어 아키텍처는 "GCN (Graphics Core Next)"라고 부른다. GCN은 AMD가 만반의 준비를 갖춰서 낸 범용 컴퓨팅에 최적화한 차세대 핵심이다. GCN에서는 프로세서의 클러스터 "CU (Compute Unit)"가 독립된 최소 단위가 된다. GPU는 확장으로  설치 가능한 CU 군과 그래픽 전용의 유닛 군이나 메모리 컨트롤러 등으로 구성된다.

 

 

Radeon HD 7900의 개요


 또, 아래의 전체 그림 중에서는 커맨드 프로세서가 그래픽용 과 컴퓨팅용의 2계통 그려져 있으나 실제로는 컴퓨팅용의 기능 확장이 된 것으로 보인다. 커맨드 프로세서는 GPU 전체에서 실행하는 프로그램의 핸드링을 담당하는 부분으로, CPU로 표현하면 하드웨어에 의한 쓰레드 스케줄링 엔진이다. AMD의 FSA (Fusion System Architecture) 구상에서 보여준 태스크 큐도 이 부분에 설치되어 있다.

 CU는 아래의 그림과 같이 명령 유닛에서 실행 유닛,로드 / 스토어 유닛, 캐시까지 갖춘 풀 프로세서가 된다. 기존의 Radeon HD 6970 (Cayman)에서 CU에 해당하는 유닛은 "SIMD (Single Instruction, Multiple Data) Engine" 이지만 상당히 구조가 다르다.

 

 

Compute Unite 블록 다이어그램

 

 

GCN Compute Unit

 

 

멀티 엔진 단일 컴퓨팅 GPU


Cayman의 SIMD Engine은 아래의 그림과 같이 16개의 VLIW (Very Long Instruction Word) 프로세서로 구성되어 있었다. 반면 GCN의 CU는 16레인 벡터 유닛 4개로 구성되어 있다. Cayman의 SIMD 엔진은 32-bit 단정밀도 부동 소수점 연산 유닛이 각 프로세서에 4 유닛으로, 16 프로세서의 합계로 64 유닛이 된다. 반면 GCN의 CU는 32-bit 부동 소수점 연산 유닛이 각 벡터 유닛에 16 유닛으로 4벡터 유닛 합계로 64 유닛이 된다.

 

AMD Cayman SIMD 엔진과 VLIW4 프로세서

 

 참고로, Cayman 이전의 AMD GPU는 5연산 유닛의 VLIW 프로세서 구성에 SIMD Engine은 80개의 연산 유닛을 갖추고 있었다. 이렇게 보면 Cayman의 SIMD Engine과 Tahiti의 CU는 모두 단정밀도 연산 유닛 수는 같지만 그 구성이 다른 것이 판명된다.

 

AMD VLIW4, VLIW5, CU 비교

 


64레인의 벡터에 해당하는 Wavefront 처리의 기본


 이러한 차이는 프로세서를 어떻게 제어하는가의 차이며, 또한 얼마나 많은 쓰레드를 동시에 달리는가의 차이이기도 하다. GCN의 CU 쪽이 기존의 VLIW4 / 5 보다 프로세서를 더 작은 입도로 제어하고 더 많은 쓰레드를 달리게 한다. 이것은 범용 컴퓨팅쪽의 설계다.

 

명령 버퍼링과 페치


 그러면 어떻게 AMD는 프로세서를 제어하고 있는 것인가? GCN의 CU에서는 명령 유닛이 4 그룹의 프로그램 카운터 군과 명령 버퍼 군을 갖추고 있다. 각각의 명령 버퍼가 10 이상의 "Wave" 명령과 스테이트를 버퍼한다. Wave는 64개의 워크 아이템 (쓰레드)을 묶은 일괄처리로 하나의 프로그램 카운터를 공유한다. 즉, 64 쓰레드가 기본적으로는 같은 명령을 실행하는 64레인 벡터이다. Wave 선두의 64스레드 분의 명령이 Wavefront로서 실행 유닛에 보내진다.

 Wave가 명령 스트림으로 Wavefront가 명령 스트림 속의 명령의 파도라는 위치다. 명령어 스트림이 파도 (Wave)처럼 실행 유닛에 밀려들어, 하나 하나의 명령이 파고 (Wavefront)라는 표현이다. 다만 실제로는 AMD에서도 용어​​ 구분은 엄밀하지 않아 통상은 Wave도 포함하여 Wavefront 라고 부른다. 이 구조는 NVIDIA도 같아서, NVIDIA는 32 쓰레드의 일괄처리를 "Warp"라고 부른다.

 

CU 아키텍처

 

 각 벡터 유닛에 대해서 10개의 Wavefront라면 총 40 Wavefront가 일어서게 된다. 각 Wavefront는 64 쓰레드의 일괄처리이므로 2560 쓰레드가 된다. 참고로, G​​PU에서는 프로그램이 사용할 수 있는 레지스터 수는 고정되어 있지 않다. 네이티브 코드로 변환시에 동적으로 할당되기 때문에 스레드 당 레지스터 수는 다르다. 1 쓰레드에 많은 레지스터를 할당하면 일어설 스레드 / Wavefront의 수가 줄어드는 구조다.

 벡터 유닛 측의 벡터 레지스터는 256-byte 길이의 레지스터가 256개 이므로 10 Wavefront를 일으키면 계산상 1 스레드 당 25 레지스터이다. 실제로는 더 잘라 좋은 숫자로 제어하는​​ 것이지만, 레지스터가 커도 일으킬 스레드 수가 많기 때문에 단일 쓰레드 당 레지스터 수는 그리 많지한다. 1 쓰레드 당 레지스터를 16개로 하는 경우 각 벡터 유닛 당 16 Wavefront로 총 쓰레드 수는 4,096이 되는 계산이다. 일으킬 스레드 수는 매우 많은 것으로 추정된다.

 


셰이더 프로그램의 진화에 따라 GPU 구조를 변혁


 AMD가 GCN에서 프로세서의 구조를 바꾼 것은 더 유연하고 다루기 쉬운 쉬운 엔진으로하기 때문이다. 애초에 GPU는 정점과 픽셀 프로세싱에 적합한 4 레인 정도의 짧은 SIMD 엔진을 다수 갖추고 있었다. 각각의 SIMD 엔진은 원래 1명령을 3 ~ 4개의 워크 아이템에 대해서 실행하고 복수의 SIMD 엔진도 같은 명령을 실행한다. 전체 구성으로는 "Array of Structures (AOS)" 형의 팍 크드 방식을 취하고 있었다.

 

AOS VS SOA

 

 그런데 그래픽의 셰이더 프로그램이 진화함에 따라, 짧은 SIMD로 처리 할 수​​ 없는 스칼라 명령이 늘어왔다. 한층 GPU 코어의 범용 컴퓨팅으로의 이용이 그 경향을 강화했다. 그래서 GPU는 이러한 문제를 해결하기 위해 프로세서의 구성을 바꾸기 시작했다. NVIDIA는 완전한 "Structure of Arrays (SOA)"(= 스칼라) 형으로 전환했다. 그 반면 AMD는 VLIW (Very Long Instruction Word) 쪽으로 프로세서를 구성하고 바꿔, 4 ~ 5개의 연산 유닛의 각 레인이 다른 명령을 실행할 수 있도록 했다. 또한 VLIW 프로세서는 16개로 1클러스터로서 16개의 VLIW 프로세서가 같은 VLIW 명령을 SIMD 실행하는 아키텍처로 했다.

 

 

 

GPU 프로그램의 변화와 GPU의 대응의 차이

 

 VLIW에서는 컴파일러에 의해서 병렬 실행 가능한 명령을 미리 하나의 초장 명령에 짜넣는다. 예를 들면, 연속된 명령 A, B, C, D의 사이에 의존성이 없어, 병렬로 실행할 수 있는 경우는 VLIW 명령 슬롯에 명령 A, B, C, D를 넣어서 1개의 VLIW 명령으로 해버린다. PC용 x86 CPU는 하드웨어에서 명령을 정렬시켜 병렬로 실행하지만, AMD GPU는 비슷한 것을 컴파일러에서 명령을 정렬시켜 실현한다.

 이 방법의 장점은 그래픽과 같은 데이터가 3 ~ 4 요소 갖춘 경우도 효율적으로 실행 가능한 위에, 명령을 VLIW에 팩화하는 것으로 스칼라 중심의 코드에서도 효율적으로 실행 가능한 것. NVIDIA 같은 스칼라형 (SOA) 형과 비교하면 하드웨어에 보다 스케쥴링 매우  가볍기 때문에, 명령 유닛을 단순화 할 수있다.

 


기존 아키텍처의 복잡하며 비효율적인 점을 개혁


 AMD의 기존의 VLIW 아키텍처를 더 작고 상세하게 보면 아래의 그림과 같이 추정된다.

(그림은 GCN인데;;)

 

 

AMD GPU GCN 아키텍처의 명령 발행


 우선, CPU상에서 동작하는 드라이버 소프트웨어의 실시간 컴파일러의 프론트 엔드가, 중간 코드의 명령을 GPU의 네이티브 명령으로 변환한다. 그렇게 생성된 명령에서 컴파일러 내에서 병렬로 실행할 수 있는 명령의 줄을 추출하여 VLIW 스케줄러 부분이 VLIW 명령 속에 팩한다. VLIW5 아키텍처에서는 흐름 제어 명령을 포함하여 6개의 명령 슬롯이 있어, 잘 명령을 짜넣으면 최대 6명령을 1사이클로 실행할 수 있다. 그래픽 처리에서 예를들면, 픽셀의 RGBA의 4개의 데이터가 온 경우는 각각 같은 명령을 실행하기 위해 VLIW 명령 슬롯 중 BCDE의 4 슬롯은 같은 명령으로 채우면 좋다.

 이 방식의 문제점은 일목요연하게 컴파일러에 의한 복잡한 스케줄링과 VLIW에 팩 효율에 있다. 특히 스칼라 명령이 계속되는 경우, 잘 병렬화 못하면 명령 슬롯을 비울수 밖에없고, 프로세서의 가동률은 훨씬 떨어진다. 그리고 범용 컴퓨팅에서는 스칼라 명령이 많은 경우도 적지 않다고 한다.

 그 반면 GCN의 새로운 아키텍처에서는, 벡터 유닛은 Structure of Arrays 형이 16 쓰레드를 병렬로 실행하는 형태로 바뀌었다. 4개의 벡터 유닛은 각각 다른 Wavefront의 명령을 실행한다. 그에 따라 명령간의 의존성을 체크 할 필요는 없다 (스레드 간의 베리어 동기화와 아토믹 오퍼레이션으로 제어한다).

 이 방법의 장점은 첫째, 컴파일러의 복잡성을 제거한 점이다. 위의 그림과 같이 컴파일러가 하는 것은, 기본적으로 GPU 네이티브 명령으로 변환하는 정도로, 이후로는 통상의 최적화밖에 필요 없다. 실행 형태로서는 각 스레드는 완전히 스칼라 프로세서로 실행되므로 프로그래밍 하는 측의 사고 방식도 간단하게 된다.

 "스케줄링이 훨씬 간단하기에 컴파일러가 훨씬 간단하게 되어, 디버깅도 용이해지고, 툴의 개발도 간단해진다. 그리고 더 중요한 점은 프로그래머가 하드웨어를 이해하고 성능을 예측 것이 간단하게 된다" 라고 AMD는 설명한다.

 또 프로세서의 가동률도 오른다. 특히 큰 것은 벡터와 스칼라의 두 명령에서도 프로세서의 가동률이 높아지는 점에서 성능의 들쭉날쭉함이 작아진다. 이것도 성능 최적화 측면에서 장점이다.

 

 

벡터 유닛

 

 

비 VLIW의 벡터 엔진

 


보다 많은 Wavefront & 쓰레드를 달리게 하는 AMD의 새로운 아키텍처


 AMD의 개혁은 GPU 전체로 보면 보다 많은 스레드 / Wavefront를 달리게 하는 것도 의미한다. 기존 AMD GPU의 경우는 1개의 SIMD Engine에 대해 각 사이클, VLIW 유닛 측에서는 1개의 Wavefront ,16개의 스레드밖에 달리지 않는다. (텍스처나 로드 / 스토어는 별개). 반면 새로운 아키텍처 GCN에서는 1개의 CU 속에서 각 사이클 4 Wavefront로 64 스레드가 병렬로 달린다.

 

AMD 프로세서의 구조

 


 즉, 지금까지의 AMD GPU의 프로세서 (SIMD Engine)는 싱글 Wavefront 머신이었다. 그것이 GCN 프로세서 (CU)에서는 4개의 Wavefront가 병렬로 달리는 멀티 Wavefront 머신으로 바뀌었다.

 차트에 의하면 연산 유닛 당 스레드 수와 Wavefront 수가 늘어난 것을 알 수 있다. 원래, VLIW5에서 VLIW4로 전환한 2011년 초의 단계에서 연산 유닛에 대한 스레드 수가 25% 늘었다. 그것이 GCN에 이르러, 한층 4배로 늘었다. 반대로 말하면, GPU를 제어하는​​ 입도가 작아지고,보다 세밀한 제어가 가능하게 되었다고 할 수 있다.

 

AMD 프로세서

 


 참고로, 기존의 GPU에서는 스레드의 수를 늘리는 것은 메모리 액세스 레이턴시를 은폐하는 것이 주목적 이었지만, 이번은 다르다. Wavefront 당 할당 유닛의 입도를 줄이는 것이 주목적이다. 메모리 레이턴시에 대해서는 AMD도 NVIDIA와 마찬가지로, 내부 메모리를 늘리는 것으로 대기 시간을 단축하는 방향으로 돌아섰다. 참고로, CPU의 캐시는 시간적 국소성을 이용하기 위한 것이지만, 기존의 GPU의 캐시는 공간적 국소성에 기울어 있었다. 이것도 AMD는 바꾸고 있다.

 

2012년 2월 1일

 

[분석정보] AMD의 신 GPU 아키텍처 "Graphics Core Next"의 비밀

 

 

[정보분석] AMD 2013년까지 로드맵 공개

 

 

[분석정보] 크게 다른 Radeon HD 2000과 GeForce 8000의 아키텍처

 

 

 

[분석정보] 인텔 GDC에서 라라비 명령 세트의 개요를 공개

 

 

 

[분석정보] 라라비 (Larrabee)의 비장의 카드 공유 가상 메모리

 

 

 

[정보분석] CPU와 GPU의 메모리 공간을 통일하는 AMD의 hUMA 아키텍처

 

 

 

[분석정보] AMD의 차세대 APU Kaveri (카베리)는 아키텍처의 전환점