문제

이것은 다소 낮은 수준의 질문입니다.x86 어셈블리에는 두 가지 SSE 명령어가 있습니다.

MOVDQA xmmi, m128

그리고

MOVNTDQA xmmi, m128

IA-32 소프트웨어 개발자 매뉴얼에는 다음과 같이 나와 있습니다. NT MOVNTDQA에서 다음을 의미합니다. 비시간적, 그렇지 않으면 MOVDQA와 동일합니다.

내 질문은 무엇입니까? 비시간적 평균?

도움이 되었습니까?

해결책

비시간적 SSE 명령어(MOVNTI, MOVNTQ 등)는 일반적인 캐시 일관성 규칙을 따르지 않습니다.따라서 비임시 저장소 뒤에는 SFENCE 명령이 따라와야 그 결과가 적시에 다른 프로세서에서 표시될 수 있습니다.

데이터가 생성되고 다시 (즉시) 소비되지 않는 경우 메모리 저장소 작업이 먼저 전체 캐시 라인을 읽은 다음 캐시된 데이터를 수정한다는 사실은 성능에 해롭습니다.이 작업은 곧 사용되지 않을 데이터를 위해 다시 필요할 수 있는 데이터를 캐시에서 밀어냅니다.이는 채워져 나중에 사용되는 행렬과 같은 대규모 데이터 구조의 경우 특히 그렇습니다.행렬의 마지막 요소가 채워지기 전에 엄청난 크기로 인해 첫 번째 요소가 제거되어 쓰기 캐싱이 효과적이지 않게 됩니다.

이와 유사한 상황에서 프로세서는 비일시적 쓰기 작업에 대한 지원을 제공합니다.이 맥락에서 비일시적이란 데이터가 곧 재사용되지 않으므로 캐시할 이유가 없음을 의미합니다.이러한 비일시적 쓰기 작업은 캐시 라인을 읽은 다음 수정하지 않습니다.대신 새 콘텐츠가 메모리에 직접 기록됩니다.

원천: http://lwn.net/Articles/255364/

다른 팁

Espo는 목표물에 거의 성공했습니다.내 두 센트를 추가하고 싶었습니다.

"비시간적"이라는 문구는 시간적 지역성이 부족함을 의미합니다.캐시는 공간적 및 시간적이라는 두 가지 종류의 지역성을 활용하며, 비시간적 명령을 사용하여 해당 데이터 항목이 가까운 미래에 사용될 것으로 예상하지 않는다는 신호를 프로세서에 보냅니다.

나는 캐시 제어 명령을 사용하는 손으로 코딩한 어셈블리에 대해 약간 회의적입니다.내 경험에 따르면 이러한 것들은 효과적인 성능 향상보다 더 사악한 버그로 이어집니다.

Intel® 64 및 IA-32 아키텍처 소프트웨어 개발자 매뉴얼, 볼륨 1에 따르면:기본 아키텍처, "Intel Streaming Simd Extensions (Intel SSE)를 사용한 프로그래밍"장 :

임시 캐싱과 임시 캐싱비시간적 데이터

프로그램에서 참조하는 데이터는 임시적(데이터가 다시 사용됨)이거나 비일시적(데이터는 한 번 참조되고 가까운 장래에 재사용되지 않음)일 수 있습니다.예를 들어, 프로그램 코드는 일반적으로 일시적인 반면, 3D 그래픽 애플리케이션의 표시 목록과 같은 멀티미디어 데이터는 비일시적인 경우가 많습니다.프로세서 캐시를 효율적으로 사용하려면 일반적으로 임시 데이터를 캐시하고 비시간 데이터를 캐시하지 않는 것이 바람직합니다.비시간적 데이터로 프로세서 캐시를 오버로드하는 것을 "캐시 오염"이라고도 합니다.SSE 및 SSE2 캐시 가능성 제어 명령어를 사용하면 프로그램이 캐시 오염을 최소화하는 방식으로 비일시적 데이터를 메모리에 쓸 수 있습니다.

비시간적 로드 및 저장 명령어에 대한 설명입니다.원천:Intel 64 및 IA-32 아키텍처 소프트웨어 개발자 매뉴얼, 볼륨 2:명령어 세트 참조

LOAD(MOVNTDQA - 이중 쿼드워드 비시간적 정렬 힌트 로드)

메모리 소스가 WC(쓰기 결합) 메모리 유형인 경우 비시간적 힌트를 사용하여 소스 피연산자(두 번째 피연산자)에서 대상 피연산자(첫 번째 피연산자)로 이중 쿼드워드를 로드합니다. [...]

[...] 프로세서는 데이터를 캐시 계층으로 읽지 않으며 해당 캐시 라인을 메모리에서 캐시 계층으로 가져오지도 않습니다.

Peter Cordes의 의견에 따르면 NT 힌트가 무시되고(아마도 NT 인식 HW 프리페처가 없기 때문에) 전체 강력하게 정렬된 로드 의미 체계가 적용되기 때문에 현재 프로세서의 일반 WB(다시 쓰기) 메모리에는 유용하지 않습니다. . prefetchnta WB 메모리에서 오염을 줄이는 부하로 사용할 수 있습니다.

STORE(MOVNTDQ - 비시간적 힌트를 사용하여 압축된 정수 저장)

메모리에 쓰는 동안 데이터 캐싱을 방지하기 위해 비일시적 힌트를 사용하여 소스 피연산자(두 번째 피연산자)의 압축된 정수를 대상 피연산자(첫 번째 피연산자)로 이동합니다.

[...] 프로세서는 캐시 계층에 데이터를 쓰지 않으며 해당 캐시 라인을 메모리에서 캐시 계층으로 가져오지도 않습니다.

다음에 정의된 용어 사용 캐시 쓰기 정책 및 성능, write around(쓰기 할당 없음, 쓰기 시 가져오기 없음)로 간주될 수 있습니다.

마지막으로 검토해 보는 것이 흥미로울 수 있습니다. John McAlpin은 비임시적 상점에 대해 언급합니다..

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top