이것은 다소 낮은 수준의 질문입니다. x86 어셈블리에는 두 가지 SSE 명령어가 있습니다.
MOVDQA xmmi, m128
과
MOVNTDQA xmmi, m128
IA-32 Software Developer 's Manual에 따르면 MOVNTDQA 의 NT 는 Non-Temporal을 의미하며 , 그렇지 않으면 MOVDQA와 동일합니다.
제 질문은 비 시간적 의미가 무엇입니까?
이것은 다소 낮은 수준의 질문입니다. x86 어셈블리에는 두 가지 SSE 명령어가 있습니다.
MOVDQA xmmi, m128
과
MOVNTDQA xmmi, m128
IA-32 Software Developer 's Manual에 따르면 MOVNTDQA 의 NT 는 Non-Temporal을 의미하며 , 그렇지 않으면 MOVDQA와 동일합니다.
제 질문은 비 시간적 의미가 무엇입니까?
답변:
비 시간적 SSE 명령어 (MOVNTI, MOVNTQ 등)는 일반적인 캐시 일관성 규칙을 따르지 않습니다. 따라서 다른 프로세서가 적시에 결과를 볼 수 있도록 비 시간 저장 뒤에 SFENCE 명령이 와야합니다.
데이터가 생성되고 (즉시) 다시 사용되지 않는 경우 메모리 저장소 작업이 먼저 전체 캐시 라인을 읽은 다음 캐시 된 데이터를 수정한다는 사실은 성능에 해를 끼칩니다. 이 작업은 곧 사용되지 않을 데이터를 위해 다시 필요할 수있는 캐시에서 데이터를 밀어냅니다. 이것은 채워지고 나중에 사용되는 행렬과 같은 큰 데이터 구조의 경우 특히 그렇습니다. 행렬의 마지막 요소가 채워지기 전에 순전히 크기가 첫 번째 요소를 제거하여 쓰기 캐싱을 비효율적으로 만듭니다.
이와 유사한 상황에서 프로세서는 비 시간적 쓰기 작업을 지원합니다. 이 컨텍스트에서 비 시간적이란 데이터가 곧 재사용되지 않을 것이므로 캐시 할 이유가 없음을 의미합니다. 이러한 비 시간적 쓰기 작업은 캐시 라인을 읽은 다음 수정하지 않습니다. 대신 새 콘텐츠가 메모리에 직접 기록됩니다.
SFENCE 필요하지 않은 것 같습니다 . 적어도 같은 스레드에서. 당신도 볼 수 있습니까?
sfenceNT 상점에 필요한 시나리오 가 있지만 일반 상점에만 필요한 것은 아닙니다. NT 상점은 다른 스레드 에서 볼 수 있듯이 다른 상점과 관련하여 주문되지 않습니다 sfence. 그러나 저장을 수행 한 동일한 스레드에서 읽는 경우에는 필요하지 않습니다 sfence. 주어진 스레드는 NT 저장소인지 여부에 관계없이 항상 프로그램 순서대로 자체 저장소를 볼 수 있습니다.
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 (후기 입) 메모리에서는 유용하지 않습니다. . prefetchntaWB 메모리에서 오염을 줄이는 부하로 사용할 수 있습니다.
STORE (MOVNTDQ-비 시간적 힌트를 사용하여 압축 된 정수 저장)
메모리에 쓰는 동안 데이터 캐싱을 방지하기 위해 비 시간적 힌트를 사용하여 소스 피연산자 (두 번째 피연산자)의 압축 된 정수를 대상 피연산자 (첫 번째 피연산자)로 이동합니다.
[...] 프로세서는 데이터를 캐시 계층 구조에 쓰거나 메모리에서 캐시 계층 구조로 해당 캐시 라인을 가져 오지 않습니다.
캐시 쓰기 정책 및 성능에 정의 된 용어를 사용하면 쓰기 처리 (쓰기 할당 없음, 쓰기시 가져 오기 없음)로 간주 할 수 있습니다.
마지막으로, 비 일시적 저장에 대한 John McAlpin의 메모 를 검토하는 것도 흥미로울 수 있습니다 .
MOVNTDQA은 비디오 RAM과 같은 WC (캐시 할 수없는 쓰기 결합) 메모리 영역에서만 특별한 작업을 수행합니다. 현재 HW의 일반 WB (후기 입) 메모리에서는 전혀 유용하지 않으며 NT 힌트는 무시되고 전체적으로 강력하게 정렬 된로드 의미가 적용됩니다. prefetchnta그러나 WB 메모리 의 오염 감소 부하 로 유용 할 수 있습니다 . 현재 x86 아키텍처는 비 시간적로드 ( "일반"메모리에서)를 지원합니까? .
MOVNTDQA xmmi, m128은 NT로드이고 다른 모든 NT 명령어는prefetchnta. 여기서 받아 들여지는 대답은 가게에 대해서만 이야기하는 것 같습니다. 이것이 제가 NT로드에 대해 알아낼 수 있었던 것 입니다. TL : DR : CPU는 캐시 오염을 최소화하기 위해 NT 힌트로 유용한 작업을 수행하지만 "일반"WB 메모리의 강력하게 정렬 된 의미를 무시하지 않으므로 캐시를 사용해야합니다.