A seguir está o que o visualizador de recursos do Vulkan mostra para meu computador:
MEMORY HEAP 0
DEVICE SIZE 8321499136
FLAGS
DEVICE_LOCAL_BIT
MULTI_INSTANCE_BIT
MEMORY TYPE 0
DEVICE_LOCAL_BIT
MEMORY TYPE 1
DEVICE_LOCAL_BIT
MEMORY HEAP 1
DEVICE SIZE 16760438784
FLAGS
NONE
MEMORY TYPE 0
HOST_VISIBLE_BIT
HOST_COHERENT_BIT
MEMORY TYPE 0
HOST_VISIBLE_BIT
HOST_COHERENT_BIT
O heap 0 é o meu dispositivo de GPU, que tem 8 GB. O heap 1 deveria ser a RAM da minha CPU. Tenho 32 GB e é isso que aparece no meu gerenciador de tarefas no Windows, mas apenas metade disso (16 GB) aparece na descrição do heap de memória Vulkan com o Vulkan. Pesquisei o motivo disso e encontrei na página "Calculando Memória Gráfica" na página da Microsoft:
Antes que o VidMm possa reportar uma conta precisa aos clientes, ele precisa primeiro calcular a quantidade total de memória gráfica. O VidMm usa os seguintes tipos de memória e fórmulas para calcular os números de memória gráfica:
Memória total do sistema
This value is the total amount of system memory accessible to the operating system. Memory that the BIOS allocates doesn't appear in this number. For example, a computer with a 1 GB DIMM (1,024 MB) that has a BIOS that reserves 1 MB of memory appears to have 1,023 MB of system memory.
Memória total do sistema disponível para uso gráfico
This value is the total amount of system memory that is dedicated or shared to the GPU. This number is calculated as follows: C++
TotalSystemMemoryAvailableForGraphics = MÁX.((TotalSystemMemory / 2), 64 MB)
O link está aqui .
Eu estava me perguntando por que isso acontece. Só metade da sua RAM está disponível para uso com Vulkan e DirectX, ou API gráfica? Aparentemente é isso que o VidMm informa. Não sei o que é o VidMm, mas o DirectX ou o Vulkan consultam isso para ver quanta memória está disponível, e sempre informam apenas metade da sua RAM?
No meu caso, tenho uma GPU dedicada com 8 GB, que é informada corretamente, e a RAM do sistema é informada como METADE do que eu realmente tenho, 32 GB dividido por 2. O que aconteceria se fosse uma iGPU? O dispositivo só conseguiria usar metade dessa memória do sistema? Ou seja, apenas metade da memória do dispositivo conseguiria ser usada? Isso só acontece no Windows e agora em outros sistemas operacionais?
VidMM é o Gerenciador de Memória de Vídeo que faz parte do Kernel Gráfico do DirectX. No XDDM, os drivers gráficos tinham que implementar seus próprios alocadores de memória. Isso era bastante confuso, pois os desenvolvedores de drivers, por natureza, são bons em hardware, mas não tanto em alocação de memória (algo em que as pessoas têm doutorados inteiros). Isso significava que os alocadores de memória de diferentes fornecedores podiam variar muito em seu desempenho. Enquanto isso, a Microsoft é muito boa em escrever alocadores de memória, já que eles já precisam fazer isso para o Windows. Com o WDDM, a Microsoft decidiu mover a alocação de memória da GPU da responsabilidade do IHV para si mesma. Isso liberou os fornecedores de GPU para se concentrarem em outros aspectos do driver e para que os usuários tivessem uma experiência unificada em todos os dispositivos.
A restrição de memória do sistema para uso gráfico não limita a quantidade de memória que você pode usar, mas sim o quanto você pode usar dentro das APIs gráficas . O sistema não quer privar outros processos de memória, então, em algum momento, precisa cortar alocações. A Microsoft decidiu que metade da memória do sistema era um limite suficiente. Este valor é provavelmente completamente arbitrário.
A Memória Compartilhada do Sistema não é apenas a memória que você pode alocar para buffers de preparação. Em segundo plano, o Windows e os drivers de vídeo são capazes de mover alocações dinamicamente de e para a GPU conforme desejado. O Agendador de Vídeo (VidSch) determinará quais recursos são necessários para executar uma lista de comandos e solicitará que o driver configure ações de DMA para transferir esses recursos para a GPU, além de remover recursos não utilizados da GPU. Obviamente, isso prejudicará o desempenho, mas pelo menos o sistema não travará.
Nesse caso, o driver da miniporta de vídeo informaria que sua memória é
PopulatedFromSystemMemory
. Isso dedicará uma parte da memóriaTotalSystemMemoryAvailableForGraphics
para uso exclusivo da GPU. Meu entendimento é que essa memória ficaria totalmente inacessível para aplicativos usarem deHeapAlloc
ouVirtualAlloc
, enquanto a memóriaSharedSystemMemory
pode ser invadida por aplicativos para uso geral, bem como alocada especificamente usando as APIs gráficas.Isso é feito para garantir que sempre haja uma parte da memória disponível para a GPU.
Só conheço o Windows, mas ficaria surpreso se outros sistemas operacionais não tivessem restrições para limitar o uso da memória gráfica.