멀티코어와 동기화

배열의 모든 요소의 합계를 여러 스레드로 구할 때, 성능을 위해 적합한 방법은?

  1. A모든 스레드가 요소마다 하나의 공유 변수에 락을 잡고 더한다
  2. B모든 스레드가 요소마다 하나의 공유 변수에 동기화 없이 더한다
  3. C각 스레드가 자신의 담당분을 지역 변수로 합산하고, 마지막에 그것들을 한 번씩 더한다
정답과 해설 보기

정답: C. 각 스레드가 자신의 담당분을 지역 변수로 합산하고, 마지막에 그것들을 한 번씩 더한다

요소마다 공유 변수를 갱신하면 락이나 아토믹 명령의 대기와 캐시 라인의 오감으로 매우 느려집니다. 각 스레드가 레지스터나 지역 변수로 부분합을 구하고, 마지막에 스레드 수만큼의 덧셈으로 전체 합을 내면 공유 쓰기는 극히 적습니다. 이 방법을 리덕션(reduction)이라 부르며, OpenMP 등의 병렬화 메커니즘에도 내장되어 있습니다.

  • A. 락 대기와 통신으로 병렬화의 효과가 거의 사라집니다.
  • B. 데이터 레이스로 합계가 올바르지 않게 됩니다.
  • C. 맞습니다. 리덕션이라고 불리는 방법입니다.
이 분야 연습하기 분야로 돌아가기

멀티코어와 동기화의 다른 문제

  1. 읽기-쓰기 락(reader-writer lock)의 특징으로 올바른 것은?
  2. 카운터가 있는 세마포어(counting semaphore)의 사용법으로 가장 적절한 것은?
  3. 캐시 일관성(coherency)과 메모리 일관성 모델(consistency model)의 차이로 올바른 것은?
  4. 하드웨어 트랜잭셔널 메모리(hardware transactional memory)의 개념으로 올바른 것은?
  5. 조건 변수(condition variable)로 「큐가 비어 있지 않게 될 때까지 기다린다」고 할 때, 대기에서 깨어난 뒤 조건을 if문이 아니라 while문으로 다시 확인하는 이유로 올바른 것은?

이 분야의 비교