Eu tenho um laptop com uma GPU dedicada, Nvidia Quadro P3200. Tem 6 GB de RAM.
O laptop também possui 32 GB de RAM “normal” (CPU?).
Estou planejando usar a GPU para computação paralela, executando simulações de física. Alguns deles envolvem arrays bem grandes.
Eu só estou querendo saber, se a memória total (todas as variáveis e todas as matrizes) no meu kernel atingir 6 GB da RAM da GPU, posso de alguma forma usar a da CPU?
Eu não usaria o laptop para mais nada durante o cálculo, portanto, a RAM principal não deveria estar ocupada.
Ps Estou usando um Dell Precision 7530, windows 10.
Resposta curta: Não, você não pode.
Resposta mais longa: a largura de banda e, mais importante, a latência entre a GPU e a RAM no barramento PCIe é uma ordem de grandeza pior do que entre a GPU e a VRAM; CPU.
A CPU pode usar uma parte da VRAM (parte mapeada na abertura PCI, geralmente 256 MB) diretamente como RAM, mas será mais lenta que a RAM normal porque o PCIe é um gargalo. Usá-lo para algo como troca pode ser viável.
Costumava ser possível aumentar o tamanho da abertura da memória alterando os bits de cinta no BIOS da GPU, mas não tentei isso desde as GPUs Nvidia Fermi (GeForce 4xx). Se ainda funcionar, também é necessário que seu BIOS esteja preparado para mapear aberturas maiores que o padrão (é altamente improvável que tenha sido testado em um laptop).
Por exemplo, uma placa de computação Xeon Phi precisa mapear toda a sua RAM na abertura PCI, portanto, precisa de um BIOS com capacidade de 64 bits no host que saiba como mapear aberturas acima do limite tradicional de 4 GB (32 bits).
Sim. Esta é a memória "compartilhada" entre a CPU e a GPU, e sempre haverá uma pequena quantidade necessária como buffers para transferir dados na GPU, mas também pode ser usada como um "backup" mais lento para a placa gráfica em muitos casos. da mesma forma que um arquivo de paginação é um armazenamento de backup mais lento para sua memória principal.
Você pode encontrar a memória compartilhada em uso no Gerenciador de Tarefas integrado do Windows acessando a guia Desempenho e clicando em sua GPU.
A memória compartilhada será mais lenta que a memória da GPU, mas provavelmente mais rápida que o disco. A memória compartilhada será a memória da CPU, que pode operar até 30 GB/s em uma máquina razoavelmente nova, mas a memória da GPU provavelmente é capaz de fazer 256 GB/s ou mais. Você também será limitado pelo link entre sua GPU e CPU, a ponte PCIe. Esse pode ser o seu fator limitante e você precisará saber se possui um PCIe Gen3 ou Gen4 e quantas faixas (geralmente "x16") ele está usando para descobrir a largura de banda teórica total entre a memória da CPU e da GPU.
Tanto quanto eu sei, você pode compartilhar a RAM do host, desde que seja memória bloqueada por página (fixada) . Nesse caso, a transferência de dados será muito mais rápida porque você não precisa transferir dados explicitamente, apenas precisa sincronizar seu trabalho (com
cudaDeviceSynchronize
, por exemplo, se estiver usando CUDA).Agora, para esta pergunta:
Não sei se existe uma maneira de "estender" a memória da GPU. Não acho que a GPU possa usar memória fixa maior que a dela, mas não tenho certeza. O que eu acho que você poderia fazer neste caso é trabalhar em lotes. Seu trabalho pode ser distribuído para que você trabalhe apenas em 6 GB por vez, salve o resultado e trabalhe em outros 6 GB? Nesse caso, trabalhar em lotes pode ser uma solução.
Por exemplo, você pode implementar um esquema de lote simples como este:
Qualquer GPU pode usar a RAM do sistema quando estiver sem sua própria VRAM.
De maneira semelhante à falta de RAM em um sistema e à paginação de todos os dados em excesso para unidades de armazenamento (SSD/HDD), as GPUs modernas podem extrair texturas ou outros dados da RAM do sistema. Os dados de textura podem ser usados da RAM do sistema pelo barramento PCIe para compensar a falta da VRAM mais rápida.
Como a RAM do sistema é algumas vezes mais lenta que a VRAM e tem latência muito maior, ficar sem VRAM se traduziria em perda de desempenho e o desempenho também seria limitado pela largura de banda do PCIe.
Portanto, não é uma questão se é possível ou não, é uma questão de desempenho ao fazê-lo.
Observe também que muitas GPUs integradas usam RAM do sistema, nem mesmo possuem a sua própria.
No caso das GPUs, o principal fator em seu desempenho é o software. Um software bem projetado usará a GPU perto de seus limites de FLOPS de saída, enquanto um mal projetado não. Normalmente, o software de computação e hash vem na 1ª categoria. O mesmo vale para alocar VRAM.
Esta pergunta é atualmente um dos principais resultados de pesquisa ao usar palavras-chave como: Os jogos podem usar RAM em vez de VRAM?
Então, achei que vale a pena acrescentar que muitos problemas relacionados ao uso de RAM vs. VRAM mudaram com a tecnologia Smart Access Memory, que atualmente é suportada por CPUs AMD Zen 3 (como Ryzen 5 5600X e Ryzen 7 5800X) , e GPUs da série AMD 6000 (como o AMD Radeon RX 6800) e serão suportados nas próximas semanas pelas GPUs da série Nvidia RTX 3000 e, posteriormente, pelas CPUs Intel de 11ª geração, mas a versão da tecnologia da Intel, e o nome usado até mesmo em algumas placas-mãe AMD é Resizable BAR.
A tecnologia essencialmente fornece mais acesso VRAM à CPU, mas resta saber se as coisas também funcionarão da maneira oposta, onde a GPU pode acessar mais RAM.