거짓 공유를 설명하기 전에 필요한
캐싱과 지역성에 대해 먼저 설명 하겠습니다
캐싱의 기본은 지역성에 근거하는데
지역성(Locality)은 아래의 추정에 근거합니다
1. 지금 읽힌 데이터는 이후에도 자주 사용될 가능성이 높다.
2. 지금 읽힌 데이터와 인접한 데이터는 이어서 사용될 가능성이 높다.
멀티 코어 CPU는 데이터를 읽어올 때, 캐시 라인 (cache line)이란 단위로 읽어옵니다.
캐시 라인이라 함은 지역성에 근거해 인접한 데이터를 미리 읽어옴으로써 속도향상을 노리는 것이지요.
하지만 이는 장점이자 독이 되기도 합니다.
이제 본론으로 들어가면
False Sharing 이란 멀티코어 환경에서 각각의 코어에서 접근하고 있는 데이터가 같은 cache line에 있어서 실제로 공유하는 데이터가 아님에도 하드웨어(프로세서)에서는 이를 공유하는 것으로 착각하여 cache coherence 트래픽이 발생하는 것을 의미한다.
그림을 보면, 2개의 스레드가 서로 다른 데이터를 접근하는데 이 데이터가 같은 Cache line에 들어있게 되며
실제로 인접메모리일 뿐 동시 접근이 일어나지 않는 코드라고 하더라도,
해당 코드가 어떻게 작성되었는지는 중요치 않습니다.
캐시 라인은 인접 메모리 접근만으로도 성능 손해를 보면서라도
데이터의 유효성을 높이고자 하는 판단을 내릴 수 밖에 없습니다.
심각한 경우 성능 하락의 원인이 되기도 합니다.
해결하기 위해서는 간단한 방법으로 data structure 에 적절한 padding(dummy) 을 삽입하여서 막는 방법이 있다. 좀더 나은 방법으로는 data structure 를 각 스레드에 맞도록 privatization 하는 방법이 있다.
결국 메모리를 손해보더라도 속도에서 이득을 보라는 얘기죠.
댓글 없음:
댓글 쓰기