Память процессов, общая память GPU и процесс x86 в адресном пространстве Windows x64

Из любопытства и какого-то странного наблюдения за поведением.
Как представлено адресное пространство для процесса x86 при выделении как для самого процесса с помощью функций управления памятью win32 (malloc/new afterallgo down there), так и выделении текстур на интегрированном Intel GPU, использующем общую память машины? Являются ли выделения GPU частью адресного пространства процесса? С тех пор, как я увидел сегодня странные вещи, происходящие с моим процессом. Я использую процесс x86 на x64 машине, мой процесс фиксированный размер памяти составляет ~1,3 Гб, потребление общей памяти GPU составляет ~600 мб, и я начинаю получать ENOMEMот HeapAlloc при попытке выделить 32Мб буфер. Я не считаю, что фрагментация является чем-то, чтобы иметь дело с Здесь, так как процесс работает до минуты. Таким образом, у меня сложилось впечатление, что память GPU подсчитывается в адресном пространстве процесса, иначе я не могу объяснитьHeapAlloc, почему возвращается null для кучи CRT. Примечание, DLL связан без / LARGEADDRESSAWARE, поэтому 2Gb выглядит как сумма вышеуказанных чисел (1.3+0.6)

Я прав? Неправильно? Кто-нибудь может объяснить, как это работает?

EDIT001: небольшое уточнение, GPU потребляет ~600 Гб не просто так, но так как я выделяю текстуры с помощью 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, так что, 2 ГБ доступно для него.
Приведенный выше код создает 35 буферов и 34 текстуры. Если вы закомментируете блок создания текстуры, будет создано 70 буферов. Что ж…

1 ответ

  1. нет. «адресное пространство процесса» в windows означает страницы памяти, выделенные для задачи.для работы с видеопамятью вам понадобится ddk материал.просто » приложение «не может делать вещи такого рода и не владеет ничего»видео».