캐시 오염

Cache pollution

캐시 오염은 실행 중인 컴퓨터 프로그램이 불필요하게 CPU 캐시에 데이터를 로드하여 다른 유용한 데이터를 캐시에서 낮은 수준의 메모리 계층으로 제거하여 성능을 저하시키는 상황을 설명한다.예를 들어, 멀티코어 프로세서에서 한 코어는 다른 코어에 의해 가져온 블록을 공유 캐쉬로 교체하거나, 프리페치 블록은 캐쉬에서 요구-페치된 블록을 교체할 수 있다.

다음 그림을 참조하십시오.

T[0] = T[0] + 1; 0.sizeof(CACH) C[i] = C[i] + 1; T[0] = T[0] + C[sizeof(CACH)-1];

(이러한 가정은 캐시가 한 레벨로만 구성되어 있고, 잠금이 해제되어 있으며, 대체 정책은 사이비-LRU이며, 모든 데이터는 캐쉬가 가능하며, 캐쉬의 세트 연관성은 N(여기서 N > 1)이며, 프로그램 값을 포함하는 데는 최대 한 개의 프로세서 레지스터를 사용할 수 있다.)

루프가 시작되기 직전에 T[0]는 메모리에서 캐시로 가져와 값이 업데이트된다.그러나 루프가 실행됨에 따라 루프가 참조하는 데이터 요소의 수는 전체 캐시를 용량으로 채우도록 요구하기 때문에 T[0]를 포함하는 캐시 블록을 제거해야 한다.따라서 다음 번에 프로그램이 T[0] 업데이트를 요청할 때 캐시가 누락되고, 캐시 컨트롤러가 데이터 버스요청하여 메인 메모리에서 해당 캐시 블록을 다시 가져오도록 해야 한다.

이 경우 캐시는 "공해"되었다고 한다.루프와 두 번째 업데이트 사이에 T[0]의 첫 번째 업데이트를 배치하여 데이터 액세스 패턴을 변경하면 다음과 같은 비효율성을 제거할 수 있다.

0.sizeof(CACH) C[i] = C[i] + 1, T[0] = T[0] + T[0] = T[0] + C[sizeof(CACH)-1]의 i인 경우,

해결 방법

위에서 언급한 코드 재구성을 제외하고 캐시 오염의 해결책은 재사용률이 높은 데이터만 캐쉬에 저장되도록 하는 것이다.이는 특수 캐시 제어 지침, 운영 체제 지원 또는 하드웨어 지원을 사용하여 달성할 수 있다.

전문 하드웨어 지침의 예로는 PowerPC AltiVec에서 제공하는 "lvxl"이 있다.이 지침은 128비트 폭의 값을 레지스터에 로드하고 해당 캐시 블록을 "최근에 가장 많이 사용됨"으로 표시하며, 즉 캐시 집합에서 블록을 제거해야 할 경우 해당 캐시 블록을 제거의 주요 후보로 표시한다.위의 예제의 맥락에서 이 지침을 적절하게 사용하려면, 루프가 참조하는 데이터 요소를 이 지침을 사용하여 로드해야 할 것이다.이러한 방식으로 실행될 경우, 그러한 루프의 실행은 캐시로부터 T[0]를 조기 퇴출시키지 않기 때문에 캐시 오염은 발생하지 않을 것이다.이는 루프가 진행됨에 따라 C에 있는 요소의 주소가 동일한 캐시 방식으로 매핑되어 실제로 오래된(그러나 "가장 최근에 사용한" 것으로 표시되지 않은) 데이터는 다른 방식으로 그대로 유지되기 때문에 피할 수 있을 것이다.가장 오래된 데이터(제공된 예와 관련이 없음)만 캐시에서 제거되며, T[0]는 업데이트가 루프의 시작 직전에 발생하기 때문에 캐시 멤버가 아니다.

마찬가지로, 운영 체제(OS) 지원을 사용하면 C 데이터 어레이에 해당하는 메인 메모리의 페이지는 "캐싱 금지" 또는 다시 말하면 캐시 불가로 표시할 수 있다.마찬가지로 하드웨어 레벨에서는 프로그램 액세스 패턴을 기반으로 저사용 데이터를 식별하고 캐시로부터 우회하는 캐시 바이패스 체계를 사용할 수 있다.또한 공유 캐시는 실행 중인 애플리케이션 사이의 파괴적인 간섭을 피하기 위해 분할될 수 있다.이러한 해결책의 절충은 OS 기반 체계가 캐시 오염 방지(메모리 영역부터 캐쉬할 수 없는 경우는 제외)에 의해 달성할 수 있는 이익을 무효화할 수 있는 큰 지연 시간을 가질 수 있는 반면 하드웨어 기반 기법은 프로그램 제어 흐름과 메모리 액세스 패턴을 전체적으로 보지 못할 수 있다는 것이다.

중요성 증대

캐시 오염 통제의 중요성은 이른바 '기억벽'으로 인한 벌칙이 계속 늘어나고 있기 때문이다.칩 제조업체들은 계속해서 증가하는 상대적인 메모리 대 CPU 지연 시간을 극복하기 위해 새로운 기술을 계속해서 고안하고 있다.그들은 캐시 크기를 늘리고 소프트웨어 엔지니어들이 데이터가 도착하고 CPU에 머무르는 방법을 제어하는 유용한 방법을 제공함으로써 그렇게 한다. 캐시 오염 제어는 (주로 내장된) 프로그래머가 이용할 수 있는 수많은 장치들 중 하나이다.그러나 대부분의 경우 소유권이 있고 하드웨어 및 애플리케이션별로 매우 특정한 다른 방법들도 사용된다.

참조