2013-01-07 3 views
2

NASM 문서에서 아래의 지시 사항을 모두 읽었지만 필자는 그 헤드 또는 테일을 제대로 만들 수 없습니다. 안타깝게도이 지침에 대한 Intel 설명서는 다소 부족합니다.NASM Prefetching

PREFETCHNTA m8    ; 0F 18 /0  [KATMAI] 
PREFETCHT0 m8     ; 0F 18 /1  [KATMAI] 
PREFETCHT1 m8     ; 0F 18 /2  [KATMAI] 
PREFETCHT2 m8     ; 0F 18 /3  [KATMAI] 

주어진 주소에 256 바이트를 캐시 할 수있는 방법에 대한 간결한 예를 제공 할 수 있습니까? 미리 감사드립니다!

답변

6

이 지침은 CPU가 캐시 라인을 캐시로 프리 페치하려고 시도하는 데 사용되는 힌트입니다. 힌트이기 때문에 CPU가이를 무시할 수 있습니다.

CPU가 지원하지 않으면 CPU는 프리 페치를 시도하지만 TLB 누락이 발생하면 포기합니다 (프리 페치하지 않음). 이것은 대부분의 사람들이 잘못 이해하는 곳입니다 (예 : "preloading"을 수행하지 못하면 더미 읽기를 삽입하여 TLB로드를 강제 실행하여 프리 페칭이 작동하지 못하게합니다).

CPU 등에 따라 미리 가져 오는 데이터 양이 32 바이트 이상입니다. CPUID를 사용하여 실제 크기 (CPUID 기능 0x00000004, EBX 비트 0-31로 반환 된 "시스템 일관성 라인 크기")를 결정할 수 있습니다. .

너무 늦게 프리 페치하면 도움이되지 않으며 너무 일찍 프리 페치하면 데이터가 사용되기 전에 캐시에서 제거 될 수 있습니다 (도움이되지 않습니다). Intel의 "IA-32 Intel Architecture Optimization Reference Manual"에는 사전 읽어 들여야 할 "Prefetch Scheduling Distance 수학"이라는 프리 페치시기를 계산하는 방법을 설명하는 부록이 있습니다.

또한 프리 페치가 성능을 저하시킬 수 있음을 기억하십시오. 예를 들어, 공간을 확보하기 위해 데이터를 제거해야 할 필요가 있고, 프리 페치를하지 않으면 CPU가 하드웨어 프리 페처를 가지고 있습니다. 어쨌든. 또한이 하드웨어 프리 페처가 어떻게 작동하는지 (그리고 없을 때도) 읽어야합니다. 예를 들어 순차 읽기 (예 : memcmp())의 경우 하드웨어 프리 페처가 자동으로 수행하고 명시 적 프리 페치를 사용하는 것이 대부분 시간 낭비입니다. CPU의 하드웨어 프리 페처가 예측할 수 없거나 예측할 수없는 "랜덤"(비 순차적 인) 액세스에 대한 명시 적 프리 페치로 인해 귀찮은 일만있을 것입니다.

1

많이 최적화 된 memcmp 함수 등의 몇 가지 예제를 살펴본 후에 이러한 지침을 (다소) 효과적으로 사용하는 방법을 알아 냈습니다.

이 지침은 32 바이트의 캐시 "라인"을 의미합니다. 원래 내가 놓친 것입니다. 따라서, L1 및 L2에 대한 256 바이트의 버퍼 캐시, 다음 명령어 세트를 사용할 수있다 :

prefetcht1 [buffer] 
prefetcht1 [buffer+32] 
prefetcht1 [buffer+64] 
prefetcht1 [buffer+96] 
prefetcht1 [buffer+128] 
prefetcht1 [buffer+160] 
prefetcht1 [buffer+192] 
prefetcht1 [buffer+224] 

T0에 접 전체 캐시 계층으로 프리 페치하기 위해 CPU에 지시한다.

t1은 데이터가 L1, L2 등으로 캐시되도록 지시합니다.

t2는 이러한 경향을 계속하여 L2로 프리 페치합니다.

"nta"접미사는 캐시 라인 읽기/쓰기와 달리 CPU가 데이터를 메모리에 이상적으로 (이상적으로) 쓰도록하기 때문에 조금 혼란 스럽습니다. 캐시 오염을 피할 수 있고보다 관련성있는 데이터를 대신 캐싱 할 수 있기 때문에 이것은 실제로 엄청나게 큰 데이터 구조의 경우에 매우 유용 할 수 있습니다.

+0

NT 상점에 대해 생각하고 있습니다. 'prefetchnta'는 매우 다르다. 왜냐하면 여전히 로딩에 관한 것이기 때문에, 저장하는 것이 아니다. 다른 레벨의 캐시로의 오염을 최소화하면서 L1으로 가져옵니다. –

+0

64B 캐시 라인은 P4 이후 모든 x86 CPU에서 표준으로 사용되었습니다.Pentium III 이전 버전 만 32B 라인을 지원합니다. –