멀티코어와 동기화
배열의 모든 요소의 합계를 여러 스레드로 구할 때, 성능을 위해 적합한 방법은?
- A모든 스레드가 요소마다 하나의 공유 변수에 락을 잡고 더한다
- B모든 스레드가 요소마다 하나의 공유 변수에 동기화 없이 더한다
- C각 스레드가 자신의 담당분을 지역 변수로 합산하고, 마지막에 그것들을 한 번씩 더한다
정답과 해설 보기
정답: C. 각 스레드가 자신의 담당분을 지역 변수로 합산하고, 마지막에 그것들을 한 번씩 더한다
요소마다 공유 변수를 갱신하면 락이나 아토믹 명령의 대기와 캐시 라인의 오감으로 매우 느려집니다. 각 스레드가 레지스터나 지역 변수로 부분합을 구하고, 마지막에 스레드 수만큼의 덧셈으로 전체 합을 내면 공유 쓰기는 극히 적습니다. 이 방법을 리덕션(reduction)이라 부르며, OpenMP 등의 병렬화 메커니즘에도 내장되어 있습니다.
- A. 락 대기와 통신으로 병렬화의 효과가 거의 사라집니다.
- B. 데이터 레이스로 합계가 올바르지 않게 됩니다.
- C. 맞습니다. 리덕션이라고 불리는 방법입니다.