"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Por que o armazenamento `std::atomic` usa XCHG para consistência sequencial em x86?

Por que o armazenamento `std::atomic` usa XCHG para consistência sequencial em x86?

Publicado em 2024-11-18
Navegar:748

Why does `std::atomic`\'s store use XCHG for sequential consistency on x86?

Por que a loja std::atomic emprega XCHG para consistência sequencial

No contexto de std::atomic para arquiteturas x86 e x86_64, um operação de armazenamento com consistência sequencial (std::memory_order_seq_cst) emprega XCHG em vez de um armazenamento simples com uma barreira de memória como a técnica para obter semântica de liberação sequencial.

Consistência sequencial e xchg

A consistência sequencial determina que todas as operações de memória parecem ser executadas em alguma ordem sequencial, e essa ordem é a mesma para todos os threads. XCHG, uma instrução x86 que troca atomicamente os valores de dois operandos, satisfaz inerentemente esse requisito de consistência sequencial. Ao usar XCHG para executar uma operação de gravação, std::atomic garante que o armazenamento se torne globalmente visível para todos os threads em um ponto específico na ordem de execução, evitando a reordenação com operações subsequentes.

mov- armazenar mfence vs. XCHG

Embora um simples mov-store seguido por um limite de memória (como mfence) possa teoricamente fornecer semântica de liberação, ele não é suficiente para operações de armazenamento de liberação sequencial. MFENCE, uma instrução de limite de memória que estabelece uma barreira de memória, garante que as operações de gravação anteriores sejam confirmadas na memória antes de prosseguir. No entanto, isso não impede que as operações de carregamento subsequentes sejam reordenadas antes do armazenamento de lançamento.

Considerações de desempenho

A escolha entre mov-store mfence e XCHG para liberação sequencial as operações de armazenamento envolvem compensações de desempenho.

  • Em certas CPUs (por exemplo, Intel Skylake), o XCHG pode ser mais eficiente do que o mov-store mfence, especialmente quando não há código dependente circundante que precise sincronizar com a operação atômica.
  • Em outras CPUs, mov-store mfence pode ser preferível para cenários de alto rendimento ou quando o código circundante pode sobrepor a execução com a operação atômica.

Detalhes de implementação

Na prática, a implementação específica do armazenamento std::atomic com consistência sequencial varia dependendo do compilador e da arquitetura de hardware.

  • GCC/ Clang: Originalmente usado mov-store mfence, mas recentemente mudou para o uso de XCHG para lojas seq-cst.
  • Intel Compiler: Usa XCHG para lojas seq-cst.
  • Microsoft Visual C: Também usa XCHG para lojas seq-cst.

Implicit Acquire Fence

A afirmação de que x86 as lojas têm uma barreira de aquisição implícita está incorreta. As lojas em x86 possuem semântica de lançamento, não semântica de aquisição. A semântica de aquisição normalmente é aplicada usando barreiras de memória, como mfence ou operações de leitura atômica com semântica std::memory_order_acquire.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3