不審な点や不思議な挙動の観察。
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個のバッファが作成されます。まあ...
私はGPUの専門家ではありませんが、指定されたプロセスの仮想メモリマッピングは[VMMap](https://technet.microsoft.com/en-us/sysinternals/vmmap.aspx)で容易に視覚化できます。私は、あなたがこのツールで遊んで興味のあるバッファのアドレスを表示することをお勧めします。そうすれば、それらがどのセクションに属しているのかを判断できます。 –
既にそれが...初めて見たときに特別なものはありません。 – kreuzerkrieg