visuel c ++ - Proceshukommelse, GPU delt hukommelse og x86 proces på x64 Windows adresserum

Indlæg af Hanne Mølgaard Plasc

Problem



Ud af nysgerrighed og nogle mærkelige adfærdsobservationer.
Hvordan præsenteres adressepladsen for x86-processen, når der tildeles både for processen selv ved hjælp af win32-hukommelsesadministrationsfunktioner (malloc/new afterall går ned der) og tildele teksturer på integreret intel GPU der bruger maskinens delte hukommelse? Er GPU-tildelingerne en del af procesadresserummet? Da jeg har set i dag underlige ting, der sker i min proces. Jeg bruger x86-processen på x64-maskine, min processtyrede hukommelsesstørrelse er ca. ~ 1,3Gb, GPU-delt hukommelsesforbrug er ~ 600Mb, og jeg begynder at få ENOMEM fra HeapAlloc, når du forsøger at allokere 32Mb buffer. Jeg tror ikke fragmentering er noget at håndtere her, da processen løber op til minut. Så jeg fik indtryk af, at GPU-hukommelsen tælles i procesadresseområdet, ellers kan jeg ikke forklare, hvordan kommer HeapAlloc tilbage null for CRT heap. Side note, DLL linked without/LARGEADDRESSAWARE, så 2Gb ser ud som summen af ​​ovenstående tal (1,3 + 0,6)


Har jeg ret? Forkert? Kan nogen forklare, hvordan det virker?


EDIT001: En lille præcisering, GPU forbruger ~ 600Gb ikke ud af det blå, men da jeg allokerer teksturer ved hjælp af DirectX.


EDIT002: Test tilføjet
Jeg hoppede over initialisering af enheden her

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;
        }
    }
}


Bare for at minde om, er det x86-proces, uden LARGEADRESSAWARE-indstilling, så 2Gb er tilgængelig for det.
Ovenstående kode producerer 35 buffere og 34 teksturer. Hvis du kommenterer teksten til skabelse af blokke, oprettes 70 buffere. Godt...

Bedste reference


ingen. 'proces adresse plads' i windows betyder hukommelsessider tildelt til task.to håndtere video hukommelse du skal bruge ddk stuff.just 'app' kan ikke gøre ting af denne art og ejer ikke noget 'video'.