[英]Process memory, GPU shared memory and x86 process on x64 windows address space
出於好奇和一些奇怪的行為觀察。
當使用win32內存管理功能為進程本身分配內存( malloc/new afterall
放在那兒)並在使用機器共享內存的集成Intel GPU上分配紋理時,x86進程的地址空間如何呈現? GPU分配是進程地址空間的一部分嗎? 自從我今天看過之后,我的過程中發生了奇怪的事情。 我在x64機器上使用x86進程,進程的承諾內存大小約為1.3Gb,GPU共享內存消耗約為600Mb,當嘗試分配32Mb緩沖區時,我開始從HeapAlloc
獲取ENOMEM
。 我不認為碎片是在這里要解決的問題,因為該過程可能要持續幾分鍾。 因此,我給人的印象是GPU內存是在進程地址空間中計算的,否則我無法解釋HeapAlloc
為何會為CRT堆返回null。 旁注,DLL鏈接時沒有/ LARGEADDRESSAWARE,因此2Gb看起來是上述數字的總和(1.3 + 0.6)
我對嗎? 錯誤? 誰能解釋它的工作原理?
EDIT001:稍微澄清一下,GPU消耗了大約600Gb的內存,但不是因為我使用DirectX分配了紋理。
EDIT002:已添加測試,在此我跳過了設備初始化
constexpr size_t dim = 5000; CD3D11_TEXTURE2D_DESC texDescriptor(DXGI_FORMAT_D24_UNORM_S8_UINT,dim,dim,1,1,D3D11_BIND_DEPTH_STENCIL);
std::vector<std::vector<uint8_t>> procData;
std::vector<CComPtr<ID3D11Texture2D>> gpuData;
// Some device/context init here
for(;;)
{
{
CComPtr<ID3D11Texture2D> tex;
hr = device->CreateTexture2D(&texDescriptor, nullptr, &tex);
if(SUCCEEDED(hr))
{
gpuData.emplace_back(tex);
}
else
{
std::cout << "Failed to create " << gpuData.size() << "th texture." << std::endl;
}
}
{
try
{
std::vector<uint8_t> buff(dim * dim, 0);
procData.emplace_back(buff);
}
catch(std::exception& ex)
{
std::cout << "Failed to create " << procData.size() << "th buffer." << std::endl;
}
}
}
提醒一下,它是x86進程,沒有LARGEADRESSAWARE設置,因此2Gb可用。 上面的代碼產生35個緩沖區和34個紋理。 如果注釋掉紋理創建塊,則會創建70個緩沖區。 好...
沒有。 Windows中的“進程地址空間”表示為任務分配的內存頁面。要處理視頻內存,您將需要ddk的東西。僅“ app”不能做這種事情,並且不擁有任何“ video”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.