멀티코어와 동기화

스레드별 카운터를 「long cnt[8];」처럼 나란히 둔 배열에서 거짓 공유가 발생하고 있다. 대책으로 가장 적절한 것은?

  1. A카운터의 타입을 long에서 int로 바꿔 배열을 작게 만든다
  2. B각 카운터 사이에 패딩을 넣거나 정렬(align)하여 서로 다른 캐시 라인에 둔다
  3. C스레드 수를 늘려 대기 시간을 분산시킨다
정답과 해설 보기

정답: B. 각 카운터 사이에 패딩을 넣거나 정렬(align)하여 서로 다른 캐시 라인에 둔다

long이 8바이트라면 카운터 8개는 64바이트짜리 하나의 라인에 들어가, 모든 스레드가 같은 라인을 두고 다툽니다. 각 카운터를 64바이트 간격으로 배치하도록 패딩을 넣거나 구조체를 캐시 라인 크기로 정렬하면, 스레드마다 다른 라인을 사용할 수 있습니다. 또한 각 스레드가 지역 변수로 세다가 마지막에 한 번만 공유 위치에 더하는 방법도 효과적입니다.

  • A. 작게 만들면 오히려 같은 라인에 더 촘촘히 들어갑니다.
  • B. 맞습니다. 라인을 나누면 오가는 일이 없어집니다.
  • C. 스레드가 늘어나면 라인이 오가는 일이 오히려 늘어납니다.
이 분야 연습하기 분야로 돌아가기

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

  1. 데이터 레이스(data race)에 대한 설명으로 올바른 것은?
  2. 위 코드를 두 스레드에서 동시에 실행하면 counter의 최종 값이 200000보다 작아지는 경우가 있다. 그 이유로 올바른 것은?
  3. 아토믹 명령(atomic instruction, 불가분 명령)에 대한 설명으로 올바른 것은?
  4. 아토믹 명령 CAS(compare-and-swap)의 동작으로 올바른 것은?
  5. 위 코드는 CAS(&p, 기대값, 새 값)를 사용하여 공유 변수 counter를 2배로 만들고 있다. CAS가 실패하여 루프를 다시 도는 경우는 언제인가?

이 분야의 비교