Pergunta

Eu li na documentação do Visual C ++ que é seguro para vários segmentos ler do mesmo objeto.

A minha pergunta é: como é que uma CPU X86-64 com múltiplos núcleos de lidar com este

Digamos que você tenha um bloco de 1 MB de memória. São diferentes tópicos literalmente capaz de ler os exato mesmos dados ao mesmo tempo ou fazer núcleos de ler uma palavra de cada vez com apenas um núcleo permissão para ler uma determinada palavra de cada vez?

Foi útil?

Solução

Não são apenas diferentes núcleos permissão para ler a partir do mesmo bloco de memória, eles estão autorizados a escrever ao mesmo tempo também. Se é "seguro" ou não, isso é uma história completamente diferente. Você precisa implementar algum tipo de guarda em seu código (normalmente feito com semáforos ou derivados deles) para proteger contra vários núcleos que lutam sobre o mesmo bloco de memória de uma forma que não permitem especificamente.

Sobre o tamanho da memória de um núcleo lê ao mesmo tempo, que geralmente é o valor de um registo, 32 bits em uma CPU de 32 bits, 64 bits para uma CPU de 64 bits e assim por diante. Mesmo fluindo é feito dword por DWORD (olhada memcpy por exemplo).

Sobre como concorrente múltiplos núcleos realmente são, cada núcleo utiliza um único ônibus para ler e escrever para a memória, por isso aceder a quaisquer recursos (RAM, dispositivos externos, a unidade de processamento de ponto flutuante) é um pedido de cada vez, um núcleo de uma vez. O processamento no interior do núcleo é completamente concomitante no entanto. transferências DMA também não bloquear o ônibus, transferências simultâneas ficar na fila e processados ??um de cada vez (creio eu, não 100% de certeza sobre isso).

Edit: Só para esclarecer, ao contrário da outra resposta aqui, eu estou falando apenas sobre um cenário sem cache. acesso somente leitura, claro, se a memória é armazenada em cache é completamente concorrente.

Outras dicas

Se há realmente nenhuma escreve em seu bloco de 1MB então sim, cada núcleo pode ler a partir de sua própria linha de cache sem qualquer problema como há gravações estão sendo cometidos e levanta-te, portanto, sem problemas de coerência de cache.

Em uma arquitetura multicore, basicamente, há um cache para cada núcleo e um "Coerência Cache Protocol" que invalida o cache em alguns núcleos que não têm a até informações mais data. Eu acho que a maioria dos processadores implementar o MOESI protocolo para a coerência de cache.

de coerência de cache é um tema complexo que tem sido amplamente discutido (eu gosto especialmente alguns artigos de Joe Duffy aqui e aqui ). A discussão apesar de tudo gira em torno das possíveis penalidades de código de desempenho que, sendo aparentemente bloquear livre, pode abrandar devido ao protocolo de coerência de cache chutando para manter a coerência em toda a caches processadores, mas, enquanto não há escreve simplesmente não há coerência para manter e, assim, não perdeu no desempenho.

Só para esclarecer, como disse no comentário, RAM não pode ser acessado simultaneamente desde x86 e x64 arquiteturas implementar um único ônibus que é compartilhado entre os núcleos com SMP garantindo a equidade acesso à memória principal. No entanto esta situação está oculta por cada cache núcleo que permite que cada núcleo tem a sua própria cópia dos dados. Para 1MB de dados seria possível a incorrer em alguma disputa enquanto a atualização do núcleo seu cache, mas que seria insignificante.

Alguns links úteis:

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