GDDR5가 DDR3를 대신할 수 없는 이유
GPU에 관심을 가지다 보면 자연스레 “DDR3/4 메모리 대신에 GPU에 적용되는 GDDR5/GDDR5X 메모리를 CPU의 시스템 메모리로 사용할 수 없을까?” 라는 궁금증을 가지게 됩니다. GDDR 메모리 쪽이 DDR 메모리에 비해 훨씬 높은 동작속도와 대역폭을 가지고 있기 때문이지요. 먼저 간단히 동작 속도와 대역폭을 비교해 보면 다음과 같습니다.
DDR3 | DDR4 | GDDR5 | GDDR5X | |
Data 1-pin 당 전송속도 (GT/s) | 0.8 ~ 2.133 | 1.6 ~ 3.2 | 5 ~ 8 | 10 ~ 14 * |
칩 1개당 data-width | x4, x8, x16 | x4, x8, x16 | x16, x32 | x16, x32 |
Burst Length | 8 | 8 | 8 | 16/8 |
*2017년 4월 현재 시장에 나와있는 제품은 12GT/s가 최대
표를 보면 DDR3/4의 데이터 1-pin 당 전송속도는 0.8GT/s ~ 3.2GT/s 정도인 반면 GDDR5/5X의 전송속도는 5GT/s ~ 14GT/s에 달하고 있어 동일한 데이터 폭을 가지도록 구성된 경우 GDDR 메모리의 대역폭이 월등히 높음을 알 수 있습니다. GDDR 메모리가 빠른 속도로 동작할 수 있는 이유는 DDR 메모리에 비해 정교한 I/O 회로를 채택했고 보다 적극적으로 온도와 전압에 따라 변하는 I/O delay를 보정하기 때문입니다. (메모리 내부 구조도 조금 달라지지만 이 글에서는 다루지 않습니다.) 다만 GDDR 메모리는 높은 동작속도를 얻은 대신 용량확장에는 제한이 생겼는데 이는 GDDR 메모리를 DDR 대신 시스템 메모리로 사용하는데 큰 장애가 됩니다.
이번 글에서는 GDDR 메모리가 고속으로 동작할 수 있는 이유를 간단히 살펴보고, 고속 동작을 위해 감수한 용량의 한계가 CPU에서는 문제가 되지만 GPU에서는 문제가 되지않는 이유에 대해 알아보도록 하겠습니다. 설명상의 편의를 위해 DDR3와 GDDR5 만을 비교할 생각인데, GDDR5X는 GDDR5의 8n prefetch/DDR 전송을 16n prefetch/QDR전송으로 변경하여 대역폭을 두 배로 늘린 메모리이기 때문에 GDDR5만을 비교하더라도 이해에는 지장이 없을 것입니다. DDR3와 DDR4의 차이에 대해서는 제가 얼마전에 썼던 글을 참고하여 주시기 바랍니다.
1. GDDR5와 DDR3의 비교
DDR3의 경우 기본적으로 DIMM(Dual in-line Memory Module)을 구성하는 것을 전제로 표준이 정해졌기 때문에 하나의 메모리 컨트롤러에 여러개의 DRAM 칩이 연결되는 것을 허용합니다. 아래 그림은 16개의 DDR3 메모리 칩으로 이루어진 DIMM 모듈이 메모리 컨트롤러와 어떤 식으로 연결되는지를 나타낸 그림인데, 클럭(CLK), 커맨드(CMD), 어드레스(ADD) 신호는 모든 메모리칩들에 의해 공유되며 데이터(DQ/DM)와 데이터 스트로브(DQS) 신호는 2개의 메모리칩 마다 공유되고 있습니다. 메모리 컨트롤러가 구동하는 클럭신호는 D0 메모리칩에 가장 먼저 도착하고 D7에 가장 늦게 도착하는데 이 시간차를 보정하기위해 각 메모리칩의 데이터신호와 클럭의 상대적인 delay는 DRAM 초기화시에 각각 다르게 조정됩니다 (Write Leveling). 이와 같은 방법은 여러개의 메모리칩을 사용하여 큰 용량을 얻기엔 유리하지만 한 클럭 주기내에 메모리칩 마다 다르게 설정된 delay를 보상할 시간이 포함되어야하기 때문에 DDR3 메모리의 I/O 동작속도를 높이기 힘든 이유중의 하나가 됩니다.
반면 GDDR5는 아래 그림과 같이 하나의 메모리 컨트롤러에 1개나 2개의 메모리칩의 연결만을 허용하기 때문에 I/O의 동작속도를 올리는데는 훨씬 유리합니다. DIMM 모듈 장착을 위한 소켓이 필요없어 메모리 칩을 컨트롤러 바로 옆에 위치시킬 수 있고 적은수의 메모리칩 만이 연결되기 때문에 드라이버 회로에 걸리는 전기적 부하(capacitive load)도 훨씬 적습니다. 이에 더해 커맨드/어드레스 채널의 클럭(CK)과 데이터 채널의 클럭(WCK)의 분리, 온도와 전압 변화에 따른 I/O 임피던스 자동 보정, 각 채널별 세분화된 delay 학습 등의 기능이 추가 되었기 때문에 DDR3 메모리에 비해 빠른 I/O 클럭 속도를 달성할 수 있는 것이지요. 이 때문에 생기는 단점은 메모리의 용량을 늘리기위해서는 메모리 컨트롤러의 갯수도 함께 늘어야 한다는 것인데 이 때문에 생기는 문제는 곧 살펴보도록 하겠습니다.
2. CPU의 메모리 구조
CPU의 프로그램과 GPU의 프로그램은 서로 다른 특성을 가지고 있습니다. CPU 프로그램의 경우 운영체제(OS)상의 가상메모리에서 동작하여 메모리 접근 패턴의 예측이 힘들고 각 프로그램 사이에 데이터의 공유가 빈번하게 일어납니다. 또한 그래픽 작업과는 달리 데이터의 재사용성(temporal/spatial locality)이 높아서 cache를 사용하여 DRAM 메모리에 요구되는 대역폭을 효과적으로 줄일 수 있지만 여러개의 프로그램이 동시 실행되는 상황을 생각하면 메모리의 용량은 크게 하는 것이 좋습니다. 간단히 정리하면 CPU에서는 메모리의 대역폭 보다는 용량이 중요한 상황인데 프로그램들 사이의 데이터 공유까지 고려한다면 분산된 여러개의 작은 메모리보다는 하나의 큰 메모리가 유리합니다.
아래는 인텔 스카이레이크 i7-6700K 쿼드코어 프로세서의 칩 사진인데 dual channel을 지원하는 하나의 메모리 컨트롤러를 가지고 있습니다. 메모리 컨트롤러가 칩에서 차지하는 면적이 결코 작지 않고 여러개의 메모리 컨트롤러를 둘 경우 데이터 공유와 컨트롤러 사이의 load balancing에 어려움이 있으므로 아래와 같은 구조가 된 것이지요. 이러한 구조에서 프로세서가 최대로 지원하는 64GB까지의 용량을 사용하려면 DIMM 구성이 가능한 DDR3/4 메모리가 필수적입니다. 실제로는 지원하지는 않지만 64-bit dual channel에 GDDR5 메모리를 연결한다고 가정한다면 기껏해야 8GB 용량까지만 구성이 가능합니다. (Clamshell모드로 x16 8Gb GDDR5 메모리 8개 연결을 가정)
3. GPU의 메모리 구조
반면 GPU 프로그램은 CPU 프로그램과 동작 특성이 많이 다릅니다. GPU에는 아주 많은 프로세싱 코어들이 있지만, 그 위에서 실행되는 Vertex/Pixel shader 프로그램들은 서로 의존성을 가지지 않는 각각의 데이터에 대해 연산을 수행합니다. 또한 모니터의 해상도에는 상한이 있기 때문에 메모리의 용량은 어느 수준 이상이 되면 성능상의 이점이 그다지 크지 않습니다. (GPGPU 컴퓨팅의 경우에는 상황이 다르긴 합니다.) GPU에서 메모리 대역폭을 가장 많이 사용하는 시점은 Pixel Shader의 계산 결과를 메모리에 저장하고 Raster Operation Unit (ROP)이 이를 이용해 화면에 보여질 프레임을 그릴 때 인데, 아주 많은 수의 프로세싱 코어와 여러개의 ROP가 동시에 동작하므로 CPU보다 훨씬 높은 메모리 대역폭을 필요로 합니다. (참고 링크) 정리하면 GPU에서는 메모리의 용량보다 대역폭이 더 중요하며, 병렬로 수행되는 Vertex/Pixel shader 프로그램들 사이에 데이터 의존성이 적기 때문에 대역폭을 높이기 위해 여러개의 작은 메모리를 사용하는 방법을 선택할 수 있습니다.
위의 그림은 작년에 발표된 Pascal 아키텍처의 nVidia GP104 GPU의 구조를 나타낸 그림인데, 양 측면에 4개씩 총 8개의 메모리 컨트롤러를 탑재하고 있는 것을 보실 수 있습니다. 각 메모리 컨트롤러는 각각의 주소 영역을 담당하고 있으며 함께 포함된 64개의 ROP는 8개씩 8개의 그룹을 이루고 각 그룹은 8개의 메모리 컨트롤러 중 하나와 연결이 됩니다. 각 ROP에서 수행되는 작업이 서로 데이터 의존성이 없기 때문에 이러한 구성이 가능한 것이지요. 각 메모리 컨트롤러에는 32-bit 데이터폭을 가지며 1-pin당 10GT/s 속도를 가지는 GDDR5X 메모리가 연결되는데 최대 대역폭을 계산해 보면 무려 320GB/s에 (8개 x 32-bit/8-bit x 10GT/s = 320GB/s) 달합니다. 반면 8개의 메모리 컨트롤러를 사용하더라도 최대로 지원할 수 있는 용량은 16GB가 한계입니다. 참고로 앞에서 설명한 인텔 스카이 레이크 CPU의 경우 DDR4-2133 메모리 까지를 지원하는데 최대 대역폭은 34GB/s (2채널 x 64-bit/8-bit x 2.133GT/s = 34.128GB/s) 정도가 됩니다.
정리하며…
간단히 정리하면 CPU의 경우 대역폭 보다는 용량이 중요하기 때문에 확장성을 위해 속도를 희생한 DDR 메모리를 탑재하고 있는 반면 GPU의 경우 용량보다는 대역폭이 중요하기 때문에 속도를 위해 확장성을 희생한 GDDR 메모리를 탑재하고 있다고 말할 수 있습니다. 또한 서로 데이터 의존성이 강한 CPU 프로그램과 의존성이 약한 GPU 프로그램의 특징은 CPU와 GPU에 탑재되는 메모리 컨트롤러의 수에 차이를 미쳤고 DDR과 GDDR이 각각 다른 방향으로 특화되도록 했습니다. 글을 마무리 하면서 덧붙이면, 메모리 용량이 확장될 필요가 없는 경우에는 GDDR 메모리를 시스템 메모리로 사용되기도 하는데 대표적인 예로 소니의 Playstation 4가 있습니다. 콘솔 게임기의 경우 PC와 같이 중간에 부품을 교체할 일이 없고 GPU와 시스템 메모리를 공유하기 때문에 높은 대역폭을 제공하기 위해 DDR 대신에 GDDR5 메모리를 채택한 것이지요.
글이 상당히 유익합니다. 많이 배웠습니다! 한 가지 궁금한것이 있다면 GDDR은 Block 단위 I/O를 하기 때문에 Word 단위 I/O를 하는 CPU와는 인터페이싱을 할 수 없는 것으로 알고 있는데 PS4에서는 이 문제를 어떻게 해결한 것일까요?
감사합니다. 제가 알기로는 DDR3와 GDDR5의 메모리 접근 단위에 차이가 없는 것으로 알고 있습니다. 혹시 가능하시다면 GDDR의 Block 단위 접근에 대한 내용이 나와있는 링크또는 참고 자료를 알려주실 수 있으신지요?
메모리 관련 많은글 올려주세요~!
기회가 되는대로 최대한 열심히 올려 보겠습니다. ^^
많이 배워가네요. 예전부터 아키텍처에 관해서 관심이 많았는데 이글을 계기로 더 많은 글들을 읽을 수 있을거 같습니다. ㅎㅎ
다시한번 유익한글 감사합니다.^^
이제 GDDR5X, GDDR6의 메모리클럭이 옥타 펌핑으로 뻥튀기되는 마당이니
더블 펌핑에 머물고 있는 시스템 메모리도 GDDR5처럼 쿼드 펌핑의 규격이 나왔으면 좋겠네요
CPU한텐 도움이 안 되는 규격이겠지만
시스템 메모리를 이용하는 내장그래픽에겐 도움이 될 것으로 보이니까요
게임이 아닌 분야라도 세대를 거듭할 수록 그래픽 평균 요구 사양이 상향될 것이기에
이를 실현시키려면 내장그래픽 자체의 성능도 중요하지만
시스템 메모리의 대역폭도 중요하게 생각해봐야 하지 않을까요?
물론 막상 닥쳤을 때 시스템 메모리 대역폭을 굳이 향상시키지 않아도 지장없을만큼
요구 사양이 충족된다면 현행 방식을 유지해도 상관없겠지만요..
DRAM이 DDR부터 DDR4까지 발전해온 과정을 살펴보면 대역폭이 늘면서 한번에 접근해야 하는 데이터의 단위도 함께 늘어왔습니다.
CPU의 L2나 L3 cache의 line size보다 DRAM에서 한번에 읽고 쓰는 단위가 더 커지게 되면 DRAM 접근 효율이 떨이지기 때문에 CPU의 구조 변화가 동반되어야 시스템 메모리 대역폭의 향상이 의미가 있을 것 같습니다.
정말 잘 읽었습니다. CPU가 데이터를 처리하는 방식이 GDDR과 그렇게 맞지 않는군요.
단순히 레이턴시가 조금 더 커서 그런 줄 알았는데 컨트롤러나 데이터 의존성에 대한 내용은 처음 알았습니다.
이번에 출시될 M1X에는 LPDDR5 쿼드채널 같은게 GDDR이나 HBM 보다 적합하겠군요..