Pergunta

Esta é uma questão um tanto de baixo nível.No assembly x86, existem duas instruções SSE:

MOVDQA xmmi, m128

e

MOVNTDQA xmmi, m128

O Manual do Desenvolvedor de Software IA-32 diz que o NT em MOVNTDQA significa Não Temporal, e caso contrário é o mesmo que MOVDQA.

Minha pergunta é: o que Não Temporal significar?

Foi útil?

Solução

Instruções SSE não temporais (MOVNTI, MOVNTQ, etc.) não seguem as regras normais de coerência de cache.Portanto, os armazenamentos não temporais devem ser seguidos por uma instrução SFENCE para que seus resultados possam ser vistos por outros processadores em tempo hábil.

Quando os dados são produzidos e não (imediatamente) consumidos novamente, o fato de as operações de armazenamento de memória lerem primeiro uma linha completa do cache e depois modificarem os dados armazenados em cache é prejudicial ao desempenho.Esta operação empurra os dados para fora dos caches que podem ser necessários novamente em favor de dados que não serão usados ​​em breve.Isto é especialmente verdadeiro para grandes estruturas de dados, como matrizes, que são preenchidas e usadas posteriormente.Antes que o último elemento da matriz seja preenchido, o tamanho expulsa os primeiros elementos, tornando o armazenamento em cache das gravações ineficaz.

Para esta e situações semelhantes, os processadores fornecem suporte para operações de gravação não temporais.Atemporal neste contexto significa que os dados não serão reutilizados em breve, portanto não há razão para armazená-los em cache.Essas operações de gravação não temporais não leem uma linha de cache e depois a modificam;em vez disso, o novo conteúdo é gravado diretamente na memória.

Fonte: http://lwn.net/Articles/255364/

Outras dicas

Espo acertou em cheio no alvo.Só queria adicionar meus dois centavos:

A frase “não temporal” significa falta de localidade temporal.Os caches exploram dois tipos de localidade - espacial e temporal, e ao usar uma instrução não temporal você sinaliza ao processador que não espera que o item de dados seja usado em um futuro próximo.

Estou um pouco cético em relação ao assembly codificado manualmente que usa as instruções de controle de cache.Na minha experiência, essas coisas levam a mais bugs malignos do que qualquer aumento efetivo de desempenho.

De acordo com o Manual do desenvolvedor de software das arquiteturas Intel® 64 e IA-32, Volume 1:Arquitetura Básica, "Programação com Extensões SIMD de transmissão Intel (Intel SSE)" Capítulo:

Cache de Temporal vs.Dados não temporais

Os dados referenciados por um programa podem ser temporais (os dados serão usados ​​novamente) ou não temporais (os dados serão referenciados uma vez e não serão reutilizados no futuro imediato).Por exemplo, o código do programa é geralmente temporal, enquanto os dados multimídia, como a lista de exibição em um aplicativo gráfico 3D, geralmente são atemporais.Para fazer uso eficiente dos caches do processador, geralmente é desejável armazenar em cache dados temporais e não armazenar em cache dados não temporais.Sobrecarregar os caches do processador com dados não temporais às vezes é chamado de "poluição dos caches".As instruções de controle de capacidade de cache SSE e SSE2 permitem que um programa grave dados não temporais na memória de uma maneira que minimize a poluição dos caches.

Descrição de instruções de carregamento e armazenamento não temporais.Fonte:Manual do desenvolvedor de software das arquiteturas Intel 64 e IA-32, Volume 2:Referência do conjunto de instruções

LOAD (MOVNTDQA — Carregar dica de alinhamento não temporal de duas palavras quádruplas)

Carrega uma palavra quádrupla dupla do operando de origem (segundo operando) para o operando de destino (primeiro operando) usando uma dica não temporal se a fonte de memória for do tipo de memória WC (combinação de gravação) [...]

[...] o processador não lê os dados na hierarquia de cache, nem busca a linha de cache correspondente da memória para a hierarquia de cache.

Observe que, como comenta Peter Cordes, não é útil na memória WB normal (write-back) nos processadores atuais porque a dica do NT é ignorada (provavelmente porque não há pré-buscadores de HW com reconhecimento de NT) e a semântica de carga totalmente ordenada se aplica . prefetchnta pode ser usado como uma carga redutora de poluição da memória WB

ARMAZENAR (MOVNTDQ — Armazenar números inteiros compactados usando dicas não temporais)

Move os inteiros compactados no operando de origem (segundo operando) para o operando de destino (primeiro operando) usando uma dica não temporal para evitar o armazenamento em cache dos dados durante a gravação na memória.

[...] o processador não grava os dados na hierarquia de cache, nem busca a linha de cache correspondente da memória para a hierarquia de cache.

Usando a terminologia definida em Políticas e desempenho de gravação em cache, eles podem ser considerados como write-around (no-write-allocate, no-fetch-on-write-miss).

Finalmente, pode ser interessante rever John McAlpin observa sobre armazenamentos não temporais.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top