이글은 케이벤치에 있는 어난드테크의 애슬론 관련 글이었죠 아마. 저도 이글은 이미 이전에 다 읽어봤던것들이네요.
===============================================================================
캐쉬는 많은 캐쉬 라인으로 분배된 표이다. 캐쉬 라인은 개당 몇 바이트 크기이고 애슬론의 경우 라인당 64 바이트이다. 직접 매핑식의 캐쉬 (Direct Mapped Cache)의 경우, 각각의 라인이 메모리의 특정한 부분에 매핑이 된다. D-Cache는 64 KB 이고 64 바이트 라인으로 이루어져 있다. 그러므로 64KB/64B =1024 캐시 라인이 된다.
이제 시스템에 128메가가 있다고 하면 각각의 캐시 라인은 128 MB / 1024 = 128 K로 매핑된다. 정확히 말하자면 메모리의 64의 연속적인 바이트가. 각각이 2K씩 떨어져서 (128K /32바이트) 모두 같은 캐시라인을 공유한다.
예로서 메모리가 1에서 64까지의 셀이 있다면 2k+1에서 2k+64까지의 메모리 셀들은 같은 캐시라인을 공유하고 있는것이다..
직접 매핑 캐쉬(Direct Mapped Cache)에서는 같은 캐쉬에 매핑되어 있는 메모리 셀들에서 데이터를 필요로 하는 경우 문제가 발생하는데, 이것은 서로 캐쉬내에서 밀어 내려 하기 때문이다.
이것의 이점은 캐쉬라인만 특정한 메모리 위치가 캐쉬에 있느냐 없느냐를 캐쉬라인에서만 보면 되므로 찾아내기가 쉽다는 것이다.
애슬론의 128KB의 L1 캐쉬는 64KB의 D-Cache와 64KB의 I-Cache(바이트당 3개의 predecode를 보유한)를 구비한 하바드-아키텍쳐 (분리형) 캐시이다. L1 D-캐쉬는 2-way 세트 조합적이다. 이것이 의미하는 바는 두 개의 라인이 메모리에 매핑된다는 것을 의미한다.
이 경우 메모리의 캐시 라인에 매핑된 부분은 두배로 크지만 (우리의 예에서는 128 MB/ (1024 캐시라인 * 2) = 256 KB) 결과적으로 더욱 증대된 유연성을 가지게 된다.
만약 같은 캐쉬라인으로 매핑된 두 개의 다른 메모리 셀에서 정보를 읽어 오려고 할 때 각각의 캐쉬라인을 검색하게 될 것이지만 이것은 또한 이 정보가 캐쉬가 되었나 안되었나를 확인하기 위해서 두 개의 다른 캐쉬라인을 찾아야 한다는 뜻이다.
===============================================================================
아마 여기에 L1이 허바드 구조(데이터/명령어 분리형)이며, "메모리에 매핑"된다는 내용이 있어서 L1이 메인메모리에 직접 매핑이 되는 것으로 생각하신 것 같군요.
여기서의 "메모리"는 하위메모리를 말하는 것이죠. 즉 L2를 말하는 것입니다.
보통 계층적 캐쉬구조에서 하위의 메모리의 상위 메모리와의 관계를 "슈퍼세트"라고 합니다. 여기서 L1의 슈퍼세트는 L2라고 할 수 있겠죠.
===============================================================================
크기 대 레이턴시 대 클럭속도.
캐쉬가 클수록 좋은것인가? 반드시 그렇지는 않은데, 전기적 신호가 이동하는데 시간이 걸리고 내장된 캐쉬가 클수록 한 클럭 사이클안에 요청된 정보를 돌려주기에는 더욱 어렵게 된다. 사실, 현재 대부분의 캐쉬는 데이터를 얻기 위해서 2개 이상의 클럭사이클을 소비한다.
Rise의 MP6의 아주 작은 8KB의 L1 D-캐쉬만이 한 클럭사이클에 데이터를 가져오고, K6-2의 32KB L1 D-캐쉬는 2개의 클럭사이클을 필요로 하고 애슬론의 큰 64KB D-캐쉬는 3사이클이 필요하다. (로드 레이턴시, load latency). 이 세 개의 사이클의 레이턴시는 L1 캐쉬가 매우 높은 클럭속도에서 동작하게 보증하는 것이다. 이것은 클럭사이클당 작업을 적게 할수록 클럭사이클은 짧게 될 수 있다는 것이다.
다행스럽게도 애슬론 같은 현재 프로세서의 L1 캐쉬는 파이프라인 되어 있다. 그러므로 L1 캐쉬는 각 클럭 사이클에 데이터를 돌려 줄 수 있다. 이 3 사이클 레이턴시는 큰 명령어 버퍼를 필요로 하는데, 이것은 명령어가 실행되기 전에 3사이클을 기다려서 데이터를 얻어야 하기 때문이다
===============================================================================
아마도 이부분에서 캐쉬의 크기가 커질수록 레이턴시 및 주변회로의 복잡성 이야기가 나온것 같습니다.
위의 부분에서 해당 설명은 캐쉬의 일반적인 설명(특히 Fully-Associative Mapping)에 해당하는 부분인듯 합니다. (즉 말하자면 "크기도 중요하지만 레이턴시도 낮고 적중율이 높아야 좋다"는..)
캐쉬는 여러개의 슬롯(이글에서는 라인이라고 표기. 어느걸 써도 상관없습니다.)으로 구성되어 있는데, 슬롯의 크기가 커질수록 비교적 큰 용량의 블록(이것은 해당 라인크기만큼의 메모리의 데이터 크기를 말합니다.)이 캐쉬에 입출력되므로 어느정도의 페널티는 있습니다.
또한 강의실의 글에서 언급했듯이, 슬롯의 크기가 커지고 슬롯의 수가 감소하면 시간적 지역성의 감소로(즉 기존에 참조되었던 워드가 들어있는 슬롯이 비워질 가능성이 높아지죠) 적중율까지도 낮아집니다.
하지만 주목하셨던 부분은 특히 "적중율(Cache Hit Rate)"부분이었으며, 일반적으로 슬롯과 슬롯의 갯수가 적정선에서 유지된다면 캐쉬의 크기는 클수록 적중율이 높습니다.
회로의 복잡성 문제도 직접매핑의 장단점(검색에 따른 지연시간은 매우낮으나 적중율이 낮다.)과 완전연관사상매핑(Fully...)의 장단점(적중율은 높지만 지연시간이 클 우려가 높다.)을 합친것 비슷한 세트연관사상(Set-Associative Mapping)방식을 채택하고 있으므로 세트의 수에 따라 적절히 대처를 하게 됩니다.(말하자면 세트사상방식은 직접매핑방식의 세트를 여러개 두는 것입니다. 세트간의 검색은 완전연관사상매핑방식과 동일하게 됩니다.)
요약하자면, 어난드테크의 해당 설명은 캐쉬에 대한 매우 일반적인 설명이며, 그 자체에 큰 문제점은 없습니다. 다만, 말씀드렸듯 세트연관사상방식의 경우 효율적인 구조를 가진다면 캐쉬의 크기가 커질수록 유리한것또한 사실입니다. 이건 캐쉬관련 전문서적이나 전공도서를 참조하시라는 말밖에 할수없군요 -_-a
===============================================================================
세트-조합성 대 클럭 속도.
우리가 보아온 바와 같이 세트가 클수록 같은 캐쉬라인을 공유하는 메모리의 부분간에 서로 밀어 내려하는 문제는 감소한다. 그러므로 높은 세트 조합성이 더욱 좋지 않겠는가? 그렇지 않다. 이거 이외에도 고민해야 하는 부분이 있다.
알다시피 캐쉬가 x 세트 조합성이면 이것은 메모리 위치 또한 x 라인이 되어야 한다는 것을 의미한다.
이 경우 캐쉬 컨트롤러는 x개의 다른 캐쉬라인을 찾아보아서(메모리 어드레스의 첫 번째 부분의 태그를 이용하여 해당되는 메모리 라인을 찾는다) 특정한 메모리 라인이 캐쉬가 되었는지 안되었는지를 검사한다.
그러므로 셋-조합성이 높을 경우에 캐쉬 컨트롤러가 요청된 데이터가 캐쉬에 있는지 없는지 검사하는데 오래 걸리게 되는 것이다.
===============================================================================
이 내용은 위에서 제가 설명한 내용과 겹치는 군요.
일반적으로 세트의 수가 많아질수록 완전연관사상매핑과 동일한 문제를 겪게 됩니다. 따라서 "적절한"세트의 수와 한 세트에서의 슬롯의 수, 그리고 슬롯의 크기가 결정되어야 하는거죠. 전적으로 이부분은 프로세서 제조사의 결정문제입니다.