Pergunta

A Microsoft oferece a função InterlockedCompareExchange para a realização de operações de comparar-and-swap atômicas. Há também um _InterlockedCompareExchange intrínseca .

em x86 estes são implementados usando a instrução cmpxchg.

No entanto, a leitura através da documentação sobre essas três abordagens, eles não parecem concordar com as exigências de alinhamento.

Manual de Referência da Intel não diz nada sobre o alinhamento (que não se verificação de alinhamento está ativado e é feita uma referência de memória não alinhado, é gerada uma exceção)

Eu também olhou para o prefixo lock, que afirma especificamente que

A integridade do bloqueio prefixo é não afetada pelo alinhamento do campo de memória.

(grifo meu)

Assim Intel parece dizer que o alinhamento é irrelevante. A operação será atômica não importa o que.

A documentação intrínseca _InterlockedCompareExchange também não diz nada sobre o alinhamento, no entanto, o InterlockedCompareExchange função afirma que

Os parâmetros para esta função deve ser alinhado em um limite de 32 bits; caso contrário, a função irá se comportar de forma imprevisível em multiprocessadores x86 sistemas e quaisquer sistemas não-x86.

Então, o que dá? São os requisitos de alinhamento para InterlockedCompareExchange apenas para se certificar a função vai funcionar mesmo em pré-486 CPU de onde a instrução cmpxchg não está disponível? Isso parece provável com base na informação acima, mas eu gostaria de ter certeza antes de eu contar com ele. :)

Ou é o alinhamento exigido pelo ISA para atomicity garantia, e eu estou apenas procurando nos lugares errados em manuais de referência da Intel?

Foi útil?

Solução

O PDF que você está citando é a partir de 1999 e claramente ultrapassada.

O up-to-date documentação Intel , especificamente Volume-3A conta uma história diferente.

Por exemplo, em um processador Core i7, você ainda tem que certificar-se de seus dados não não abrangem mais de cache-linhas, ou então a operação não é garantido para ser atômica.

Em 3A Volume, Programação do Sistema, para x86 / x64 Intel afirma claramente:

8.1.1 Garantia de Operações Atomic

O processador Intel486 (e processadores mais novos desde então) garante que o seguinte operações de memória básicos serão sempre realizadas atomicamente:

  • Reading ou escrever um byte
  • Reading ou escrever uma palavra alinhado em um 16-bit fronteira
  • Reading ou escrever uma doubleword alinhados em um 32-bit fronteira

O processador Pentium (e processadores mais novos desde então) garante que o seguinte operações de memória adicionais serão sempre realizadas atomicamente:

  • Reading ou escrever um quadword alinhados em um 64-bit fronteira
  • 16-bit acessos aos locais de memória uncached que se encaixam dentro de um barramento de dados de 32 bits

Os processadores da família P6 (e processadores mais novos desde então) garantia de que o seguinte operação de memória adicional será sempre realizada atomicamente:

  • Unaligned 16, 32 e 64-bit acessos a memória cache que se encaixam dentro de um cache linha

acessos à memória cacheable que estão divididos em linhas de cache e limites da página não são garantidos para ser atômica pela Intel Core 2 Duo, Intel® Atom ™, Intel Core Duo, Pentium M, Pentium 4, Intel Xeon, família P6, processadores Pentium e Intel486. O Intel Core 2 Duo, Intel Atom, Intel Core Duo, Pentium M, Pentium 4, Intel Xeon, e processadores da família P6 fornecer sinais de controle de ônibus que permitem memória externa subsistemas para fazer separação acessa atômica; no entanto, os dados não-alinhado acessa vontade impactar seriamente o desempenho do processador e deve ser evitado

Outras dicas

x86 faz não requerem o alinhamento para a instrução cmpxchg. No entanto, o alinhamento é recomendado para o desempenho. Este deve ser nenhuma surpresa, meio compatibilidade com versões anteriores que o software escrito com um manual de 14 anos atrás ainda serão executados em processadores de hoje.

Por que exatamente Microsoft requer um alinhamento não está claro a partir de sua documentação. Pode ser para o desempenho ou para suportar arquiteturas RISC ou ambos.

Intel® 64 e Manual do IA-32 arquiteturas de software desenvolvedor
Volume 3 (3A): Sistema de Guia de Programação
Janeiro 2013

8.1.2.2 Software Controlado Bus Locking

Para forçar explicitamente as semânticas de bloqueio, o software pode usar o prefixo de bloqueio com as seguintes instruções quando eles são usados ??para modificar um local de memória. [...]

• As instruções de câmbio (XADD, cmpxchg e CMPXCHG8B).
• O prefixo LOCK está automaticamente assumido para a instrução XCHG.
• [...]

[...] A integridade de um bloqueio de ônibus não é afetada pelo alinhamento da campo de memória. As semânticas de bloqueio são seguidos para o maior número de ciclos do bus conforme necessário para atualizar todo o operando. No entanto, é recomendável que acessos bloqueados estar alinhados em seus limites naturais para melhor o desempenho do sistema:

• Qualquer limite para um acesso de 8 bits (bloqueado ou não).
• limite de 16-bit para acessos palavra bloqueados.
• limite de 32-bit para trancadas doubleword acessos.
• limite de 64-bit para acessos quadword bloqueados.

Consulte este SO pergunta : alinhamento natural é importante para o desempenho, e é necessário no x64 arquitetura (por isso não é apenas a sistemas de pré-x86, mas os POST-x86 também - x64 ainda pode ser um pouco de um caso de nicho mas está crescendo em popularidade depois de tudo ;-); que pode ser por isso que documentos da Microsoft lo conforme necessário (difícil encontrar docs sobre se MS decidiu forçar a questão de alinhamento, permitindo a verificação de alinhamento - que podem variar de acordo com a versão do Windows; afirmando na documentação que o alinhamento é necessária, MS mantém o liberdade para forçá-lo em alguma versão do Windows, mesmo se eles não forçá-lo sobre os outros).

Interlocked APIs da Microsoft também aplicado a ia64 (enquanto ainda existia). Não houve prefixo bloqueio na ia64, apenas as instruções cmpxchg.acq e cmpxchg.rel (ou beasties fetchadd e outros semelhantes), e todos estes alinhamento necessário se bem me lembro.

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