[ NUMA ] 캐쉬 일관성 (Cache Coherence) 문의

   조회 4397   추천 0    

1-3. NUMA <- 발췌 from http://blog.naver.com/PostView.nhn?blogId=bomyzzang&logNo=220906611725

여러 프로세서가 동시에 동일한 데이터가 필요할 경우 메모리 뱅크들 사이로 데이터를 이동하기 때문에 성능이 떨어 질 수 있다. 그렇기 때문에 무조건적으로 효율이 좋은 것은 아니므로 프로세스가 로컬메모리를 사용하도록 하는게 최적화의 키 포인트이다. 그리고 CPU에 달려있는 작은 크기의 비공유 메모리(CPU캐시라 불리우는 것)가 있는데 기본적인 NUMA 형태는 프로그래밍 상으로 공유 메모리에 대해서 캐시 일관성(Cache Coherence)을 유지하기 어렵기 때문에 대부분의 NUMA 시스템은 ccNUMA(cache-coherence NUMA)형태로 하드웨어적으로 구현하여 제공하고 있다.


 NUMA 관련 시험 중 인데, 하기 내역이 저에겐 모호하게 느껴 져서요.

질문) 상기 내용에서 캐쉬 일관성의 쉬운 의미 및 NUMA 노드가 캐쉬 일관성 유지가 어려운 이유가 궁금합니다.


감사합니다.

짧은글 일수록 신중하게.
백두성 2017-03
캐시 일관성 및 NUMA 관련은 각각
https://ko.wikipedia.org/wiki/%EC%BA%90%EC%8B%9C_%EC%9D%BC%EA%B4%80%EC%84%B1
https://ko.wikipedia.org/wiki/%EB%B6%88%EA%B7%A0%EC%9D%BC_%EA%B8%B0%EC%96%B5_%EC%9E%A5%EC%B9%98_%EC%A0%91%EA%B7%BC
를 보시는게 좋겠네요.

요즘 시스템이 다중 Core CPU가 일반적이고,
2-CPU (2-Way)이상의 NUMA 시스템들도 일반 적이기 때문에
서로 다른 Core에서 동작중인 thread간 공유 메모리의 값을 일치시켜 주어야 하는 문제가 생깁니다.
이것이 캐시 일관성입니다..
위키 백과의 내용처럼 core 1에서 동작중인 thread가
해당 core 로컬 캐시인 L1 캐시의 공유 변수 X에 대한 값을 변경하고
동시에 core2의 thread가 해당 core L1 캐시에 있는 같은 공유 변수 X에 대한 변경을 시도할때,
같은 X값에 대해 서로 다른 값이 될 수 있는 상황이 흔히 발생합니다.
따라서 모든 코어의 L1 캐시에 같은 address를 갖는 값에 대한 일관성을
어떻게 유지해 줄것이냐의 문제가 Cache Coherence 입니다.

Single CPU인 경우의 Core간 속도 차이가 없는,
버스를 사용해 broadcast로 일치 시켜주면 되어 간단하겠지만,
캐시 일관성을 지원하지 않는 NUMA의 경우 다른 CPU를 거치게 되면,
로컬에 비해 신호를 전달하는데 속도 차이가 발생하여,
서로 다른 CPU에서 동시에 같은 주소 값에 대한 변경이
이루어 질때, 속도 차이로 인해 발생하는 충돌문제를 CPU 우선순위 등등을 고려해
관리해주어야 한다는 점 때문에 어렵다는 것으로 생각됩니다.

하지만 캐시 일관성 모드를 해지하지 않는 이상
직접 프로그래밍 할일은 없으니,
실제 병렬 프로그래밍을 하는 입장에서는 위와 같은 문제로 발생할 수 있는,
thread 대기시간에 따른 성능 저하를 고려해 
되도록 대기 시간을 줄일 수 있도록,
같은 CPU 주변 코어에서 같은 데이터를 공유하는 thread가 배치되도록 하는 등의,
core관리를 하는게 중요합니다.

NUMA쪽은 주변 I/O(PCI-e) 도 같은 문제가 발생하기 때문에, DMA등과 함께
역시 thread 배치가 중요합니다.
위에서 말한 cache coherency는 각 CPU별 cache들 사이의 coherency인 것 같네요. 동일한 memory에 대한 cacheline이 각 CPU별로 존재한다고 할때, 한 CPU에서 발생한 write에 대해 다른 CPU의 cacheline이 update될 수 있는가 하는 건데요. SMP 또는 UMA라고 부르는 방식은 보통 memory cross-bar라고 하는 공통된 통로를 통해서 memory에 접근합니다. 그래서 어떤 CPU든 바라보는 memory의 view는 동일하고, 이 cross-bar 상단에 위치하는 unified cache를 경유해서 snoop control을 하기도 수월한 구조가 됩니다. NUMA는 일단 각 CPU가 각자의 memory controller와 local memory를 가지는 구조입니다. 물론 다른 CPU가 가진 remote memory에도 접근은 가능하지만 local memory 대비 접근 cost가 높습니다. 기본적으로 각 CPU 또는 cluster가 따로 놀기 좋은 구조이기 때문에, snoop control 자체가 불가능한 것은 아니지만 아무래도 cost도 높고 UMA에서처럼 cross-bar를 lock한 상태로 어떤 atomic operation을 하는 등의 처리는 어려운 구조가 됩니다.
두 분 답변 감사합니다.
설명을 듣고 보니, 동일 변수의 값에 CPU별로 다른 경우에, 어떻게 인지 및 해결하는지 궁금하네요
'다운힐'님의 글을 보니, CPU별로 해당 변수 값이 변경되었는지 감시(SNOOP)하는 방법이 있는 거 같긴한데.


QnA
제목Page 5256/5715
2014-05   5191131   정은준1
2015-12   1724139   백메가
2023-12   2673   포스트맨
2015-02   7257   김제연
2016-04   4585   주태백
2020-10   6283   집구석
2011-01   8816   경박한시민
2015-02   8407   엠브리오
2019-08   3237   무아
2023-12   1791   ClubMJ
2017-03   4398   전설속의미…
2023-12   2131   Kimmandu
2011-02   9240   정지혁
2011-02   5868   한태동
2016-04   12624   퍼싱글
2016-04   4345   블랙
2017-04   4081   김건우
2011-03   7945   안형곤
2016-04   4018   카르하타
2024-01   1054   삐돌이슬픔이
2015-02   5689   김현린
2018-07   6068   LSSAH