이것은 다소 낮은 수준의 질문입니다. 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
필요하지 않은 것 같습니다 . 적어도 같은 스레드에서. 당신도 볼 수 있습니까?
sfence
NT 상점에 필요한 시나리오 가 있지만 일반 상점에만 필요한 것은 아닙니다. 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 (후기 입) 메모리에서는 유용하지 않습니다. . prefetchnta
WB 메모리에서 오염을 줄이는 부하로 사용할 수 있습니다.
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 메모리의 강력하게 정렬 된 의미를 무시하지 않으므로 캐시를 사용해야합니다.