CPU 캐시는 언제 주 메모리로 플러시됩니까?


18

코어가 2 개인 CPU가있는 경우 각 코어마다 자체 L1 캐시가 있습니다. Core1과 Core2가 동시에 동일한 메모리 부분을 캐시 할 수 있습니까?
가능하다면 Core1과 Core2가 캐시에서 값을 편집 한 경우 주 메모리의 값은 얼마입니까?

답변:


26

코어가 2 개인 CPU가있는 경우 각 코어마다 자체 L1 캐시가 있습니다. Core1과 Core2가 동시에 동일한 메모리 부분을 캐시 할 수 있습니까?

예. 그렇지 않은 경우 성능이 끔찍합니다. 동일한 코드를 실행하는 두 개의 스레드를 고려하십시오. 두 L1 캐시 모두에서 해당 코드를 원합니다.

가능하다면 Core1과 Core2가 캐시에서 값을 편집 한 경우 주 메모리의 값은 얼마입니까?

이전 값은 주 메모리에 있으며 CPU가 읽지 않기 때문에 중요하지 않습니다. 캐시에서 수정 된 값을 꺼내기 전에 메모리에 기록해야합니다. 일반적으로 MESI 프로토콜 의 일부 변형 이 사용됩니다. 기존의 MESI 구현에서 한 캐시에서 값이 수정되면 같은 레벨의 다른 캐시에 전혀 존재할 수 없습니다.


15

그렇습니다. (두 캐시가 동일한 메모리 영역을 캐시하게 함) 실제로 발생할 수있는 문제입니다. 예를 들어 다양한 솔루션이 있습니다.

  • 두 캐시는 서로 동의하지 않도록 통신 할 수 있습니다.
  • 모든 캐시를 모니터링하고 그에 따라 업데이트하는 일종의 감독자가있을 수 있습니다.
  • 각 프로세서는 캐시 된 메모리 영역을 모니터링하고 쓰기를 감지하면 (현재 유효하지 않은) 캐시를 버립니다.

이 문제를 캐시 일관성 이라고 합니다 . 이 주제에 관한 Wikipedia 기사 에는 문제와 가능한 해결책에 대한 훌륭한 개요가 있습니다.


2

제목의 질문에 대답하려면 캐싱 프로토콜이 무엇인지에 따라 다릅니다. 다시 쓰기 인 경우, 캐시 제어기가 선택 공간이 없을 때만 캐시를 기본 메모리로 플러시합니다. 이미 채워진 공간에 새 캐시 블록을 넣습니다. 이전에 공간을 차지한 블록이 제거되고 해당 값이 주 메모리에 다시 기록됩니다.

다른 프로토콜은 연속 기입입니다. 이 경우, 캐시 블록이 레벨 n에 기록 될 때마다 레벨 (n + 1)의 해당 블록이 업데이트됩니다. (이것은 개념적으로 아래에 탄소 종이로 양식을 채우는 것과 유사합니다. 맨 위에 쓰는 것은 아래 시트에 복사됩니다.) 더 많은 쓰기 작업이 필요하기 때문에 속도가 느리지 만 캐시 간의 값은 더 일관됩니다. 후기 입 방식에서는 최상위 캐시 만 특정 메모리 블록에 대한 최신 값을 갖습니다.


1
나는 여기에 어떤 비율의 독자들이 카본지를 사용했는지 궁금합니다. :)
Barmar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.