원문 : https://www.techpowerup.com/gpu-specs/docs/amd-gcn1-architecture.pdf

주의 : 허락받고 번역한 것이 아니므로 언제든 내려갈 수 있습니다.

주의 : 번역이 개판이므로 이상하면 원문을 참고하세요.

주의 : 우리말로 번역하기 애매한 것들은 그냥 원문으로 씁니다.

정보 : 그림은 클릭하면 새창에 나옵니다. 새창에서 그림위에 + 버튼이 나오면 누르시면 커집니다.



INTRODUCTION


지난 15 년간 ( 역주 : 이 문서는 2012 년에 작성되었습니다 ) 그래픽스 프로세서들은 지속적으로 발전해 왔으며 컴퓨팅 환경[computing landscape]의 필수 요소가 되는 첨단 기술입니다. 첫 번째 디자인들은 적은 유연성을 가진 특정 목적의 하드웨어를 사용했습니다. 그 후의 디자인들은 셰이더 프로그램들을 통해 제한된 프로그램 작성 기능을 소개했으며, 결국에는 많은 그래픽스 목적 기능들을 여전히 유지하면서 고도로 프로그래밍이 가능한 처리량 컴퓨팅 디바이스[throughput computing device]가 되었습니다.


Figure 1: GPU Evolution


GPU 들의 성능과 효율성에서의 잠재력은 믿을 수 없을 정도입니다. 게임들은 산업계 필름 영화들과 비견될 만큼의 가시 품질을 제공하며, 과학 커뮤니티의 얼리 어댑터들은 4 TFLOPS ( Floating point Operations per Second ) 를 초과하는 능력을 갖춘 최첨단 GPU 들을 사용해 크기정도[order of magnitude]( 역주 : 수학에서 서로 다른 크기를 비교할 때 사용되는 크기 등급. 몇 자리 단위의 숫자만큼 차이가 난다는 의미임. 위키백과 참고 바람 )의 성능 향상을 확인했습니다. 전력 효율도 주목할 만합니다; 예를 들면, AMD Radeon[TM] HD 7770M GPU 는 최대 45 W 의 전력 드로[power draw]에서 1 TFLOPS 이상을 달성합니다.


OpenCL[TM], DirectCompute, C++ AMP 와 같은 핵심 산업 표준들은 프로그래머들이 GPU 에 접근할 수 있도록 해 줍니다. 앞으로의 도전은 메인스트림 애플리케이션을 위한 매끄러운 이종 컴퓨팅 솔루션[seamless heterogeneous computing solution]을 제공하는 것입니다( 역주 : GPU 를 그래픽스 전용이 아니라 범용 목적으로 사용할 수 있도록 만들겠다는 의미로 보임 ). 이는 성능과 전력 효율에서의 향상을 수반하지만, 프로그래밍 가능성과 유연성의 향상도 수반할 것입니다. 메인스트림 애플리케이션들은 GPU 와 CPU 모두를 사용하는 현대의 에코시스템[echosystem]과 태블릿에서 슈퍼 컴퓨터에 이르기까지 다양한 형태 인자[form factor]들에 적용될 산업 표준을 필요로 합니다.


AMD 의 Graphics Core Next (GCN) 은 GPU 하드에어를 위한 근본적인 변화를 나타내며, 프로그래밍 가능하고 이종으로 구성된 미래의 시스템들을 위한 아키텍쳐입니다. GCN 은 28 nm 노드에서 전력 및 면적 효율성을 위해 신중하게 최적화되었으며, 몇 년 안에 향후의 공정 기술[process technology]들로 활장될 것입니다.


COMPUTE UNIT OVERVIEW


컴퓨트 유닛[compute unit]들은 GCN 아키텍쳐에서 기본이 되는 계산 빌딩 블록[computational building block]( 역주 : 빌딩 블록이라는 것은 특별한 기능을 수행하도록 미리 만들어 둔 부품을 의미 )입니다. 이러한 CU 들은 완전히 새로운 명령 집합[instruction set]들을 구현합니다. 그 명령 집합들은 이전 디자인에서보다 컴파일러나 소프트웨어 개발자들이 사용하기에 더욱 단순해졌으며 일관된 성능을 제공합니다.


이전 세대의 AMD GPU 들에서, 셰이더 배열[shader array]들은 여러 개의 SIMD 엔진들로 구성되었으며, 각 엔진들은 16 개의 ALU( 역주 : Arithmetic Logic Unit, 산술 논리 장치. 사칙연산과 논리연산을 계산하는 디지털 회로 )로 구성되었습니다. 각 ALU 는 셰이더 컴파일러를 사용해 4 개 혹은 5 개의 독립적인 명령들의 묶음[bundle]들을 VLIW ( Very Long Instruction Word ) 포맷으로 실행할 수 있었습니다. 그 셰이더 컴파일러는 동시에 발행가능한 명령들을 검색하고 스케줄링할 책임이 있었습니다. SIMD 엔진들은 웨이브프런트[wavefront]라 불리는 64 개의 작업 아이템들의 그룹들을 발행받았으며, 한 번에 하나의 웨이브프런트를 실행했습니다. 데이터 플로우 패턴[data flow pattern]에 걸맞는 이 디자인은 그래픽스 처리에서 ( 예를 들어 픽셀 셰이더에서 RGBA 컬러 값들을 조작하기 위해 ) 매우 일반적이며, 대부분의 경우에 높은 수준으로 ( 역주 : GPU 를 ) 지속적으로 활용하는 것을 가능하게 해 줍니다. 하지만 범용 목적 애플리케이션[general purpose application] 관점에서는 기저 데이터 포맷들이 더 복잡해지고 예측불가능해질 수 있습니다. 이는, 매 사이클마다 병렬적으로 실행될 수 있고 처리중인 리소스들을 완전히 활용할 수 있는, 4 개나 5 개의 연산들의 집합을 지속적으로 찾는 것을 어렵게 만듭니다.


GCN 에서는 각 CU 가 벡터 처리를 위한 4 개의 독립된 SIMD 유닛들을 포함합니다. 이러한 각 SIMD 유닛들은 16 개의 작업 아이템들에 대해 하나의 연산을 동시적에 실행합니다만, 각 유닛들은 독립된 웨이브프런트 상에서 동작합니다. 단일 웨이브프런트 내의 독립된 연산들을 찾아내기 위해서 컴파일러에 의존하지 않습니다. 이는 병렬적으로 처리될 수 있는 웨이브프런트들을 찾아내는 데 중점을 둡니다.


Figure 2: VLIW4 vs. GCN


효율성을 위해서, 각 GCN 컴퓨트 유닛 내의 SIMD 들은 전용[private] 리소스와 공유[shared] 리소스들의 조합을 소유하게 됩니다. 버퍼링, 레지스터, 벡터 ALU 같은 명령들은 높은 성능과 활용도를 유지하기 위해서 4 개의 SIMD 들 각각에 대해서 전용됩니다. 프런트-엔드, 브랜치 유닛, 데이터 캐시와 같은 다른 리소스들은 면적 및 전력 효율성을 위해서 SIMD 들간에 공유됩니다.


Figure 3: GCN Compute Unit



GCN 에서 또 다른 핵심적인 혁신은 일관성 캐싱[coherent caching]( 역주 : 여러 스레드에서 동시에 접근해도 '일관성'을 유지할 수 있다는 의미입니다 )입니다. 역사적으로 GPU 들은 메모리의 일관성 뷰[coherent view]를 유지하지 않는 ( 읽기 전용 텍스쳐 캐시들과 같은 ) 특수화된 캐시들에 의존해 왔습니다. GPU 내의 코어들 사이에서 통신하기 위해서는, 프로그래머나 컴파일러가 반드시 명시적인 동기화[explicit synchronization] 명령을 삽입해서 공유된 데이터를 메모리에 플러시[flush]해야 합니다. 이 접근법이 디자인을 단순화해 주기는 했지만, 애플리케이션이 데이터를 공유하는데 있어서 부하를 증가시켰습니다. GCN 은 범용 목적 작업[workload]들을 위해서 설계되었습니다. 이 작업들에서는 코어간 통신 알고리즘이 일반적입니다. 캐시 일관성 규약[cache coherency protocol]은 L2 캐시를 통해 데이터를 공유하며, 이는 그래픽스칩 외부 메모리를 사용하는 것보다 훨씬 더 빠르고 전력 효율이 좋습니다.


캐시 일관성과 함께, GCN 은 하드웨어와 드라이버 지원의 조합을 통해 가상 메모리[virtual memory]를 제공합니다. 가상 메모리는 메모리 관리의 관점에서 거의 대부분의 어려움들을 제거해 주며, 새로운 기능들을 열어 둡니다. 고성능 그래픽스 및 마이크로프로세서에서의 AMD 만의 전문 기술이 특히 도움이 되었습니다. 왜냐하면 GCN 의 가상 메모리 모델은 x86 과의 호환성을 유지할 수 있도록 신중하게 정의되었기 때문입니다. 이는 CPU 와 개별 GPU 사이에서 데이터를 이동시키는 것을 단순화합니다. 더욱 중요한 것은 CPU 와 GPU 에 의해 끊김없이[seamlessly] 공유되는 단일 주소 공간을 위한 길을 열었다는 것입니다. 데이터를 복사하는 것이 아니라 공유하는 것은, 성능 및 전력 효율을 위해 필수이며 AMD 의 Accelerated Processing Units (APUs) 같은 이종 시스템들에서 핵심적인 요소입니다.


CU FRONT-END


( 역주 : 이해를 돕기 위해서 이 챕터에서 설명하는 블록을 구분해 봤습니다. 어둡지 않은 부분입니다.


)


GCN 에서 각 SIMD 유닛은 10 개의 웨이브프런트를 위해 자신만의 40-bit 프로그램 카운터( 역주 : Figure 3 에서 "SIMD" 유닛의 "PC" )와 명령 버퍼(  역주 : Figure 3 에서 "SIMD" 유닛의 "IB" )를 할당받습니다. 즉 전체 CU 들은 40 개의 웨이브프런트들을 동시에 처리할 수 있으며, 각각은 잠재적으로 다양한 작업그룹[work-group]이나 커널[kernel]로부터 올 수 있습니다. 이는 이전 디자인에 비해 훨씬 더 유연합니다. 이는 32 CU 를 가진 AMD Radeon[TM] HD7970 과 같은 GCN GPU 가 동시에 81,920 개의 작업 아이템들에 대해서 동작할 수 있다는 것을 의미합니다.


4 개까지의 컴퓨트 유닛으로 구성된 클러스터[cluster]는 단일 32 KB L1 명령 캐시들을 공유하는데, 이 캐시는 4-way associative( 역주 : "Set Associative Cache" 방식중 하나인데, 간단하게는 캐시 라인이 4 개가 있다고 생각하시면 됩니다. 즉 동시에 4 개의 캐시라인에 접근이 가능합니다 )이며 L2 캐시에 의해 지원[backed by]됩니다. 캐시라인은 64 B long 이며 일반적으로 8 개의 명령들을 저장할 수 있습니다. 캐시가 가득 차면, 새로운 요청은 Least Recently Used( 역주 : 최근에 가장 덜 사용된 ) 캐시 라인을 퇴출시키고 새로운 명령들을 위한 공간을 할당합니다. 공유된 L1 명령 캐시는 4 개의 뱅크[bank]들을 가지며 4 개의 CU 에 대해서 사이클당 32 B 의 명령 전송[instruction fetch]를 유지할 수 있습니다. 명령 전송은 컴퓨트 유닛 내부 SIMD 사이에서 나이, 스케줄링 우선순위, 웨이브프런트 명령 버퍼 활용도에 따라 스케줄링[arbitrate]됩니다( 역주 : AMD 는 "schedule" 대신에 "arbitrate" 라는 용어를 사용하는 것으로 보입니다. 꼭 AMD 만 그런 것은 아닌 것 같고 일반적으로 사용하는 용어로 보입니다. 역자는 익숙함 때문에 "스케줄링"을 사용하겠습니다 ).


일단 명령들이 웨이브프런트 버퍼들에 전송되고 나면, 다음 단계는 명령들에 대한 디코딩[decoding] 및 발행[issuing]입니다. 컴퓨트 유닛은 각 사이클에 하나의 SIMD 를 선택해서 디코딩 및 발행을 수행하는데, 라운드-로빈 스케줄링[round-robin arbitration]을 사용합니다( 역주 : 프로세스들 사이의 우선순위를 두지 않고 시간단위로 작업을 할당하는 방식입니다 ). 선택된 SIMD 는 10 개의 웨이브프런트 버퍼로부터 5 개까지의 명령들을 디코딩해 실행 유닛[execution unit]으로 발행합니다. 추가적으로, 특별한 명령( 예를 들어 NOP, 배리어[barrier], 중단[halt], 예측된 벡터 명령 건너뛰기[skipping] 등 )들은 어떠한 기능 유닛[functional unit]들을 사용하지 않고 웨이브프런트 버퍼 내부에서 실행될 수 있습니다. 각 CU 들은 16 개의 버퍼를 가지고 있는데, 이는 배리어 명령들을 트래킹[track]합니다. 배리어는 웨이브프런트를 전역적으로 동기화하게 만듭니다.


CU 프런트엔드는 7 개의 다양한 종류의 명령들을 디코딩하고 발행할 수 있습니다: 브랜치[branch] 명령, 스칼라[scalar] ALU 명령, 스칼라 메모리 명령, 벡터 ALU 명령, 벡터 메모리 명령, 지역 데이터 공유[local data share] 명령. 전역 데이터 공유[global data share] 및 익스포트[export] 명령, 특수[special] 명령. SIMD 당 각 타입에 대해서 하나의 병령만이 한 번에 제출될 수 있습니다. 이는 실행 파이프라인[execution pipeline]의 한계를 초과하지 않기 위함입니다. 실행 순서를 보존하기 위해서, 각 명령들은 서로 다른 웨이브프런트로부터 와야만 합니다; 각 SIMD 에 대해서 10 개의 웨이브프런트를 가지고 있으므로, 일반적으로 그것으로부터 선택할 수 있는 많은 경우의 수가 있습니다. 이러한 두 가지 제약하에서, 모든 혼합[mix]이 허용되며, 이는 컴파일러가 다양한 방식으로 실행을 위한 명령을 발행할 수 있도록 자유도를 부여합니다.


CU 프런트엔드는 매 사이클 당 5 개의 명령들을 발행할 수 있습니다. 이는 2 개의 레지스터 파일을 사용해 여섯 개의 벡터 실행 파이프라인과 스칼라 실행 파이프라인들을 혼합합니다. 벡터 유닛들은 그래픽스 셰이더 뿐만 아니라 범용 목적 애플리케이션들을 위해서 핵심이 되는 계산 능력을 제공합니다. 명령 버퍼에서 다뤄지는 특수 명령들과 함께 두 개의 스칼라 유닛들은 GCN 아키텍스쳐에서 모든 제어 흐름[control flow]들을 담당합니다.


SCALAR EXECUTION AND CONTROL FLOW


( 역주 : 이해를 돕기 위해서 이 챕터에서 설명하고 있는 블록을 구분해 봤습니다. 어둡지 않은 부분입니다 


)


성능 및 전력 효율성을 위해서 GCN 컴퓨트 유닛에는 새로운 스칼라 파이프라인들이 필수입니다. 제어 흐름 처리는 셰이더 코어[shader core]들을 통해서 분산[distributed]되어 있는데, 이는 응답지연[latency]를 줄이고 중앙화된 스케줄러[centralized scheduler]를 사용해서 통신하기 위한 전력 부하[power overhead]를 피할 수 있게 해 줍니다. 특히 그래픽스보다는 더 복잡한 제어 흐름을 가지는 범용 목적 애플리케이션을 위해 유용합니다.


각 컴퓨트 유닛들은 8 KB 의 스칼라 레지스터 파일을 가지는데, 이것은 각 SIMD 를 위해 512 개의 엔트리[entry]들로 나뉘어 있습니다. 이 스칼라 레지스터들은 SIMD 상에 존재하는 10 개의 웨이브프런트들 모두에 의해서 공유될 수 있습니다; 웨이브프런트는 112 개의 사용자 레지스터와 구조적 상태[architectural state]를 위해 예약되어 있는 몇 가지 레지스터들을 할당할 수 있습니다. 이 레지스터의 크기는 32 비트이며, 64 비트 값을 저장할 수 있도록 하기 위해서 연속적인 엔트리들이 사용될 수 있습니다. 웨이브프런트 제어 흐름을 위해 이것이 필수적입니다; 예를 들어, 웨이브프런트 내의 64 개의 작업아이템들 각각에 대해 비교[comparison]하는 결과를 산출할 수 있습니다.


첫 번째 스칼라 파이프라인은 조건 분기[conditional branch]를 다루는데 명령에 인코딩되어 있는 16 비트 부호있는 옵셋[singed offset]을 사용합니다. 이는 또한 특정 유형의 동기화와 인터럽트[interrupt]를 다룰 책임이 있습니다. 인터럽트는 GCN 에서 추가된 완전히 새로운 기능입니다. 이는 디버깅을 위한 핵심 기능입니다. 왜냐하면 그것들은 중단점[breakpoint]을 위해 제어 흐름을 재전송[redirect]할 수 있기 때문입니다.


두 번째 스칼라 파이프라인은 완전한 정수 ALU 입니다. 이는 주소 생성 유닛[address generation unit, AGU]로 기능하여 스칼라 데이터 캐시로부터 데이터를 읽어들입니다. 실제 ALU 는 64 비트 크기입니다. 이 파이프라인은 점프[jump], 콜[call], 리턴[return]을 포함한 다양한 제어 흐름 명령들을 돕습니다. 이것들은 예전의 프로그램 카운터를 인접한 레지스터들로 구성된 64 비트 값으로 대체[replace]( 혹은 교체[swap] )함으로써 처리됩니다. 예측[prediction]도 스칼라 ALU 에 의해서 관리되는데, 분기[fork] 연산과 병합[join] 연산을 관리하기 위해서 보조 하드웨어[assist hardware]를 사용합니다.


스칼라 L1 데이터 캐시는 읽기 전용 구조입니다. 스칼라 파이프라인들은 주로 제어 흐름과 궁합이 맞기 때문에, 메모리에다가 결과를 다시 써야 할 필요가 없습니다. 그것의 구조[organization]는 L1 명령 캐시와 매우 유사합니다. 16 KB 스칼라 데이터 L1 은 4-way associative 이며 64 B 라인 및 LRU replacement( 역주 : LRU 에 의해서 페이지를 교체하는 정책 )를 가지고 있습니다; 또한 4 개까지의 컴퓨트 유닛으로 구성되어 있는 클러스터 사이에서 공유되며, L2 캐시에 의해 지원됩니다. 스칼라 읽기는 4 개의 64 B long 이며 인접한 스칼라 레지스터를 채웁니다. 그것은 4 개의 뱅크들을 가지며, 4 개의 컴퓨트 유닝에 대해서 사이클당 16 B 의 처리량을 가지고 있습니다. 스칼라 데이터 L1 캐시는 이전 세대에 존재하던 상수 캐시[constant cache]를 대체합니다. 왜냐하면 그것이 좀 더 유연하기 때문입니다.


VECTOR EXECUTION


( 역주 : 이해를 돕기 위해서 이 챕터에서 설명하고 있는 블록을 구분해 봤습니다. 어둡지 않은 부분입니다. VECTOR EXECUTION, VECTOR REGISTER, VECTOR ALUS 챕터는 모두 이 부분에 대해서 설명합니다.


)


GCN 의 엄청난 처리 성능은 고수준으로 병렬화된 SIMD 에서 나옵니다. SIMD 는 범용 목적 애플리케이션과 최신 그래픽스를 위한 계산을 수행합니다. GCN 에서는 더 나은 프로그래밍 가능성과 일관된 성능을 제공하기 위해서 SIMD 가 완전히 점검[overhaul]되었습니다.


이전의 VLIW 컴퓨트 유닛 아키텍쳐는 단일 SIMD 를 가지고 있었지만, 그것들은 단일 웨이브프런트로부터 병렬 연산들을 실행하도록 요구되었습니다. 이는 2 개의 직접적인 결과를 가지고 있었습니다. 첫째, 성능은 컴파일러에 의해서 근본적으로 제한되었습니다; 웨이브프런트 내 병렬성을 띄고 있는 작업들이 적다면 하드웨어가 별로 활용되지 못했습니다. 만약 웨이브프런트 내에 2 개의 명령만이 병렬적으로 실행될 수 있다면, 성능의 절반이 사용되고 있지 않은 것입니다. 두 번째 결과는 컴파일러가 레지스터 파일에 대한 읽기와 쓰기를 주의 깊게 스케줄링해야만 한다는 것입니다; 포트 충돌[port conflict]이 발생하면 하드웨어 활용도가 떨어지기 때문입니다. 잠재적인 포트 충돌을 제거하기 위해서, 웨이브프런트들은 ALU 연산들을 밀집해서[back-to-back] 발행할 수 없었습니다. 그래서 지연을 감추기 위한 웨이브프런트들이 끼워 넣어졌습니다[interleaved]. VLIW 아키텍쳐는 그래픽스를 위해서 상대적으로 좋기는 했지만, 복잡한 작업들에 대해서는 성능 예측이 잘 되지 않았으며 스프트웨어 튜닝을 열심히 해야 했습니다.


GCN 아키텍쳐는 더 단순하며 성능이 훨씬 더 좋습니다. 근본적인 변화는 웨이브프런트 내의 예측불가능한 명령어 수준 병렬화를 피하는 것입니다. 그리고, 하드웨어를 포화상태로 만들기 위해서, 소프트웨어가 적절한 개수의 데이터 병렬 웨이브프런트[data parallel wavefront]들을 공급하도록 하는 것입니다. 이는 GPU 들을 사용하는, 특히 범용 목적의 작업들을 위해 사용하는, 애플리케이션을 위해서 엄청난 이점을 제공합니다.


VECTOR REGISTERS


GCN 아키텍쳐의 가장 큰 이점 중 하나는 더욱 단순하고 고성능을 가진 벡터 레지스터 파일 디자인입니다. 각 SIMD 가 독립적인 웨이브프런트를 실행하고 있기 때문에, 레지스터 파일은 4 개의 독립적인 슬라이스[slice]들로 나뉠 수 있습니다.


벡터 범용 목적 레지스터들 (vGPRs) 은 64 개의 레인[lane]들을 포함하는데, 각 레인은 32 비트 크기까지 될 수 있습니다. 인접한 vGPR 들은 64 비트 혹은 128 비트 데이터들로 조합됩니다. 각 SIMD 는 64 KB 파티션[partition]으로 된 vGPR 들을 가집니다. 그래서 CU 를 위한 전체 레지스터의 개수는 일정합니다. 각 SIMD 파티션은 매우 강력하게 뱅크화되어 있으며, X 레지스터들을 읽고 Y 레지스터들을 쓸 수 있습니다.


레지스터 파일로부터의 대량의 대역폭[bandwidth]은 포트 충돌을 줄여주며, 이는 벡터 ALU 명령들이 SIMD 내에 끼워져 있지 않고 조밀하게 발행될 수 있다는 것을 의미합니다. 이는 컴파일러의 작업을 엄청나게 단순화해주며, 개발자가 고성능의 코드를 작성할 수 있도록 해 줍니다.


VECTOR ALUS


각 SIMD 는 16 개의 레인 벡터 파이프라인을 포함합니다. 이는 예측가능하며 단일 정밀도 및 배정밀도 소수점 연산, 최고 속도 비정규화[full speed denormal], 모든 올림 모드[rounding mode]를 지원하는 IEEE-754 표준과 완전하게 호환됩니다. 각 레인들은 single precision fused or unfused multiply-add 연산이나 24 비트 정수 연산을 자연스럽게 실행할 수 있습니다. 정수 multiply-add 는 작업 그룹[work-group] 내에서 주소를 계산하는데 특히 유용합니다. 웨이브프런트는 단일 사이클에서 SIMD 에 발행되지만, 64 개의 작업 아이템을 위한 연산을 모두 실행하려면 4 사이클이 걸립니다.


GCN 은 벡터 ALU 에다가 새로운 미디어[media] 및 이미지[image] 처리 명령들을 추가했습니다. 특히, 2 개의 새로운 명령들이 존재합니다: 4x1 sum-of-absolute-differnces (SAD) 와 quad SAD 인데, 이는 8 비트 색상을 가진 32 비트 픽셀 상에서 동작합니다. 이러한 새로운 명령들을 사용하면, 컴퓨트 유닛은 사이클당 64 개의 SAD 를 실행할 수 있습니다. 이는 클럭[clock]당 256 개의 연산들을 옮기는[translate] 것입니다. 이 명령들은 매우 강력하며 제스쳐 인식이나 비디오 검색과 같은 최신의 GPU 애플리케이션들을 위해 필수적입니다. 예를 들어 AMD 의 Steady Video 2.0 기술은 새로운 SAD 및 QASD 명령을 사용해 실시간에 녹화되고 스트리밍되는 비디오로부터 흔들림[shakiness]을 제거합니다.


배정밀도 및 32 비트 정수 명령들은 SIMD 내부에서는 감소된 속도로 실행됩니다. GCN 아키텍쳐는 유연하며, 배정밀도 성능은 단일 정밀도 성능에 비해 1/2 에서 1/16 이며, 그에 따라 지연도 증가합니다. 배정밀도 및 32 비트 정수 성능은 특정 GCN 구현에서는 매우 안 좋을 수 있으며, 이는 대상 애플리케이션에 의존하고 있습니다.


64 비트 초월 함수[transcendential function]나 IEEE 나누기와 같은 더 복잡한 명령들은 마이크로 코드[microcode]에 의해 지원됩니다. SIMD 는 개선된 분기 유닛의 이점을 이용해 하드웨어에서 부동소수점 예외[exception]를 제공히기도 하고, 벡터 조건 코드를 위해 스칼라 GPR 을 사용하기도 합니다.


LOCAL DATA SHARE AND ATOMICS


GCN 과 같은 처리량 컴퓨팅 플랫폼에서는, 통신 및 동기화가 고성능을 보장하기 위해 필수입니다. 특히나 최신의 범용 목적 애플리케이션에 대해서는 더욱 그러합니다. 지역 데이터 공유는 명시적으로 주소화된 메모리입니다. 이는 제 3 의 레지스터 파일로서 기능하는데, 특히 작업 그룹내에서의 동기화나 그래픽스를 위한 보간을 위해서 사용됩니다.


Figure 4: Local Data Share (LDS)



GCN 에서 LDS 용량[capacity]은 16 비트나 32 비트 뱅크를 가진 64 KB 로 두 배가 되었습니다( 제품마다 다릅니다 ). 각 뱅크는 512 개의 엔트리들을 포함하는데, 각 엔트리들의 크기는 32 비트 크기입니다. 뱅크는 모든[all-to-all] 크로스바[crossbar]에서 32 비트 값들을 읽거나 쓸수 있으며( 역주 : 크로스바는 특별한 의미는 아닌 것 같고 메모리 상에 중간중간 막대처럼 영역이 배치되어 있어서 크로스바라고 부르는 것 같습니다 ), 32 비트 아토믹 정수 유닛[atomic integer unit]을 포함한 유닛을 스위즐[swizzle]할 수 있습니다( 역주 : 스위즐은 여러 개로 구성된 컴포넌트의 값들을 선택적으로 혼합하는 기능입니다. 예를 들어 rgba 를 rrrr 로 만들수도 있고 abgr 로 만들수도 있습니다 ). 일반적으로 LDS 는 각 사이클에 서로 다른 두 개의 SIMD 로부터 16 개의 레인들을 합칩니다[coalesce]. 그래서 두 개의 웨이브프런트들이 매 4 사이클마다 완료됩니다. 웨이브프런트로부터 온 32 개의 레인들에 대해서 충돌이 자동으로 검출되며 하드웨어 내부에서 리졸브[resolve]됩니다. 같은 뱅크 내에서 서로 다른 요소에 접근하는 명령은 종료되기 위해서 추가적인 사이클을 소비합니다. 브로드캐스트[broadcast]들은 투명[transparent]하며( 역주 : 브로드캐스트하는 방식이 사용자에게 노출되어 있지 않다는 의미인듯. 아마도 비트수를 지정할 필요가 없다는 말이 아닌가 싶음. ), 8, 16, 32 비트 데이터는 어떠한 제약도 없이 벡터 ALU 명령을 위한 입력 피연산자[operand]로서 사용될 수 있습니다.


그래픽스의 경우, LDS 는 텍스쳐 데이터 상에서 최고 속도 보간을 수행하는데 사용하는데 사용되며, 접근 패턴 덕분에 충돌이 발생하지 않는다는 것이 보장됩니다. 범용 목적 컴퓨트 커널의 경우, SIMD 는 LDS 에서 데이터를 로드하고 저장할수 있습니다. 이를 통해 산란[scatter] 혹은 수집[gather] 접근을 사용하여 캐시 계층을 오염시키는 것을 피할 수 있습니다. 혹은 이를 사용해 캐시 대역폭을 증폭시킬 수도 있습니다. 추가적으로, 아토믹 유닛들은 작업 그룹 내부에서 고성능 추론[reduction]을 사는 데 있어 필수적입니다. 그리고 그것은 부동소수점 최대[max], 최소[min], 그리고 비교[compare] 및 교환[swap] 연산들을 수행할 수 있습니다.


LDS 명령들은 주소[address], 2 개의 데이터 값들, 그리고 목적지[destination]를 사용합니다. 주소는 vGPR 로부터 오고, 목적지는 vGPR 이거나 LDS 를 직접적으로 읽고 있는 SIMD 일수 있습니다. 2 개의 데이터 값들은 L1 데이터 캐시 ( LDS 에 저장하기 위해 ) 나 vGPR ( 로드하거나 저장하기 위해 ) 로부터 올 수 있습니다. 다른 디자인들과는 다르게, 전용 파이프라인은 LDS 를 레지스터에 로드하는 것과 같은 데이터 이동을 위해서 벡터 ALU 명령을 사용하지 않습니다.


EXPORT


익스포트 유닛은 고정 함수 그래픽스 하드웨어와 전역 데이터 공유 ( GDS ) 에 대한 컴퓨트 유닛의 윈도우[window]입니다. 모든 계산이 종료되었을 때, 일반적으로 그 결과는 그래픽스 파이프라인의 다른 유닛들로 전달됩니다. 예를 들어 픽셀이 셰이딩되고 나면, 그것들은 일반적으로 디스플레이에 대한 최종 출력 이전에 깊이 테스트와 스텐실 테스트, 그리고 블렌딩을 위한 렌더 백엔드[render back-end]로 전달됩니다. 익스포트 유닛은 결과들을 그래픽스 파이프라인의 프로그래밍 가능한 스테이지로부터 테셀레이션[tessellation] 스테이지나 래스터화[rasterization] 스테이지, 그리고 렌더 백엔드와 같은 고정 함수 스테이지로 전달됩니다.


GDS 는 지역 데이터 공유와 동일합니다. 단지 그것이 모든 컴퓨트 유닛에 의해 공유될 수 있어서 모든 웨이브프런트들 사이에서 명시적인 전역 동기화 지점으로서 기능한다는 차이가 있습니다. GDS 의 아토믹 유닛들은 좀 더 복잡하며 순서있는 카운트 연산들을 다룰 수 있습니다.


VECTOR MEMORY


While the SIMDs in each Compute Unit can execute 128 floating point operations per clock cycle, delivering enough bandwidth to match the impressive computational resources. GCN 에서 거의 대부분의 중요한 변화는 의심할 여지가 없이 캐시 계층에 존재합니다. 이는 그래픽 디자인에 매우 특화되어 있는 구조에서 고성능 및 프로그래밍 가능한 계층 구조로 변경되었습니다. 이 구조는 범용 목적 애플리케이션과도 잘 들어 맞고, x86 프로세서와의 통합을 위해서 준비되었습니다. 이 변화들은 컴퓨트 유닛들 내부에서 시작되었지만, 전체 시스템을 통해 확장되었습니다.


GCN 메모리 계층은 가상 메모리 지원과 훌륭한 아토믹 연산 성능을 가진 통합된[unified] 읽기/쓰기 캐싱 시스템입니다. 이는 이전 세대에서 사용되었던 독립된 읽기 캐싱 및 쓰기 버퍼링 패스[path]에 대한 중대한 개선이 있었음을 보여 줍니다. 벡터 메모리 연산들은 주소, 데이터를 위한 다양한 처리량[granularity]을 지원하는데, 이것은 32 비트부터 128 비트 쿼드[quad]까지의 범위를 가집니다.


Figure 5: Vector Memory


L1 데이터 ( L1D ) 캐시는 16 KB 이며 4-way set associative 인데, 64 B 라인들과 LRU replacement 를 가지고 있습니다. 이는 L2 및 다른 캐시들처럼 극단적으로 느슨한[relaxed] 일관성[consistency] 모델이라는 점에서 일관됩니다. 개념상으로는 L1D 캐시는 L2 캐시를 통한 궁극적인 전역 일관성과 함께 작업 그룹 일관성을 가집니다. L1D 는 더티 바이트 마스크[dirty byte mask] 를 사용하는 write-through, write-allocate 디자인을 가지고 있습니다( 역주 : write-through, write-allocate 는 캐시 쓰기 정책입니다. "문c 블로그"의 [ Cache -Policies ] 에 잘 정리되어 있습니다 ). 캐시라인은 웨이브프런트 명령의 모든 64 ( 역주 : 64 개의 레인 ) 가 저장을 완료할 때 L2 에 다시 써집니다. 더티 데이터를 가진 라인들도 역시 L1D 에 유지됩니다. 반면에 부분적으로 깨끗한 모든 라인은 L1D 캐시에서 추방됩니다. 특별한 일관성 로드 명령도 존재합니다. 그것은 L2 캐시로부터 불러와[fetch] 가장 최근의 값이 사용되었음을 보장합니다( 역주 : 실제로 사용한게 아닌데 사용했다고 우선수위를 높이는듯? ).


AGU 가 합병된 주소[coalesced address]를 계산하고 나면, 그 요청은 L1D 캐시 태그들을 탐색합니다. 맞는게 존재하면[ On a hit], 그 캐시는 전체 64 B 라인을 읽어 냅니다. 완전히 합병된 요청들을 사용하면, 이것은 웨이브프런트의 16 개의 데이터 값 혹은 1/4 와 연관됩니다. 비록 낮은 지역성[poor locality]로 인해 부가적인 사이클이 필요하긴 합니다. 계산 작업을 위해 캐시 라인은 vGPR 나 LDS 에 작성됩니다.


L1D 캐시에 저장하는 것은 약간 더 복잡합니다. 쓰기 데이터는 적절한 저장소 포맷[storage format]으로 변환되어야 하며, 그리고 나면, 맞는 캐시를 찾고 궁극적으로 L2 캐시로 쓰기를 하기 전에, 쓰기 주소가 가능하면 새로운 독립된 트랜잭션으로 합쳐집니다.


만약 메모리 요청이 L1D 캐시에서 실패하면, 그것은 통일되고 일관성 있는 L2 캐시로 전달됩니다. 이것은 셰이더 코어의 외부에 존재하며 메모리 컨트롤러들과 연관됩니다.


효율성을 증진시키고 부하를 줄이기 위해서, 약간 전용 하드웨어를 사용하는 유연한 메모리 계층이 그래픽스를 위해 재사용됩니다. 주소 생성 유닛은 사이클당 4 개의 텍스쳐 주소를 받습니다. 그리고 나서 16 개의 샘플링 주소를 가장 가까운 이웃을 위해 계산합니다. L1 데이터 캐시로부터 샘플들이 읽혀지고 텍스쳐 매핑 유닛[Texture Mapping Unit]( 혹은 TMU )에서 압축이 해제됩니다. 그리고 나서 TMU 는 클럭당 가능한 한 4 개의 보간된 텍셀[texel]을 산출하기 위해서 인접 샘플들을 필터링합니다. TMU 출력은 원하는 포맷[desired format]으로 변환되며 궁극적으로 이후의 사용을 위해 벡터 레지스터에 작성됩니다. 어떤 값들을 그래픽스 커널의 메모리로 쓰기위해서 사용되는 포맷 변환 하드웨어[format conversion hardware]도 존재합니다.


L2 CACHE, COHERENCY AND MEMORY


GCN 에서 분산된 L2 캐시는 GPU 에서 일관성의 핵심입니다. 그것은 읽기 전용 L1 명령들과 스칼라 캐시들을 위한 후방 방어벽[backstop]으로 기능합니다. 이는 CU 클러스터들에 의해 공유되며, 모든 CU 내의 L1 데이터 캐시에 의해서도 공유됩니다. L2 캐시는 물리적으로는 메모리 채널들과 쌍을 이루는 슬라이스로 구분됩니다. 그리고 컴퓨트 유닛에서 캐싱된 메모리 파티션까지 이어진 크로스바 섬유[crossbar fabric]를 통해서 흐름에 접근합니다.


Figure 6: Cache Hierarchy


L1 데이터 캐시와 마찬가지로 L2 는 가상으로 주소화되어 있습니다. 그래서 TLB( 역주 : Translation Lookaside Buffer. 가상주소를 물리 주소로 변환하는 캐시 ) 가 전혀 필요하지 않습니다. L2 캐시는 16-way associative 이며, 64 B 캐시 라인과 LRU replacement 를 가집니다. 그것은 write-back, write-allocate 디자인이며, 그래서 L1 데이터 캐시에서의 모든 쓰기 실패[write miss]를 흡수합니다. 각각의 L2 슬라이스는 64 KB 에서 128 KB 이며 L1 캐시들에 64 B 캐시 라인을 전송할 수 있습니다.


일관성 L2 캐시의 가장 큰 이점중 하나는 그것이 전역 아토믹 연산을 실행하고 서로 다른 웨이브프런트 사이에서 동기화를 하기 위한 가장 자연스런 위치라는 점입니다. 웨이브프런트 내부의 아토믹 연산을 위해서 LDS 가 사용될 수 있지만, 어떤 지점에서는, 서로 다른 웨이브프런트들로부터의 결과들이 합쳐질 필요가 있습니다. 이것이 정확히 L2 가 활동하게 되는 위치입니다. L2 슬라이스는 각 사이클에 캐시 라인에 대해 가능한 한 16 개의 아토믹 연산들을 실행할 수 있습니다.


GCN 의 전체적인 일관성 규약은 하이브리드 모델입니다. 이는 GPU 의 엄청난 성능과 대역폭을 전통 CPU 의 프로그래밍 가능성과 함께 녹여냅니다. 관점이 미래의 통합을 향해 있습니다. 개념상으로는 L1 데이터 캐시는 작업 그룹 내의 지역 접근을 위한 엄격한 일관성을 유지합니다. 웨이브프런트의 작업이 끝나는 시점이나 배리어가 실행되면, 그 데이터는 L2 로 작성되며 GPU 전체에 대해 전역적인 일관성이 됩니다.  이 모델은 종종 이완된 일관성[relaxed consistency]로서 설명되며 많은 이점을 가지고 있습니다. 수많은 지역 접근들은 낮은 부하와 높은 성능을 가지게 되지만, L2 는 프로그래머 친화적인 일관성을 제공합니다.


똑같이 중요한 것은, 캐시 계층이 x86 마이크로 프로세서들과 통합하기 위해서 설계되었다는 것입니다. GCN 의 가상 메모리 시스템은 4 KB 페이지들을 지원할 수 있으며, 이것은 x86 주소 공간을 위해 자연스러운 매핑 단위[granularity]입니다 - 미래의 공유된 메모리 공간을 위한 길을 연 것입니다. 사실 DMA( 역주 : Direct Memory Access, CPU 를 통하지 않고 메모리에 직접 접근하는 것 ) 전송을 위해 사용되는 IOMMU 가 이미 x86 주소 공간으로의 요청을 변환하여 데이터를 GPU 에 옮기는 데 도움을 주고 있으며 이 기능은 시간이 지날 수록 발전할 것입니다. 추가적으로, GCN 에서 캐시들은 64 B 라인들을 사용하는데, 이것은 x86 프로세서들에서의 크기와 같습니다. 이는 GPU 와 CPU 사이에서 전통적인 캐싱 시스템을 통해서 프로그래머가 명시적으로 제어하지 않고도 투명하게 데이터를 공유하기 위한 ( 이종 시스템들을 위한 ) 단계를 설정합니다.


메모리 컨트롤러는 GPU 들을 서로 묶으며 시스템의 거의 모든 파트들에 데이터를 제공합니다. 커맨드 프로세서, ACE, L2 캐시, PBE, DMA 엔진, PCI Express, 비디오 가속기, 크로스파이어 상호연결[Crossfire interconnection], 디스플레이 컨트롤러 등은 모두 지역 그래픽스 메모리에 대한 접근을 합니다. 각각의 메모리 컨트롤러들은 64 비트 크기이며, 두 개의 독립적인 32 비트 GDDR5 메모리 채널로 구성되어 있습니다. 저가 제품의 경우에는 GDDR5 가 DDR3 로 대체될 수도 있습니다. 메모리 처리량을 늘리기 위해서, GDDR5 컨트롤러는 채널당 두 개의 DRAM 을 사용하여 용량을 뻥튀기하기 위해 clamshell mode 에서 동작할 수도 있습니다.


PROGRAMMING MODEL


GPU 의 성능은 애플리케이션 프로그래밍 인터페이스[Application Programming Interface]( API )를 통해 발휘됩니다. 이는 개발자들을 위한 일관된 인터페이스를 제공하는 추상화입니다. 결정적으로, API 는 다양한 GPU 패밀리들 뿐만 아니라 하드웨어 세대들과 소프트웨어를 넘나 드는 호환성을 제공합니다. 그 목적은 프로그래머가 기반 하드웨어에 대한 걱정을 하지 않고 애플리케이션에만 집중할 수 있게 하는 것입니다.


업계 표준을 만족시키기 위해서 새로운 GCN ISA 가 디자인되었습니다. AMD 의 이종 시스템 아키텍쳐[Heterogeneous System Architecture] ( HSA ) 는 이종 컴퓨팅을 위한 모델로서 구상되었습니다. 그것은 CPU 와 GPU 가 통신하는 방식을 정의하며, 가상 ISA ( HSA 중간 언어[Intermediate Language] ) 를 포함합니다. 이것은 하드웨어마다 구현이 다릅니다. HSAIL 코드는 기반 하드웨어에서 동적으로 컴파일됩니다( 아마도 Vulkan 의 spir-v 같은 느낌인듯 합니다 ). 즉 모든 벤더의 CPU 와 GPU 에 대해 호환됩니다. GCN 은 HSAIL 에 대한 완벽한 지원을 제공하며, 그 이유는 부분적으로는 더욱 유연한 명령어 집합[instruction set]으로 전환하기 위함입니다.


GCN 은 산업 표준 컴퓨트 API 들에 애한 완벽한 지원을 합니다. 특히 OpenCL[TM] 1.2, DirectCompute 11.1, C++ AMP 와 호환되는 첫 번째 GPU 입니다. 이러한 표준들을 사용함으로써, 프로그래머들은 모든 운영체제를 대상으로 하고 다양한 하드웨어 상에서 호환되는 애플리케이션을 작성할 수가 있습니다. 이러한 산업 표준들은 개발자를 위해 성공적인 장기 로드맵[long term loadmap]을 보장해 주며, 불확실한 미래에 독점 프로그래밍 모델이나 하드웨어 플랫폼을 피하기 위해서 필수적입니다.


그래픽스 영역에서, GCN 은 DirectX 11.1 을 위해 준비되었으며, 이는 Windows[(R)] 8 에 소개될 것입니다. 그리고 세 가지 특별한 핵심 기능을 포함합니다. 첫 번째는 타깃-독립적인 래스터화입니다. 이것은 2D 이미지들을 위한 래스터화를 고정 함수 그래픽스 하드웨어로 이동시킵니다. 이는 CPU 로부터 2D 안티 에일리어싱[anti-aliasing]을 없애버리며, 동일한 이미지 품질을 제공하면서 전력을 줄이게 됩니다. 두 번째 변경은 범용 목적 데이터 배열 ( Unordered Access View 라 불립니다 ) 들이 6 가지 유형의 프로그래밍 가능한 셰이더와 비디오 가속을 위해서 이용될 수 있다는 것입니다. 이는 전체 GPU 프로그래밍 가능성을, 컴퓨트와 픽셀 셰이더로 국한하는 것이 아니라, 그래픽스와 비디오 API 를 통해서 확장합니다. 마지막으로 DirectX[(R)] 11.1 은 Stereo 3D 를 위한 표준 API 를 포함합니다. 이는 특정 벤더용 미들웨어나 서드 파티 미들웨어의 단편화된 에코시스템[ecosystem]들을 대체합니다.


GCN 에는 범용 목적 프로그래밍 가능성과 관련한 매우 중요한 개선점들이 많이 존재합니다만, 그것들은 그래픽스의 문맥에서도 유리합니다. 예를 들어, 개발자는 Partially Resident Texture (PRT) 를 사용하여 거의 무한대의 텍스쳐 디테일을 가진 월드를 생성할 수 있습니다. GPU 의 가상 메모리 시스템은 메모리에 필요한 부분만을 로드합니다. GCN 에서는 32 TB 까지의 가상 메모리가 텍스쳐를 위해 사용될 수 있습니다. 이것이 실제 가용 메모리를 줄이기 때문에, 드라이버와 GPU 는 텍스쳐를 64 KB 타일 단위로 필요한 만큼 페이징합니다. 이 절차는 투명하며( 역주 : 프로그래머가 제어할 수 없다는 말임 ), 프로그래머가 명시적으로 데이터를 메모리에 프리로딩해야 하는 수고를 덜어 줍니다. PRT 는 id Tech 5 와 같은 선도적인 멋진 게임 엔진들에서 이미 사용중이며, 차세대의 게임 엔진들과 히트한 게임들에서 일반적이 될 것입니다.


SYSTEM ARCHITECTURE


궁극적으로, GCN 은 2-3 W 로 제한되는 태블릿에서 전체 건물을 채우는 슈퍼컴퓨터에 이르기까지 다양한 종류의 제품에서 사용될 것입니다. 이는 성능 및 파워의 스펙트럼이 100 배 정도 차이가 남을 보여주며, 극단적으로 다른 환경들을 보여 줍니다. 고성능 GPU 들은 일반적으로 전용 고 대역폭 메모리 서브시스템을 가지고 있으며 크로스파이어로 연결되어 작동할 수도 있습니다. 여기에서 렌더링은 최대 성능을 위해 다중 GPU 들 사이에서 분할됩니다. 반대로 고도로 통합되어 있는 태블릿이나 PC 를 위한 System-On-Chip 은 CPU, GPU, 그리고 다른 On-die 컴포넌트 사이의 메모리 컨틀롤러를 공유할 것입니다. 이러한 다양성을 다루기 위해서, GCN 의 시스템 아키텍쳐는 범용 목적 셰이딩 코어들과 고정 함수 그래픽스 하드웨어에서의 범용성과 확장성을 위해 재설계되었습니다.


GCN 은 호스트 프로세서와의 인터페이싱을 위해서 PCI Express[TM] 3.0 을 사용하는 첫 번째 아키텍쳐입니다. AMD Radeon[TM] HD 7970 같은 GCN 기반 독립 GPU 들은 16 배의 링크를 사용하는데, 이것은 32 GB/s 의 대역폭을 제공합니다. 이 CPU to GPU 인터페이스는 범용 목적 작업에서는 특히 병목이 됩니다. 여기에서 거대 데이터 집합들은 두 프로세서 사이에서 움직입니다. GCN 은 두 개의 양방향 DMA 엔진들을 가지고 있어서, 두 개의 데이터 스트림들이 동시에 PCI Express[TM] 3.0 링크의 모든 방향을 사용할 수 있으며 효율적으로 가용 대역폭을 이용합니다.


DMA 엔진들은 x86 마이크로 프로세서에 대한 AMD 의 경험이 성과를 올린 영역입니다. GCN 은 I/O 메모리 관리 유닛[Memory Management Unit] (IOMMU) 를 포함하는데, 이는 GPU 를 위한 x86 주소를 투명하게 매핑할 수 있습니다. 이는 GCN 의 DMA 엔진들이 페이지화가 가능한 CPU 메모리에 쉽게 접근할 수 있으며, 데이터를 이동시키기 위해서 주소 변환을 하는 부하를 가지고 있지 않음을 의미합니다. IOMMU 는 이종 시스템 통합을 더욱 강하게 하는 단계이며 시간이 지날 수록 발전할 것입니다.


GCN 커맨드 프로세서는 고수준 API 커맨드를 드라이머로부터 받아서 다양한 처리 파이프라인으로 그것들을 매핑할 책임이 있습니다. GCN 에는 두 개의 주요 파이프라인들이 존재합니다. 비동기 컴퓨트 엔진[Asynchronous Compute Engine] (ACE) 은 컴퓨트 셰이더를 관리하며, 반면에 그래픽스 커맨드 프로세서는 그래픽스 셰이더와 고정 함수 하드웨어를 다룹니다. 각 ACE 는 커맨드의 병렬 스트림을 다룹니다. 그리고 그래픽스 커맨드 프로세서는 각 셰이더 유형을 위한 개별 커맨드 스트림을 가질 수 있으며, GCN 의 멀티 태스킹의 이점을 살리기 위해서 풍부한 작업을 생성하게 됩니다.


스케줄링은 GCN 이 산업을 발전시키고 있는 또 다른 영역입니다. 멀티 태스킹을 위해서는 가상 메모리가 필요하며, 그래서 메모리에 대한 경쟁적인 요청을 하는 애플리케이션들이 안전하게 동시에 존재할 수 있습니다. 멀티 태스킹은 1980 년대 이래로 컴퓨터에서 일반적이며, 프로그래머의 생산성을 위해서 매우 가치가 있습니다. GCN 은 기본적인 기반[infrastructure]을 생성하고 고수준으로 병렬화된 GPU 의 활용도와 효율성을 증신시키기 위해서 멀티 태스킹을 사용합니다.


ACE 는 모든 컴퓨트 셰이더 스케줄링과 리소스 할당을 다룹니다. 제품은 다수개의 ACE 를 가질 수 있으며, 그것들은 성능의 관점에서 확장하거나 축소하기 위해서 서로 독립적으로 동작하게 됩니다. 각 ACE 는 캐시나 메모리로부터 커맨드를 불러와서 태스크 큐를 형성합니다. 이는 스케줄링의 시작점입니다. 각 태스크들은 스케줄링을 위해 background 로부터 real-time 까지의 우순위 레벨을 가지고 있습니다. ACE 는 가장 높은 우선순위 태스크에 대한 하드웨어 요청을 검사하여, 리소스를 충분하게 이용할 수 있을 때 그 태스크를 GCN 셰이더 배열로 보낼[dispatch] 것입니다.


많은 태스크들이 동시에 실행될 수 있습니다; 이 제한은 하드웨어 리소스에 의해서 많아지거나 적어질 수 있습니다. 태스크는 순서없이[out-of-order] 완료되며, 이는 리소스를 일찍 릴리스하지만, 정확성을 위해서는 ACE 에서 트래킹되어야만 합니다. 태스크가 GCN 셰이더 배열에 보내질 때, 그것은 여러 개의 작업 그룹으로 분할되는데, 작업 그룹들은 실행을 위해서 개별 컴퓨트 유닛들로 보내질 수 있습니다. 매 사이클마다, ACE 는 작업그룹을 생성하고 작업그룹에서 하나의 웨이브프런트를 컴퓨트 유닛으로 보냅니다.


ACE 는 보통 독립적인 방식[fashion]으로 연산을 수행하지만, 그것들은 캐시, 메모리, 혹은 64 KB 전역 데이터 공유를 사용하여 동기화하거나 통신할 수 있습니다. 이것은 ACE 가 실제로는 태스크 그래프를 형성할 수 있다는 것을 의미하며, 여기에서 개별적인 태스크들은 서로에 대한 의존성을 가지게 됩니다. 그래서 실제로는, ACE 안의 태스크는 다른 ACE 나 그래픽스 파이프라인의 태스크들에 의존하고 있을 수 있습니다. 예를 들어, 현재 실행중인 태스크 그래프가 의존성때문에 그래픽스 파이프라인으로부터의 입력을 위해 대기하고 있다면, ACE 는 스케줄링될 준비가 되어 있는 다른 태스크 큐로 전환할 수 있습니다. ACE 는 이전 태스크와 연관된 모든 작업그룹을 플러싱할 것이고, 그리고 나서 새로운 태스크로부터의 작업그룹을 셰이더 배열에 발행할 것입니다.


GRAPHCIS ARCHITECTURE


그래픽스 커맨드 프로세서는 전통적인 렌더링 파이프라인을 형성합니다. 3D 파이프라인은 여러 유형의 프로그래밍 가능한 셰이더들( 예를 들어, vertex, hull, domain, geometry, pixel shader )과 삼각형과 픽셀을 조작하는 다양한 고정함수 하드웨어로 구성되어 있습니다. 셰이더 성능은 매우 가변적입니다. 그러므로 진짜 문제는 고정 함수 하드웨어를 확장하는 것입니다.


3D 렌더링은 클럭 당 단일 삼각형을 조립[assemble]하는 프리미티브 파이프라인에서 시작합니다. GCN 에서 프리미티브 파이프라인의 개수는 성능 요구사항과 연관되어 매우 다양합니다. 다중 프리미티브 파이프라인은 화면 공간을 분할하고 올바른 삼각형 순서를 유지하기 위해 동기화에 의존합니다. 그리고 조립된 삼각형은 버텍스 셰이딩과 헐[hull] 셰이딩을 위한 셰이더 배열로 전달됩니다. 헐 세이더는 버텍스 좌표를 테셀레이션 좌표로 옮기고 제어 정보를 설정합니다.


프리미티브 파이프라인은 도메인을 2-64 개의 더 작은 오브젝트로 실제로 분할하는 테셀레이션 스테이지를 위한 고정 함수 하드웨어도 포함하고 있습니다. GCN 의 테셀레이터는 이전 세대보다 4 배까지 빠릅니다. 훨씬 느린 off-chip 메모리 대신에 일관성 L2 캐시를  더 큰 파라미터 캐시를 이용할 수 있는 더 큰 파라미터 캐시를 사용합니다. 테셀레이션 이후에는 도메인 셰이더가 오는데, 이것은 분할된[tessellated] 출력을 표준 버텍스로 변환하고 그 결과를 지오메트리 셰이더로 넘깁니다.


다른 주요 그래픽스 함수들은 픽셀 파이프라인에 집중되어 있습니다. GCN 픽셀 파이프라인들은 스크린 공간을 독립적인 타일로 분할함으로써 확장됩니다. 버텍스를 픽셀로 변환하는 실제 레스터화가 첫 번째 작업입니다. 각 래스터라이저는 사이클당 단일 삼각형을 읽어들일 수 있으며, 16 개의 픽셀을 쓸 수 있습니다. 나중에 계층적인 Z 테스트를 통해서 이전 픽셀 셰이딩에 의해서 가려진 픽셀들을 제거하게 됩니다.


타일 안에서 조각화된[fragmented] 픽셀들이 셰이딩되고 나면, 그것들은 렌더 백엔드[Render Back-End] (RBE) 로 흘러들어 갑니다. RBE 는 뎁스 테스트, 스텐실 테스트, 알파 테스트를 적용하여 픽셀 조각이 최종 프레임에서 가시화되어야 하는지를 결정합니다. 그리고 나서 가시화된 픽셀 조각들은 커버리지[coverage] 와 컬러[color]를 샘플링해 최종 출력 픽셀을 생성합니다. GCN 의 REB 는 16 KB 컬러 캐시로부터 픽셀당 8 개 까지의 컬러 샘플들( 예를 들어 8x MSAA )에, 4 KB 의 뎁스 캐시로부터 픽셀당 16 개의 커버리지 샘플들( 예를 들어 16x EQAA 까지 )에 접근할 수 있습니다. 컬러 샘플들은 최종 안티 에일리어싱 픽셀 컬러를 생성하기 위해서 커버리지 샘플들에 의해서 결정되는 가중치[weight]들을 사용해 블렌딩될 수 있습니다. 그 결과는 메모리 컨트롤러들을 통해서 프레임 버퍼로 작성됩니다.


그래픽스 파이프라인은 ACE 와 동일한 기술 집합을 사용해서 조직되었습니다. 3D 파이프라인의 각 스테이지들은 ACE 처럼 동시에 실행될 수 있습니다. 프리미티브 및 픽셀 파이프라인들은 크로스바 섬유를 통해서 프로그래밍 가능한 GCN 셰이더에 연결됩니다. 그 태스크 큐는 다른 셰이더와 고정 함수 하드웨어에 대해 캐시나 메모리를 통해 동기화됩니다.


The advantage of GCN's flexibility is evident in the first few products that have scaled across all four dimensions. AMD Radeon[TM] HD 7970 은 스크린을 2 개의 프리미티브 파이프라인과 4 개의 픽셀 파이프라인으로 분할합니다. 그리고 셰이딩을 위해서 32 개의 컴퓨트 유닛과 384 비트의 메모리 인터페이스를 사용합니다. GCN 픽셀 파이프라인들은 2 개의 REB 와 3 개의 메모리 컨트롤러로 조직화되어, 메모리 대역폭에서 50 % 의 향상이 있었습니다. 반대로, AMD Radeon[TM] 7770 GHz 에디션은 단일 프리미티브 파이프라인, 2 개의 픽셀 파이프라인, 10 개의 컴퓨트 유닛을 가지고 있습니다. 7770 에디션에서의 픽셀 파이프라인들은 2 개의 메모리 컨트롤러로 축소되었으며, 128 비트 크기의 인터페이스를 사용합니다.


Figure 7: AMD Radeon[TM] HD 7970


Figure 8: AMD Radeon[TM] HD 7870 GHz Edition


Figure 9: AMD Radeon[TM] HD 7770 GHz Edition


PROGRAMMABLE VIDEO PROCESSING


범용 프로그래밍 가능성은 전체 GCN 아키텍쳐 사이에서 최 우선순위입니다. 특히 비디오 처리가 그러합니다. 비디오의 유일한 특징중 하나는 그것들이 매우 특정된[specific] 데이터 유형이며 고정 함수 하드웨어의 이점을 취할 수 있는 많은 기회가 존재한다는 것입니다. 비디오 전용 UVD3 디코더 엔진이 MPEG-4 와 DivX 포맷을 지원하기 위해서 추가되었으며, 이와 함께 Multi-View Codec 이 추가되어 Stereo 3D 와 HD picture-in-picture  디스플레이에서 사용됩니다.


Figure 10: Hybrid Video Encoding


GCN 은 전력 효율성을 가진 비디오 코덱 엔진[Video Code Engine] ( VCE ) 을 통합했는데, 이는 60 frames/sec 로 1080p 를 재생할 수 있는 H.264 인코딩에 대한 완벽한 하드웨어 구현을 포함합니다. 그러나 VCE 는 프로그래밍을 고려해 두고 명시적으로 설계되었습니다 - VCE 의 엔트로피 인코딩 블록[entropy encoding block] 은 소프트웨어에 완전하게 접근할 수 있습니다. AMD 의 Accelerated Parallel Programming SDK 와 OpenCL[TM] 을 사용하는 개발자는 custom motion estimation, inverse discrete cosine transform, motion compensation 을 하드웨어 엔트로피 인코딩과 함께 사용하는 하이브리드 인코더를 생성하여 실시간 인코딩보다 더 빠른 결과를 얻을 수 있습니다.


RELIABLE COMPUTING


범용 목적 컴퓨팅은 어느 정도 수준의 신뢰성을 요구하는데, 이는 전통적인 그래픽스 월드보다는 훨씬 큽니다. 하지만 AMD 에게는 매우 친숙합니다. 2003 년 이후로 AMD 의 Opteron 프로세서들은 세계에서 가장 큰 슈퍼 컴퓨터와 업무 전용 시스템[mission critical system] 들의 일부로서 사용되어 왔습니다. 이런 시스템들은 고장시간[downtime]과 데이터 손상[corruption]은 허용하지 않습니다. AMD 는 매우 신뢰도 있는 디자인을 하는 경험을 했고, 서버 룸, 슈퍼 컴퓨터, 단일 워크스테이션, 게이밍 노트북 등의 어떠한 시스템에서라도 적용이 가능한 제품을 생성하기 위해서 GCN 아키텍쳐에 그 경험을 적용했습니다. GCN 아키텍쳐의 중요한 목표는 신뢰성이지만, 보증되지 않은 상황에서의 부하는 피해야 합니다.


현대 칩들에서의 가장 큰 신뢰성은 on-chip 메모리에서의 soft errors ( 혹은 bit-flips ) 입니다. AMD Radeon[TM] HD 7970 과 같은 고성능 GPU 는 12 MB 가 넘는 SRAM 과 CU 및 캐시들을 통해 퍼져 있는 레지스터 파일들을 가지고 있습니다. GCN 은 single error correct 와 double error detect ( SECDED ) 를 모든 on-chip 메모리를 위해 완벽히 다룰 수 있도록 설계되었습니다. 이는 면적과 전력 측면에서 약간의 부하를 가지고 있습니다만, 정확하고 신뢰성있는 결과가 필수적인 전문 애플리케이션에서는 별로 중요하지 않을 수 있습니다.


두 번째 신뢰성 문제는 외부 메모리입니다. GDDR5 는 산업 표준에 기반하고 있으며 매우 다양한 서드 파티들에 의해서 제조되고 있습니다. 표준 GDDR5 메모리 인터페이스는 CRC 를 사용해서 전송된 데이터를 검사하고 손상된 데이터를 반송합니다. 그러나 ECC 는 존재하지 않습니다. 즉 DRAM 이 가지고 있는 데이터가 soft error 에 의해서  손상되었는지 여부를 알 방법이 없습니다.


GCN 메모리 컨트롤러는 SECDED 를 DRAM 에 적용하는 선택적인 모드를 가지고 있습니다. ECC 로 보호되는 데이터는 약 6% 정도 커지는데, 이는 전체적인 메모리 용량과 대역폭을 약간 감소시킵니다.


아키텍쳐로서 GCN 은 전문적인 제품이나 소비자 제품을 위해서 커스터마이징이 가능합니다. 전문적인 애플리케이션들은 최소한의 성능 저하와 함게 최대한의 신뢰성을 제공하기 위해서 on-chip SRAM 과 선택적인 외부 DRAM 을 위한 ECC 보호의 이점을 취할 수 있습니다. ECC 를 지원하는 CPU 제품은 그래픽스 드라이버를 통해 그것을 활성화하거나 비활성화할 수 있습니다.


CONCLUSION


( 역주 : 그냥 내용 요약이 아니라 AMD 자랑이라서 번역이 귀찮아졌네요. 건너 뜁니다 )


AMD's GCN Architecture comes at a time of change for the industry. Graphics is an increasingly important part of the user experience, and a crucial component for SoCs that integrate CPUs and GPU side-by-side. The mandate for GPUs is expanding to include not just 3D rendering, but new general purpose, heterogeneous applications such as facial recognition, which are only feasible using the parallel performance of the GPU.


As a company, AMD is uniquely positioned with deep expertise and a long history of excellence in both CPUs and GPUs for the PC. GCN is a marriage of these domains, melding the reliability and programmability of traditional CPUs with the efficient parallel performance of a GPU.


GCN is huge step forward, firmly placing AMD in the new era of heterogeneous computing, but without losing sight of efficiency or performance. The GCN Architecture encompasses innovations such as virtual memory, coherent caching and an elegant hybrid vector/scalar instruction set that are revolutionary. At the system level, GCN is the only discrete graphics architecture that is compatible with the x86 programming model, paving the way for future software and hardware integration.


Most importantly, AMD has carefully crafted an architecture that is a tremendous advance in programmability, but does not sacrifice performance or efficiency. Features such as a unified instruction stream and scheduling in the scalar pipelines enhance utilization and boost the achievable performance on real workloads. The first GPUs manufactured on 28nm were based on GCN and improved performance/watt and performance/mm2 by roughly 50% over the prior generation. The AMD Radeon™ HD 7970 GHz Edition achieves peak performance of over 1 TFLOPS double precision and 4 TFLOPS single precision, a testament to the underlying architecture. GCN will eventually revolutionize AMD's entire product line, from tablets to supercomputers.


DISCLAIMER


The information presented in this document is for informational purposes only and may contain technical inaccuracies, omissions and typographical errors. AMD reserves the right to revise this information and to make changes from time to time to the content hereof without obligation of AMD to notify any person of such revisions or changes.


AMD MAKES NO REPRESENTATIONS OR WARRANTIES WITH RESPECT TO THE CONTENTS HEREOF AND ASSUMES NO RESPONSIBILITY FOR ANY INACCURACIES, ERRORS OR OMISSIONS THAT MAY APPEAR IN THIS INFORMATION.

AMD SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR

PURPOSE.


IN NO EVENT WILL AMD BE LIABLE TO ANY PERSON FOR ANY DIRECT, INDIRECT, SPECIAL OR OTHER CONSEQUENTIAL DAMAGES ARISING FROM THE USE OF ANY INFORMATION CONTAINED HEREIN, EVEN IF AMD IS EXPRESSLY ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

+ Recent posts