Pergunta

Em que circunstâncias é inseguro para ter dois tópicos diferentes simultaneamente escrevendo a elementos adjacentes da mesma matriz em x86? Eu entendo que em algum DS9K-como arquiteturas com modelos de memória insanos isso pode causar lacrimejamento palavra, mas em x86 bytes individuais são endereçáveis. Por exemplo, no real D linguagem de programação é um tipo de ponto flutuante de 80-bits no x86. Seria seguro para fazer algo como:

real[] nums = new real[4];  // Assume new returns a 16-byte aligned block.
foreach(i; 0..4) {
    // Create a new thread and have it do stuff and 
    // write results to index i of nums.
}

Nota: Eu sei que, mesmo se isso é seguro, às vezes pode causar problemas de compartilhamento de falsos com o cache, levando a um desempenho lento. No entanto, para os casos de uso que tenho em mente as gravações serão suficientes pouco frequente para que isso não importa na prática.

Edit: Não se preocupe com a leitura de volta os valores que estão escritas. A suposição é que há é a sincronização antes de quaisquer valores são lidos. Eu só se preocupam com a segurança de escrito desta forma.

Foi útil?

Solução

O x86 tem caches coerentes. O último processador para escrever a uma linha de cache adquire a coisa toda e faz uma gravação para o cache. Isso garante que os valores individuais de byte e quatro bytes escrito em valores correspondentes são atomicamente actualizado.

Isso é diferente do que "é seguro". Se os processadores cada única gravação para bytes / DWORDS "propriedade" de que o processador de design, em seguida, as atualizações serão corretos. Na prática, você quer um processador para ler os valores escritos por outras pessoas, e isso exige sincronização.

Também é diferente do que é "eficiente". Se vários processadores podem cada gravação para lugares diferentes na linha de cache, em seguida, a linha de cache pode ping-pong entre CPUs e isso é muito mais caro do que se a linha de cache vai para uma única CPU e permanece lá. A regra usual é colocar os dados específicos do processador em sua própria linha de cache. Claro, se você está indo só para gravar em apenas que uma palavra, apenas uma vez, e a quantidade de trabalho que é significativo em comparação com um movimento de linha de memória cache, então seu desempenho será aceitável.

Outras dicas

Eu poderia estar faltando alguma coisa, mas eu não prevêem quaisquer problemas. arquitetura x86 escreve apenas o que ele precisa, ele não faz qualquer escrito fora dos valores especificados. Cache-espionagem alças as questões de cache.

Você está perguntando sobre x86 especificidades, mas seu exemplo é em alguma linguagem de alto nível. Sua pergunta específica sobre D só podem ser respondidas pelas pessoas que escreveram o compilador que você está usando, ou talvez a especificação da linguagem D. Java, por exemplo, exige que o acesso do elemento da matriz não deve causar lacrimejamento.

Em relação x86, atomicidade das operações é especificado na Seção 8.1 do manual 3A Volume Software da Intel do desenvolvedor . De acordo com ele, as operações da loja atômicas incluem: armazenar um byte, armazenar palavra-alinhados palavra e dword DWORD-alinhado em todas as CPUs x86. Também especifica que em P6 e CPUs posteriores desalinhado 16, 32 e acesso de 64 bits para a memória cache dentro de uma linha de cache é atômica.

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