NVIDIA 5090 における TerminateOnOutOfMemory

お世話になっております。​

あるユーザーから、ゲームをプレイ中に画面が真っ暗になり、やがてPC全体がクラッシュして再起動してしまうという不具合の報告がありました。

そのユーザーのPCのスペックは以下の通りです:

GPU: NVIDIA GeForce RTX 5090

GPU Driver Version: 610.88

CPU: Intel Core i9-12900KS

Operating System: Windows 11

このゲームは UE 5.4.4 PCD3D_SM6 で動作しています。

ユーザーからは、クラッシュ前後で NVIDIA ドライバーの TDR イベントが繰り返し発生していたとの報告がありました。

しかし、ユーザーが共有したダンプによると、RenderThread で以下のコールスタックを持つ GPU OutOfMemory によるクラッシュが発生しています:

​ 	FWindowsDialog::Show(HWND__ * ParentWindowHandle, int Template) Line 1875	C++
 	FWindowsDialog::Show(HWND__ * ParentWindowHandle, EAppMsgType::Type MsgType, const FString & Text, const FString & Caption) Line 1945	C++
 	FWindowsPlatformMisc::MessageBoxExt(EAppMsgType::Type MsgType, const wchar_t * Text, const wchar_t * Caption) Line 1966	C++
 	TerminateOnOutOfMemory(ID3D12Device * InDevice, HRESULT D3DResult, bool bCreatingTextures) Line 903	C++
 	D3D12RHI::VerifyD3D12Result(HRESULT D3DResult, const char * Code, const char * Filename, unsigned int Line, ID3D12Device * Device, FString Message) Line 1068	C++
 	FD3D12TransientHeap::FD3D12TransientHeap(const FRHITransientHeap::FInitializer & Initializer, FD3D12Adapter * Adapter, FD3D12Device * Device, FRHIGPUMask VisibleNodeMask) Line 84	C++
 	FD3D12TransientHeapCache::CreateHeap::__l2::<lambda>(FD3D12Device *) Line 150	C++
	FD3D12LinkedAdapterObject<FD3D12TransientHeap>::CreateLinkedObjects(FRHIGPUMask GPUMask, const FD3D12Adapter::CreateLinkedObject::__l2::void <lambda>(IConsoleVariable *) &) Line 190	C++
 	FD3D12Adapter::CreateLinkedObject(FRHIGPUMask) Line 389	C++
 	FD3D12TransientHeapCache::CreateHeap(const FRHITransientHeap::FInitializer & HeapInitializer) Line 148	C++
 	FRHITransientHeapCache::Acquire(unsigned __int64 FirstAllocationSize, ERHITransientHeapFlags FirstAllocationHeapFlags) Line 623	C++
 	FRHITransientResourceHeapAllocator::CreateBufferInternal(const FRHIBufferCreateInfo & CreateInfo, const wchar_t * DebugName, unsigned int PassIndex, unsigned int BufferSize, unsigned int BufferAlignment, TFunction<FRHITransientBuffer * __cdecl(FRHITransientHeap::FResourceInitializer const &)> CreateBufferFunction) Line 740	C++
 	FD3D12TransientResourceHeapAllocator::CreateBuffer(const FRHIBufferCreateInfo & InCreateInfo, const wchar_t * InDebugName, unsigned int InPassIndex) Line 231	C++
 	FRDGBuilder::AllocateTransientResources(TArrayView<FRDGBuilder::FCollectResourceOp const ,int> Ops) Line 2794	C++
 	FRDGBuilder::Execute() Line 1828	C++
 	RenderViewFamilies_RenderThread(FRHICommandListImmediate & RHICmdList, const TArray<FSceneRenderer *,TSizedDefaultAllocator<32>> & SceneRenderers) Line 4917	C++
 	FRendererModule::BeginRenderingViewFamilies::__l44::<lambda>(FRHICommandListImmediate &) Line 5190	C++

ユーザーがこの問題に関して徹底的なトラブルシューティングを行ったことを踏まえると、ゲーム以外に他のソフトウェアが動作していた可能性は低いと思われます。また、NVIDIA 5090 を使用していることを考えると、メモリ不足になるのは不自然です。

当社のQAチームではまだこの問題を再現できていませんが、ユーザーからは発生のタイミングにばらつきがあったとの報告を受けています。

NVIDIA 5090でメモリ不足が発生したという同様の報告を、これまでに受けたことはありますか?また、-gpucrashdebugging以外に、この問題の診断に役立つ情報はありますか?

ご協力いただき、誠にありがとうございます。

[Attachment Removed]

大変お待たせしてしまい申し訳ございません。

今回のように特定のGPUで同じようなTDRが起こることはさまざまなタイトルでしばしば報告されています、確実な再現が難しく具体的な原因を含むaftermathなどのGPUクラッシュダンプ出力が望まれますが安定的に取得することが難しい状態です。NVIDIA社とも連絡も行っておりますが抜本的な改善はドライバ次第となるケースが多いです。

-gpucrashdebuggingが付与されているならばTDR時にダンプは出力されている可能性がありそうです。

ただダンプ出力は確実性に乏しく、オプションを設定したとしてもうまくダンプが出力されないケースが多々あります。ご確認をお願いします。

ダンプが出力されているのであれば、追加の情報を得られる可能性がありますがShippingビルドではマーカーが省略されるため解析の難しい状態になっていることがあります

この場合 bAllowProfileGPUInShipping = true; をTarget.csに追加することでshippingビルドでもマーカーを出力することが出来ます。

OoMがレポートされるのはアロケーションのAPIがOUTOFMEMORYのエラーコードを返しただけであり実際のビデオメモリの枯渇が原因とは限りません。

メインメモリが枯渇していたり、ドライバー内部の事情で発生することも過去の事例であるようですし、

そもそもTDRに陥るような致命的な状態になったあとCreateHeapが正しく動作しない状態に陥り汎用的なエラーコードとしてOoMを返した可能性もありえるのではないかと推測されています。

Unreal Engineを使っているかに関わらず大量のメモリを積んでいるビデオカードでのOOM問題ではNVIDA社のドライバの動作を調整する NVIDIA Profile Inspector によってメモリ関係のパラメータ(恐らくrBAR系のパラメータ)を調整することで改善が見られたケースというのも報告されているようです。

[Attachment Removed]