병렬처리를 한다고 무조건 성능 향상이 되는 것은 아닙니다. 병렬처리를 하여 성능이 향상될 수 있는 부분이 존재할 때 성능이 향상될 수 있습니다. 병렬처리를 하여 성능이 향상되는 부분이란 쉽게 이야기 하여 처리를 여러 개의 코어에서 나누어 연산할 수 있는 부분을 의미합니다.
병렬처리를 통한 성능 향상은 전체 처리의 관점에서 보아야 합니다. 부분에서의 몇 백%의 성능 향상을 할지라도 그게 전체 처리에서의 몇 백%의 성능 향상을 의미하지는 않기 때문입니다.
그럼, 병렬처리를 통하여 어느 정도의 성능 향상을 가져올 수 있을까요?
이 문제에 대하여 이론적인 계산을 가능하게 하는 방법이 암달의 법칙입니다.
암달의 법칙은 연산의 P비율만큼만 병렬화가 가능하여 S만큼의 성능 향상이 있을 경우, 최대 속도 향상은 1 / ((1-P) + P/S)로 정의됩니다.
간단히 아래 예로 암달의 법칙을 살펴보겠습니다.
위의 예에서 각각의 네모는 동일한 처리량의 크기를 나타내고 한 행을 한 단계로 가정하겠습니다. 위의 예를 보면 직관적으로 2번째 단계의 3개 네모를 동시에 실행한다면, 3개의 코어가 각 1개씩 실행한다고 했을 때 성능이 향상된다는 것을 알 수 있습니다. 위의 예에서 동시에 실행하여 성능을 향상할 수 있는 부분은 2단계뿐입니다. 암달의 법칙으로 위의 예를 풀어보면 아래와 같습니다.
동일한 가중치를 갖는 4단계 중 1단계만 병렬화가 가능할 경우 성능 향상은 P는 1/4 = 0.25가 되며 S는 병렬 처리다 될 경우 처리 성능은 1개로 실행하는 것에 비하여 3배가 되므로 3이 됩니다.
이를 바탕으로 암달의 법칙으로 계산하면 아래와 같습니다.
1/(1-0.25+0.25/3) = 1/0.83 = 1.2
즉 최대 20%의 성능 향상을 얻을 수 있다는 것을 알 수 있습니다.
참고로 암달의 법칙은 개인적인 경험상 프로그램 튜닝을 할 때에도 대략적인 성능 향상 계산이나 사고에 유용합니다.
'강좌' 카테고리의 다른 글
C++ boost 메모리풀 강좌 #3: singleton_pool 클래스를 이용하여 일반 클래스에 메모리풀 적용하기 (0) | 2021.11.13 |
---|---|
C++ boost 메모리풀 강좌 #2: pool 클래스를 이용하여 버퍼에 메모리풀 적용하기 (0) | 2021.11.12 |
C++ boost 메모리풀 강좌 #1: 메모리풀의 개념 (0) | 2021.11.11 |
병렬처리 개념 강좌: #6 설계 관련 팁 (0) | 2021.11.09 |
병렬처리 개념 강좌: #5 설계 관련 3가지 생각 포인트 (0) | 2021.11.08 |
병렬처리 개념 강좌: #4 2가지 종류의 병렬처리 (0) | 2021.11.07 |
병렬처리 개념 강좌: #2 병렬처리가 대중화되는 배경 (0) | 2021.11.05 |
병렬처리 개념 강좌: #1 병렬처리의 개념 (0) | 2021.11.04 |