제목을 '멀티코어 시대에 대처하는 우리의 자세'라 했습니다. 거창하게 멀티코어 시대에 대처하기 위해서는 이러이러해야 한다는 것도 아니고, 어떠한 자세가 올바르다 라고 감히 주장하려는 것도 아닌, 단지 가수 이승환의 노래 제목을 패러디 했을 뿐입니다. :)
이 글에서는 Amdahl's law와 Gustafson's law를 이야기 해보려 합니다. 전산 관련 전공을 하신 분들은 한번 쯤은 들어보셨을 것입니다. 시스템 성능에 대한 기본적인 법칙이고, 따라서 병렬 컴퓨팅의 성능을 이야기 할 때 항상 등장하는 법칙입니다. 예를 들면, '쿼드 코어를 쓰면 프로그램의 성능이 얼마나 빨라질까요?'라는 질문에 대강의 답을 해 줄 수 있는 법칙들입니다.
먼저 지적해 두어야 할 재미있는 사실은, 흔히 Amdahl's law와 Gustafson's law를 별개의 법칙인 것처럼 구별해서 언급하지만 원래 두 법칙은 수학적으로 동치라는 것입니다. (Yuan Shi, "Reevaluating Amdahl's Law and Gustafson's Law"). 그럼에도 불구하고 각각을 따로 이름 붙이고 있는 이유는, 같은 사실을 두고 상당히 다른 직관을 제공하고 있기 때문입니다.
현재 시중에 팔리고 있는 대개의 데스크탑 컴퓨터는 최소 2개 이상의 코어를 가진 멀티코어 프로세서를 장착하고 있습니다. 그 와중에 사용자는 듀얼 코어를 구입할지, 쿼드 코어를 구입할지 하는 고민에 마주하게 됩니다. 그 고민이 너무 어려운 이유는 온라인 쇼핑몰에서 보게 되는 구입 후기가 제각각으로 분분하기 때문인데요, 누구는 쿼드 코어를 달고 성능이 매우 좋아졌다고 하고 다른 누군가는 쿼드 코어를 달았는데 오히려 비슷한 가격의 듀얼 코어 보다 성능이 떨어지는 것 같다고 합니다. 왜 이런 상반된 반응이 나오는 것일까요? 이를 설명해 주는 것이 Amdahl's law와 Gustafson's law입니다.
0) 의존성과 병렬 처리
프로그램을 병렬적으로 수행하기 위해서는 각 작업 간에 의존성이 없어야 합니다. 작업 간에 의존성이 있다는 것은 어떤 작업이 수행되기 위해서는 다른 작업의 결과를 필요로 한다는 것입니다. 흔히 부장의 결재를 받기 위해서는 과장의 결재를 먼저 받아야 하는 것과 마찬가지지요. 그런데 이를 달리 말하면, 의존 관계에 있는 작업은 동시에 병렬적으로 수행할 수 없다는 말과 같습니다. 프로그램에는 어쩔 수 없이 이러한 의존 관계의 작업들이 있고, 따라서 병렬 처리가 불가능한 부분이 존재하게 됩니다.
프로그램 전체에서 병렬 처리가 가능한 부분의 비율을 P라 하고, 그렇지 않고 순차 처리를 해야 하는 부분의 비율을 S라 하면, P와 S의 합은 1이 됩니다.
1) Amdahl's Law - 특정 작업을 얼마나 빠른 시간에 할 수 있는가?
만약 병렬 처리가 가능한 부분을 N개의 프로세서에 나눠서 수행한다고 하면, 프로그램의 수행에 걸리는 시간은 더 짧아지게 됩니다. 그런데 과연 얼마나 더 빨라지게 되는지 계산을 해 봅시다.
우선 병렬 처리가 불가능한 부분, 즉 전체 중 S 만큼을 수행하는 시간은 변하지 않습니다. 나머지 병렬 처리가 가능한 부분, 즉 전체 중 P만큼은 N개의 프로세서에 나눠서 수행하기 때문에 수행 시간이 1/N으로 줄어들게 됩니다. 따라서 성능 향상은,
Speed-up(N) = (S + P) / ( S + P/N ) = 1 / (S + (1 - S) / N)
이 됩니다. 알아보기 어려우니 N을 무한대로 보내 보겠습니다. 그러면 최대 성능 향상은,
Speed-up(inf) = 1 / S
가 되는 것을 알 수 있습니다. 만약 병렬 처리가 불가능한 비율이 전체의 50%라고 하면, 아무리 많은 프로세서를 사용한다 하더라도 최대 성능향상은 2배를 넘지 못한다는 뜻입니다. 운 좋게 병렬 처리가 가능한 부분이 전체의 90%인 프로그램이 있다 하더라도, 성능 향상은 최대 10배를 넘지 못합니다. 2개의 코어를 사용하면 약 2배의 성능 향상이 있지만, 16개를 사용하더라도 성능 향상은 약 9배 정도에 그칩니다.
평소에 주로 사용하는 프로그램이 워드 프로세서, 웹 서핑 등과 같이 병렬화 부분이 2~30% 정도에 그치는 경우라면 듀얼 코어와 쿼드 코어의 차이를 느끼지 못할 것입니다. 오히려 같은 가격이라면 클럭 스피드가 빠른 듀얼 코어 쪽이 더 빠르다고 느낄 지도 모르겠습니다. 거기에 더해 동영상 인코딩과 같이 병렬화 부분이 많은 프로그램이라 하더라도 병렬화 가능한 부분에는 한계가 있으므로 옥타 코어, 헥사 코어가 등장하고 나면, 체감 성능에는 한계가 있을 것이라 예측할 수 있습니다.
Amdahl's law는 어찌 보면 병렬 컴퓨팅에 대해 비관적인 전망을 하고 있다 볼 수도 있습니다. 아무리 프로세서 수가 많아진다 하더라도 순차 처리를 해야 하는 부분에 의해 제약을 받기 때문에 시스템 전체 성능 향상은 그리 크지 않을 수도 있다는 것을 말해주고 있기 때문입니다.
2) Gustafson's Law - 단위 시간에 얼마나 많은 양의 작업을 처리할 수 있는가?
그러면 과연 멀티 코어의 미래는 비관적인 상황일까요? 누구도 예측할 수는 없지만, 그에 대해 새로운 시각을 제시하는 법칙이 바로 Gustafson's law입니다. 그 특성 상 law라기 보다 trend로 봐야 한다는 의견도 있으나, 편의상 law라고 부르겠습니다.
Gustafson이 주장한 것은, 컴퓨팅 파워가 증가하면서 컴퓨터가 수행해야 할 작업의 크기도 점점 증가하고 있다는 것입니다. 이는 대부분의 컴퓨터 사용자가 경험적으로 느끼고 있는 사실일 것입니다. 게임의 화질이 점점 좋아진다거나, 동영상, 음악 파일의 크기가 점점 커지고 있다거나, 심지어 윈도우즈 운영체제의 크기도 점점 커지고 있다거나 하는 것 말입니다.
이러한 추세에 따라, 프로세서의 수가 늘어나면 같은 시간에 처리할 수 있는 작업의 양이 프로세서의 수에 비례해서 늘어난다는 것이 Gustafson의 법칙입니다.
Speed-up(N) = S + N*P = S + N(1 - S)
이 법칙이 유효한 이유는 사람의 지각 능력에 어느 정도 한계가 있기 때문입니다. 사람의 지각은, 동영상의 경우 30fps 정도면 끊김이 없다고 인식한다거나, 반응 속도 0.1ms와 0.01ms는 구분할 수 없다거나 하는 특징을 가지고 있습니다. 만약 한 화면을 만드는 시간을 1/30초에서 1/60초로 줄이기 보다는, 1/30초 동안 처리할 작업의 양을 두 배로 늘려 고화질의 화면을 만들어 낸다면 사용자의 만족도는 더 높아질 수 있을 것입니다.
1)과 2)를 종합해 보면, 이제까지 사용해 왔던 프로그램을 멀티코어 시스템을 통해 빠르게 수행하는 데는 어느 정도 한계가 있음을 알 수 있습니다. 또한 향후 멀티코어 시스템을 활용할 프로그램들은 기존의 프로그램의 속도를 향상시키기 보다는 수행할 작업의 양을 늘려 user-experience를 향상시키는 것에 초점을 두고 개발될 가능성이 높다고 생각할 수 있을 것입니다. 빠른 시일 내에는 게임과 같은 그래픽스에서 성과가 나타날 것이나, 그 이후의 킬러 어플리케이션에 대해서는 의견이 분분한 상황인 것 같습니다.

