x64窗口地址空间

时间:2017-01-17 19:47:32

标签: windows visual-c++ memory-management gpu directx-11

出于好奇和一些奇怪的行为观察。
当使用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个缓冲区。嗯......

1 个答案:

答案 0 :(得分:0)

没有。 &#34;处理地址空间&#34;在Windows中意味着分配给任务的内存页面处理视频内存,你需要ddk stuff.just&#34; app&#34;不能做这类事情并且不拥有任何东西&#34;视频&#34;。