멀티코어와 동기화
스레드별 카운터를 「long cnt[8];」처럼 나란히 둔 배열에서 거짓 공유가 발생하고 있다. 대책으로 가장 적절한 것은?
- A카운터의 타입을 long에서 int로 바꿔 배열을 작게 만든다
- B각 카운터 사이에 패딩을 넣거나 정렬(align)하여 서로 다른 캐시 라인에 둔다
- C스레드 수를 늘려 대기 시간을 분산시킨다
정답과 해설 보기
정답: B. 각 카운터 사이에 패딩을 넣거나 정렬(align)하여 서로 다른 캐시 라인에 둔다
long이 8바이트라면 카운터 8개는 64바이트짜리 하나의 라인에 들어가, 모든 스레드가 같은 라인을 두고 다툽니다. 각 카운터를 64바이트 간격으로 배치하도록 패딩을 넣거나 구조체를 캐시 라인 크기로 정렬하면, 스레드마다 다른 라인을 사용할 수 있습니다. 또한 각 스레드가 지역 변수로 세다가 마지막에 한 번만 공유 위치에 더하는 방법도 효과적입니다.
- A. 작게 만들면 오히려 같은 라인에 더 촘촘히 들어갑니다.
- B. 맞습니다. 라인을 나누면 오가는 일이 없어집니다.
- C. 스레드가 늘어나면 라인이 오가는 일이 오히려 늘어납니다.