정보공간_1

[2기 전주 박준형] Parallel Processing 본문

IT 놀이터/Elite Member Tech & Talk

[2기 전주 박준형] Parallel Processing

알 수 없는 사용자 2012. 8. 20. 01:58

병렬처리의 필요성에 대해 설명하고자 합니다.

01. Thread

Thread란 사전적 의미로 실, 가닥, 줄기를 말합니다.

컴퓨터 프로그램에서의 Thread도 위의 의미와 동일 합니다. 하지만 of execution이라는 의미가 생략된 것 입니다.

'Thread of execution' 실행의 실, 실행의 가닥, 실행의 줄기라는 것이 완벽한 의미가 됩니다. 즉 이러한 thread를 여러개 만들어 동시에 여러 일을 할 수 있도록 실행시키므로써 병렬 프로그래밍을 할 수 있습니다.

보통 처음 프로그래밍에 입문을 하였을때 'Hello world'라는 예제를 실행 시켜 보았을 것입니다. 이것도 main 스레드(마스터 스레드)에 의해 예제가 실행 되는 것입니다.

 

 

02. 여러개의 심장을 가진 컴퓨터

멀티 코어란 두개 이상의 독립 코어를 하나의 프로세서에 집적해서 만든 것!!

만약 코어가 4개인 쿼드 코어를 예로 들자면...

CPU는 처리 속도(클록 스피드)가 싱글 코어의 4배가 된다는 말이 아닌.. 처리 할 수 있는 양이 4배가 늘었다는 것을 의미합니다.

 

03. 공짜 점심의 시대

"공짜 점심의 시대는 끝났다"

그동안 소프트웨어 개발자가 순차 프로그램을 제작하면서 누렸던 특혜가 끝나고 병렬 프로그램의 시대가 왔음을 의미합니다.

그전까지는 CPU 클록 속도, 명령어 세트의 집약, 캐시의 증대등 컴퓨터 하드웨어 발전을 통해 소프트웨어 개발자가 특별한 노력없이 속도 향상을 얻을 수 있었습니다.

- CPU 클록 속도

CPU가 하나의 명령어를 수행하는 데 걸리는 속도. 1GHz CPU는 1초에 1기가에 해당하는 명령어를 수행하는 속도를 의미합니다.

클록 속도로 프로그램의 속도를 높여가는 90년대 부터 2004년까지의 시절의 소프트웨어 개발자는 하드웨어의 발전을 기대하고 더 많은 연산과 메모리를 요구하는 프로그램을 출시했고, 소비자는 더 많은 자원을 요구하는 소프트웨어 때문에 컴퓨터를 교체하게 되는 순환 방식으로 컴퓨터 산업이 발전했습니다.

- 명령어 세트의 집약, 캐시의 증대

'프로세서 집적도는 약 18개월에서 24개월마다 2배씩 증가한다' - 무어의 법칙

이 법칙에 의해 시간이 지남에 다라 CPU에 들어가는 트랜지스터의 수가 증가하여 더 많은 명령어와 캐시를 탑제하였습니다.

● 많은 하드웨어 명령어 추가로 인한 효과

R = a * b + c * b;

일반 사람들이 생각하는 CPU의 행동은 2번의 곱셈을 한 후에 다시 그 결과를 더하는 과정을

생각 할 것입니다. 새로운 CPU가 개발 되면서 기존의 3번의 클록 연산으로 계산하던 것을 1번의

클록 계산으로 2번의 곱셈과 한 번의 덧셈 결과를 돌려주는 기능이라 가정한다면,,, 이 명령어로 인한 효과는 1/3의 처리 시간의 단축을 가져오게 될 것입이다. 이처럼 연산 횟수를 줄일 수 있는 하드웨어 명령어 세트를 수없이 추가 해왔습니다.

● CPU 내부 캐시의 증가 효과

하드웨어에 저장된 정보는 메모리와 캐시를 거처 레지스터에 올라와 CPU 연산을 수행합니다.

전송 속도는 레지스터 > 캐시 > 메모리 > 하드웨어(하드디스크) 순서이고 보통 메모리 보다 캐시의 속도가 10배정도 빠르게 됩니다. 이처럼 캐시의 증가라는 하드웨어의 발전 덕에 기존 프로그램이 자연스럽게 처리속도가 빨라졌습니다.

 

04. 전력, 발열의 문제

CPU 클록 소도는 도선의 깊이를 짧게 하여 전자가 도달하는 길이를 줄이는 방식으로 진행되었습니다. 하지만 도선의 길이를 짧게 할수록 반도체의 신호를 OFF 시켜도 넘어가는 전자들이 생겨났고 이로 인해 전력 사용량이 증가하고 발열도 심해졌습니다. 보통 CPU 동작 클록을 2배 높이면 8배의 전력이 상승합니다.

이로써 CPU 제조사는 전력과 발열량 문제 때문에 클록 속도의 향상을 포기하고 코어를 늘리는 방향으로 전환하게 되었습니다.

 

05. 순차 프로그램 -> 병렬 프로그램

코어를 2개로 느리면 전력은 약 2배만 증가하기 때문에 전력의 문제를 피했습니다. 하드웨어의 문제는 해결되고 공은 소프으웨어로 넘어오게 되었습니다. 코어의 수가 많아 질 수록 클록 속도는 증가하지 않지만 처리하는 양이 늘어나게 되어 공짜 점심은 끝나게 된 것입니다.

CPU의 코어와 프로그램의 스레드는 일대일 매칭됩니다. 순차 프로그램은 시작에서부터 끝까지 하나의 스레드로 실행하게 되는데 2개의 코어를 가진 CPU에서는 1/2의 자원만 사용하게 됩니다.

반면에 2개의 스레드를 생성하면 2배 처리를 할 수 있고 병렬 구간은 1/2로 처리 시간이 감소하게 됩니다.

하지만 병렬 프로그래밍으로 개발하기 위해서는 여러가지 난관이 있습니다.

- 병렬 프로그램의 설계 방법이 다릅니다.

: 순차 프로그램에 없던 복수의 스레드가 있고 스레드 간에 작업을 배분해주어야 하는 문제가 발생

- 기존 프로그램에서 순차적으로 진행되던 순서가 불확실합니다.

: 동기화 같은 버그 문제

- 유지 보수가 힘들어진다.

 

06. 병목구간은 한군데가 아니다.

과거의 프로젝트는 중요한 부분을 한두군데 정하여 병렬화하였습니다. 어렵기때문에...

이것에 대한 문제점을 암달의 법칙을 통해 알아보겠습니다.

암달의 법칙은 프로그램은 병렬화할 수 없는 순차 영역과 병렬 영역이 존재하게 되고 전체 프로그램의 성능은 이를 합산한 결과를 말합니다. 코어와 스레드의 증가로 병렬 영역의 속도가 향상되어도 전체 프로그램에서는 일부분의 개선에 불과하기 때문에 한계가 있습니다.

예로 들자면 어떤 프로그램에서 병렬화하여 속도 개선이 가능한 부분과 순차적 부분이 50%씩 존재하고, 병렬 영역 4배 바르게 병렬처리 가능하다고 가정한다면... 암달의 법칙은

  • 병렬화 전 프로그램 수행 시간 T1 = Ts + Tp, T2 = Ts + (Tp / 4) 가 됩니다.
  • 성능 개선 효과를 비율로 나타내면 T1 / T2 -> 2 / 1.24 = 1.6 이 됩니다.
  • 병렬 영역을 4배 개선했지만 순차영역에 의해 전체 프로그램은 약 1.6배가 개선된 것입니다.
  • 50%의 병렬 영역을 무한대로 성능을 향상 시켜도 프로그램 효과는 2배 이상 얻을 수 없습니다.

성능 개선 효과 = 1 / ((1 - Tp) + (Tp / N))

Tp : 병렬화할 수 있는 영역 N : 병렬화로 얻을 수 있는 효과 또는 프로세서 개수

이는 프로세서의 코어가 증가하는 비율로 프로그램의 성능이 향상되지 않는다는 뜻을 가집니다.

프로그램 성능은 순차영역 때문에 비효율적이 되며, 이것에 의해 코어 수의 증가를 통한 하드웨어 발전도 한계에 도달할 것을 예측할 수 있습니다.