병렬처리의 한계와 가능성 – Grosch의 법칙과 VLSI

다단일 프로세서의 계산 속도는 물리적인 특성에 의하여 한계점을 가지고 있다. 실리콘 칩 상에 전자 프름의 최대 속도는 및의 속도의 1/10 정도(3*10^7m/sec)이다. 따러서 지름이 3cm인 칩에서 전기 신호의 최대 전송시간은 10^-9sec가 된다. 한 번의 신호 전송에 의해 한 번의 부동소수점 연산이 가능하다고 가정하더라도 그러한 칩으로 만들어진 컴퓨터의 계산 능력은 10^9FLOPS = 1GFLOPS가 된다,. 즉, 초당 10억번의 부동소수점 연산 처리까지만 가능하다. 다만, 최근에는 프로세서 칩 내부에 여러 개의 명령어 실행 유니트들을 두는 슈퍼스칼라 기술을 이용함으로써 프로세서의 처리 속도를 좀 더 높여뒀지만(이미 적용되어 나오는 프로세서들이 대부분임), 명령어-수준 병렬성에 의해 한계를 가진다. 

이러한 물리적인 한계를 극복할 수 있는 기술이 병렬처리이다. 병렬처리 개념이 문헌에 처음 소개된 것은 1920년대였으나, 상당 기간 동안 구체적인 연구와 개발이 이루어지지는 못한 데는 몇 가지 비관적인 예측들이 있었기 때문이다. 이것들을 하나 하나 살펴볼 것이다.

우선 살펴볼 것은 프로세서의 성능이 가격의 제곱에 비례하여 높아질 것으로 예측한 Grosch의 법칙이다. (p.s. 이 이론 자체가 엄청난 고전이지만, 병렬컴퓨터 구조론에 있어서 한번 지나가야 하는 법칙이다.) 이 법칙은 n개의 프로세서들을 사용하면 최대 n배의 성능 향상을 얻을 수 있지만, 루트n배의 비용만 투자해도 n배 더 빠른 프로세서를 개발할 수 있을 것이므로 단일 프로세서의 시스템으로도 같은 수준(n배)의 성능을 얻을 수 있다는 주장이다. 만약 이 법칙이 사실이라면, 굳이 많은 비용을 들여서 다수의 프로세서들을 이용한 병렬처리 시스템을 구성하는 의미가 없어지는 것이다. 그래서 당시의 이러한 논리 때문에, 오래동안 병렬처리 기술은 비용보다도 신뢰도를 더 중요시하는 군사용 또는 항공우주용 컴퓨터에서만 사용되어 왔는데, 병렬처리 구조가 결함 허용을 위한 하드웨어 중복성을 구현하기가 용이하기 때문이었다. (망가져도 다른 코어 쓰면 되니깐)

그러나, VLSI 칩들이 등장하면서 상황이 완전히 바뀌게 되었다. VLSI 기술을 이용하여 개발한 프로세서들은 대량 생산이 가능하기 때문에 가격이 저렴해지고, 따라서 약간의 비용만 추가하면 많은 수의 프로세서들을 포함하는 시스템을 구성할 수 있게 된 것이다. 결과적으로 Grosch의 법칙은 VLSI 기술의 출현과 함께 더 이상 성립되지 않게 된 것이다.

최근에는 가격보다는 처리 속도를 더 중요시하는 경향이 있기 때문에 많은 비용을 투자하면서 더 빠른 프로세서를 개발하고, 그러한 프로세서들을 많이 사용하여 더 높은 성능의 시스템을 개발하고 있다.

빠른 컴퓨터에 대한 개발을 위하여…

빠른 컴퓨터에 대한 요구는 지금도, 앞으로도 지속적으로 있을 것으로 보여진다.

컴퓨터의 속도를 결정하는 첫 번째 요소는 다들 알듯 프로세서의 속도가 향상되는 것이다. 그러나, 그것이 한계에 부딧히게 되어 멀티코어를 만들고 병렬처리 기술들을 지속적으로 하고 있다.

병렬 처리란 다수의 프로세서들이 여러 개의 프로그램들 혹은 한 프로그램의 분할된 부분을 분담하여 동시에 처리하는 기술을 말한다. 병렬처리가 가능해지기 위해서는 다음과 같은 조건들을 만족해야 한다.

  1. 많은 수의 프로세서들을 이용하여 하나의 시스템을 구성할 수 있도록, 작고 저렴하며 고속인 프로세서들의 사용이 가능해야 함
  2. 한 프로그램을 여러 개의 작은 부분들로 분할하는 것이 간으해야 하며, 분할된 부분들을 병렬로 처리한 결과가 전체 프로그램을 순차적으로 처리한 경우와 동일한 결과를 얻을 수 있어야 함

첫 번째 조건은 최근 반도체 및 프로세서 기술의 발전으로 만족을 하고 있는 상황이다. 그러나 두 번째 조건은 다음과 같은 새로운 과제들을 야기시킨다.

  • 분할성
  • 복잡성
  • 프로세서간 통신

분할성이란 병렬 처리를 위하여 하나의 프로그램을 여러 개로 나눌 수 있어야 ㅎ나다는 것이다. 프로그램들 중에는 반드시 순차적으로 처리되어야 하는 것들도 있기 때문에 병렬 처리가 근본적으로 불가능할 수도 있다. 또한 많은 수의 프로세서들이 제공되더라도 프로그램을 그 수만큼 분할할 수 없는 경우에는 프로세서 이용률이 낮아져서 원하는 만큼의 성능 향상을 얻을 수 없기 때문에 분할성은 매우 중요하다. 이러한 경우에 병렬처리의 효과를 높이기 위해서는 순차적으로 처리해야 하는 부분을 최소화할 수 있는 새로운 알고리즘 개발이 필요하게 되고, 알고리즘 자체가 복잡해질 수도 있다. 이 부분이 복잡성에 해당한다.

하나의 프로그램이 여러 개의 작은 부분들로 나누어져 서로 다른 프로세서들에 의해 처리되는 경우에는 프로세서들 간에 데이터 교환을 위한 통신이 필요하게 된다. 프로세서의 수가 증가하면 통신 선로의 수도 그만큼 더 많아지고, 인터페이스를 위한 하드웨어도 복잡해진다. 그에 따라 프로세서간 통신을 지원하기 위한 소프트웨어 오버헤드와 하드웨어상 지연 시간 때문에 통신에 소모되는 시간이 길어져서 속도 향상에도 한계가 있게 된다.

이 밖에도 알고리즘의 병렬성을 표현해줄 수 있는 병렬 프로그램 언어와 컴파일러의 개발도 요구된다. 또한 프로세서들이 각종 하드웨어 자원들을 공유할 수 있도록 상호 베타 매너키즘이 설계되어야 하고, 공유자원들에 대한 경합을 줄이고, 이용률을 극대화시킬 수 있도록 운영체제에서도 특별한 기능이 추가되어야 한다.

이 내용들을 전부 정리해보면 병렬컴퓨터 시스템을 개발하기 위해서는 하드웨어의 구조, 운영체제, 알고리즘, 프로그래밍 언어, 컴파일러 등 거의 모든 분야의 컴퓨터 기술들이 통합되어야 한다.

p.s. 진짜 진짜 관심 있는 분야이긴 한데…./먼산