Múltiplos CPU / núcleos podem acessar a mesma RAM simultaneamente?


15

Isto é o que eu acho que iria acontecer:

  1. Se dois núcleos tentassem acessar o mesmo endereço na RAM, um teria que esperar o outro acessar a RAM. Na segunda vez em que cada núcleo tenta acessar o mesmo endereço, eles ainda podem ter essa RAM em cache, para que possam acessar seus respectivos caches simultaneamente .

  2. Se dois núcleos tentassem acessar endereços diferentes na mesma RAM, um teria que esperar o outro acessar a RAM.

Em outras palavras, eu imagino que, para tarefas de programação intensivas em RAM, o multiprocessamento não ajudará muito, a menos que envolva a leitura do mesmo endereço na RAM várias vezes por núcleo.

Portanto, vários processadores / núcleos podem acessar a mesma RAM simultaneamente ou o que estou dizendo está correto?


Não posso falar com o nível de hardware a que você está se referindo, mas posso dizer que tarefas intensivas em ram podem ser auxiliadas pelo multiprocessamento, simplesmente dividindo o uso; isto é, se você possui 500mb de dados no RAM, precisa processar, distribua 250mb desses dados / ram para um proc e 250mb para outro e você dobrou efetivamente sua taxa de transferência possível (restrições de largura de banda do ram não obstante). Além de o hardware poder ou não fazê-lo, ter vários processadores acessando o mesmo endereço ram é uma ideia realmente ruim, e a maioria dos códigos multiprocessos tenta evitá-lo.
Jimmy Hoffa

1
@ JimmyHoffa Mas as restrições de largura de banda da RAM são exatamente o que ele está falando (já que a suposição é de que a tarefa é vinculada à memória).

@ Jimmy Eu não vejo nenhum problema com dois processadores tentando ler o mesmo endereço de RAM. Eu só veria um problema se tentassem escrever ao mesmo tempo.
Perdido Hobbit

1
em um processador multicore específico com o qual eu trabalhava, os núcleos não "sabiam" nada além de seus caches locais; as coisas que precisavam sincronizar com o cache compartilhado estavam sendo feitas de forma transparente para elas no número especificado de ciclos do processador; programador disposto a levar isso em conta acrescentou apenas manualmente quantidade necessária de nops em seu código de montagem
mosquito

2
Resposta curta: depende da arquitetura do barramento do sistema, do protocolo de coerência do cache, do número de portas no seu controlador DDR e do número de controladores DDR. A resposta longa está na folha de dados do seu sistema.
SK-logic

Respostas:


11

Resumo: geralmente é possível que um único núcleo sature o barramento de memória se o acesso à memória for suficiente.

Se você estabelecer a largura de banda da memória da sua máquina, poderá ver se um processo de thread único pode realmente conseguir isso e, se não, como a largura de banda efetiva usa a escala com o número de processadores.


Os detalhes dependerão da arquitetura que você está usando. Supondo algo como SMP e SDRAM modernos:

  1. Se dois núcleos tentassem acessar o mesmo endereço na RAM ...

    poderia seguir várias maneiras:

    • os dois querem ler simultaneamente:

      • dois núcleos no mesmo chip provavelmente compartilharão um cache intermediário em algum nível (2 ou 3); portanto, a leitura será feita apenas uma vez. Em uma arquitetura moderna, cada núcleo pode continuar executando µ-ops de um ou mais pipelines até a linha de cache estar pronta
      • dois núcleos em chips diferentes podem não compartilhar um cache, mas ainda precisam coordenar o acesso ao barramento: idealmente, o chip que não emitiu a leitura simplesmente espionará a resposta
    • se ambos querem escrever:

      • dois núcleos no mesmo chip estarão gravando no mesmo cache e isso só precisará ser liberado na RAM uma vez. De fato, como a memória será lida e gravada na RAM por linha de cache, as gravações em endereços distintos, mas suficientemente próximos, podem ser combinadas em uma única gravação na RAM

      • dois núcleos em chips diferentes têm um conflito, e a linha de cache precisará ser gravada de volta na RAM pelo chip1, buscada no cache do chip2, modificada e depois gravada novamente (não há idéia se a gravação / busca pode ser unida por bisbilhotar)

  2. Se dois núcleos tentassem acessar endereços diferentes ...

    Para um único acesso, a latência do CAS significa que duas operações podem ser potencialmente intercaladas para não demorar mais (ou talvez apenas um pouco mais) do que se o barramento estivesse ocioso.


Outro item da lista é quando um núcleo inicia uma transferência de DMA enquanto o núcleo da antera cutuca a área de destino.
#

7

Portanto, vários processadores / núcleos podem acessar a mesma RAM simultaneamente ou o que estou dizendo está correto?

Existem muitas arquiteturas de máquinas diferentes por aí, cada uma com seu próprio conjunto de recursos. Uma categoria de máquinas de multiprocessamento é chamada MISD , para Dados Únicos de Múltiplas Instruções, e essas máquinas são projetadas para fornecer os mesmos dados a vários processadores, todos ao mesmo tempo. Uma classe relacionada de máquinas conhecida como arquiteturas SIMD (dados múltiplos de instrução única) é muito mais comum e também fornece acesso à mesma memória ao mesmo tempo, mas a memória contém instruções em vez de dados. No MIMD e no SIMD, "acesso" significa acesso de leitura - você pode imaginar o problema que teria se duas unidades tentassem gravar no mesmo local ao mesmo tempo!


3

Embora a maioria das respostas se aproxime do lado do modelo de software e / ou hardware, a maneira mais limpa é considerar como os chips físicos de RAM funcionam. (O cache está localizado entre o processador e a memória e simplesmente usa o mesmo barramento de endereços, e sua operação é completamente transparente para o processador.) Os chips de RAM têm um único decodificador de endereço, que recebe o endereço da célula de memória, chegando ao o barramento de endereços (e da mesma forma um barramento de dados, dentro ou fora). As memórias atuais são construídas na "abordagem de processador único", ou seja, um processador é conectado através de um barramento a um chip de memória. Em outras palavras, esse é o "gargalo de von Neumann", pois todas as instruções devem fazer referência à memória pelo menos uma vez. Por esse motivo, em um fio (ou fios, também conhecido como barramento), apenas um sinal pode existir por vez, portanto, o chip de RAM pode receber um endereço de célula por vez. Até que você possa garantir que os dois núcleos coloquem o mesmo endereço no barramento de endereços, o acesso simultâneo ao barramento por dois drivers de barramento diferentes (como núcleos) não é fisicamente possível. (E, se for o mesmo, é redundante).

O resto é a chamada aceleração de hardware. O barramento de coerência, o cache, o acesso SIMD etc. são apenas algumas fachadas agradáveis ​​em frente à RAM física, sua pergunta era sobre. Os aceleradores mencionados podem cobrir a luta pelo uso exclusivo do barramento de endereços, e os modelos de programação não têm muito a ver com sua pergunta. Observe também que o acesso simultâneo também seria contra a abstração "espaço de endereço privado".

Então, para as suas perguntas: o acesso direto simultâneo à RAM não é possível, nem com o mesmo nem com endereços diferentes. O uso do cache pode cobrir esse fato e, em alguns casos, permitir acesso aparentemente simultâneo. Depende do nível e da construção do cache, bem como da localidade espacial e temporal dos seus dados. E sim, você está certo: o processamento multi-core sem acesso aprimorado à RAM não ajudará muito em aplicativos que usam muita RAM.

Para uma melhor compreensão: lembre-se de como o Direct Memory Access funciona. Tanto a CPU quanto o dispositivo DMA podem colocar o endereço no barramento, de modo que eles precisam se excluir do uso simultâneo do barramento.


1

Você não se preocupa com a RAM física, mas se preocupa mais com a memória virtual e o espaço de endereçamento de processos ou threads (todos os threads do mesmo processo compartilham um espaço de endereço comum) na prática.

Obviamente, se você estiver codificando um kernel de sistema operacional com vários núcleos, preocupa-se muito com a RAM e a coerência do cache.

A maioria dos processadores multinúcleo possui algum tipo de mecanismo de coerência de cache . Os detalhes são específicos do processador. Como o processador está usando caches de CPU , eles às vezes se comportam como se vários núcleos do processador estivessem acessando o mesmo local de memória simultaneamente.

Padrões recentes de linguagens industriais como C11 ou C ++ 11 têm algum modelo de memória ( compatível com vários segmentos) .


0

As CPUs modernas estão fisicamente ligadas aos seus dispositivos de memória externa para obter a largura de banda máxima de transferência de dados. Isso ocorre devido aos requisitos de integridade do sinal (comprimento do traço, terminação, inclinação do relógio, etc.) necessários para sustentar as altas taxas de transferência. Por exemplo, em uma placa-mãe com várias CPUs, cada CPU possui um conjunto dedicado de slots DIMM. Independentemente do que os programadores de software possam pensar, uma CPU não pode simplesmente acessar dados de memória externa de outra CPU. O software de gerenciamento de memória de um sistema, seja no nível do kernel do sistema operacional, no Hypervisor, nos núcleos do plano de dados ou de outra forma, lida com a transferência de dados de memória entre CPU.


1
é difícil ler este post (parede de texto). Você se importaria de editá -lo em uma forma melhor?
precisa
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.