이것은 다소 낮은 수준의 질문입니다. x86 어셈블리에는 두 가지 SSE 명령어가 있습니다.
MOVDQA xmmi, m128
과
MOVNTDQA xmmi, m128
IA-32 Software Developer ‘s Manual에 따르면 MOVNTDQA 의 NT 는 Non-Temporal을 의미하며 , 그렇지 않으면 MOVDQA와 동일합니다.
제 질문은 비 시간적 의미가 무엇입니까?
답변
비 시간적 SSE 명령어 (MOVNTI, MOVNTQ 등)는 일반적인 캐시 일관성 규칙을 따르지 않습니다. 따라서 다른 프로세서가 적시에 결과를 볼 수 있도록 비 시간 저장 뒤에 SFENCE 명령이 와야합니다.
데이터가 생성되고 (즉시) 다시 사용되지 않는 경우 메모리 저장소 작업이 먼저 전체 캐시 라인을 읽은 다음 캐시 된 데이터를 수정한다는 사실은 성능에 해를 끼칩니다. 이 작업은 곧 사용되지 않을 데이터를 위해 다시 필요할 수있는 캐시에서 데이터를 밀어냅니다. 이것은 채워지고 나중에 사용되는 행렬과 같은 큰 데이터 구조의 경우 특히 그렇습니다. 행렬의 마지막 요소가 채워지기 전에 순전히 크기가 첫 번째 요소를 제거하여 쓰기 캐싱을 비효율적으로 만듭니다.
이와 유사한 상황에서 프로세서는 비 시간적 쓰기 작업을 지원합니다. 이 컨텍스트에서 비 시간적이란 데이터가 곧 재사용되지 않을 것이므로 캐시 할 이유가 없음을 의미합니다. 이러한 비 시간적 쓰기 작업은 캐시 라인을 읽은 다음 수정하지 않습니다. 대신 새 콘텐츠가 메모리에 직접 기록됩니다.
답변
Espo는 목표물에 거의 맞았습니다. 2 센트를 더하고 싶었습니다.
“비 시간적”문구는 시간적 지역성이 부족함을 의미합니다. 캐시는 공간적 및 시간적 두 가지 종류의 지역성을 이용하며 비 시간적 명령어를 사용하여 가까운 장래에 데이터 항목이 사용될 것으로 예상하지 않는다는 신호를 프로세서에 전달합니다.
캐시 제어 명령을 사용하는 수동 코딩 어셈블리에 대해 약간 회의적입니다. 내 경험상 이러한 것들은 효과적인 성능 향상보다 더 많은 사악한 버그로 이어집니다.
답변
인텔 ® 64 및 IA-32 아키텍처 소프트웨어 개발자 매뉴얼, 볼륨 1 : 기본 아키텍처, “인텔 SSE (Streaming SIMD Extensions) 프로그래밍”장에 따르면 :
임시 데이터와 비 임시 데이터 캐싱
프로그램에서 참조하는 데이터는 일시적 (데이터가 다시 사용됨) 또는 비 시간적 (데이터가 한 번 참조되고 곧 다시 사용되지 않음) 일 수 있습니다. 예를 들어, 프로그램 코드는 일반적으로 시간적이지만 3D 그래픽 애플리케이션의 표시 목록과 같은 멀티미디어 데이터는 종종 비 시간적입니다. 프로세서의 캐시를 효율적으로 사용하려면 일반적으로 비 시간 데이터를 캐시하지 않고 임시 데이터를 캐시하는 것이 바람직합니다. 비 시간적 데이터로 프로세서의 캐시를 오버로드하는 것을 “캐시 오염”이라고도합니다. SSE 및 SSE2 캐시 가능성 제어 명령을 사용하면 프로그램이 캐시 오염을 최소화하는 방식으로 비 시간적 데이터를 메모리에 쓸 수 있습니다.
비 시간적로드 및 저장 지침에 대한 설명입니다. 출처 : Intel 64 및 IA-32 아키텍처 소프트웨어 개발자 매뉴얼, 볼륨 2 : 명령어 세트 참조
LOAD (MOVNTDQA-Double Quadword Non-Temporal Aligned Hint로드)
메모리 소스가 WC (쓰기 결합) 메모리 유형 인 경우 비 시간적 힌트를 사용하여 소스 피연산자 (두 번째 피연산자)에서 대상 피연산자 (첫 번째 피연산자)로 이중 쿼드 워드를로드합니다. […]
[…] 프로세서는 데이터를 캐시 계층으로 읽지 않으며 해당 캐시 라인을 메모리에서 캐시 계층으로 가져 오지 않습니다.
Peter Cordes가 언급했듯이 NT 힌트가 무시되고 (아마도 NT 인식 HW 프리 페 처가 없기 때문에) 전체적으로 강력하게 정렬 된로드 의미 체계가 적용되기 때문에 현재 프로세서의 일반 WB (후기 입) 메모리에서는 유용하지 않습니다. . prefetchnta
WB 메모리에서 오염을 줄이는 부하로 사용할 수 있습니다.
STORE (MOVNTDQ-비 시간적 힌트를 사용하여 압축 된 정수 저장)
메모리에 쓰는 동안 데이터 캐싱을 방지하기 위해 비 시간적 힌트를 사용하여 소스 피연산자 (두 번째 피연산자)의 압축 된 정수를 대상 피연산자 (첫 번째 피연산자)로 이동합니다.
[…] 프로세서는 데이터를 캐시 계층 구조에 쓰거나 메모리에서 캐시 계층 구조로 해당 캐시 라인을 가져 오지 않습니다.
캐시 쓰기 정책 및 성능에 정의 된 용어를 사용하면 쓰기 처리 (쓰기 할당 없음, 쓰기시 가져 오기 없음)로 간주 할 수 있습니다.
마지막으로, 비 일시적 저장에 대한 John McAlpin의 메모 를 검토하는 것도 흥미로울 수 있습니다 .