Differences Between CPU and GPU

Differences Between CPU and GPU


개요

CPU는 직렬처리, GPU는 병렬처리 정도로 막연하게만 알고 있었기에 갑자기 궁금해져서 찾아봤다.

개념적인 부분을 넘어 로우 레벨로 들어가면, CPU든 GPU든 0과 1을 처리하는 목적의 연산 장치이다. 그렇다면 결국 하는 일은 같은데, 처리 방식에서 차이점이 있다는 뜻이다.

차이

1. 제어 유닛의 비중

컴퓨터에서 실제로 0과 1을 계산하는 부품은 ALU(산술 논리 장치, Arithmetic Logit Unit)이다. 즉 덧셈/뺄셈 또는 AND/OR/XOR 등의 논리 연산을 수행한다.

여기서 CPU는 전체 칩의 면적에서 ALU가 차지하는 비중이 GPU에 비해 상대적으로 적은 대신 제어 유닛(Control Unit)과 캐시(Cache) 메모리가 아주 크다.

GPU는 칩의 면적 대부분에 ALU를 박아놨다. 복잡한 제어문이나 캐시 메모리 대신 계산만 수행하는 회로를 최대한 많이 집어넣은 형태이다. Graphic Processing Unit의 이름처럼 그래픽 데이터를 처리하는 목적이므로 각 픽셀 값에 대해 단순 연산을 빠르게, 한꺼번에 처리할 수 있으면 된다.

2. 레이턴시와 처리량

레이턴시(Latency, 응답 속도)는 CPU가 압도적으로 빠르다(Low-Latency). CPU는 작업 하나를 얼마나 더 빨리 끝내느냐에 집중한다. 반면 GPU의 단일 작업 속도는 CPU보다 느릴 수 있지만, 한꺼번에 얼마나 많은 양을 처리하느냐에 집중(High-Throughput)한다. CPU가 아무리 빨라도, 순차적으로 1000개를 처리하는 시간과 하나 처리하는 데 조금 느리더라도 1000개를 동시에 처리하는 시간이 큰 차이가 날 수밖에 없다.

3. SIMD vs SISD

CPU는 기본적으로 SISD(Single Instruction, Single Data) 방식이다. 하나의 명령어로 하나의 데이터를 처리하는 데 최적화되어 있다. 현대 CPU는 소량의 병렬 처리를 위해 SIMD(Single Instruction, Multiple Data)를 지원하기도 한다.

GPU는 SIMT(Single Instruction, Multiple Threads) 방식을 사용한다. “모든 픽셀에 2를 더해라”와 같은 명령어를 수천 개의 스레드에 동시에 전달하여, 각 스레드가 서로 다른 데이터(각자의 픽셀값)에 대하여 동일한 작업을 수행하게 만든다. 예를 들어 RGB 이미지의 밝기를 좀 올리고 싶다고 했을 때, 각 픽셀에 해당하는 RGB 값에 특정 값을 더해주면 된다.

4. 메모리 접근 방식

데이터를 불러오는 통로인 대역폭(Bandwidth)에서도 차이가 난다. CPU는 메모리에서 데이터를 하나씩 가져올 때 발생하는 지연 시간을 줄이기 위해 계층적인 캐시 구조(L1, L2, L3)를 매우 정교하게 사용한다. GPU는 캐시보다 통로 자체를 넓게 만들어서, 한 번에 수천개의 데이터를 쏟아부어 날먹하는 ALU가 없도록 쉬지 않고 계산하게 만드는 구조이다. 정리하자면 CPU는 이전 계산이 끝나고 다음 계산을 수행하기 전까지 저장할 공간이 필요하기 때문에 대역폭을 크게 만드는 대신 계층적 캐시 구조를 사용해서 효율적으로 처리한다. 그러나 GPU는 데이터를 임시로 저장하는 부분에 집중할 필요가 없다. 데이터가 들어오면 그냥 수천 개의 미니언(ALU)들 중 놀고 있는 놈을 찾아 계산하라고 때려박으면 되기 때문이다.

결론

게임 그래픽 처리하려고 만들었던 GPU를 신경망 처리하는 데 갖다 쓰고 있다는 사실이 상당히 흥미롭다.