태그 : multi-core

멀티 코어란 무엇인가?

멀티 코어란 무엇인가?


멀티 코어(multi-core)는 멀티 코어 CPU를 이야기하는 것인데 이것은 두 개 이상의 독립 코어를 단일 집적회로로 이루어진 하나의 패키지로 통합한 것으로 듀얼 코어(dual-core) 프로세서는 두 개의 코어를 포함하고 있으며, 쿼드 코어(quad-core)는 네 개의 코어를 포함하고 있다.

현재 칩 제조사에서 출시하는 신형 CPU들은 이렇게 두 개 이상의 CPU를 내장한 멀티 코어 CPU가 주종을 이루고 있다. 이는 단일 코어에서 더 이상 코어 클럭을 이용해서 성능을 올리는 방법으로는 한계에 도달했기 때문이다. 그런데 이러한 하드웨어 환경에서 게임의 성능을 최대한 끌어 올리도록 만들기 위해서는 하드웨어에서 제공하는 여러 개의 코어들을 이용해서 병렬 처리(parallel processing)가 가능한 구조로 게임을 구성을 해야 한다. 왜냐하면 단일 쓰레드를 사용하도록 제작된 프로그램은 여러 개의 코어를 가진 프로그램 내에서 실행이 되더라도 속도가 빨라지지 않기 때문이다. 멀티 코어가 주는 성능을 최대한 이용하기 위해서는 응용 프로그램이 멀티 코어를 지원하도록 작성해야 하는데 문제는 이것이 쉽지 않다는 것이다.


왜 멀티 코어 프로그래밍이 어려운가?


우선 언어적 특성에 기인한 원인이 있다. 일반적으로 게임에 사용하는 C와 C++은 본질적으로 순차적 언어이기 때문에 병렬 처리가 당연한 문제의 경우에도 구현이 쉽지 않는 경우가 많다.

그런데 이런 언어 상의 문제점만 있는 것이 아니라 게임이라는 애플리케이션의 특징에 기인한 문제점도 있는데 이것은 더욱 복잡하고 까다롭다. 첫 번째로 다른 응용 프로그램과 비교할 때 게임은 인공지능, 물리 시뮬레이션, 네트워킹, 애니메이션, 렌더링 시스템 등과 같은 다양한 서브 시스템으로 구성이 되어 있는 것이 보통이다. 그런데 이들 서브 시스템은 서로 결합되어 작동되는 것이 보통이므로 단순한 서브 시스템의 조합으로 구성된 응용 프로그램과 비교할 때 훨씬 더 복잡한 구조를 가지고 있다. 즉, 서브 시스템 간의 의존도가 높기 때문에 병렬 처리하는 것이 어렵다. 두 번째는 게임이 이벤트 중심의 애플리케이션이라는 점이다. 게임은 사용자의 입력이나 네트워크를 통해 전송되는 패킷, 게임 내에 정의된 시나리오, 물리 시뮬레이션 등에 의해서 수시로 변경되며 서로 상호작용해서 작동되는 것이 보통이다. 그리고 이런 이벤트들을 전체 시스템의 관점에서 보면 정해진 규칙은 있지만 순서는 없다. 이러한 이벤트들은 여러 개의 서브 시스템에서 처리하여 그 결과를 이용하게 되는데 게임에서는 이렇게 각 서브 시스템간에 데이터 정보를 공유해야 하므로 서브 시스템들을 독립적으로 병렬 처리하는 것이 어렵다.

그리고 세 번째로는 게임의 실시간성에 따른 프레임에 관한 문제이다. 게임은 실시간으로 작동되어야 하기 때문에 게임은 매 프레임을 순차적으로 처리해서 렌더링 하게 되는데 현재의 프레임은 이전 프레임에 의존적이기 때문에 프레임들을 병렬 처리할 수가 없다. 이것도 게임을 병렬 처리 하기 어려운 이유 중의 하나이다.


그러면 멀티 코어 프로그래밍은 어떻게 접근해야 할까?


멀티 코어 시스템은 여러 개의 프로세서를 처리하므로 프로세서 간 통신을 위한 효율적이고 유연한 소프트웨어 아키텍쳐를 필요로 한다. 이 소프트웨어 아키텍쳐란 각 서브 시스템 간의 교환되는 데이터의 동기화가 용이한 모델에 초점을 맞춘 것을 말하는 것으로 데이터의 동기화 뿐만 아니라 코어의 개수가 서로 다른 환경에서도 안정적으로 작동될 수 있어야 한다. 이러한 병렬 처리 데이터 동기화의 모델 중에서 게임에 적합한 모델로는 비동기화 함수 병렬 모델(Asynchronous parallel model)이라는 것이 있다. 게임에서는 보통 게임 로직, 물리 연산, 렌더링의 순서로 작업이 행해 것이 보통인데 비동기화 함수 병렬 모델에서는 이 세 가지를 각각의 코어로 실행하고 이들 코어간의 동기화는 최신 결과를 기다리지 않고 이전 결과를 가지고 작업을 수행하는 것이다. 예를 들어 렌더링에서는 이번 프레임에서의 물리 연산의 결과를 기다려서 렌더링 작업을 수행하는 것이 아니라 이전 물리 연산 결과를 이용하여 렌더링하게 된다. 이것은 게임이라는 응용 프로그램이 적당한 응답성만을 보장하면 되는 특성에 기인한 것으로 이 방법을 사용하면 각 서브 시스템간의 분리 뿐만 아니라 병렬 처리도 용이해 진다는 장점이 있다.


디버깅에서도 차이가 있다. 일반적으로 멀티코어 시스템의 디버깅은 단일 시스템의 디버깅보다 더 복잡하고 어플리케이션에 영향을 미칠 수 있다. 하나의 코어 또는 코어의 하위 집합만이 정지되는 경우에는 다른 코어가 정지된 코어로 데이터를 전송하거나 수신할 수 있기 때문에 단일 쓰레드에서의 디버깅과는 다를 수 있다.

이상 언급한 것은 소프트웨어적인 측면인데 이런 소프트웨어적인 측면 뿐만 아니라 하드웨어적인 측면에서도 고려해야 하는 점이 있다. 예를 들어 메모리나 버스의 경우에도 사용 가능한 대역폭을 코어 간에 공유해야 한다는 점에 주의해야 한다. 소프트웨어 아키텍처가 아무리 잘 설계가 되어 있다고 하더라도 이러한 부분에서 병목 현상이 발생하게 되면 당연히 퍼포먼스에 영향을 미치게 되기 때문이다.

실제로는 이보다 더 많은 내용들이 있겠지만 여기까지만 살펴 보더라도 멀티 코어로의 패러다임의 전환은 그 어느때보다 소프트웨어 특히 병렬 처리와 관련한 소프트웨어를 잘 다룰 줄 아는 프로그래머의 역할이 중요해졌다는 것을 알 수 있다.

멀티 코어가 대세가 되는 시대에는 더 이상 하드웨어의 업그레이드 만으로는 프로그램의 빠른 실행을 기대할 수가 없게 되었다. 이제는 기술 진보의 의미가 클러 수의 증가로 하드웨어가 빨라 지는 것을 의미하는 것이 아니라 병렬 처리가 가능한 코어의 증가로 동시 처리의 증가를 의미하는 시대가 도래 되었다. 이것은 주어진 문제를 여러 개로 분리해서 가장 효율적으로 처리할 , 수 있는 방법이 중요한 이슈로 부상했다는 것을 의미한다.



참조

[1] 위키피디아 - 멀티코어, http://ko.wikipedia.org/

[2] Multithreaded Game Engine Architectures, Gamasutra,

http://www.gamasutra.com/view/feature/1830/multithreaded_game_engine_.php?print=1

by kimsama | 2008/05/29 19:40 | MultiCore | 트랙백 | 덧글(3)

◀ 이전 페이지다음 페이지 ▶