멀티코어와 동기화

멀티스레드 프로그램에서 일어나는 거짓 공유(false sharing)에 대한 설명으로 올바른 것은?

  1. A서로 다른 스레드가 서로 다른 변수를 갱신하고 있는데도, 그 변수들이 같은 캐시 라인에 있어서 라인이 코어 사이를 오가며 느려진다
  2. B두 스레드가 같은 변수를 동기화 없이 갱신하여 값이 깨진다
  3. C스레드끼리 서로의 락을 기다리며 멈춰 버린다
정답과 해설 보기

정답: A. 서로 다른 스레드가 서로 다른 변수를 갱신하고 있는데도, 그 변수들이 같은 캐시 라인에 있어서 라인이 코어 사이를 오가며 느려진다

일관성은 캐시 라인(일반적으로 64바이트) 단위로 관리됩니다. 코어 0이 변수 a, 코어 1이 변수 b만 갱신하더라도 a와 b가 같은 라인에 있으면, 쓸 때마다 상대의 복사본이 무효화되어 라인이 두 코어 사이를 오갑니다. 결과는 올바른데도 성능이 크게 떨어지는 것이 거짓 공유입니다. 스레드별 집계용 배열 등에서 일어나기 쉬운 문제입니다.

  • A. 맞습니다. 데이터는 공유하지 않는데 라인을 공유하게 되는 현상입니다.
  • B. 그것은 데이터 레이스입니다.
  • C. 그것은 데드락입니다.
이 분야 연습하기 분야로 돌아가기

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

  1. 스레드별 카운터를 「long cnt[8];」처럼 나란히 둔 배열에서 거짓 공유가 발생하고 있다. 대책으로 가장 적절한 것은?
  2. 데이터 레이스(data race)에 대한 설명으로 올바른 것은?
  3. 위 코드를 두 스레드에서 동시에 실행하면 counter의 최종 값이 200000보다 작아지는 경우가 있다. 그 이유로 올바른 것은?
  4. 아토믹 명령(atomic instruction, 불가분 명령)에 대한 설명으로 올바른 것은?
  5. 아토믹 명령 CAS(compare-and-swap)의 동작으로 올바른 것은?

이 분야의 비교