보관물

Archive for the ‘Parallel’ Category

멀티코어(Multi Core)와 매니코어(Many Core)

9월 24, 2010 8개의 댓글

현대 PC에 적용가능한 병렬 프로그래밍을 구분할 수 있는 가장 큰 기준은 멀티코어(Multi Core) 방식과 매니코어(Many Core) 방식입니다. 좀 더 근본적인 분류는 공유 메모리(Shared Memory) 와 분산 메모리(Distributed Memory)가 있지만 순수 분산 메모리는 PC와는 다소 거리가 있기 때문에 이 글이나 앞으로의 글에서 크게 언급되지 않을 것 같습니다.

멀티코어 방식은 요즘 일반적으로 보급되어 있는 멀티코어 CPU에서의 프로그래밍을 의미합니다. Intel Core 2 / i5 / i7 모두 멀티코어 기반의 CPU입니다. 멀티코어는 하나의 CPU 다이(die)에 여러개의 CPU를 집적해놓은 것 입니다.  하나의 다이에 집적되어 있는 각각의 CPU를 코어(Core)라 합니다. 단순히 다수의 코어를 넣는 것 뿐만 아니라 각각의 코어간에 메모리 공유를 위한 복잡한 장치가 포함되어 있습니다. 개발자 관점에서는 동일한 CPU가 여러개 있는 것이기 때문에 이해 및 적용이 쉽습니다.하나의 일을 여러개의 CPU가 나눠서 처리하는 것은 상당히 어렵지만, 독립적인 일을 동시에 처리하는 것 이라면 단순히 쓰레드(Thread)나 프로세스(Process)만 만들어 주는 작업으도로 상당한 성능이득을 볼 수 있습니다.

Intel Core i7 Nehalem(4-cores)

Intel Core i7 Gulftown(6-cores)

게임으로 예를들어 보면..
– main thread : game logic & rendering
– audio thread : mixing & DSP processing
– file I/O thread
– network I/O thread
이렇게만 분리해 둬도 각각의 코어에 적절하게 업무가 분배되고  main thread는 하나의 코어를 거의 독점해서 사용하게 됩니다.

작년(2009)만 해도 2코어가 주류였으나  내년(2011)에는 4코어가 일반화되고 6코어도 고급유저들에게 상당수 보급되리라 생각합니다. 하지만 앞으로 계속 동일한 형태의 코어가 늘어나는 방식의 CPU는 만들 수가 없습니다. 제가 생각하는 PC에 적용가능한 코어는 8개가 한계입니다.

이는 CPU의 캐쉬(cache)디자인과 가장 깊은 연관이 있습니다. (멀티코어의 캐쉬 디자인에 대해서는 나중에 다른 글로 정리해 보겠습니다) 간단히 설명하자면 코어가 많아질 수록 코어간에 공유되는 메모리가 많아지고, 이를 정확하게 처리하기 위해 성능감소가 필연적으로 따라옵니다. 사실 4코어에서 8코어로 넘어갈  때 일반 유저들이 느끼는 성능 증가는 0%에 가깝습니다. 더군다나 8코어 이상에서는 성능이 감소하지 않으면 다행입니다. 결론적으로 멀티코어 방식은 이미 성능한계에 도달 했고 다른 방식의 병렬 CPU가 필요하게됩니다.

멀티코어의 대안으로 등장한 것이 매니코어 방식입니다. 매니코어는 작게는 수집개에서 많게는 수백개의 코어를 하나의 CPU에 집적하는 것입니다. 다만 이때 직접되는 코어는 멀티코어처럼 동일한 코어를 여러개 집적하는 것이 아니라, 단순한 기능을 가진 작은 코어를 집적하는 것입니다. 수십~수백개의 작은 코어와 이를 관리/운영하는 수개의 일반 코어로 구성될 것입니다.(미래형인 이유는 매니코어의 컨셉은 잡혀있으나 실제 구현방식은 지속적으로 수정되고 있기 때문입니다) 현 세대에 구현된 대표적인 예로는 PlayStation 3에 쓰이고 있는 Cell 프로세서가 있습니다.

Toshiba Cell Processor(1 generic core & 8 small cores)

Intel에서도 작년에 48코어의 CPU디자인을 공개했습니다. (참고) Intel의 디자인은 작은 코어의 집적이 아닌 일반적인 코어의 집적이었으나, 기존의 멀티코어와는 완전히 다른 컨셉을 가진 디자인입니다.

멀티코어와 매니코어의 가장 큰 차이점은, 공유 메모리 방식이냐 분산/공유 메모리 하이브리드 방식이냐 입니다. 멀티코어의 경우 모든 코어가 동일한 메모리 영역을 공유하나 매니코어의 경우 코어의 작은 그룹은 메모리를 공유하나 그룹과 그룹간에는 메모리를 공유하지 않습니다. 개발자의 관점에서 보자면 N개의 멀티코어를 가진 M개의 PC에서 돌아가는 프로그램을 개발하는 것과 같습니다. 인텔의 48코어 디자인을 예로 들자면 2멀티코어 PC가 24대 있다고 생각하면 됩니다. (2X24=48) 메모리가 공유되지 않는 코어간에는 직접 메세지를 만들어 명시적으로 데이터를 송/수신 해야 합니다.

이미 짐작하셨겠지만 매니코어 프로그래밍은 정.말 너.무 어.렵.습.니.다. 제가 종종하는 말입니다만 매니코어 프로그래밍은 인간의 한계를 뛰어넘는 인지력을 요구하는 과제입니다. 단순히 하나의 과제를 병렬로 처리하는 것 뿐만 아니라 각각의 과제에 필요한 정보의 분리 및 수집까지 고려해야되기 때문입니다. 2005년 Cell 프로세서가 처음에 공개되었을 때는 빠른시간안에 개발자들이 매니코어 방식에 적응하고 점유율을 늘려갈 수 있으리라 생각했지만, 엄청난 개발비용에 시장에서 외면받아 사장되었습니다. (Cell프로세서는 현재 PlayStation 3을 제외하고는 거의 사용되지 않습니다. 제작자인 Toshiba도 포기한 상태) PlayStation3에서도 소니의 직접적인 기술지원을 받는 퍼스트파티나 거대한 투자능력을 가진 개발사의 게임을 제외하고는 PlayStation3의 성능을 제대로 발휘하는 게임이 없습니다.

멀티코어 방식은 이미 한계에 이르렀고, 매니코어 방식은 시장성이 떨어지는데 과연 앞으로 어떻게 될까요?

매니코어 방식이 수 년안에 PC시장 및 개발의 대세가 될 것입니다. 멍청한 개발자를 족쳐서 똑똑하게 만들어 대세가 되는 것이 아니라 자연스럽게 세대의 전환이 이루어질 것 입니다.

CPU업계는 몇년 후 8코어를 팔고나면 쪽박찰 상황이고 학계는 언제나 무한한 성능을 필요로합니다. 매니코어가 언급되기 시작한 시점부터 업계와 학계는 매니코어 개발의 난이도를 쉽게 만드는데 집중해 왔습니다. (학계보다는 업계가 급한 것 같습니다) 개발의 난이도를 낮추는 대도는 처리를 추상화(abstraction)하고 어렵고 복잡한 요소들을 추상화층 하부로 자동화하는 것입니다.  가상 메모리(Virtual Memory)를 통해 개발자는 더 이상 메모리 구성을 고려하지 않아도 되었고, 하드웨어 추상화 층(Hardware Abstraction Layer)을 통해 수많은 하드웨어의 특성을 크게 고려하지 않아도 되었습니다.

매니코어 개발에서도 그 노력이 요즘들어 결실을 맺어가고 있습니다. 특히나 인텔의 TBB(Thread Building Blocks)와 ArBB(Array Building Blocks)는 가장 눈에 띄는 성과입니다. 아직은 매니코어 개발 자동화는 걸음마단계이기 때문에 다양한 개발분야에 범용적으로 적용하기에는 무리가 있습니다.

자동화는 소프트웨어적 지원과 하드웨어적 지원이 동시에 진행되어야 제대로된 결실을 볼 수 있습니다. 매니코어의 하드웨어 기준이 잡히지 않았기 때문에 지금까지의 모든 성과는 소프트웨어로 이루어져왔습니다. 매니코어 하드웨어의 방향이 잡히고 추상화/자동화를 위한 하드웨어 지원이 가능해지면 범용적으로 사용가능한 매니코어 개발 방법론이 만들어질 것입니다. 이는 앞으로 몇년 안에 이루어질 것 입니다.

슬슬 가시화 되고 있는 GPU와 CPU통합은 매니코어 대중화의 분수령이 될 것이고(GPU를 CPU에 넣는 것은 결국 GPU 내의 수백개의 Floating Point Unit을 매니코어 방식으로 CPU에 집적하는 것 입니다.) 게임 개발자,기획자,아티스트에게 새로운 가능성이 열릴것 입니다. 이를 위해 필수적인 것은 역시나 매니코어 개발의 자동화 입니다.  99.9% 개발자들은 인간의 한계를 뛰어넘는 천재가 아니니까요.