2012-04-20 4 views
3

친구 운영체제로 인한 캐시 오염의 영향을 응용 프로그램의 성능에 대해 연구하고 싶습니다.
작은 맞춤 벤치 마크 프로그램을 작성했습니다.시스템 콜을 사용한 캐시 오염

1. malloc an array of size = l1 data cache-size 
2. repeat ... sweep this array from start to end (hit-rate = 1.0) 
3. *** perform a system call that thrashes l1 data cache *** 
4. sweep the array once again (expected hit-rate = ~0.7 ---> 1.0) 

알고리즘의 2 단계는 전체 배열을 반복적으로 읽습니다. 다행히도 배열은 캐시에 머물러 있기 때문에 1의 적중률이 발생합니다.

시스템 호출을 수행 한 후에 다시 캐시를 읽으려고합니다. 하지만 OS가 사용자에게 속한 일부 캐시 라인을 제거했다고 가정합니다.

이 프로그램은 시스템 호출을 사용하여 l1 데이터 캐시에서 많은 사용자 데이터 행을 제거합니다. 나는 이것을 어떻게 얻을 수 있을까 ??

시스템 호출이 파일 관련이거나 스트림 관련이어야한다고 가정합니다.

답변

1

L1 캐시에 미치는 영향은 시스템 호출에 따라 다릅니다. 한 가지 방법은 서로 다른 여러 시스템 호출을 반복하고 각각의 영향을 측정하는 것입니다 (예 : write()과 같은 I/O 관련 호출, 버퍼의 크기를 다양하게 할 수 있으므로 캐시에 미치는 영향).

당신은 아마 그들이 커널 공간으로 스위치를 필요로하지 않는 한, vsyscalls (예를 들어, gettimeofday())로 구현 시스템 호출을 피하기 위해 할 것입니다. [1, 2]을 참조하십시오.

L1d에서 효과를 분리하는 것처럼 들리므로주의해야 할 또 다른 사항이 있습니다. 2 단계에서 배열을 반복하면서 L1i 캐시가 채워집니다. 시스템 호출이 완료되면 L1i 이 모두 오염되어 i- 캐시 누락의 성능 영향을 볼 수 있습니다.

더 세밀한 측정을 얻으려면 아키텍처에 따라 하드웨어 성능 카운터를 활용할 수 있습니다.

+0

완벽한 ... 나는 열린, 쓰기 및 닫기 시스템 호출을 사용했습니다. 각 반복 후 파일에 32 k 배열을 쓰려고합니다. 하지만 그 효과는 놀랍습니다 ... l1 데이터 캐시는 l1 명령 캐시보다 효과가 적습니다. 어떤 아이디어? 나는 전화 당 명령어 수, 호출 당로드 수 등을 설명하는 정확한 통계를 다시 게시 할 것이다. 어쨌든 포스트를 고려해 주셔서 감사합니다. –

+0

내 즉각적인 추측은 실제로 커다란 커널 데이터가 실제로 다루어지고 있지 않다는 것입니다. 단지 사용자 버퍼에서 쓰는 것), 따라서 작은 d- 캐시 영향. 나는 많은 커널 데이터 구조를 조작하는 시스템 호출을 찾으려고 노력할 것이다 --- (아마도 copy-on-write 효과를 알고있을지라도)'fork()'와 같은 것일 것이다. – kch

+0

fwrite는 일반적으로 사용자 버퍼에서 다음과 같이 작성해야한다. 커널 버퍼가 비어 있으면 디스크에 기록합니다. 나의 이해는 여기에서 정확한가? 커널이 사용자 버퍼에서 디스크로 직접 DMA를 수행합니까? 나는 그렇지 않다고 생각한다. –

관련 문제