멀티코어와 동기화

Linux의 NUMA 시스템에서 자주 사용되는 퍼스트 터치(first-touch) 정책(처음 페이지에 쓴 스레드가 동작 중인 노드의 메모리에 그 페이지를 배치)에서 주의해야 할 점으로 올바른 것은?

  1. A퍼스트 터치에서는 페이지가 무작위 노드에 배치된다
  2. Bmalloc을 호출한 시점에 모든 페이지의 배치 장소가 결정된다
  3. C큰 배열을 하나의 스레드만으로 0으로 초기화하면 전부가 하나의 노드에 배치되어, 다른 노드의 스레드가 먼 메모리를 사용하게 된다
정답과 해설 보기

정답: C. 큰 배열을 하나의 스레드만으로 0으로 초기화하면 전부가 하나의 노드에 배치되어, 다른 노드의 스레드가 먼 메모리를 사용하게 된다

malloc으로 확보만 해서는 물리 페이지가 할당되지 않으며, 처음 쓸 때의 페이지 폴트에서 그 스레드가 있는 노드의 메모리에 배치됩니다. 그래서 초기화를 하나의 스레드로 수행하면 배열 전체가 그 노드에 모이고, 병렬 계산에서 각 스레드가 담당하는 부분의 상당수가 먼 메모리가 됩니다. 초기화도 계산과 같은 분담으로 병렬 수행하면, 각 부분이 담당 스레드 가까이에 배치됩니다.

  • A. 무작위가 아니라 처음 접근한 스레드에 의해 정해집니다.
  • B. malloc 시점이 아니라 처음 쓰는 시점에 정해집니다.
  • C. 맞습니다. 초기화도 나중에 사용할 스레드에게 분담시키는 것이 기본입니다.
이 분야 연습하기 분야로 돌아가기

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

  1. 병렬 프로그램에서 코어 수를 늘려도 성능이 기대만큼 늘지 않는 원인으로 해당하지 않는 것은?
  2. 루프의 반복을 여러 스레드로 나눌 때, 반복마다 계산량이 크게 들쭉날쭉한 경우에 적합한 나누기 방법은?
  3. 배열의 모든 요소의 합계를 여러 스레드로 구할 때, 성능을 위해 적합한 방법은?
  4. 읽기-쓰기 락(reader-writer lock)의 특징으로 올바른 것은?
  5. 카운터가 있는 세마포어(counting semaphore)의 사용법으로 가장 적절한 것은?

이 분야의 비교