2017-01-17 4 views
0

不審な点や不思議な挙動の観察。
Win32メモリ管理機能(malloc/new afterall)を使用してプロセス自体に割り当て、マシンの共有メモリを使用する統合Intel GPUにテクスチャを割り当てる場合、x86プロセスのアドレス空間はどのように表示されますか? GPUの割り当てはプロセスアドレス空間の一部ですか?私は今日、私のプロセスに奇妙なことが起こっているのを見てきました。私はx64マシンでx86プロセスを使用しています。私のプロセスコミットメモリサイズは約1.3Gbです.GPU共有メモリ消費量は〜600Mbです。そして、ENOMEMからHeapAllocに32Mbバッファを割り当てようとします。私は断片化が処理が分単位で実行されるのでここで扱うべきものだとは思わない。だからGPUのメモリがプロセスのアドレス空間でカウントされているという印象を受けました。そうでなければ、HeapAllocがどのようにCRTヒープにnullを返すのか説明できません。サイドノート、DLLは/ LARGEADDRESSAWAREなしでリンクされているので、2Gbは上記の数値の合計(1.3 + 0.6)になります
私は正しくですか?違う?誰でもそれがどのように動作するか説明できますか?プロセスメモリ、GPU共有メモリ、x64ウィンドウ上のx86プロセスアドレス空間

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

LARGEADRESSAWARE設定がないため、x86プロセスであるため、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

RAMはビデオカードでハードウェアレベルでカットされています。あなたのプロセスについての手がかりはありません –

+0

多分ドライバーレベルで?さもなければOSはそれからメモリ「盗んだ」ことを知らないでしょう... – kreuzerkrieg

関連する問題