2008-08-31 2 views
81

이것은 다소 저급적인 질문입니다. 86 어셈블리에서 두 개의 SSE 명령이 있습니다 :x86의 "non temporal"메모리 액세스의 의미는 무엇입니까?

MOVDQA xmmi, m128

MOVNTDQA xmmi, m128

IA-32 소프트웨어 개발자 설명서는 말한다 NT에 그 MOVNTDQA는 의 약자입니다. -Temporal, 그렇지 않으면 MOVDQA와 같습니다.

내 질문은 무엇입니까 비 일시적의 의미는 무엇입니까?

+1

SSE4.1'MOVNTDQA xmmi, m128'은 NT로드이고 다른 모든 NT 명령어는'prefetchnta'를 제외하고는 store라는 점에 유의하십시오. 허용 된 대답은 상점에 대해서만 말하는 것 같습니다. [이것이 NT로드에 대해 나타낼 수있는 것입니다] (http://stackoverflow.com/questions/32103968/non-temporal-loads-and-the-hardware-prefetcher-do-theywork-together). TL : DR : CPU가 캐시 오염을 최소화하기 위해 NT 힌트와 함께 유용하게 사용할 수 있지만 "정상적인"WB 메모리의 강하게 정렬 된 의미를 무시하지 않으므로 캐시를 사용해야합니다. –

+1

업데이트 : NT *로드 *는 대부분의 CPU (예 : 인텔 SnB 제품군)의 UCSW 메모리 영역을 제외하고는 아무런 도움이되지 않을 수 있습니다. NT/스트리밍 * 스토어는 확실히 정상적인 메모리에서 작동합니다. –

+0

@Peter : USWC 메모리를 의미합니까?전에 UCSW 또는 USWC 메모리에 대해 들어 본 적이 없습니다. 잘못된 약어를 ​​알아내는 것이 도움이되지 않았다 .-) –

답변

106

비 임시 SSE 명령어 (MOVNTI, MOVNTQ 등)는 일반적인 캐시 일관성 규칙을 따르지 않습니다. 따라서 다른 프로세서에서 결과를 적시에 볼 수 있으려면 시간이 아닌 매장에 SFENCE 명령을 사용해야합니다.

데이터가 생성되어 다시 (즉시) 소비되지 않으면 메모리 저장소 연산이 전체 캐시 줄을 먼저 읽은 다음 캐시 된 데이터를 수정한다는 사실이 성능에 좋지 않습니다. 이 작업은 곧 사용할 수없는 데이터를 위해 다시 필요할 수있는 캐시에서 데이터를 푸시합니다. 이것은 채워진 후 나중에 사용되는 행렬과 같은 대용량 데이터 구조에서 특히 그렇습니다. 행렬의 마지막 요소가 채워지기 전에 깎아 지른 크기가 첫 번째 요소를 제거하므로 쓰기 캐싱이 비효율적입니다.

이와 유사한 상황에서 프로세서는 비 임시 기록 작업을 지원합니다. 이 컨텍스트에서 비 시간적이란 데이터가 곧 재사용되지 않는다는 것을 의미하기 때문에 캐쉬 할 이유가 없습니다. 이러한 비 일시적인 쓰기 작업은 캐시 라인을 읽은 다음 수정하지 않습니다. 대신 새 내용이 메모리에 직접 기록됩니다.

출처 : http://lwn.net/Articles/255364/

+10

좋은 답변이지만, 비 NT가 아닌 프로세서 (즉, 일반 명령)를 사용하는 경우에도, 캐시가 "읽히지 않고 수정 된"것이 아닙니다. 캐시에없는 라인에 대한 정상적인 명령어 쓰기의 경우 캐시에 라인이 예약되고 마스크는 라인의 어떤 부분이 최신인지를 나타냅니다. 이 웹 페이지는 "상점에서의 스톨 금지"라고합니다 : http://www.ptlsim.org/Documentation/html/node30.html. 더 정확한 참조를 찾을 수 없었습니다. 단지 프로세서 시뮬레이터를 구현하는 사람들 에게서만 들었습니다. –

+2

실제로 http://www.ptlsim.org/는 정확한 사이클 프로세서 시뮬레이터에 관한 웹 사이트입니다. "상점에서의 실속"에 대해 저에게 말한 사람들과 정확히 같은 종류의 일을합니다. 나는 그들이이 코멘트를 볼 수있는 경우에 대비하여 그것들을 더 잘 언급 할 것이다. http://unisim.org/ –

+0

대답과 코멘트는 https://stackoverflow.com/questions/44864033/make-previous-memory-stores- 후속 메모리로드시 'SFENCE'가 필요하지 않을 수도 있습니다. 적어도 같은 스레드에서. 너 볼 수도 있니? –

29

ESPO 대상에 거의 뱅입니다. 단지 두 개의 센트를 추가하고 싶었습니다.

"임시가 아닌"구는 임시 지역이 없다는 것을 의미합니다. 캐시는 두 가지 유형의 지역 (즉, 공간 및 시간)을 활용하고 프로세서에 신호를 보내는 비 임시 명령을 사용하여 데이터 항목이 가까운 미래에 사용될 것으로 예상하지 않습니다.

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

+0

"캐시 제어 명령을 사용하는 직접 코딩 된 어셈블리"에 대한 질문. 나는 당신이 명시 적으로 JavaVM과 같은 것을 "손으로 코딩"했다고 말한 것을 알고 있습니다. 더 나은 유스 케이스인가요? JavaVM/Compiler는 프로그램의 정적 및 동적 동작을 분석하고 이러한 비 시간 명령어를 사용합니다. – Pat

+1

문제가있는 도메인, 알고리즘 또는 응용 프로그램의 알려진 지역 특성 (또는 그 부족)을 악용해서는 안됩니다. 캐시 오염을 피하는 것은 실제로 매우 매력적이고 효과적인 최적화 작업입니다. 또한 조립에 대한 싫어함은 무엇입니까? 컴파일러가 아마도 활용할 수있는 이득을 얻을 수있는 방대한 기회가 있습니다 –

+3

지식이 풍부한 저수준 프로그래머가 작은 커널에 대해 컴파일러보다 성능이 우수하다는 것은 확실합니다. 이것은 논문 및 블로그 포스트를 게시하는 데 적합하며 두 가지 모두를 수행했습니다. 그들은 또한 훌륭한 교훈적인 도구이기 때문에 "실제로"무엇이 일어나는지 이해하는 데 도움이됩니다. 내 경험에 비추어 볼 때 실제로 많은 프로그래머가있는 실제 시스템이 있고 정확성과 유지 보수성이 중요한 곳에서는 저수준 코딩의 이점이 거의 항상 위험보다 중요합니다. – Pramod