2016-07-31 2 views
2

때 버퍼 (TLB) 오염을 봐 데이터 항목을 쓰고 싶을 때 데이터를 포함하는 블록을 먼저 캐시로 가져와 데이터 항목을 캐시에 씁니다. 이로 인해 캐시 오염이 발생할 수 있습니다. 이를 피하기 위해 인텔은 임시 지침을 도입하지 않았습니다.번역 피하기 mmap()

mmap()을 사용하여 파일에 데이터를 쓰고 다시 읽지 않을 경우 TLB 항목 생성을 피할 수 있습니까? 비 임시 명령과 비슷한 명령이 있습니까?

+1

아니요, 파일 기반 매핑에 hugepages를 사용할 수 없기 때문에 아니에요. 어쩌면 1/2 L2 캐시 크기 등의 버퍼 크기로'쓰기 '를 사용하면 실제로 더 잘 수행 될 수 있습니다. 너는 시험해야한다. (커널 문제는 버퍼를 페이지 캐시에 복사 할 때 NT 저장소를 사용하지 않지만). 파일 데이터가'madvise (MADV_DONTNEED) '를 사용하여 장시간 참조되지 않을 경우 커널에 디스크에 기록한 후에 RAM에서 파일 데이터를 삭제하도록 유도하면 페이지 캐시 오염을 피할 수 있습니다. –

+2

액세스 패턴에 따라 pwrite()가 write()보다 더 적합 할 수 있습니다. 하지만 네, 확실히 테스트해야합니다. 또 다른 제안은 오염을 완화하기 위해 모든 파일 수정이 동일한 CPU에서 발생하도록 보장하는 것입니다. 또한 파일이 매핑되지 않은 경우 최종 TLB 촬영 비용을 측정하는 것을 잊지 마십시오. – Pseudonym

답변

1

CPU가 가상 주소에서 실제 주소로 매핑하기 위해 TLB 항목이 필요하므로 mmap() 또는 유사한 API를 사용하여이를 피할 수 없습니다.

TLB에서 매핑을 저장하지 않도록하는 것이 가능하더라도, 매핑 된 메모리에 모든 액세스 페이지 테이블에서 해당 항목을 다시로드해야하므로 성능이 더 악화 될 것입니다. 비 임시 액세스는 에 대해서만 의미가 있지만 페이지 테이블 항목은 으로되어 있습니다.

+1

L1 DTLB에서 퇴거 당하면 L2 TLB로 이동하는 대신 TLB 항목에 시간이 아닌 힌트가 있다고 생각할 수 있습니다. 따라서 더 빨리 퇴거 당하거나 L1 TLB에 머물러있을 수 있습니다. 이것은 PREFETCHNTA가 더 큰 L2를 오염시키지 않고 데이터를 L1로 가져 오는 것과 유사합니다. x86에서 TLB 항목을 사용하는 것과 같은 메커니즘은 없지만로드에 대한 비 시간적 힌트를 사용하여 어떤 작업도 수행 할 수 없기 때문에가 아닙니다. (좋은 점은 TLB 항목 캐시가로드가 아니라 저장소 임). –