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

   조회 4405   추천 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 3732/5718
2014-05   5207732   정은준1
2015-12   1739581   백메가
2017-07   4408   Lucyed
2021-04   4408   가츠
2015-05   4408   쁘삐
2020-05   4408   메가날백
2023-09   4408   아마데우쓰
2017-01   4408   전설속의미…
2014-12   4408   아름다운노을
2015-01   4408   전설속의미…
2015-08   4408   박완경
2018-08   4408   김민철GC
2016-10   4408   조항주Jeonju
2014-04   4408   나비z
2018-06   4408   쿨리스트
2013-11   4408   행아범
2020-02   4408   화란
2016-02   4408   뽀뽀중
2023-11   4408   galaxyfamily
2018-01   4408   김건우
2015-06   4408   슬루프
2013-11   4408   대한민국