[정보] CPU와 GPU의 차이

섹건 2007.03.26 11:07 조회 수 : 379

  [정보] CPU와 GPU의 차이

1차 출처: PC WATCH 2차 출처: PARKOZ HARDWERE  

●범용 컴퓨팅으로 비슷해지는 CPU와 GPU

 AMD( 구ATI Technologies)의, DirectX 10세대 고급 지향 GPU 「R600」가, 드디어 출시를 앞두고 있다.

AMD,NVIDIA 양 회사의 DirectX 10 GPU는, 모두, Unified-Shader형 아키텍쳐로, 무제한의 셰이더프로그램장이나 셰이더로 부터의 메모리 액서스 등, 범용적인 컴퓨팅에 적용할 수 있는 기능을 갖추고 있다.



또, NVIDIA는 「CUDA(compute unified device architecture)」, AMD는 「Close to the Metal(CTM)」으로, 범용 프로 그래밍도 더욱 빠르게 진행 시킨다. AMD는 GPU 코어를, Fusion 프로세서로, CPU에 통합해, 범용 전용으로 적극적으로 사용하려 하고 있다.



그러나, CPU와 GPU에는, 아직 큰 차이가 있다. GPU는, 현재 상태로서는, 데이터 패러럴(데이터 병렬) 형의 연산에 특화한 프로세서 코어인 채. 양프로세서의 구조적인 차이는 크게 작용하며, 그 때문에, 이점이 있는 어플리케이션의 분야도 다르다. 그 갭은 분명히 존재 한다.



●단순한 명령 발행의 구조를 가지는 GPU

CPU와 GPU가 크게 다른 것은, 명령을 발행하는 구조다.

현재 GPU의 명령 실행의 구조는, 매우 간소화 되고 있다. GPU의 연산 유닛인 Programable Shader 프로세서는, 여러 유닛씩 바인드 된 클러스터로서 관리되고 있다. 일반적인 구성은 4~16개의 셰이더 클러스터를 1클러스터에 정리하는 것이다.



각 셰이더 프로세서는 각각 별도의 데이터 엘리먼트에 대해서의 처리를 행할 수 있다. 그러나, 셰이더 프로세서의 명령 유닛(Instruction Unit)은, 클러스터마다 1개 밖에 없다. 명령 유닛은, 클러스터내의 복수의 셰이더 프로세서에 대해서, 같은 명령을 발행한다. 즉, 각 사이클마다, 각 셰이더 프로세서는 같은 명령을 실행한다. 프로그램 카운터도 당연히, 공유화되고 있다.



전체로 보면, 셰이더 클러스터 전체가, 1개의 명령으로 복수의 데이터에 대해서 처리를 행하는 SIMD(Single Instruction, Multiple Data) 형태 프로세서의 대형화된 형태가 되고 있다.



예를 들면, 셰이더 프로세서 0은 명령 A를 픽셀 α에 대해서 실행하고, 셰이더 프로세서 1은 픽셀 β에 명령 A를, 셰이더 프로세서 2는 픽셀 γ에 대해서 명령 A를 실행한다. 이와 같이 실행 하고, 클러스터 내의 n개의 셰이더 프로세서는 각각 같은 명령 A를 다른 엘리멘트에 실행한다. 실제로, 셰이더 프로세서 안에도 복수의 실행 유닛이 있으며, 복수 명령을 동시에 실행하는 것이 가능하지만, 단순하게 하기 위해서, 그것은 생략 한다.



또, 기존의 GPU는 셰이더 클러스터 내의 셰이더 프로세서가, 수 사이클에 걸쳐 같은 명령을 실행하고 있다.

셰이더 프로세서 0은 1 사이클에 픽셀 α1에 대하여 명령 A를 실행, 2 사이클에는 픽셀 α2에, 3 사이클에는 픽셀 α3에 대하여 명령 A를 실행한다. 결국 캐스케이드형에, 복수 픽셀에 대해서 명령을 실행하는 것이다.



예를 들면, 셰이더 클러스터안에 4개의 셰이더 프로세서가 있어, 각각 4 픽셀에 대해서 같은 명령을 실행하는 경우, 셰이더 클러스터는 16개의 픽셀을 1개의 배치 로서 취급하게 된다.

이 배치의 단위는, GPU 아키텍쳐에 의해서 크게 차이가 난다. AMD의 Radeon X1800(R520)에서는 4개의 픽셀셰이더 프로세서로 구성되는 클러스터가, 4회에 걸쳐 같은 명령을 실행한다.

그 때문에, R520의 경우는, 픽셀셰이더는 4 프로세서×4 픽셀 =16개의 픽셀을 1개의 배치로서 취급하고 있었다.

AMD에서는, 이 배치를 GPU의 스레드라고 부르고 있다.



그에 대하여, NVIDIA의 예전 GeForce 7(G7x) 세대의 픽섹셰이더에서는, 각 셰이더 프로세서가 220개의 픽셀에 같은 명령을 실행하는 스타일을 가지고 있었으며, G7x 세대의 픽셀셰이더의 클러스터는 4개의 셰이더 프로세서로 구성되어 있었다. 그 때문에, G7x의 경우는, 이 배치의 사이즈는 4 프로세서×220 픽셀=880개의 픽셀이 되고 있었다.

GeForce 8800(G80)에서는 이 입도가 16또는 32 픽셀까지 축소 되어 있다.




CPU와 GPU의 명령 실행의 차이



●CPU와 GPU의 차이는 개인과 단체의 차이

CPU의 명령 실행의 구조는, GPU와는 크게 차이가 난다.

현재의 슈퍼 스칼라 CPU의 경우는, 다수가 다른 실행 유닛을 갖추고 복수가 다른 명령을 병렬에 실행할 수 있다.

예를 들면, 2개의 스칼라 연산 유닛으로 정수 연산 명령 A와 B를 실행. 그와 동시에, 메모리로 부터의 데이터 읽기 명령 C를 로드/스토어 유닛이 실행, SIMD 연산 유닛 0이 SIMD 연산 명령 D를, SIMD 유닛 1이 명령 E를 실행 하는 형태.



멀티 코어 CPU의 경우, 각각의 CPU 코어가, 각각의 실행 유닛에 대하여 다른 명령을 발행한다.

GPU와 같이, 같은 명령을 4 사이클에 건너 실행하는 제약도 없으며, CPU 전체는, 각 사이클마다, 각각의 실행 유닛이 다른 명령을 실행하고 있다.



명령 발행의 경우에서 보면, CPU와 GPU는 큰 구조상의 차이가 있다. CPU는 유연하게 명령을 실행할 수 있는데 대하여, GPU는 일정한 입도의 데이터에 대해서 같은 명령을 실행해 간다. 명령 실행에, 입도가 있는 것이 큰 차이.

 

또, 현재의 CPU의 경우, 명령 유닛이 복수의 명령을 동시에 읽어 들인다. 명령 스케쥴러가, 명령 순서를 바꿔 넣는 아웃 오브 오더(out-of-order) 형 실행으로, 동시에 다수의 명령을 실행할 수 있도록 하고 있다. GPU는 이러한 복잡한 명령 스케줄링 기구를 가지지 않고, 기본적으로는 소프트웨어측의 스케줄링으로 병렬화한다.



이러한 아키텍쳐로부터, CPU에서는, 명령 제어 관련의 유닛이 커진다. 개개의 실행 유닛에 대하여 다른 명령을 발행하며, 아웃 오브 오더 실행이나 분기 예측을 행하기 때문이다. 그 때문에, 상대적으로 CPU내에 차지하는 실행 유닛의 비율이 줄어 들어 버린다. 그에 비해 GPU는, 명령 발행 기구는 최소한으로 하고, 실행 유닛 자체에 다이 면적을 할애할 수 있다. 그 때문에, 다이 면적 당의 연산 성능은, GPU가 훨씬 뛰어나다.



●동적 분기에서 효율이 떨어지는 GPU

그러나, 이 구조를 위해서 GPU는 약점이 따른다. 실행하는 프로그램에 조건 분기명령이 포함되면, 성능이 크게 떨어지는 경우가 있다. 그 때문에, GPU로 범용적인 컴퓨팅이 가능하게 되었다고 해도, GPU로 실행할 수 있는 어플리케이션에서는, 아직도 제약이 항상 따라다니고 있다.



아래 그림은, AMD가 Radeon X1000(R5xx)의 기술 설명으로 나타내 보인 차트를 정리한 것.

단순한 그림자 맵으로 조건 분기 하는 셰이더 프로그램의 예를 나타내고 있으며, 픽셀이 그림자 에리어에 있는 경우, 프로그램은 패스 A를 실행, 픽셀이 그림자 에리어에 없는 경우는 패스 B에 분기 한다.




조건분기명령을 GPU로 실행하는 경우



이 경우, GPU는 픽셀을 일정수의 배치로 제어하고 있다. 그 때문에, 그 배치내의 픽셀에 대해서는, 기본적으로 같은 명령을 실행해야 한다. 이것이, GPU의 「분기 입도 블록(Branch Granularity Block)」이다.

예를 들면, R520의 분기 입도 블록은 16 픽셀이 된다.



분기 입도 블록안의 픽셀이 모두 그림자일 경우, 셰이더는 모든 픽셀에 대해서 패스 A의 명령만을 실행한다. 픽셀이 모두 그림자에 없는 경우도 같으며, 패스 B만을 실행한다. 문제는, 분기 입도 블록안에, 그림자의 픽셀과 그림자가 아닌 픽셀이 혼재하고 있는 경우다.



PC 전용의 GPU에서는, 이 경우, 셰이더는 패스 A와 패스 B의 양쪽 모두의 패스를, 블록내의 모든 픽셀에 대해서 실행한다. 복수 패스를 시리얼화해 실행해 버리는 것. 그 위에, 각 픽셀마다 분기를 체크, 분기 한 값을 받아 아웃풋 레지스터에 출력한다.

즉, 셰이더프로세서 자체는 양쪽 모두의 프로그램 패스를 실행 해야 하기 때문에, 그 블록에 대해서는, 조건 분기를 하는 의미는 거의 없어져 버린다. 게다가 분기 오버헤드도 이것에 참가한다.



이러한 구조이기 때문에, GPU에서는 분기 입도 블록이 크면 클수록, 조건 분기시의 효율이 나빠진다.

1개의 블록안에, 다른 분기가 혼재할 가능성이 증가하기 때문이다.





아래의 그림은, 분기 입도 블록이 16 픽셀과 64 픽셀, 256 픽셀의 경우의 효율을 비교한 것이다.

이것을 보면, 효율의 차이가 분명이 나타난다.




분기 입도와 GPU의 조건 분기에서의 효율



●GPU의 트랜드는 동적 분기 효율의 향상

이러한 구조이기 때문에, GPU에서는, 세세하게 분기가 발생하는 어플리케이션의 실행은 골칫거리다.

그러나, 셰이더 프로그램도 진화하고, 동적인 분기를 행하게 되었다. 그리고, 비그래픽스 어플리케이션에서는, 동적 분기가 필요한 분야도 많으며, 분기시의 효율을 올리는 것이 요구되고 있다.

이것은, GPU를 범용에 사용하는 경우의 필수 조건.



그 때문에, 최근 1~2년의 GPU는, 모두 분기시의 효율을 올리기 위해서, 분기 입도 블록을 작게 하도록 하여 왔다.

NVIDIA의 G7x으로부터 G80의 진화는, 그것의 전형으로, 단번에 분기 입도가 작아졌다.

ATI의 R600도 입도가 작아지는 것이, 시사되고 있다. 그러나, 그런데도 일정한 입도로 제어하고 있는 것 자체는 변하지 않다.



GPU의 동적 분기 효율을 올리기 위한 이상형은,  1프로세서 1엘리먼트 단위로 분기 제어를 할 수 있도록 하는 것.

CPU와 같이 해버리면, 완전한 효율로 동적 분기가 대량으로 발생하는 프로그램도 효율적으로 실행할 수 있게 된다.

실제, 「Cell Broadband Engine(Cell B.E.)」의 「SPU(Synergistic Processor Unit)」는, 개개의 SPU 단위로 제어하고 있어, GPU 코어보다 폭넓은 어플리케이션을 유연하게 실행할 수 있다.



그러나, 이것은 GPU에 있어서 매우 어려운 트레이드 오프 이기도 하다. 명령 제어의 구조를 바꾸고, 개개의 셰이더프로세서 단위로 제어하게 되면, 셰이더클러스터가 복잡하게 되어 버린다. 또, 데이터 액세스 등 다른 보틀 넥도 발생한다.

GPU의 경우, 셰이더프로세서가 일정한 입도로 메모리액서스를 하는 것을 전제로 하고 있기 때문이다.






셰이더클러스터가 복잡하게 되면, 결국, GPU에 탑재할 수 있는 셰이더프로세서의 실행 유닛수가 줄어 들게 되어, 그만큼, GPU의 퍼포먼스가 줄어 들어 버린다. 즉, GPU의 유연성과, 퍼포먼스의 트레이드 오프가 되는 것이다.



이 선택에 대해서는, NVIDIA의 기술개발 부문의 톱인 David B. Kirk씨 (Chief Scientist)가 단적으로 말하고 있다.

「우리는 비교적 심플한 코드를 보다 빠르게 달리게 하는 한편, 보다 복잡한 코드에 대해서는, 약간 비효율적이어도 좋다고 판단.  만약, CPU가 가지고 있는 명령 제어 기구를 GPU에 내장하면, 셰이더프로세서는 지금의 10배의 크기가 되어 버릴 것이며, 그에 따라 복잡한 코드가 2배의 속도로 달릴는 것은 좋은 트레이드 오프는 아니다.

그것보다는, 10분의 1크기의 작은 셰이더로, 2분의 1의 스피드로 달리게 하는 편이 좋다.

이것은, GPU와 CPU의 설계 철학적인 차이」



즉, GPU는 동적으로 분기가 자주 발생하는 복잡한 코드는, 약간 비효율적이라도 상관없다.

희생을 지불해가며 빠르게 하는 것보다, 심플한 코드가 빠르게 달리도록 최적화하는 것이 좋다고 판단하고 있는 것.

GPU는, 어디까지나, 많은 데이터에 동일한 처리를 행하는 것에 최적화한, 데이터 패러럴 프로세서의 테두리에 있다.



무엇보다, GPU는 예전의 아키텍쳐로부터의 진보도 계속하고 있다. 예전의 GPU는, 「Embarassingly Parallel」라고 불리는, 의존성이 없는 병렬성의 처리에 특화하고 있었다. 그 때문에, 연산 유닛간의 상호 데이터 참조는, 멀리있는 메모리를 개입시킬 수 밖에 없었다. 그러나, G80에서는 셰이더프로세서를 바인드 한 「Streaming Multiprocessor(SM)」단위로, 셰이더프로세서 간에 상호 액세스가 생기는 공유 메모리를 16 KB 갖추고 있다. 1개의 셰이더프로세서의 연산 결과를, 다른 셰이더프로세서가 짧은 지연시간으로 참조가 가능하다.






G80 Streaming Multiprocessor



다음의 분기점은, AMD의 경우는 CPU에의 통합이다.

CPU에서 GPU 코어를 통합을 진행시켜 가면서 명령 세트 레벨로의 통합을 진행시키면, 또 다시 GPU 코어의 모습은 바뀌어서 갈것이다.

CPU 코어와 GPU 코어가 같은 메모리 공간을 공유해서 명령 디코드도 공유하면, 메모리 카피는 불필요해져서, 결국 짧은 지연시간으로 GPU 코어 기능을 사용할 수 있게 된다.

그러한 통합에 적절한 GPU 코어 아키텍쳐를, AMD는 모색하고 있다.









결론: 사줘
번호 제목 글쓴이 날짜 조회 수
공지 로그인이 안되는 경우.. 가오파 2021.02.20 1222
공지 주소 복구했습니다. - 수정 가오파 2019.01.20 5033
공지 채팅 IRC말고 DISCORD로 넘어감 사자 2016.08.19 3880
공지 자유게시판 [127] 배삼룡 2004.11.11 6373
8193 대세가 던파인것 같아서 나도 던파시작했음...;; [8] OQ 2007.03.27 284
8192 [세빗 2007] DDR3 시대 개막 [4] 가오파 2007.03.26 297
8191 던파 이런 망할 [5] 하이하이 2007.03.26 300
8190 이적 "지금의 저의 모든 게 담긴 앨범입니다." [5] 배삼룡 2007.03.26 273
8189 미스치루 - 이노센트 월드 섹건 2007.03.26 331
8188 미스치루 - 彩り 섹건 2007.03.26 258
8187 밥 딜런 - Knockin' On Heaven's Door 섹건 2007.03.26 269
» [정보] CPU와 GPU의 차이 섹건 2007.03.26 379
8185 배삼룡이랑 야옹이 [2] 섹건 2007.03.26 277
8184 헤일로 어째서 헤일로에 ㅎㄷㄷㄷ 하는가 [2] 섹건 2007.03.26 239
8183 섯다칠줄아는사람 (수학여행가면 머하지) [1] 포쿠테 2007.03.25 323
8182 YS online 클베테스터 당첨되었다! [8] OQ 2007.03.25 190
8181 지존의 도시 [3] 섹건 2007.03.25 242
8180 41곡 표절 [1] 가오파 2007.03.24 350
8179 이종격투기 최종 필살기 [5] 가오파 2007.03.24 288
8178 을룡교 배삼룡 2007.03.24 266
8177 하아.. 모히칸으로 잘랐다만 [5] 포와로 2007.03.24 266
8176 타이완 거지 10년 구걸해 12억 벌었다 [7] 섹건 2007.03.24 243
8175 데브캣, ‘소스’ 엔진 기반의 신작 액션 게임 개발 진행 [1] 섹건 2007.03.24 292
8174 지존의 게임소설 [6] 섹건 2007.03.23 203