出於好奇和一些奇怪的行爲觀察。
當使用win32內存管理功能(malloc/new afterall
下去)爲進程本身分配x86進程的地址空間並在使用計算機共享內存的集成英特爾GPU上分配紋理時,該地址空間如何顯示? 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分配紋理。在x64窗口地址空間上處理內存,GPU共享內存和x86進程
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個緩衝區。那麼......
我不是GPU方面的專家,但可以通過[VMMap](https://technet.microsoft.com/en-us/sysinternals/vmmap.aspx)輕鬆查看任何指定進程的虛擬內存映射。我建議你玩這個工具,並打印你感興趣的緩衝區地址,以便確定它們屬於哪個部分。 –
已經做到了......一開始沒有什麼特別的,去圖 – kreuzerkrieg