본문 바로가기

3.구현

멀티코어/멀티프로세스 캐쉬

들어가기

멀티코어는 한 프로세스에 여러개의 코드가 있는 CPU이고 멀티프로세스는 물리적으로 CPU가 여러 개가 있다. 물리적으로라는 말도 어색한게 지금은 물리적으로 한 개처럼 보이개 만들기도 하기 때문이다. 그래서 여기서는 특별하게 분리하지 않고 캐쉬 관점에서 다룰려고 한다.

작성자: ospace114@empal.com, http://ospace.tistory.com/

False Sharing

cache coherence 문제가 있는데 L2캐쉬는 공유되지만 L1캐쉬는 코어별로 존재한다. 각 코어별로 L1캐쉬에 같은 데이터가 있고, 한 코어가 데이터를 수정한다면 어떻게 될까? 코어에 의해 수정된 데이터가 Write-Back에 의해 먼저 L1캐쉬에 저장되고 캐쉬가 eviction될때에 L2캐쉬에 저장되고, 다시 메모리로 저장된다. 다른 코어가 이 데이터를 L2캐쉬 갱신 전에 읽는다면 수정 전에 값을 읽는데 이를 캐시 일관성cache coherence이 깨지게 된다.

MESI에 의해 같은 데이터를 다른 캐쉬에도 있다면 값 변경 메시지는 보내서 동기화시킨다. MESI는 캐쉬의 4가지 상태인 Modified, Exclusive, Shared, Invalid의 첫글자로 만들었다. Shared는 데이터가 여러 코어에서 공유되고 있다는 의미이고, 데이터 수정위해서는 캐쉬를 invalid로 변경하고, 값을 수정하면 modified상태로 바뀐다.
다른 코어에서 값을 읽을 경우 캐쉬로 새로 가져와야 하므로 시간이 많이 걸린다. 위 동작이 바이트 단위가 아닌 캐쉬 라인으로 보통 64바이트 단위로 수행된다. 이는 spatial locality를 이용하기 위함이다.

캐시관련 모든 작업은 캐쉬라인 단위로 수행된다. 즉, 캐쉬라인에서 다른 코어가 사용하는 데이터는 다른 위치이지만 같은 캐쉬라인에 존재할 수 있다. 이때마다 invalid가 발생하면서 공유하는 데이터가 아닌데도 캐쉬에 새로 읽어오는 false sharing이 발생한다. 이를 해결하는 간단한 방법은 캐쉬라인 만큼 패딩을 채우면 된다.

Processor Affinity

서로 다른 코어에 할당된 쓰레드 간에 같은 데이터를 공유하는 경우 캐쉬를 새로 가져와서 성능 저하가 발생한다.
쓰레드를 특정 코어에 할당하여 오버헤드 줄일 수 있다.

// Windows  
BOOL SetProcessAffinityMask(HANDLE hProces, DWORD\_PTR dwProcessAffinityMask);  
DWORD\_PTR SetThreadAffinityMask(HANDLE hThread, DWORD\_PTR dwThreadAffinityMask);  
// Linux  
int sched\_getaffinity(pid\_t pid, size\_t cpusetsize, cpu\_set\_t \*cpuset);  
int sched\_setaffinity(pid\_t pid, size\_t cpusetsize, const cpu\_set\_t \*cpuset);

주의할 점은 항상 같은 코어에 부하가 몰릴 수 있다.

Cache Blocking

반복문 실행시 사용될 데이터가 캐쉬라인에 존재하도록 한다. 반복시 한 번 사용되고 버려지는 경우 최악의 캐쉬 성능을 보여준다. 이 경우 데이터를 잘개 잘라서 작은 반복문으로 처리한다.

Hold Approach

읽기와 쓰기가 자주 발생하는 경우 local copy를 사용하여 캐쉬효율을 높일 수 있다. Thread Local Storage나 Local Variable을 사용한다.

Avoid False Sharing

앞의 False Sharing문제를 해결하는 방법으로 공유되지 않은 데이터는 다른 캐쉬라인에 두는 방법으로 패킹을 추가하거나 다른 메모리에 할당한다. 또는 local 영역에 저장해서 사용한다.

결론

CPU에서 캐시에 대해서 간단하게 살펴보았다. 캐시를 어떻게 활용하는가에 따라서 성능 차이가 확연하게 난다. 특히 데이터를 처리가 많은 CPU인 경우 더 크게 나타난다. 부족한 글이지만 여러분에게 도움이 되었으면 하네요. 즐프하세요. ospace.

반응형

'3.구현' 카테고리의 다른 글

자체 문서화 코드  (0) 2024.01.17
유니코드(Unicode)란  (0) 2023.12.30