繁体   English   中英

x64 Windows地址空间上的进程内存,GPU共享内存和x86进程

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM