Esta é uma questão de baixo nível. Na montagem x86, existem duas instruções SSE:
MOVDQA xmmi, m128
e
MOVNTDQA xmmi, m128
O Manual do Desenvolvedor de Software IA-32 diz que NT em MOVNTDQA significa Non-Temporal e que, caso contrário, é igual a MOVDQA.
Minha pergunta é: o que significa não temporal ?
MOVNTDQA xmmi, m128
é uma carga NT, enquanto todas as outras instruções NT são armazenadas, exceto paraprefetchnta
. A resposta aceita aqui parece ser apenas sobre lojas. Isso é o que descobri sobre cargas do NT . TL: DR: espero que a CPU faça algo útil com a dica do NT para minimizar a poluição do cache, mas eles não sobrescrevem a semântica fortemente ordenada da memória WB "normal", então eles têm que usar o cache.Respostas:
As 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 sejam vistos por outros processadores em tempo hábil.
Quando os dados são produzidos e não (imediatamente) consumidos novamente, o fato de que as operações de armazenamento de memória leem primeiro uma linha de cache completa e, em seguida, modificam os dados em cache é prejudicial ao desempenho. Esta operação remove os dados dos caches que podem ser necessários novamente em favor dos dados que não serão usados em breve. Isso é 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 total despeja os primeiros elementos, tornando o armazenamento em cache das gravações ineficaz.
Para esta e outras 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 a modificam; em vez disso, o novo conteúdo é gravado diretamente na memória.
Fonte: http://lwn.net/Articles/255364/
fonte
SFENCE
pode não ser necessário. Pelo menos no mesmo tópico. Você também poderia olhar?sfence
é necessário para armazenamentos NT, ao passo que nunca é necessário apenas para armazenamentos normais. As lojas NT não são encomendadas em relação a outras lojas (NT ou não), como visto por outras threads , sem umsfence
. Para leituras do mesmo encadeamento que fez os armazenamentos, entretanto, você nunca precisasfence
: um determinado encadeamento sempre verá seus próprios armazenamentos na ordem do programa, independentemente de serem ou não armazenamentos do NT.Espo acerta o alvo. Só queria adicionar meus dois centavos:
A frase "atemporal" significa ausência de localidade temporal. Os caches exploram dois tipos de localidade - espacial e temporal, e ao usar uma instrução atemporal você está sinalizando ao processador que não espera que o item de dados seja usado em um futuro próximo.
Estou um pouco cético quanto ao assembly codificado manualmente que usa as instruções de controle de cache. Em minha experiência, essas coisas levam a mais bugs do que qualquer aumento efetivo de desempenho.
fonte
De acordo com o Manual do desenvolvedor de software das arquiteturas Intel® 64 e IA-32, Volume 1: Arquitetura básica, capítulo "Programação com extensões Intel Streaming SIMD (Intel SSE)":
Cache de dados temporais vs. não temporais
Descrição das instruções de carregamento e armazenamento não temporais. Fonte: Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 2: Instruction Set Reference
CARGA (MOVNTDQA - Carregar Dica de Alinhamento Não Temporal de Duas Palavras Quadword)
Observe que, como Peter Cordes comenta, não é útil na memória WB (write-back) normal nos processadores atuais porque a dica do NT é ignorada (provavelmente porque não há pré-buscadores HW compatíveis com o NT) e a semântica de carga totalmente ordenada se aplica .
prefetchnta
pode ser usado como uma carga de redução de poluição da memória WBSTORE (MOVNTDQ - Armazenar Inteiros Empacotados Usando Dica Não Temporal)
Usando a terminologia definida em Políticas e desempenho de gravação de cache , eles podem ser considerados como write-around (no-write-alocate, no-fetch-on-write-miss).
Finalmente, pode ser interessante revisar as notas de John McAlpin sobre armazenamentos não temporais .
fonte
MOVNTDQA
só faz algo especial em regiões de memória WC (Unacheable Write-Combining), por exemplo, RAM de vídeo. Não é de todo útil na memória WB (write-back) normal no HW atual, a dica do NT é ignorada e a semântica de carga totalmente ordenada é aplicada.prefetchnta
pode ser útil, entretanto, como uma carga de redução de poluição da memória WB. As arquiteturas x86 atuais suportam cargas não temporais (da memória "normal")? .