簡體   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