2010-08-09 14 views
5

가능한 중복 취소 :
CPU cache flush어떻게 CPU의 L1 및 L2 캐시

내가 제온 서버의 벤치 마크를 실행 해요, 그리고 내가 사형 집행을 2 ~ 3 번 반복합니다. 실행을 반복하면서 L1과 L2의 캐시 내용을 지우고 싶습니다. 그렇게하기위한 방법을 제안 할 수 있습니까?

+4

테스트중인 아키텍처 및 OS는 무엇입니까? –

+0

miunute에 대한 서버에서 임의의 다른 작업을 수행하고 있다고 생각합니까? – Dentrasi

+0

내 질문에 왜 그렇게하고 싶습니까? –

답변

8

CPU를 통해 (즉 DMA가 아닌) 반복적으로 큰 데이터를 읽으려고합니다. 등 :

int main() { 
    const int size = 20*1024*1024; // Allocate 20M. Set much larger then L2 
    char *c = (char *)malloc(size); 
    for (int i = 0; i < 0xffff; i++) 
     for (int j = 0; j < size; j++) 
     c[j] = i*j; 
} 

그러나 서버에 의존

더 큰 문제는 (메모리) 디스크 캐시 후, L1/L2 캐시 일 수있다. 리눅스 (예를 들어)를 사용하여 드롭 :

sync 
echo 3 > /proc/sys/vm/drop_caches 

편집 : 그것은 아무것도 할 수없는 큰 프로그램을 생성하는 간단하다 : 다른 이름으로 몇 번 실행

#!/usr/bin/ruby 
puts "main:" 
200000.times { puts " nop" } 
puts " xor rax, rax" 
puts " ret" 

을 (코드가 아닌 생산 스크립트) 작업을 수행해야합니다

+6

대부분의 최신 CPU에는 별도의 명령어 및 데이터 캐시가 있습니다. 20M 이상의 RAM을 순환 시키면 데이터 캐시가 지워질 수 있습니다. 그것은 명령 캐시를 건드리지 않을 것이다. 또한 CPU가 캐시를 모두 사용할 것이라고 보장 할 수는 없으며 동일한 작은 섹션을 계속해서 다시 사용할 수 있습니다. –

+0

해결책은 기본적으로 동일합니다. 많은 코드를 생성하고 실행하십시오. –

+0

최신 프로세서가 패턴을 인식하고 기존 캐시 라인을 무효화하지 않습니다. 따라서 프로그램에 2 개의 캐시 라인 만 사용하게됩니다. 캐시가 중요한 요소 인 경우 그것을 끄고 사용하지 않는 것이 좋습니다. 반면에; 그것은 아마도 첫 번째 장소에서 두 가지 헛점을 만들어 내지 않을 것입니다. –

관련 문제