본문 바로가기
IT분야 해외뉴스

■고토 히로시무의 Weekly 해외 뉴스■ (2007.4.16)

by leeyj. 2007. 4. 17.

고토 히로시무의 Weekly 해외 뉴스

 

위협적인 NVIDIA G80 아키텍쳐

 

상세하게 밝혀진 G80의 마이크로 아키텍쳐

  DirectX 10
세대 GPU가 드디어 2 라운드를 맞이한다. NVIDIA가 다음 DirectX 10세대 GPU AMD(ATI Technologies)가 첫 DirectX 10세대 GPU R600」를 준비했기 때문이다. NVIDIA G8x 세대 GPU와 메인 스트림&밸류 GPU 3 CeBIT에서 벌써 몇 회사에 OEM을 보이고 있다. AMD R600에 대해서는 당초 1/4분기 발표라고 설명하고 있었다. 모두 초읽기 상태에 들어가 있다.


 거기서, NVIDIA GeForce 8800(G80) 아키텍쳐를 정리 위협적인 G8x계 코어를 전망해 보고 싶다.


 G8x계 아키텍쳐에 대해서는 NVIDIA GPU전용의 범용(General Purpose) 프로그래밍 모델 「CUDA (compute unified device architecture)」의 설명을 통해 상세하게 설명하고 있다. 그 설명에는 G80 발표시에 애매하게 되어 있던 부분도 포함되어 있다. 마이크로 아키텍쳐에 대해서는 상세하게 밝혀지고 있다. 거기에 따라 G8x 아키텍쳐는 높은 성능이라는 것이 밝혀지고 있다.

 


클러스터화 된 G80 연산 프로세서군


 G80의 경우 합계 128개의 스칼라 연산 프로세서 「Streaming Processor(SP)」를 탑재하고 있다. Streaming Processor군은 실제로는 16 개씩 클러스터에 조직화되어 있다. CUDA에서는 이 클러스터를 「Texture Processor Cluster(TPC)」라고 부르고 있다. 최초의 GPU 설명에는 Shader Cluster로 불리고 있었지만 Texture Processor Cluster가 보다 정확하다. 그것은 G8x계에서는 Shader Processor가 분해되고 있기 때문이다.


 G7x 세대에는 1개의 Shader Processor안에 4 way SIMD(Single Instruction, Multiple Data) 프로세서와 스칼라 연산 유닛 texture 유닛이 포함되어 있었다. 한묶음이 된 Shader Processor 4개로 1개의 클러스터로 구성되어 있었다. 그에 대해 G8x 세대로는 프로세서와 texture 유닛은 분리되어 한층 더 프로세서에서 SIMD로 스칼라로 분해되고 있다. 분리된 프로세서군과 texture 유닛을 종래의 Shader와는 다른 단위로 클러스터화했던 것이 G8x계 아키텍쳐다.


 GPU의 경우 통상 프로세서 부분은 클러스터 단위로 모듈화한다. 클러스터의 내부 구성을 바꾸지 않고 클러스터의 수를 증감시켜 다양하게 만든다. GPU 코어의 설계를 용이하게 하기 위해서다. 모듈화된 블록을 조합해 고급 지향 GPU 밋드렌지 GPU 메인 스트림&밸류 GPU 3 종류의 다이(반도체 본체)를 만들어 나누고 있다. G80에서는 합계로 8개의 Texture Processor Cluster가 있어 클러스터수가 바뀌게 된다.


 G80의 각 Texture Processor Cluster 안에는 16개의 Streaming Processor군은 8 개씩 2개의 번들로 나눌 수 있다. 이 번들은 「Streaming Multiprocessor(SM)」라고 불리는 유닛으로 이름대로 Streaming Processor의 멀티 프로세서로 구성 되어 있다. 클러스터안에 게다가 2개의 클러스터가 있는 상자 구조의 이미지다.


 이 외 G8x의 클러스터(Texture Processor Cluster)에는 2개의 Streaming Multiprocessor으로 공유하는 리소스가 포함된다. texture의 프로세싱을 행하는 「Texture Unittexture 데이터를 캐쉬하는 「Texture L1 CacheL2인스트럭션 캐쉬와 L2정수 캐쉬 「Instruction & Constant L2 Cache」메모리로부터의 데이터의 로드와 스토어를 행하는 「Load/Store Unit」등이다.


 

제어의 단위가 되는 Streaming Multiprocessor


 G8x에서는 Streaming Processor 제어는 Streaming Multiprocessor 단위로 행해진다. 바꾸어 말하면 2개의 Streaming Multiprocessor에는 각각 개별 인스트럭션 유닛(Instruction Unit)이 있어 양Streaming Multiprocessor는 각각 다른 인스트럭션을 평행해서 실행할 수 있다. 적어도 CUDA의 설명에서는 그렇게 되고 있어 그래픽 파이프로도 기본적인 동작은 같을거라고 추측된다.







  NVIDIA의 차트를 바탕으로 한 위의 그림에는 2개의 Streaming Multiprocessor가 파이프라인으로 보인다. 그러나, 실제로는 병렬로 접속되고 있을 것이다.


 G7x 세대에는 4개의 4way SIMD 프로세서로 클러스터가 구성되어 클러스터마다 1개의 인스트럭션 유닛이 있어 클러스터 단위로 프로세서군이 제어되고 있었다. 4 way 4개이므로 합산하면 16개의 연산 유닛이 클러스터에 포함되어 있던 것이 된다. 실제로는 그 밖에도 연산을 담당하는 유닛은 있지만 메인의 연산 유닛수는 16개였다.


 그에 대한 G8x 세대로는 16개의 스칼라 프로세서로 클러스터가 구성되어 있다. 4 way SIMD 구성은 취하지 않지만 클러스터에 포함되는 메인 연산 유닛 수는 단순 계산에서는 G7x 세대와 같다. 그러나, 프로세서의 제어 자체는 8개 단위로 행해진다. , 프로세서군을 제어하는 입도를 보다 작게 하고 있다.


 좀 더 세세하게 보면 G7x계의 경우는 4way SIMD 4 유니트로 4개의 thread를 동시에 실행할 수 있는 구조로 되어 있었다. SIMD 유닛은 2 분할해 다른 인스트럭션을 실행하는 일도 가능하지만 같은 thread 범위내에서 컴파일러로 인스트럭션을 스케줄 해 실행하는 형태였다. 그에 대한 G8x계에서는 각 스칼라 유닛이 분리되고 있어 별도인 thread를 실행할 수 있다.

 


제어의 입도를 작게 한 G80의 아키텍쳐


 다만, 1 인스트럭션 유닛으로부터 인스트럭션으로 1개의 번들내의 연산 유닛이 제어되는 구조 자체는 G7x에서도 G8x에서도 변함없다.


 G7x계에서는 클러스터의 인스트럭션 유닛으로부터 4개의 4way SIMD 유닛에 대해 같은 인스트럭션이 발행된다. 기본적으로 4way SIMD 유닛이 각각 데이터 엘리먼트에 대해서 같은 인스트럭션을 실행한다. 그 때문에 통상 16개의 데이터 엘리먼트에 대해서 같은 인스트럭션을 실행하게 된다. 클러스터 전체가 1개의 인스트럭션으로 복수의 데이터에 대해서 처리를 행하는 16 way SIMD(Single Instruction, Multiple Data) 형 프로세서가 되고 있다(실제로는 SIMD를 분할해 다른 인스트럭션을 실행시킬 수도 있다).


 G80의 경우는 Streaming Multiprocessor의 인스트럭션 유닛으로부터 인스트럭션을 8개의 스칼라 프로세서가 실행한다. Streaming Multiprocessor 전체로 보면 8 way SIMD 구조이다. 프로세서를 제어하는 입도는 G80가 보다 작다.


 또, G7x Pixel Shader에서는 cascade로 같은 인스트럭션을 220개의 픽셀에 대해서 실행하는 구조이다. 그 때문에 880 픽셀이 G7x thread 블록의 입도가 되고 있다.


 G80에서는 이것도 작아지고 있다. 프로그래밍 모델상에서는 G80 Streaming Processor에서의 실행을 「warp」라고 부르는 단위로 제어하고 있어 warp의 단위는 32 thread(16 thread 지원한다). Streaming Multiprocessor에 포함되는 Streaming Processor의 수는 8개이기 때문에 각 Streaming Processor 4 사이클에 건너 같은 인스트럭션을 다른 thread에 대해서 실행한다고 생각된다. warp 32 thread G80의 경우 분기 입도가 된다.


 warp안의 thread가 모두 1 방향으로 분기 하는 경우는 그 warp 1 방향의 분기 패스만을 실행한다. 그러나, thread에 의해 분기 방향이 나뉘었을 경우 그 warp는 양쪽 모두의 패스를 실행해야 한다. 그 때문에 프로그램 실행에 필요한 사이클이 길어져 효율이 악화된다. 그 때문에 GPU는 세대가 진행되는 것에 따라 분기 입도를 작게 하는 방향으로 향하고 있다.


 덧붙여서 G80에서는 복수의 warp로 한층 더 큰 thread 블록을 구성하고 있어 이 thread 블록이 coherency를 취하는 단위가 되고 있다. , 복수의 warp를 바꾸어 실행하는 것으로 파이프라인을 충전하는 구조가 되고 있다. 실행 파이프를 풀로 가동시키기 위해서 전형적으로 8개의 warp이 필요하다.


 8개의 warp가 각각 32개의 thread를 달리게 하면 thread는 합계로 256개가 된다. G80 Streaming Multiprocessor의 인스트럭션 유닛은 최대 512 thread까지를 액티브하게 달리게 할 수가 있지만 그것은 파이프라인을 충전하기 위해서다. G70에서는 파이프라인을 충전하는 thread의 수가 분기 입도였다. 그러나, G80에서는 그것이 분리되어 있다.


 

부동소수점 유닛과 복잡 연산 유닛으로 분리


 G80의 연산 유닛은 Streaming Processor(SP) Super Function Unit(SFU) 2개의 파이프로 구성되어 있다. Streaming Multiprocessor에 대해 Streaming Processor 8, Super Function Unit 2개 갖춰져 있다. Super Function Unit 4개의 Streaming Processor로 공유되어 있다.


 G80 발표시 설명에서는 Streaming Processor안에 부동 소수점 주산(FMAD:Floating Point Multiply-Add) 유닛과 적산(FMUL:Floating Point Multiply) 유닛 2개로 단순화 해서 설명했다. 그러나 CUDA에서의 설명은 구체적으로 연산 유닛의 내용이 밝혀졌다.


 Streaming Processor 자체는 스칼라의 주산(MAD) 연산 유닛(ALU)으로 FMUL/FADD/FMAD/정수 오퍼레이션/포맷 전환등을 실행할 수 있다. 1 인스트럭션/클럭 실행 throughput이다.


 Super Function Unit RCP/RSQ/LG2/EX2/SIN/COS라고 한 복잡한 연산을 행하는 유닛이다. 4개의 Streaming Processor의 사이로 공유되는 리소스가 되고 있다. 코스트의 비싼 유닛을 분리해 공유 리소스로 했다고 생각할 수 있다. 4 클럭마다 1 인스트럭션을 발행할 수 있다. 실제로는 1 클럭마다 1 thread의 인스트럭션을 발행하고 있다고 생각된다. Super Function Unit FMUL와 무브 인스트럭션도 실행할 수 있다.


 Streaming Multiprocessor의 레지스터는 합계로 32 KB라고 보여진다. G80 전체에서는 Streaming Multiprocessor 16개 있으므로 그 경우는 합계로 512 KB의 레지스터가 된다. 이 숫자는 정확한가 어떤지 모르지만 같은 Unifide-Shader 아키텍쳐를 취하는 Xbox 360 GPU(Xenos)가 합계 24,576개의 벡터 레지스터(384KB)를 가지므로 부자연스럽지 않다. 레지스터의 양이 많은 것은 메모리 지연을 줄이기 위해서다. CPU가 캐쉬를 크게 해 메모리 지연을 줄이듯이 GPU도 레지스터를 크게 해 메모리 지연을 줄인다.


 G8x 아키텍쳐는 각 thread가 사용하는 물리 레지스터수는 고정되어 있지 않다. 「 각 thread마다 전용 레지스터 공간을 가지지만 고정되지는 않았다. thread수가 증가하면 레지스터수가 줄어든다」라고 NVIDIA David B. Kirk(데이빗·B·커크) (Chief Scientist)는 설명하고 있었다.

 


범용 컴퓨팅을 위한 Shared Memory


 종래의 GPU는 「Embarassingly Parallel」라고 불리는 의존성이 없는 병렬처리에 특화하고 있었다. 그 때문에 연산 유닛간 상호 데이터 이용은 GPU 코어로부터 먼 메모리를 개입시킬 수 밖에 없었다. on-chip으로 자유롭게 리드&라이트 액세스가 생기는 메모리를 가지지 않기 때문이다. 이것이 비그래픽 처리를 행하는 경우 GPU 약점의 하나라고 말해지고 있었다.


 거기서 G80에서는 Streaming Multiprocessor(SM) 마다 Streaming Processor간에 공유하는 메모리 「Shared Memory」를 16 KB 갖추고 있다. 이것이 G80의 커다란 특징이 되고 있다.


 Shared Memory G80 발표 당시「Parallel Data Cache」라고 부르고 있던 메모리다. 프로그램으로부터 완전하게 보이는 메모리로 각 연산 파이프로부터 병렬로 액세스가 가능하다. 그 때문에 1개의 Streaming Processor의 연산 결과를 다른 Streaming Processor가 짧은 지연시간으로 참조가 가능하고 종래 GPU의 제약을 경감하고 있다.


 G80 Shared Memory는 프로그램으로부터 완전하게 보여 coherency 메카니즘을 하드웨어로 가지지 않는 점으로써 CPU의 캐쉬와는 다르다. 그 의미는 명칭으로는 당초의 Parallel Data Cache보다 Shared Memory가 정확하다. 어느 쪽일까 하고 말하면 Cell Broadband Engine(Cell B.E. )의 각 SPE(Synergistic Processor Element)가 갖추는 Local Store 메모리를 닮아 있다.


 NVIDIA가 추천 하는 모델은 GPU의 외부 메모리상의 데이터를 우선 Shared Memory에 피트하는 부분집합에 분할한다. 그 부분집합을 Shared Memory에 로드해 thread 블록의 thread군으로 계산한다. 처리가 끝난 시점에서 Shared Memory로부터 GPU 외부 메모리에 데이터 부분집합을 써 되돌린다. 모두 Shared Memory로 행하는 것을 전제로 하고 있다. 이 모델이 잘 작동하면 계산하는 동안 외부 메모리에 액세스 할 필요가 격감한다.


 NVIDIA는 프로세서의 로컬메모리간에 메모리 내용을 메세지 패싱 하는 모델은 프로그래밍이 어려운것을 CUDA로 설명하고 있다. 이것은 간접적으로 Cell B.E. 의 모델을 부정하고 있다. 무엇보다 이것은 NVIDIA가 상정하는 어플리케이션이 한정되고 있기 때문이기도 하다.


 NVIDIA G8x 아키텍쳐에서는 이러한 G80의 특징을 그대로 계승하고 있다.


 

 (2007 4 16)


[Reported by 고토 히로시무(Hiroshige Goto) ]


원본출처 : http://pc.watch.impress.co.jp/docs/2007/0416/kaigai350.htm