Parallel & Distributed Computing

조유정·2023년 9월 14일

영남대학교 곽종욱 교수님께서 강의하시는 <클라우드 컴퓨팅>을 수강하고 정리한 글입니다.
- 2023.09.08 강의 정리


시대가 변하는 중

무어의 법칙이라고 아는가?
1998-2002년, 마이크로프로세서가 폭발적으로 성장하던 시기였다.
1년에 50%라는 미친 성장률을 보여주었는데, 이를 무어의 법칙이라고 불렀다.

무어의 법칙: 프로세서가 1년 주기로 50% 향상된다.

소프트웨어 개발자들은 딱히 알고리즘에 손대지 않아도, 시간이 조금만 지나면 프로그램이 개선되는 상황이었다. 소프트웨어 성능을 올리는데 소프트웨어 개발자는 아무것도 안해도 됐음 ㅇㅇ...

근데 이제는??
프로세서 개발 성장률이 영원히 올라갈까??
당근 아님. 현재는 1년에 고작 20% 정도.

왜 그렇게 됐을까?
프로세서 성능이 빨라졌다는 것은 프로세서가 빠르게 움직인다는 것이다.
즉, clock 속도가 빠르다는 것이다.

박수치는 것만 생각해봐도 알 수 있다.
천천히 박수칠 때와 빠르게 박수칠 때의 차이점은... 힘들다는 것이다...
땀도 날테고...

clock 속도가 빠를수록 전기를 많이 쓰게 되는데, 전기를 많이 쓰면 절로 열이 많이 발생한다.
열이 손 쓸 수 없게 많이 나버리게 된 시점에서 프로세서 성장률이 꺾이게 되었다.

새로운 해결방안

마이크로프로세서 성장률이 곤두박칠 치는 상황에서 가만히 있을 수는 없다.
그래서 나온 새로운 해결방안은 프로세서를 여러개 써보는 것이었다.

프로세서를 빠르게 만들기 -> 프로세서를 여러 개 쓰기

조금 더 생각해보기

근데 이게 과연 단순한 일일까??
그냥 프로세서 여러 개 박아넣으면 저절로 성능이 올라갈까?

프로세서를 여러 개 사용한다는 것은 프로그램을 병렬화하여 실행시킨다는 것이다.
프로그램이 실행되는 부분을 쪼갈라서, 각각 실행시키고, 결과를 모아서, 짜잔~

근데
프로그램을 짜다보면 분명 저렇게 쪼가르기가 안되는 알고리즘이 있다.
이렇게 병렬화가 되지 않는 부분이 많아지면, 프로세서를 여러 개 넣어본다하더라도 효과가 크진 않을 것이다.

왜! 병렬화가 되지 않는 부분이 많으면 프로그램 성능이 크게 증가하지 않는가에 대한 설명을 하기에 앞서, 프로그램 성능에 영향을 미치는 요인들에 대해 생각해보자

p = Number of cores // 코어의 개수
T_serial = serial run-time // 직렬 실행시간
T_parallel = = Parallel run-time // 병렬 실행시간
S = Speedup // 실행시간 향상정도
E = Efficiency

코어 개수와 실행시간의 관계

p개 코어로 프로그램을 실행하면 병렬 프로그램이 직렬 프로그램보다 p배 빠르게 실행된다.
T parallel = T serial/ p의 관계에서 병렬 프로그램이 선형 속도 향상을 갖는다고 말할 수 있다.
(곱하기 아니라 나누기인데 고치기 귀찮)

속도 향상과 실행시간의 관계

속도 향상은 다음과 같이 정의할 수 있다.

프로그램의 효율성을 높이기 위한 방법

즉, S가 증가하고 p가 감소할수록 프로그램 성능이 향상될 것이다.
따라서 다음과 같이 Efficiency를 정의할 수 있다.

조금 더더 생각해보기

문제 성능에 영향을 끼칠 요인이 저게 전부일까?

실제로 코어 개수에 따라서 S가 선형적으로 증가하고, E가 선형적으로 감소하지 않는다.
왜냐하면 오버헤드가 있으니까.
프로그램을 쪼가르는 시간, 쪼가른 애들끼리 데이터 주고 받는 시간, 계산결과를 합치는 시간... 등등...

이런 오버헤드 때문에 프로그램 크기에 따라 S, E가 다르게 측정된다.
아무래도 프로그램 크기가 크면, 프로그램 전체 실행시간 중에서 오버헤드가 차지하는 부분이 적을 것이기 때문이다.

프로그램 크기가 클수록, 코어 개수를 늘림에 따라 프로그램 성능 향상 정도가 커진다.

프로그램 크기가 클수록, 코어 개수를 늘림에 따라 속도 향상 정도(S)가 커진다. 프로그램 크기가 클수록, 코어 개수를 늘림에 따라 효율성(E) 감소 정도가 작아진다.

Amdahl의 법칙

대략적으로 말하면,
사실상 병렬화되지 않는 직렬 프로그램이 존재한다면 코어 개수와 관계없이 속도 향상은 제한된다.

P : 병렬화 가능한 부분
1-P : 병렬화 불가능한 부분
N : 코어 개수

분모에 있는 값이 작을수록 속도가 향상될 것이다.
직렬 프로그램: (1 - P)
병렬 프로그램: P / N

P는 변하지 않는 값이기에
병렬 프로그램 값을 줄이려면 코어 개수(N)을 늘리면 되는데
직렬 프로그램 값을 줄이려면.. 방법이 없다..

코어 개수를 늘리는게 의미가 있는 것일까??
병렬화 가능한 부분을 늘리는 게 더 이득인 거 같은데????????

병렬화 가능한 부분이 많을수록, 코어 개수가 늘어남에 따라 속도 향상 정도가 높다.
병렬화 가능한 부분이 적을수록, 코어 개수가 늘어남에 따라 속도 향상 정도가 낮다.

병렬화 불가능한 부분이 많다면, 코어 개수를 늘려도 SpeedUp에는 한계가 있다.
코어 개수를 늘리는 것은 의미가 없고, 병렬 가능한 부분을 늘려야 한다.

  • 병렬화 가능한 부분을 효율적으로 병렬화 하자.
  • 중요한 것은, 병렬화 가능한 부분을 가능한 많이 늘리는 것이다.
  • 병렬화 불가능한 부분(1-p)을 줄이자.

참고

Performance of Parallel Programming

profile
나는 아직 멍청하다

0개의 댓글