멀티스레드 프로그래밍을 시작하기 전에...
일러두기
각 장의 흐름
- 이 장에서 사용할 예제의 원본 소스코드
- 문제 발생
- 원인 분석
- 문제 해결
- 마무리
최소 VS2013 이상의 컴파일러 사용
모든 소스코드는 C++11
을 사용하여 작성되었다. 따라서 C++11
을 정식으로 지원하기 시작하는 VS2013 이상의 버전에서 작성되어야 한다.
CPU는 최소 Intel i5 4코어 이상
Intel의 i3등 4코어 미만의 프로세서를 가지는 CPU로 예제를 실행하면 스레드 수에 따른 속도 향상이 눈에 띄지 않거나 오히려 성능이 역행하는 구간이 발생할 수 있다.
CPU 코어 수에 대한 정보는 시작 -> 실행 -> msinfo32 에서 확인할 수 있다.
필자의 컴퓨터 환경은 Intel® Core™ i7-2600 CPU @ 3.40GHz, 3401Mhz, 4코어, 8논리 프로세서 이다.
모든 소스코드는 Release로 빌드
만약 소스코드를 Release로 빌드하지 않으면 컴파일러 디버깅 옵션에 의해 스레드 수 증가에 따른 성능 향상이 명확히 드러나지 않을 뿐 아니라 일부 예제에서는 문제 발생 상황이 재현되지 않을 수 있다.
멀티스레드 프로그래밍을 해야하는 이유
멀티스레드 프로그래밍에 관심을 가지는 여러분이라면 컴퓨터 공학에서 말하는 무어의 법칙 Moore's law에 대해 들어본 적이 있을 것이다. 무어의 법칙이란 CPU증가가 18개월에서 24개월마다 2배씩 향상된다는 경험적인 관찰에 의한 법칙이다.
위 그래프는 ISSCC의 자료이다. 이 자료에서 우리는 중요한 두가지를 발견할 수 있다. 하나는 2011년 IBM z엔터프라이즈가 5.2GHz의 세계 기록을 세운것 그리고 다른 하나는 더 이상 CPU 클럭 수의 발전이 무어의 법칙에 못 미칠 뿐 아니라 역행하고 있다는 사실이다.
사실 멀티프로세서와 그를 활용하기 위한 멀티스레드 프로그래밍은 최신기술은 아니다. 하지만 그 전까지 컴퓨터의 성능 향상은 주로 CPU 클럭 수 증가로 해결할 수 있었기 때문에 본격적으로 대두되기 시작한 것이 늦었던 것이다. 멀티스레드 프로그래밍은 안던컨데 어렵다. 그럼에도 불구하고 멀티스레드 프로그래밍을 공부하고 활용하는것에 이득은 무엇일까?
암달의 법칙
1967년 진 암달(Gene Amdahl)은 시스템의 어느 한 부분이 향상될 때 전체 컴퓨터 시스템은 얼마나 향상될지를 예측할 수 있는 암달의 법칙을 발표했다. 암달의 법칙에 따르면 프로그램 전체가 두 배 빨라진다면 실제 실행도 두 배 빨라지지만, 프로그램의 절반만 성능을 향상시킨다면 전체 시스템의 성능은 1.33배만 향상된다고 하고 있다.
위 그림은 100만큼의 시간이 걸리는 작업 5개를 처리하는 시스템이다. 병렬 처리를 사용하지 않은 원래 프로그램은 작업량 500, 시간 500으로 1배만큼의 시간이 소요된다.
위 프로그램의 일부를 듀얼코어로 처리하였을 때라면 작업량 500, 시간은 400으로 시간의 1.25배가
쿼드코어로 처리한 경우 작업량 500에 시간 350으로 속도 증가가 1.4배가 되었다.
$$ \begin{aligned} \dot{x} & = \sigma(y-x) \ \dot{y} & = \rho x - y - xz \ \dot{z} & = -\beta z + xy \end{aligned}
$$