병렬 처리 프로그래밍을 하려고 마음을 먹고, 또 멀티 코어 프로세서에 대해 관심을 가지기 시작하고, 프로그래밍을 하다 보면 많은 컨셉들이 있을것이다. 반드시 이해해야 할 중요하지만 매우 단순한 컨셉들을 살펴보겠다.
<내용>
안녕하세요 제임스 랜더스 입니다. 오늘은 병렬 처리와 관련한 핵심 컨셉들을 알아보는 시간을 가지도록 하겠습니다. 병렬 처리 프로그래밍을 하려고 마음을 먹고, 또 멀티 코어 프로세서에 대해 관심을 가지기 시작하고, 그리고 실제로 프로그래밍을 하시다 보면 많이 들으시는 컨셉들이 있을 겁니다. 앞으로 제가 설명해 드릴 컨셉들은 반드시 이해해야 할 중요한 것들입니다. 실로 매우 단순한 컨셉들이기도 하죠. 한 번 살펴보겠습니다.
우선 가장 먼저 태스크/데이터 병렬 처리 입니다. 이들이 과연 무엇인지부터 살펴보고, 암달의 법칙(Amdahl’s Law)에 대해서도 간략하게 이야기를 나누어 보도록 하겠습니다. 암달의 법칙은 매우 흥미로운 이론인데요, 가끔은 상식에 벗어나는 결과들을 예측하는데 사용되기도 합니다.
우선 태스크/데이터 병렬 처리에 대해서 알아보도록 하죠. 병렬 처리는 여러 가지의 일을 한 번에 하는 것을 의미합니다. 하지만 흔히 사람들이 이야기하는 병렬 처리 방식에는 두 가지가 있죠. 하나는 태스크 병렬 처리이고, 나머지 하나는 데이터 병렬 처리 입니다.
데이터 병렬 처리는 매우 단순합니다. 프로세스 하고자 하는 데이터의 양이 매우 많을 때 (예를 들어 한 이미지에 여러 개의 픽셀들이 있을 때, 또는 한 번에 업데이트 해야 할 결제 내역서가 많을 때), 이들 데이터를 여러 개의 프로세서에 분류하는 것이 데이터 병렬 처리 입니다. 이는 지난 수년 간 슈퍼 컴퓨터들이 압도적인 솜씨를 보여오던 분야라고 할 수 있죠.
반면에 태스크 병렬 처리는 수행해야 될 일, 즉 작업의 양 자체가 매우 많을 때 유용한 방식입니다. 여기 매우 많은 데이터가 축적되어 있다고 가정했을 때, 데이터 중 최소값을 고르고, 또 최대값을 고르고, 또 평균 값을 계산해 내야 하는 경우라 할 수 있죠. 매우 단순한 예이긴 합니다만, 이런 경우 사용자는 여러 개의 프로세서들이 같은 데이터를 보면서 각기 다른 작업의 답을 내도록 명령 할 수 있습니다. 한마디로 태스크 병렬 처리는 같은 작업을 여러 프로세서에서 나눠서 처리하는 개념이 아니라, 여러 개의 작업을 하나씩 각각의 프로세서들에 배당하는 개념이라고 보시면 되겠습니다.
태스크 병렬 처리의 가장 흔한 예 중 하나는 파이프라인 기법(pipelining) 입니다. 예를 들어 지금 처리해야 될 작업이 총 3개, 즉 작업1, 작업2, 작업3이 있다고 가정하고, 이 작업들은 모두 같은 데이터를 기반으로 실행된다고 가정했을 때, 각각의 작업마다 데이터를 개별적으로 접촉하는 것이 아니라, 데이터를 우선 첫 작업에 준 후 프로세스를 진행하게끔 한 후, 바로 두 번째 작업에 투입, 그리고 또 바로 세 번째 작업에 투입하는 것입니다. 이러한 파이프라인 기법을 자주 활용하는 작업에는 이미지 프로세싱이 있습니다 그래서 그래픽 프로세서들이 종종 파이프라인 기법을 도입하기도 하죠. 우선 이미지 하나를 흘리면, 첫 번째 작업부터 프로세스가 시작됩니다. 특정 필터를 통해 다음 작업으로 이미지가 계속 전달되죠. 이러한 작업 방법은 태스크와 데이터 병렬 처리를 혼합한 예라 할 수 있습니다. 아무래도 적응하는데 약간의 시간이 걸리겠죠. 그러나 여러분들의 애플리케이션에서 병렬 처리가 어떤 방식으로 행해지는지 이해하는 것은 상당히 의미 있는 일이라고 생각합니다. 현실에서는 이 두 가지 병렬 처리 방식들이 동시에 존재합니다. 이들을 찾아보고, 또 이해하려고 노력하다 보면, 여러분들의 프로그램에는 어떤 방식이 가장 적합할 지, 태스크 병렬 처리가 나을 지, 데이터 병렬 처리가 더 나을 지 충분히 판단하실 수 있을 겁니다.
이러한 일련의 분석 과정을 거쳐서 처리 방식을 정하셨다면, 그 다음으로 해야 할 질문은 과연 우리가 기대할 수 있는 속도는 얼마고 또 사용하고자 하는 멀티 코어 프로세서로부터 활용할 수 있는 성능은 어느 정도 되느냐가 될 것입니다. 사실 이와 관련해서는 진 암달(Gene Amdahl)이 제시한 흥미로운 연구 결과가 있습니다. 흔히 암달의 법칙이라 불리는 것인데요, 스피드의 향상 여부는 프로그램 내의 순차적인 부분에 의해 제한된다는 이론입니다. 여기서 “순차”라는 의미는 병렬 처리 형태로 처리할 수 없는 부분을 의미합니다. 단순한 예를 한 번 가정해 보죠. 어떤 프로그램에는 5가지 파트가 있다고 생각해 봅시다. 한 파트 당 각각 100유닛이라는 시간이 소요됩니다. 이 경우, 첫 번째, 세 번째, 다섯 번째 파트에서는 병렬 처리 방식을 사용할 수 없다고 가정합니다. 대신 나머지 두 번째, 네 번째 파트에는 데이터 또는 태스크 병렬 처리 방식을 도입할 수 있다고 생각하구요. 기본적으로 이 프로그램을 실행하기 위해서는 500유닛이라는 시간이 필요합니다. 하지만 두 번째와 네 번째 파트를 병렬 처리 방식을 이용해 처리를 하면 이 둘을 처리하는데 각각 50유닛의 시간을 절약할 수 있습니다. 두 개의 프로세서를 이용하게 됨으로 처리 시간도 두 배 빨라진 것이죠. 결과적으로 프로그램을 실행시키기 위해서는 400유닛이라는 시간이 필요로 하게 됩니다. 속도가 25% 향상된 것이죠. 만약 네 개의 프로세서를 활용, 두 번째, 네 번째 파트를 각각 25유닛의 시간에 처리할 수 있도록 한다고 생각해 봅시다. 이 두 개의 파트를 처리하는데 이전보다 많은 네 개의 프로세서가 사용됨으로 처리 시간도 1/4로 줄어들었습니다. 즉, 이 경우 프로그램을 실행시키는데 350유닛의 시간이 필요하게 되고, 40% 향상된 속도를 경험할 수 있게 되는 것이죠.
암달의 법칙이 초점을 맞추고 있는 사실 중 하나는, 순차적인 부분이 절대 줄어들지 않는다는 것입니다. 매우 많은 수의 프로세서를 동원해 두 번째, 네 번째 파트를 측정할 수조차 없는 엄청난 속도로 처리한다고 해도 병렬 처리 방식을 적용할 수 없는 3개의 파트가 여전히 300유닛의 시간을 잡아먹게 된다는 것이죠. 이것이 암달의 법칙의 핵심입니다. 기본적으로 프로그램 내 순차적인 부분에 의해 제한을 받게 되고, 결국 암달의 법칙에 의하면, 프로세서의 수를 아무리 들여도 속도의 효율을 70% 이상 올릴 수 없다는 결론에 도달하게 됩니다.
암달의 법칙을 곧이곧대로 받아들인다면, 사실 멀티코어도 그리 매력적이지는 않을 것이고, 병렬 처리 방식 또한 그리 눈길을 끌지 못할 것입니다. 무슨 일이 일어난 것일까요? 우리는 이미 수천 개의 프로세서를 보유한 슈퍼 컴퓨터를 개발해 냈습니다. 이젠 암달의 법칙이 절대적인 진리가 아닐 정도로 기술이 발전한 것이죠. 사실 진 암달은 이 법칙을 1967년 고안해 냈습니다.
놀랍게도 상당한 시간이 걸렸지만, 1988년에야 비로소 구스타프손(Gustafson)이 암달의 법칙에 대한 반론을 제시하고 나섰습니다. 그는 암달과는 약간 다른 시각으로 접근했습니다. 그는 컴퓨터들의 매년 똑 같은 수준의 일만 하도록 개발되진 않는다고 주장했습니다. 컴퓨터 기술이 점점 발전하고, 그 성능이 점점 강력해지면서, 우리는 컴퓨터에 갈수록 무겁고 어려운 업무를 던져주기 시작했습니다. 프로세스 해야 할 데이터 양도 어마어마하게 많아졌죠. 오늘날 우리는 그런 모습을 실제로 보고 있습니다. 시각을 약간 달리 하여, 프로그램이 실행되는데 500유닛의 시간이 필요하다고 가정했을 때를 다시 한 번 생각해 봅시다. 대신 이번에는 병렬 처리 부문에서 처리할 작업 양을 두 배로 늘리는 겁니다. 이 경우 프로그램이 실행되는 데에는 여전히 500유닛의 시간이 걸리겠지만, 그 시간 동안 처리한 작업량은 평소에 700유닛이 걸리던 만큼으로 증가합니다. 단 두 개의 프로세서로 40% 이상의 속도 향상을 이끌어 낸 것이죠. 만약 이러한 방법을 이용해 4개의 프로세서로 프로그램을 실행 시킬 경우 500유닛이라는 시간 동안 1100유닛의 시간 동안에 할 수 있는 작업량을 소화해 낼 수 있습니다. 속도가 2.2배 향상되는 것입니다. 즉, 구스타프손의 이론은, 소화해 내고자 하는 작업의 양만 지속적으로 늘릴 수 있다면 프로그램 내의 순차적인 부분들의 영향력이 약화되고, 대신 프로세서의 양을 늘리면 늘릴수록 얼마든지 속도를 향상시킬 수 있다는 것입니다. 비록 완벽한 병렬 처리 방식의 활용이라 볼 수는 없지만, 속도 향상에는 큰 효과를 볼 수 있습니다. 물론 10개의 프로세서를 활용한다고 해서 반드시 10배의 속도 향상 효과를 볼 수는 없겠지만, 결국 속도 향상 그래프는 상승 곡선을 그릴 수 밖에 없기 때문에 20개의 프로세서를 사용했을 경우 10개의 프로세서를 사용했을 때 보다 거의 두 배 가까운 속도 향상을 기대할 수 있습니다.
그러므로 만약 누군가가 암달의 법칙을 이야기하면서 병렬 처리 방식은 의미가 없다고 말한다면, 구스타프손이 그 해결책을 나름 제시해 주었다는 이야기를 꼭 하시길 바랍니다. 구스타프손의 이론이야 말로 지난 수 년간 슈퍼 컴퓨터들이 병렬 처리 방식을 통해 큰 성능 향상 효과를 누릴 수 있었던 이유라 할 수 있습니다. 지속적인 프로세서 향상을 도모하고 있는 멀티 코어 프로세서 시장에서도 이러한 이론은 충분히 통할 것입니다.
출처 : ZDNet Korea
'Robotics > Software Tech.' 카테고리의 다른 글
Visual Studio 2008에서 병렬 컴파일로 컴파일 성능 향상시키기 (0) | 2008.06.19 |
---|---|
Visual Studio 2008의 새로운 기능 'Performance Wizard' (0) | 2008.06.19 |
멀티코어 프로그래밍을 하기위해 어떻게 해야하는가.. (0) | 2008.05.15 |
#pragma once의 의미 (0) | 2008.04.29 |
Windows에서 최대한 Realtime을 지켜보자 (1) | 2008.03.28 |