出于好奇和一些奇怪的行为观察。
当使用win32内存管理函数(malloc/new afterall
下去)为进程本身分配两者时,如何为x86进程提供地址空间并分配纹理在集成的英特尔GPU上使用机器的共享内存? GPU分配是进程地址空间的一部分吗?自从我今天看到我的过程中发生了奇怪的事情。我在x64机器上使用x86进程,我的进程提交的内存大小约为~1.3Gb,GPU共享内存消耗约为600Mb,当我尝试分配32Mb时,我开始从ENOMEM
获得HeapAlloc
缓冲。我不相信碎片是这里要处理的事情,因为这个过程会持续一分钟。所以我得到的印象是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个缓冲区。嗯......
答案 0 :(得分:0)
没有。 &#34;处理地址空间&#34;在Windows中意味着分配给任务的内存页面处理视频内存,你需要ddk stuff.just&#34; app&#34;不能做这类事情并且不拥有任何东西&#34;视频&#34;。