특정 데이터에 대해 캐시를 우회하라는 지침이있는 프로세서가 있습니까? This question에는 SSE4.2 지침이 캐시를 우회하는 것으로 표시된 대답이 있습니다. 누군가가 저를 계몽 할 수 있습니까?캐시를 우회하라는 지시를받은 프로세서가 있습니까?
답변
특정 데이터의 정의에 따라 예. 프로세서는 일반적으로 캐시 할 수있는 메모리 영역과 캐시 할 수없는 영역을 정의하는 데 사용되는 캐시 제어 레지스터/테이블을 가지고 있습니다. 일반적으로 사용자 공간에서 실행되는 코드는 해당 테이블에 액세스 할 수 없습니다.
특정 데이터에 대해 캐시를 우회하라는 지침이있는 프로세서가 있습니까?
SuperH 제품군 (또는 SuperH-2 이상)은 캐시 메모리를 암시 적 및 명시 적으로 우회합니다. 이는 특별한 지시 사항이 아닌 메모리 주소 공간의 다른 영역을 사용하여 수행됩니다.
주소의 상위 3 비트를 001
으로 설정하면 캐시를 통해 미러의 최상위 3 비트를 지우고 같은 주소의 미러에 액세스 할 수 있습니다. 그리고 메모리 매핑 I/O 레지스터와 같은 일부 영역은 절대로 캐시되지 않습니다.
일반적으로 캐시 정책은 MMU (Memory Management Unit)에서 제어합니다. 각 주소 범위에 대해 캐싱 정책이 결정됩니다. 이 테이블은 OS에서 관리하며 시스템 공간에서 사용할 수 있습니다. 캐시에있는 아키텍처에 대해 묻는 질문에 대한 사이드 바 대답으로는 일반적으로 캐시를 동기화/무효화/플러시 할 수있는 CPU 명령이 있습니다. 그러나 MMU 테이블과 마찬가지로이 명령은 시스템 공간에서만 사용할 수 있습니다.
약간의 설명; x86에서 _single_ cacheline을 무효화하기위한 clflush 명령은 _not_ privileged입니다. 그리고 원래 포스터가 언급했듯이,'movnt' SSE 명령은 캐시 우회를 허용합니다. _stores_ - http://stackoverflow.com/questions/37070/what-is-the-meaning-of-non-temporal-memory-accesses 자세한 내용은 -in-x86을 참조하십시오. –
Altera Nios II 아키텍처에는 캐시를 우회하는로드/스토어에 대해 ldio
과 stio
의 특정 명령어가 2 개 있습니다. 이것은 메모리 매핑 IO에 사용됩니다.
http://www.csun.edu/~glaw/ee525/Lecture03Nios.pdf
의 Nios II는 일반적으로 알테라의 FPGA 보드과 사용되는 소프트 프로세서이다 그것은 또한 하드 ASIC 디바이스에 대한 라이센스를 할 수 있지만이 아키텍처
에 기초 상업적 CPU를 모르겠지만 SSE 캐시 바이 패스 저장 명령어는 곧 다시는 건드리지 않는 영역에 쓸 때 캐시를 오염시키지 않아야한다. 예 : 다시 사용될 데이터를 제거하지 않으려 고합니다.
또한 x86 구현은 일반적으로 캐시 라인의 어떤 부분에 쓰기가 발생하면 전체 캐시 라인에서 읽습니다. 캐시 라인의 이전 내용이 불필요하다면 이는 메모리 대역폭의 낭비입니다. (memcpy
memset
의 또는 예를 들어 dest
ARG.) I 쓰기 결합 (movntq
/movntdq
) memcpy
을 구현하는 효과 대이 라이트 - 백 (기본값) some old discussion 알았다. 다른 사람이 memcpy
의 결과를 즉시 읽는다면 이것을 사용하는 것에주의하십시오.
스트리밍로드는 reading from USWC regions에 대해서만 작동하며, 보통 memcpy
은 무시 무시하게 수행합니다. 스트리밍로드 (WB (쓰기 저장))는 현재 특별하지 않으며 일반적인 movdqa
로드와 유사합니다. (즉, NT 힌트는 무시됩니다). Intel의 최적화 매뉴얼에는 오염을 줄이는 부하에 prefetchnta
을 사용할 수 있다고합니다.이 읽기를 트리거하지 않고 (오히려 movnt
으로 우회하는 것보다) 캐시에 쓰고 자 할 경우
는 IDK. 아마도 AVX512는 memcpy
에 대해이 문제를 해결할 것입니다. 512b ZMM 레지스터가 64 바이트, 즉 전체 캐시 라인이기 때문일 수 있습니다. 아직 캐싱되지 않은 메모리에 대한 ZMM 레지스터의 64 바이트 정렬 저장 은 RAM을 먼저 읽지 않고 시스템의 다른 CPU 코어에 저장소가 즉시 표시되도록 구현할 수 있습니다. .
을 내가 궁금 : 어떤 실제적인 응용 프로그램에 대한이 캐시를 우회? 마음에 오는 모든 것은 지시 타이밍의 예측 가능성을 향상시키는 것입니다. 다른 사람들이 있습니까? – wallyk
내가 흔히 접하게되는 2 가지 사례는 서로 다른 코어에서 실행되는 스레드간에 시간에 민감한 데이터를 공유하고 UART IC와 같은 다른 하드웨어와 인터페이스하기 위해 메모리 매핑 레지스터에 쓰기입니다. –
@wallyk : 일반적인 목적은 캐시 오염을 방지하는 것입니다 (예를 들어 많은 양의 데이터를 작성하고 "곧"읽는 것을 기대하지 않으며 캐시에서 푸시해야하는 데이터를 원하지 않는 경우). – Brendan