2017-01-17 65 views
0

出於好奇和一些奇怪的行爲觀察。
當使用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個緩衝區。那麼......

+0

我不是GPU方面的專家,但可以通過[VMMap](https://technet.microsoft.com/en-us/sysinternals/vmmap.aspx)輕鬆查看任何指定進程的虛擬內存映射。我建議你玩這個工具,並打印你感興趣的緩衝區地址,以便確定它們屬於哪個部分。 –

+0

已經做到了......一開始沒有什麼特別的,去圖 – kreuzerkrieg

回答

0

沒有。窗口中的「進程地址空間」意味着分配給任務的內存頁面,以處理視頻內存,您​​將需要ddk stuff.just「app」不能做這類事情,並且不擁有任何「視頻」。

+0

說明加入了問題 – kreuzerkrieg

+0

內存被硬件級的顯卡切斷,它不知道你的進程 –

+0

好嗎?也許在駕駛員級別?否則操作系統將不知道內存從它被盜'... – kreuzerkrieg