멀티프로세서 프로그래밍 시대의 개막

From DevNote

Jump to: navigation, search

Contents

Intro

요즘 CPU업계의 가장 큰 이슈는 멀티코어의 등장이다. CPU회사와 컴퓨터 회사의 광고에는 멀티코어 CPU의 장점들과 성능향상에 대한 내용으로 메워져있다. 그런데 조금만 주의 깊게 생각하면 이른바 IBM-PC는 XT, AT, 286, 386, 486, 펜티엄으로 발전하며 메가와 기가헤르쯔(MHz, GHz)로 CPU 성능을 이야기하던 것이 얼마 되지 않았다. 그런데 이제 속도 보다는 몇개의 코어가 있느냐에 더 집중하고 있음을 쉽게 알 수 있다. 그럼 왜 갑자기 멀티코어 CPU가 지금 등장하였을까? 누군가가 멀티코어 기술을 갑자기 발명한 것도 아니다. 이른바 CPU가 여러개 있는 멀티프로세서 시스템은 오래전부터 연구되어 왔으며 최근에는 서버용으로 사용되는 대부분의 컴퓨터들이 멀티프로세서를 채용하고 있으나 개인 컴퓨터로 보편화 되지는 않았다.

멀티코어는 CPU의 실행 유닛이 하나의 칩위에 여러개 있는 것을 말한다. 그런데 이제 멀티코어 CPU는 현재 출시되는 대부분의 일반 사용자의 컴퓨터에 장착되고 있다. 멀티코어가 등장한 배경은 무엇이고 멀티코어는 프로그래머들에게 어떤 의미인가? 그저 운영체제가 알아서 멀티코어를 사용하기 때문에 개발자들은 별로 달라지는 것이 없는 것일까? 이러한 의문은 개발자 뿐만 아니라 일반 사용자들에게도 매우 자연스러운 것이다.

쿼드 코어까지 벌써 출시한 인텔사의 광고 선전물과 기술적인 스펙에도 왜 예전처럼 더 빠른 CPU를 내놓지 않고 멀티코어를 만들기 시작했는지에 관해서는 설명이 없다.

무어의 법칙

컴퓨터 하드웨어에 있어 가장 유명한 이론 중의 하나가 인텔사의 공동 창업자 중의 한명인 무어가 발표한 무어의 법칙(Moore's Law) 이다. 아래의 이론은 나중에 24개월에 두배 증가하는 것으로 수정되었으며, 실제 인텔사의 CPU집적도는 이 무어의 법칙을 그대로 따라 발전되었다.[1]

   
멀티프로세서 프로그래밍 시대의 개막
IC칩의 집적도는 대략 1년에 2배로 증가한다 ... 확실히 단기적으로 이 증가율은 더 늘어나지는 않더라도 지속될 것으로 기대된다. 장기적으로보면 증가율은 어느 정도 불확실하지만, 적어도 10년간은 증가율이 일정 수치로 머물러 있지는 않을 것이라 믿는다. 그러니까 1975년에는 65,000개의 트랜지스터가 하나의 칩에 집적될 수 있다는 뜻이다. 나는 그러한 대형회로가 하나의 웨이퍼 위에 제작될 것이라 믿는다.[2]
   
멀티프로세서 프로그래밍 시대의 개막

이 이론이 말하는 것은 반도체의 기하급수적 성장(Exponential growth)이다. 기하급수적 성장은 엄청난 속도의 성장이다.


각 프로세서별 트랜지스터 개수 차트 Copyright ⓒ 2005 Intel Corporation.
각 프로세서별 트랜지스터 개수 차트 Copyright ⓒ 2005 Intel Corporation.


CPU 뿐만아니라 컴퓨터 업계도 비슷한 속도로 함께 성장하였다. 가장 큰 수혜자는 물론 윈텔(Wintel)이라 불리우는 인텔사와 마이크로소프트사이다. 아래 인텔과 마이크로소프트사의 주식 차트도 이러한 기하급수적 성장과 거의 일치를 보여주고 있다.


마이크로소프트와 인텔사의 주식 차트
마이크로소프트와 인텔사의 주식 차트


그런데 웬일인지 2000년을 기점으로 갑자기 주식가격이 폭락했음을 알 수 있다. 무슨 일이 생긴 것일까? 닷컴버블의 붕괴에 따른 IT주식의 폭락과 연결이 된다. 하지만 2006년 지금도 이들 회사의 주식은 제자리 걸음이며 새로운 제품출시가 조금씩 지연되고 있다. 2년이 지나면 어김없이 2배 더 빠르고 좋은 하드웨어가 나타나 업그레이드를 해야만 했었으나 요즘은 꼭 그렇지 않다. 무어의 법칙이 이제 더 이상 적용되지 않고 있는 것이다.

그동안 우리에게 익숙한 것은 CPU가 동작하는 클럭스피드 즉 메가헤르츠(MHz) 혹은 기가헤르츠(GHz)로 성능을 구분하는 것이었다. CPU의 집적도(집적도는 몇 나노미터 공정으로 표현된다) 뿐만아니라 같은 시간에 더 많은 작업을 하기위해 클럭 스피드(clock speed)도 기하급수적으로 성장하였다. 그런데, 여기서 집적도와 클럭스피드는 이미 물리적 한계를 안고 있다. 다시 말해 우리는 분자레벨 보다 작은 집적도를 만들 수 없고 빛의 속도보다 빠른 속도를 낼 수 없다. 거기에 집적도가 기하급수적으로 증가하고 클럭스피드를 높임에 따라 CPU의 발열량도 같은 수준으로 증가하였다.

무어의 법칙은 과연 끝났나?

인텔사의 프레드 폴락(Fred Pollack)에 따르면 CPU하나당 트랜지스터의 개수는 18개월마다 두배가 되었으며, 전력소모량과 발열량 또한 CPU 클럭 스피드에 비례하여 증가하였다. 아래 그래프를 보면 이미 0.5 마이크로미터 기술로 제작된 펜티엄 프로가 뜨거운 난로 수준의 열을 내었고 0.1마이크로미터에선 원자로에 근접한다. 전력 소모량도 기하급수적으로 증가함을 볼 수 있다. 따라서 CPU의 다이(die) 크기를 늘려서 성능향상을 꾀하는 것은 너무나 많은 전력 소모량과 발열로 더 이상 불가능하다. [3] 이러한 이유로 4.3GHz 이상의 CPU를 제작하는 것은 불가능한 것으로 알려져 있다.


집적도 증가에 따른 발열량의 증가
집적도 증가에 따른 발열량의 증가


   
멀티프로세서 프로그래밍 시대의 개막
최근 몇 년간 클럭 스피드(frequency)의 증가는 중대 문제에 직면하였다. 전력 소모와 발열은 클럭 주파수와 함께 기하 급수적으로 증가하였다. <중략> 이러한 모든 이유때문에 프로세서의 성능을 향상시키기 위해 클럭 주파수를 높이는 것은 더 이상 가능한 옵션이 아니다. 클럭 주파수는 계속 증가하기는 하겠지만 그 속도는 빠르지 않을 것이다. 그동안의 기록적인 성능향상 속도와 성능대비 비용 절감 효과를 유지하기 위해서는 새로운 전략이 필요하다.[4]
   
멀티프로세서 프로그래밍 시대의 개막


이제 무어의 법칙은 이제 죽었다고 말하는 사람도 있다. 기하급수적 성장은 실제 자연계에서는 언젠가 그 성장세가 꺾이는 모습을 보이는 자연성장 곡선을 그리게 되는데 CPU의 경우 이미 그것이 시작되었다는 것이다. 이 사람은 한 발 더 나가 무어의 법칙의 종말이 컴퓨터와 소프트웨어의 보편화를 이루어 엄청난 가격 하락을 가져올 것이라 예견하고 있다.

어쨋거나 무어의 법칙은 언젠가 끝나게 되어 있었다. 무어의 법칙이 끝나게 되면서 가장 크게 타격을 입는 것은 당연히 그동안 무어의 법칙의 가장 큰 수혜자였던 IT 선두 기업들이다. 하지만 소비자 입장에서는 나쁠 것은 없다. 필자가 처음 8비트 컴퓨터를 접한 1980년대 초반에 컴퓨터를 가진 사람은 매우 드물었다. 교보문고에 전시되어 있는 컴퓨터를 잠시 만져보기 위해 3시간을 줄서서 기다린 기억이 아직도 생생하다. 이제 컴퓨터는 모든 집에 보급되었고 가격도 점차로 낮아지고 있다. 그리고 잦은 업그레이드 걱정과 비용에 대한 걱정이 줄어들 수 있다.

멀티코어의 등장

무어의 법칙이 적용되는 동안 인텔을 비롯한 하드웨어 및 소프트웨어 회사는 비교적 장사하기 쉬웠다. 매 18개월 후에 같은 가격에 두배 더 빠른 컴퓨터가 나오면, 사용자들은 그에 따라 자연스럽게 업그레이드하는 수요와 공급의 싸이클이 돌아가고 있었기 때문이다. 그런데 무어의 법칙이 끝나가면서 이들이 내놓은 것은 멀티코어 기술이며 이들 회사들은 아래와 같이 멀티코어가 무어의 법칙을 이어갈 것으로 기대하고 있다.


   
멀티프로세서 프로그래밍 시대의 개막
멀티코어를 사용함으로써, 프로세서 설계자들은 클럭 스피드를 조금 감소시켜 전력 소모량과 발열량을 줄임과 동시에 멀티스레드 소프트웨어들의 전체 처리량은 오히려 증가시킬 수 있다. 클럭 스피드를 낮춤으로인해 각 개별 스레드의 실행 속도는 약간 느려지겠지만, 동시에 여러 스레드가 실행되어 전체 처리량은 상당히 늘어날 수 있다. 근본적으로 멀티코어 프로세서는 병렬처리 실행유닛이 하나의 칩에 통합 되었다는 것을 제외하면 멀티 프로세서 서버와 비슷하다. 이러한 접근 방식은 비용과 전력소모에 있어 보다 더 효과적이다. 인텔은 3, 4년 안에 보다 많은 코어를 하나의 칩에 통합하여 10배 정도의 성능 향상을 얻을 것으로 기대된다.[4]
   
멀티프로세서 프로그래밍 시대의 개막


멀티코어는 CPU하나에 여러개의 실행 유닛을 가지는 것을 의미한다. CPU가 여러개 있는 멀티프로세서 시스템과 다른 점이라면 여러 개의 실행유닛이 하나의 칩위에 있으며 모든 코어들이 같은 L2 캐쉬메모리를 공유한다는 것이다. CPU 캐쉬메모리를 하나로 통합하므로써 보다 많은 성능향상과 분리된 캐쉬메모리 때문에 생기는 문제점(예를 들면 False sharing[5])을 방지할 수 있다.

이미 발표된 듀얼코어, 쿼드코어 이후 인텔과 AMD는 기하급수적으로 코어의 수를 증가시킬 계획을 가지고 있으며 이것이 무어의 법칙을 계속 진행시킬 것이라고 한다.[6] 256개의 코어를 가진 CPU는 2015년 쯤에 등장할 것이라고 예견하고 있다.[7]

하지만, 인텔의 멀티코어 개발이 회사가 주장하는 바와 같이 예상대로 진행된다 하더라도 무어의 법칙을 이어 기하급수적 성능향상 유지시켜 준다는 전망은 그리 낙관적이지는 않다.

Scale-up Scale-out

서버하드웨어에서는 다음과 같은 Scale-up과 Scale-out이라는 개념이 있다.

  • Scale-up: 보다 성능이 좋은 컴퓨터 혹은 CPU로 업그레이드 하는 것을 의미한다. 무어의 법칙이 이에 해당한다.
  • Scale-out: 어플리케이션을 비슷한 성능의 여러개의 컴퓨터 혹은 여러개의 CPU에 나뉘어져 실행될 수 있도록 제작하여 성능을 높이는 것. 여러 대의 값이 싸고 낮은 성능의 컴퓨터를 이용하여 클러스터(cluster) 혹은 그리드 컴퓨팅이 있다. 대표적인 예는 구글의 웹검색 시스템을 들 수 있다. [8]

그런데 멀티코어 기술이 발전함에따라, Scale-up이 다시 중요하게 부각되고 있다. 클러스터나 그리드 컴퓨팅을 지원하는 소프트웨어의 개발이 매우 힘들고 복잡하다. 16코어 이상의 CPU를 여러개 넣어 만든 멀티프로세서 시스템은 현재의 클러스터나 그리드 컴퓨터들과 비슷하거나 더 높은 성능을 발휘할 것으로 기대된다.[9] 클러스터에 사용되는 많은 저가의 컴퓨터들은 상당한 공간을 차지하고 많은 전력을 소모하는 단점이 있다.

소프트웨어 개발 - 새로운 도전

   
멀티프로세서 프로그래밍 시대의 개막
수년간 병렬 프로그래밍 주창자들은 "언젠가 우리 모두 멀티프로세서 컴퓨터를 갖는 날이 올 것이다"라고 말해왔다. 마침내 그 날이 오고 말았다. 지난 20년간 지속되어온 무어의 법칙의 종말을 앞두고 모든 주요 CPU칩 메이커들은 적어도 두개의 코어를 가진 CPU를 생산하기 시작하였고 일부는 8개의 코어 생산계획을 발표하였다. 이러한 프로세싱 파워를 잘 이용하는 것이 앞으로 중대한 도전이 될 것이다.[10]
   
멀티프로세서 프로그래밍 시대의 개막

이제 우리는 어쨋거나 멀티코어 시대에 들어섰다. 그렇다면 멀티코어가 소프트웨어 개발에 의미하는 바는 무엇인가? 이전에는 더 빠른 CPU가 나오면 소프트웨어는 아무런 수정 없이도 더 빠르게 동작하였다. 프로그램을 어느 정도 비효율적으로 코딩하여도 좋은 CPU를 가진 새로운 컴퓨터로 교체하면 별 문제 없었다. 하지만, 멀티코어 시대는 소프트웨어 개발자에게 새로운 도전을 요구하고 있다.

   
멀티프로세서 프로그래밍 시대의 개막
멀티프로세서 아키텍쳐의 보급은 소프트웨어 개발 전반에 영향을 미칠 것이다. 최근까지 기술의 진보는 클럭 속도의 발전을 의미하였으며 소프트웨어는 시간이 지날수록 저절로 빨라졌다. 그러나, 이제 이 무임승차는 끝났다. 기술의 진보는 더 이상 클럭 속도의 증가를 의미하는 것이 아니라 병렬성의 증가를 의미하게 될 것이며 이러한 병렬성을 이용하는 것이 현시대 컴퓨터 사이언스가 해결해야할 중대 도전 중의 하나이다.[11]
   
멀티프로세서 프로그래밍 시대의 개막
   
멀티프로세서 프로그래밍 시대의 개막
소프트웨어 개발에 있어 객체지향(OO) 기술 이래 가장 큰 혁명이 문을 두드리고 있는데 그 이름은 콘커런시(concurrency)라고 한다.

매 10여년 마다, 우리가 소프트웨어를 개발하는 방법과 환경에 있어 큰 변혁을 보아왔다. 그러나, 객체나 웹혁명과는 달리, 우리는 컨커런시 혁명이 오고 있는 것을 보고 있다. 이것은 소프트웨어 프로그래머들에게 경이적인 시간이 될 것이다. 지난 시간 우리가 객체, 가비지 콜렉션(garbage collection), 웹을 개발했던 것처럼. 앞으로 남은 10여년동안 콘커런시를 위한 개발을 하게 될 것이다.[12][13]

   
멀티프로세서 프로그래밍 시대의 개막

멀티코어를 제대로 활용하려면 잘 짜여진 멀티스레드(Multi-thread) 프로그램이 필요하다. 현재 소프트웨어 기술로 잘 짜여진 멀티스레드 프로그램을 개발하는 것은 쉽지 않다. 그리고 주어진 문제들을 여러 스레드로 분리하여 수행하는 알고리즘과 데이터구조를 만드는 일은 그 자체로도 프로그래머에게 큰 도전이다.

듀얼이나 쿼드코어 CPU에서 이것이 큰 문제가 되지는 않을 것이다. 운영체제가 이미 멀티스레드로 동작하므로 어느 정도 성능향상은 이미 나타나고 있다. Intel Core 2 Duo 벤치마크에 따르면 코어 2는 펜티엄 4에 비해 약 1.5배의 성능 향상을 보여준다. 하지만, 앞서 말한 바와 같이 인텔은 이미 256 코어를 개발할 것이라는 야심찬 계획을 가지고 있으며 80개 코어를 가진 CPU의 시제품을 최근에 선보였다. [14]

여기서 중요한 점은 코어의 개수가 증가할수록 성능향상의 폭은 점점 감소[15]하며, 잘못 짜여진 프로그램은 코어의 개수를 늘리면 오히려 전체 성능이 떨어지거나, 많은 코어 CPU에서만 발생이 되는 예상치 못한 버그로 인해 사용불가능해질 수 있다는 것이다. 최근에 발표된 윈도우즈 비스타를 포함하여 마이크로소프트가 발표한 윈도우즈 운영체제 자체도 이러한 대형 멀티코어에 적합하게 설계되었는지 의문이다. 더군다나 현재 가장 널리 사용되는 C/C++ 언어 또한 멀티스레드 프로그래밍을 위해 특별히 설계되지 않았다. 여기에OpenMP는 C/C++에서 병렬처리를 위한 표준 API를 제공하고자 노력하고 있기도 하지만, 혁신적인 향상이 있어 보이지는 않는다.

암달의 법칙

앞서 언급한 바와 같이 멀티코어는 기본적으로 멀티스레드를 사용한 병렬연산(Parallel computing)으로 인해 얻어지는 속도향상을 전제로 하고 있다. 하지만 컴퓨터에서 수행되는 모든 작업이 병렬화 될 수는 없다. 컴퓨터가 수행하는 대부분의 작업은 병렬화가 불가능하거나 매우 어려운 부분이다. 따라서 멀티코어를 사용하였을때 얻어지는 속도 향상은 프로그램이 얼마만큼 병렬화가 가능하느냐에 달려 있으며 여기서 흔히 사용되는 법칙이 암달의 법칙(Amdahl's law) 이다.[16]


\Large\text{Speed Up }=\ \huge\frac{1}{F + (1-F)/N}\ \ \Large\left\{\text{N: Number of processors or cores}\\\text{F: Sequential Fraction}


예를 들면 전체 프로그램 중 약 20%가 병렬화되어 동시 수행가능하며 이 프로그램을 4개의 코어를 가진 CPU에서 실행한다면. 순차적으로 실행되는 부분인 F값은 1 - 0.2 = 0.8 이며 아래와 같이 싱글코어에서 수행하는 것과 비교하여 기껏해야 1.176배의 성능향상만이 있을 뿐이다. 여기서 코어의 개수를 무한대로 늘린다하여도 1.25배의 성능 향상만 가능하다. 암달의 법칙에서 눈여겨 볼 것은 코어의 개수 보다는 얼마만큼 많은 부분이 병렬화되어 실행될 수 있느냐가 매우 중요함을 알 수 있다. 극단적인 예로 100%병렬화 가능한 프로그램이라면 코어의 개수만큼의 배수로 성능향상이 가능하다. 즉 4개의 코에에서는 최대 4배의 성능향상을 기대할 수 있다.


\Large\frac{1}{0.8 + (1-0.8)/4}=1.176\text{,     }\lim_{N\to\infty}\frac{1}{0.8 + (1-0.8)/N}=1.25


이론상으로나 경험상으로 높은 병렬성을 같는 프로그램은 극히 드물다. 그리고 병렬성을 높이기 위해 동원되는 새로운 알고리즘과 데이터 구조는 이해하기 어렵고 디버깅하기도 매우 힘들다.

다시말해, 인텔이 멀티코어로 무어의 법칙을 이어 가려면, 하나의 CPU에 있는 멀티코어의 수를 매2년 마다 기하급수적으로 늘려야하고 대부분의 소프트웨어는 멀티스레드로 프로그래밍 되고 병렬성이 매우 높아져야만 한다. 이것은 상당히 어렵고 거의 불가능에 가까운 것이 사실이다.

마치며

컴퓨터의 역사는 다른 산업에 비해 매우 짧으며 인류 역사와 비교하면 아직도 시작에 불과하다. 발전속도가 빠르다는 것은 아직 안정되지 않았다는 뜻이기도 하다. 현재 멀티코어 CPU와 멀티프로세서 혹은 멀티코어 프로그래밍이 새로운 흐름임은 아무도 부인할 수 없다. 이제 시대에 뒤떨어지지 않으려면 개발자들의 마인드도 이에 맞추어 새로운 멀티스레드, 병렬처리 패러다임으로 변해야하는 시점에 와 있다. 멀티스레드 프로그래밍에 기반한 소프트웨어의 뒷받침이 없이는 멀티코어 CPU는 제 구실을 하지 못할 것이다.

그동안 학계와 슈퍼컴퓨팅 업계와 서버소프트웨어에서 주로 연구개발되어 오던 멀티프로세서 프로그래밍이 일반적인 프로그래밍 기술로 자리잡아 가며 연구개발은 더욱 가속화되고 있다.

앞으로 이 위키에서 필자는 멀티코어 CPU를 100% 활용하기 위한 가장 효율적인 멀티스레드 프로그래밍 알고리즘, 데이터 구조, 테크닉들에 관해 설명해 나가기로 하겠다.

참고 문서와 각주

Views
Personal tools
Ads: