Search
Duplicate
🥕

캐시 메모리는 프로그래머가 제어하지 않는지 궁금합니다.

간단소개
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
CS
Scrap
태그
9 more properties

Q)

1. CPU에 내장된 L1, L2, L3 캐쉬 메모리는 프로그래머가 제어하지 않는지 궁금합니다. 2. 요즘은 다중 코어 CPU 가 개인용 컴퓨터에 일반적인데, 각 코어별로 레지스터(범용, mmx, sse, avx 등)들은 각 코어별로 가지고 있는건가요?

A)

프로그래머는 일반적으로 캐시를 직접 제어할 수 없습니다. 해당 데이터가 어떠한 캐시 레벨에 있는지도 직접 알 수 없습니다. (물론 데이터 접근속도를 체크하여 간접적으로 알 순 있습니다. 이는 2018년 CPU 최대 보안게이트인 멜트다운의 핵심 아이디어가 됩니다.) 다만 몇 가지 제한된 명령어는 제공합니다. 1. 캐시을 통하지 않고 곧바로 메인메모리에 읽거나 쓰는 simd의 non-temporal hint(movntq 등) 2. 캐시 레벨을 강등시키는 CLDEMOTE(https://www.felixcloutier.com/x86/cldemote) 3. 캐시를 flush 하는 CLFLUSHOPT(https://www.felixcloutier.com/x86/clflushopt) 4. 캐시 prefetch 힌트 PREFETCHWT1 (https://www.felixcloutier.com/x86/prefetchwt1) 5. 등... 1번의 non-temporal hint는 3N 면접에 나왔다고도 들어서 꽤 쓰는 것 같지만 나머지는 잘 쓰지 않는 것 같습니다. (nt hint 는 다음 글 참고 https://80000coding.oopy.io/551ed685-37b2-480c-aaa3-8f4996e26c4f) 과거에는 cache prefetch를 프로그래머가 직접 하는 경우가 꽤 있었고 하드웨어에서도 그것을 명령어로 지원했던것으로 압니다만, 현대 CPU에서는 "힌트"(CPU가 무시할 수 있음) 수준으로만 주로 제공합니다. (Xeon 시리즈에서는 예외적으로 캐시 관련 명령어를 좀 더 지원해주는 것 같습니다) 이유는 Cache와 Hardware cache prefetcher가 엄청 발전했기 때문입니다. 현대 CPU의 cache prefetcher는 데이터의 접근 패턴을 분석하고, 다음에 접근할 데이터를 예측하여 미리 cache를 prefetch 할 수 있습니다. 그래서 프로그래머가 직접 캐시를 제어하는것 보다, cache friendly한 자료구조를 사용하고 데이터 접근 스탭 패턴을 일정하게 하는것이 오히려 더 많은 성능을 낼 수도 있습니다. (https://en.wikipedia.org/wiki/Cache_prefetching) 예로, 2차원 배열을 순회할 때,
for (int i : row) for (int j : col) arr[i][j]
Plain Text
복사
위와 같이 row/col 순으로 접근하는게, col/row 순으로 접근하는 것 보다 빠릅니다 (캐시라인 때문). 하지만 col/row 순으로 접근해도 "그렇게 까진" 느리진 않습니다. 왜냐하면 col/row 순의 데이터 접근 패턴이 일정하기 때문에 hardware cache prefetcher가 다음 데이터를 예측해서 미리 prefetch 하기 때문입니다. row/col, col/row, ramdomly 배열 접근을 측정해보시면 랜덤하게 접근하는 속도가 매우 뒤떨어집니다 row/col < col/row <<<< ramdomly
2. 각 코어마다 고유의 Physical Register File을 가집니다. [1](full overview of the Intel Skylake microarchitecture.)
SMT(HyperThread) 에서도 각 논리스레드가 각각의 레지스터를 가집니다. (Intel Architecture Software Optimization manual chapter 2.3.9.)
Duplicated for each HT thread: the registers, the return stack buffer, the large-page ITLB
Statically allocated for each HT thread: the load, store and re-order buffers, the small-page ITLB
Competitively shared between HT threads: the reservation station, the caches, the fill buffers, DTLB0 and STLB.
51