Repository navigation
perf(agc): resolve DISPATCH_INDIRECT thread dimensions on the GPU - #8066
Conversation
An indirect dispatch with USE_THREAD_DIMENSIONS read its thread counts on the CPU, which waits for the recorded work that stores them. The argument kernel now turns them into group counts on the GPU and copies the counts into the ShaderData thread limit, so the dispatch stays on the GPU path. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
This pull request is labeled |
|
Other open pull requests touch the same code. Merging one will break the other, or both implement the same thing. If this one builds on them, list them in Depends on.
Some comparisons could not be completed because a pull request conflicts with the base branch. Review these shared files manually before concluding that there is no overlap.
|
The agc_driver_indirect_thread_dimensions_cpu registration sat at the end of the address-passes test block, where other open changes add their tests too. It now has its own BUILD_TESTING block after the execution test name check, with the same properties. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
The CTest registration moved to its own |
|
Windows runs on a different NVIDIA card and an RDNA2 iGPU, plus one extra case the test doesn't cover: two thread-dimension dispatches of the same program in one submission. Setup: Windows 11 26300, MinGW GCC 15.2 Release,
No GTA V or other title runs here, so the frame-time claim is not re-measured. probediff --git a/core/libs/prx/libSceAgcDriver/tests/execution/IndirectThreadDimensions.cpp b/core/libs/prx/libSceAgcDriver/tests/execution/IndirectThreadDimensions.cpp
index 37573087c..7e9e6fa98 100644
--- a/core/libs/prx/libSceAgcDriver/tests/execution/IndirectThreadDimensions.cpp
+++ b/core/libs/prx/libSceAgcDriver/tests/execution/IndirectThreadDimensions.cpp
@@ -172,6 +172,33 @@ void RunCpuFallback(Slot& slot, const Shape& shape) {
Check(slot, shape, std::string(shape.name) + ", read on the CPU behind a pending argument label");
}
+void RunPair(Slot& slot, Slot& second, std::array<std::uint32_t, 3> first, std::array<std::uint32_t, 3> next, bool producedOnGpu) {
+ Reset(slot);
+ Reset(second);
+ second.counterDescriptor = slot.counterDescriptor;
+ std::vector<std::uint32_t> words;
+ if (producedOnGpu) {
+ Program(words, AddressWriterCode.data(), {1u, 1u, 1u}, {Low(slot.arguments.data()), High(slot.arguments.data()), first[0], first[1], first[2]});
+ words.insert(words.end(), {0xc0031500u, 1, 1, 1, GroupCounts});
+ Program(words, AddressWriterCode.data(), {1u, 1u, 1u}, {Low(second.arguments.data()), High(second.arguments.data()), next[0], next[1], next[2]});
+ words.insert(words.end(), {0xc0031500u, 1, 1, 1, GroupCounts});
+ } else {
+ for (std::size_t axis = 0; axis < 3; ++axis) slot.arguments[axis] = first[axis];
+ for (std::size_t axis = 0; axis < 3; ++axis) second.arguments[axis] = next[axis];
+ }
+ Program(words, CounterCode.data(), {64u, 1u, 1u}, {Low(slot.counterDescriptor.data()), High(slot.counterDescriptor.data())});
+ words.insert(words.end(), {0xc0021102u, 1u, Low(slot.arguments.data()), High(slot.arguments.data())});
+ words.insert(words.end(), {0xc0011600u, 0u, ThreadDimensions});
+ words.insert(words.end(), {0xc0021102u, 1u, Low(second.arguments.data()), High(second.arguments.data())});
+ words.insert(words.end(), {0xc0011600u, 0u, ThreadDimensions});
+ words.insert(words.end(), {0xc0033700u, 0x00100200u, Low(&slot.done), High(&slot.done), 1u});
+ Packet packet{words.data(), static_cast<std::uint32_t>(words.size()), 0, {}};
+ Require(sceAgcDriverSubmitAcb(Compute, &packet) == 0, "compute submit failed");
+ AgcDriverWaitIdle_nid_postfix();
+ const Shape total{"pair", {first[0] * first[1] * first[2] + next[0] * next[1] * next[2], 1u, 1u}, {64u, 1u, 1u}};
+ Check(slot, total, std::string("two thread-dimension dispatches of one program in one submission, ") + std::to_string(first[0]) + " then " + std::to_string(next[0]) + (producedOnGpu ? " threads, arguments stored by the GPU" : " threads, arguments stored by the CPU"));
+}
+
}
int main() {
@@ -193,6 +220,14 @@ int main() {
RunSubmitted(*slot, shape, false);
std::cout << shape.name << ": passed\n";
}
+ auto* second = new (block + 4096) Slot{};
+ for (int round = 0; round < 3; ++round) {
+ RunPair(*slot, *second, {100u, 1u, 1u}, {40u, 1u, 1u}, false);
+ RunPair(*slot, *second, {40u, 1u, 1u}, {130u, 1u, 1u}, false);
+ if (gpuThreadDimensions) RunPair(*slot, *second, {100u, 1u, 1u}, {40u, 1u, 1u}, true);
+ if (gpuThreadDimensions) RunPair(*slot, *second, {1u, 1u, 1u}, {190u, 1u, 1u}, true);
+ }
+ std::cout << "pair probe: passed" << std::endl;
if (gpuThreadDimensions) {
for (const auto& shape : Shapes) {
RunCpuFallback(*slot, shape);AI-assisted: yes (Claude Code); results above were run on this machine. |
|
Ran this on GTA V (PPSA04263 01.010.002), Linux 7.2.8-zen1-2-zen, NVIDIA GeForce RTX 5060 Laptop GPU, NVIDIA 615.71.09, Graphics Mode Performance, the Story prologue after Resume Story, with no input. Summary lines (main, then the PR): |
|
@wachi35676 Thanks for running it on two more GPUs, and for the back-to-back probe. Two dispatches of one program in one submission share the template and the ShaderData buffer and differ only in the limit store, so that is the ordering I most wanted checked, and the sums (140, 170, 191) rule out both a leaked and a dropped limit. On the negative control: as noted under Tested, without the limit store the first shape runs 128 threads instead of 100, so the test does fail when the store is missing. @CPritch Thanks for the second machine. -0.3 % is within run-to-run noise, so in this window on this laptop the change makes no measurable difference. The gain in the description comes from removing the CPU reads of thread-dimension arguments, each of which first finishes leased GPU work under the GPU mutex. It can only show where those reads are frequent in the window and the frame waits on them. Your summaries show far less queue-worker work than mine ( I've added your result to the description, so the speed-up isn't read as general. |
|
Checked the argument kernel's ceil(threads / size) and the thread-limit store, the CPU fallback in |
What
A
DISPATCH_INDIRECTwhose initiator sets USE_THREAD_DIMENSIONS (bit 5) takes thread counts from its arguments, not group counts.indirectArgumentsPathsent every such dispatch to the CPU (IndirectThreadDimensions). The read has to wait for earlier GPU work that may store the arguments: since #6786 it finishes the leased work first (FinishLeaseWork), under the GPU mutex. GTA V's async compute queues issue these dispatches all the time. In one run (title, loading and 200 s of Story) the driver read 28839 of them on the CPU, and those reads took 71 s in total across the compute queues.The argument kernel (
DispatchArguments.comp) now does the conversion on the GPU. Given the group size per axis (COMPUTE_NUM_THREAD_X/Y/Z), it writesceil(threads / size)as the group counts. It also writes the thread counts in words 3 to 5 of its output, andrecordDispatchcopies them into the program's ShaderData thread limit (dispatchThreadLimit) before the dispatch. The dispatch then stays on the GPU path like a group-count indirect dispatch.Other changes:
Driver::dispatchcompiles these dispatches as partial-group programs with a placeholder limit (~0uon each axis). It sets the push constant size of the request to 0, so the ShaderData words land in a storage buffer the GPU can store into.forgetShaderDataWords), so the next refresh writes them all again.TRANSFER_DST, not only the refreshable ones.decideIndirect's CPU fallback (pending image results, pending label or copied writer, no host import, device-memory LDS) converts the counts to groups itself and stores the limit withvkCmdUpdateBuffer.APS5_NO_GPU_THREAD_DIMENSIONS=1restores the CPU read.Tested
Windows 11 Pro 26300, NVIDIA GeForce RTX 5090 (617.42), MinGW-w64 Release build of this branch on
main7a015c0.agc_driver_indirect_thread_dimensions. It submits four shapes on a compute queue: 100x1x1 threads in groups of 64x1x1, 5x3x2 in 4x2x2, 64x2x1 in 32x1x1, and 0x7x1 in 8x1x1. Each runs once with the arguments stored by a GPU producer in the same submission and once with arguments the CPU wrote. A counter checks that exactly the requested threads ran. The test also takesdecideIndirect's CPU fallback, behind a GPU producer and a pending label over the arguments (cpuReason2). Without the limit store the first shape runs 128 threads instead of 100.agc_driver_indirect_thread_dimensions_cpuruns the same shapes withAPS5_NO_GPU_THREAD_DIMENSIONS=1, with arguments the CPU wrote.ctest -j 24: 1683 of 1685 pass.agc_driver_pixel_ldsandagc_driver_pass_input_hazardfail on plainmain7a015c0 too on this RTX 5090.ANYPS5_GPU=AMDthe indirect and dispatch-move tests (agc_driver_indirect_thread_dimensions, its_cpuvariant,indirect_arguments_*,gpu_indirect_arguments_*,indirect_dispatch_limit,dispatch_move*,lds_beyond_device_limit,oversized_dispatch,pipelined_dispatch*) also pass on the AMD Radeon(TM) Graphics iGPU of a Ryzen 9 9950X3D (64-lane subgroups).ctest --test-dir build -R agc_driver_indirect -VwithANYPS5_REQUIRE_VULKAN=1,ANYPS5_NO_SHADER_CACHE=1andVK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation, onmain7a015c0 and on this branch (84a6fb0). Both logs show the loader insertingVK_LAYER_KHRONOS_validation, and neither says it was not found.mainpasses its 4 tests (agc_driver_indirect_arguments_pending_producer,agc_driver_indirect_arguments_written_ahead,agc_driver_indirect_dispatch_limit,agc_driver_indirect_patched_stage); this branch passes those and the two new ones. Both logs hold the same fourVUID-lines, all from the existingagc_driver_indirect_arguments_pending_producer(2xVUID-vkCmdWaitEvents-srcStageMask-01158, 2xVUID-vkSetEvent-event-09543). The two new tests log none.GTA V (PPSA04264) needs #6488 to reach Story and #7603 (merged since) not to hang there, so both builds carry them on this branch's base. In the summary lines,
7b18631f34aaismain7a015c0 + #6488 (a48c5a7) + #7603 (e5b4bd7), and72a70f6d87efis the same build + this branch (84a6fb0). Both are Release builds on one Windows 11 Pro 26300 machine with a Ryzen 9 9950X3D and the RTX 5090 (617.42). The scene is the Story prologue, resumed from the same save before every run, at 3840x2160 with default settings and replayed pad input. OnlyAPS5_TRACE_FRAMES=7500:300is set besides the pad input file. Caches are warm, and both game folders hold the same shader and pipeline cache files. Base and change alternate in one session, three pairs:The median frame time drops by 2.7 %, 3.9 % and 3.1 % (84.2 to 81.5 ms on average, 3.3 %), and every change run is faster than every base run. GPU busy time per present stays about the same (58.8 against 59.2 ms on average). In the digests of pair 2 below, the draw committer's wait falls from 29.1 to 2.8 ms per frame, and
GpuMutex.wait.draw(27.8 ms per frame in the base) leaves the largest slices.A reviewer's run on a Linux laptop (RTX 5060 Laptop GPU, NVIDIA 615.71.09, GTA V PPSA04263 01.010.002, frames 3600:700,
maind14a186 against the same + this branch, A B A B) found no difference (p50 -0.3 %). Whether that window had CPU thread-dimension reads was not checked, so the gain above holds for the RTX 5090 machine and scene only.In separate runs of the same scene with
APS5_PROFILE_DRAW=1, the[indirect]line readscpu-side 30391 (thread dimensions 30391, ...); CPU argument reads took 66.6 son the base andcpu-side 0 (thread dimensions 0, ...); CPU argument reads took 0.0 swith the change.Every trace reports dropped events: the event buffer of queue worker 0x0 fills after about 8 s of the 25 s window and that of the draw committer after about 23 s, so the digests' per-thread tables cover only that part.
totals_fullis false everywhere, so the summary numbers are complete.An earlier version of this description compared the change with
APS5_NO_GPU_THREAD_DIMENSIONS=1in one build on an oldermainwith #6786 (6 %). Its summary lines all carried one commit and it also setAPS5_TRACE_DIR, so this comparison of two builds replaces it.Summary lines, in run order (base and change of pair 1, then pairs 2 and 3):
{"commit":"7b18631f34aa","dirty":false,"env":{"APS5_PAD_INPUT_FILE":"<path>","APS5_TRACE_FRAMES":"7500:300"},"gpu":"NVIDIA GeForce RTX 5090","driver":"NVIDIA 617.42","os":"Windows 10.0.26300","resolution":"3840x2160","window":{"spec":"frames 7500:300","first_present":7500,"ms":25044.981},"presents":300,"frame_ms":{"p50":83.396,"p90":84.716,"p99":87.254,"max":87.593},"gpu_busy_ms_per_present":58.784,"worker_busy_pct":{"queue worker 0x0":3260.007,"queue worker 0x38":45.801,"queue worker 0x20":87.867,"queue worker 0x30":54.591,"queue worker 0x28":52.606},"top_phases_ms_per_frame":{"Driver.EndSubmission":2641.579,"Driver.Packet":279.223,"Driver.Packet.memory_wait":157.690,"Driver.Packet.draw":63.406,"Driver.Draw":63.078,"Driver.Packet.dispatch":50.642,"Driver.Draw.draw_enqueued":38.213,"Graphics.Draw":33.843},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":8.429,"events_lost":515260,"totals_full":false},"draw committer":{"events_full_after_s":24.440,"events_lost":6518,"totals_full":false}},"trace":"aps5-trace-7b18631f34aa-6976.json.gz"} {"commit":"72a70f6d87ef","dirty":false,"env":{"APS5_PAD_INPUT_FILE":"<path>","APS5_TRACE_FRAMES":"7500:300"},"gpu":"NVIDIA GeForce RTX 5090","driver":"NVIDIA 617.42","os":"Windows 10.0.26300","resolution":"3840x2160","window":{"spec":"frames 7500:300","first_present":7500,"ms":24412.405},"presents":300,"frame_ms":{"p50":81.126,"p90":83.000,"p99":85.552,"max":86.734},"gpu_busy_ms_per_present":59.033,"worker_busy_pct":{"queue worker 0x0":3474.282,"queue worker 0x38":44.650,"queue worker 0x28":59.382,"queue worker 0x20":84.807,"queue worker 0x30":48.179},"top_phases_ms_per_frame":{"Driver.EndSubmission":2748.638,"Driver.Packet":269.574,"Driver.Packet.memory_wait":152.638,"Driver.Packet.dispatch":54.212,"Graphics.Draw":53.091,"Driver.Dispatch":52.066,"Graphics.Draw.draw_and_resource_release":47.456,"Driver.Packet.draw":36.631},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":8.047,"events_lost":522055,"totals_full":false},"draw committer":{"events_full_after_s":23.899,"events_lost":5534,"totals_full":false}},"trace":"aps5-trace-72a70f6d87ef-33088.json.gz"} {"commit":"7b18631f34aa","dirty":false,"env":{"APS5_PAD_INPUT_FILE":"<path>","APS5_TRACE_FRAMES":"7500:300"},"gpu":"NVIDIA GeForce RTX 5090","driver":"NVIDIA 617.42","os":"Windows 10.0.26300","resolution":"3840x2160","window":{"spec":"frames 7500:300","first_present":7500,"ms":25427.010},"presents":300,"frame_ms":{"p50":84.639,"p90":85.939,"p99":87.886,"max":90.503},"gpu_busy_ms_per_present":58.649,"worker_busy_pct":{"queue worker 0x0":3259.212,"queue worker 0x38":51.112,"queue worker 0x30":41.957,"queue worker 0x20":81.680,"queue worker 0x28":63.741},"top_phases_ms_per_frame":{"Driver.EndSubmission":2681.263,"Driver.Packet":281.364,"Driver.Packet.memory_wait":158.059,"Driver.Packet.draw":64.121,"Driver.Draw":63.798,"Driver.Packet.dispatch":51.390,"Driver.Draw.draw_enqueued":38.590,"Graphics.Draw":34.733},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":8.396,"events_lost":535277,"totals_full":false},"draw committer":{"events_full_after_s":23.631,"events_lost":19898,"totals_full":false}},"trace":"aps5-trace-7b18631f34aa-17656.json.gz"} {"commit":"72a70f6d87ef","dirty":false,"env":{"APS5_PAD_INPUT_FILE":"<path>","APS5_TRACE_FRAMES":"7500:300"},"gpu":"NVIDIA GeForce RTX 5090","driver":"NVIDIA 617.42","os":"Windows 10.0.26300","resolution":"3840x2160","window":{"spec":"frames 7500:300","first_present":7500,"ms":24436.965},"presents":300,"frame_ms":{"p50":81.301,"p90":82.676,"p99":85.448,"max":85.534},"gpu_busy_ms_per_present":59.143,"worker_busy_pct":{"queue worker 0x0":3478.718,"queue worker 0x38":48.398,"queue worker 0x30":50.894,"queue worker 0x20":88.089,"queue worker 0x28":54.915},"top_phases_ms_per_frame":{"Driver.EndSubmission":2755.037,"Driver.Packet":274.103,"Driver.Packet.memory_wait":157.061,"Driver.Packet.dispatch":54.144,"Graphics.Draw":53.161,"Driver.Dispatch":51.988,"Graphics.Draw.draw_and_resource_release":47.690,"Driver.Packet.draw":36.649},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":8.190,"events_lost":524642,"totals_full":false},"draw committer":{"events_full_after_s":23.435,"events_lost":11125,"totals_full":false}},"trace":"aps5-trace-72a70f6d87ef-27876.json.gz"} {"commit":"7b18631f34aa","dirty":false,"env":{"APS5_PAD_INPUT_FILE":"<path>","APS5_TRACE_FRAMES":"7500:300"},"gpu":"NVIDIA GeForce RTX 5090","driver":"NVIDIA 617.42","os":"Windows 10.0.26300","resolution":"3840x2160","window":{"spec":"frames 7500:300","first_present":7500,"ms":25421.039},"presents":300,"frame_ms":{"p50":84.617,"p90":85.908,"p99":88.180,"max":89.627},"gpu_busy_ms_per_present":58.837,"worker_busy_pct":{"queue worker 0x0":3256.001,"queue worker 0x28":57.131,"queue worker 0x30":45.872,"queue worker 0x20":87.092,"queue worker 0x38":47.211},"top_phases_ms_per_frame":{"Driver.EndSubmission":2677.855,"Driver.Packet":280.366,"Driver.Packet.memory_wait":157.081,"Driver.Packet.draw":64.243,"Driver.Draw":63.919,"Driver.Packet.dispatch":51.337,"Driver.Draw.draw_enqueued":38.604,"Graphics.Draw":34.714},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":8.362,"events_lost":540270,"totals_full":false},"draw committer":{"events_full_after_s":23.514,"events_lost":21130,"totals_full":false}},"trace":"aps5-trace-7b18631f34aa-7248.json.gz"} {"commit":"72a70f6d87ef","dirty":false,"env":{"APS5_PAD_INPUT_FILE":"<path>","APS5_TRACE_FRAMES":"7500:300"},"gpu":"NVIDIA GeForce RTX 5090","driver":"NVIDIA 617.42","os":"Windows 10.0.26300","resolution":"3840x2160","window":{"spec":"frames 7500:300","first_present":7500,"ms":24647.342},"presents":300,"frame_ms":{"p50":82.014,"p90":83.568,"p99":85.617,"max":86.009},"gpu_busy_ms_per_present":59.503,"worker_busy_pct":{"queue worker 0x0":3479.772,"queue worker 0x38":46.340,"queue worker 0x28":59.045,"queue worker 0x20":86.177,"queue worker 0x30":46.840},"top_phases_ms_per_frame":{"Driver.EndSubmission":2779.638,"Driver.Packet":273.241,"Driver.Packet.memory_wait":155.311,"Driver.Packet.dispatch":54.427,"Graphics.Draw":53.995,"Driver.Dispatch":52.188,"Graphics.Draw.draw_and_resource_release":48.147,"Driver.Packet.draw":37.013},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":8.114,"events_lost":532240,"totals_full":false},"draw committer":{"events_full_after_s":22.900,"events_lost":20038,"totals_full":false}},"trace":"aps5-trace-72a70f6d87ef-22380.json.gz"}The traces are attached.
aps5-trace-7b18631f34aa-6976.json.gz
aps5-trace-7b18631f34aa-7248.json.gz
aps5-trace-7b18631f34aa-17656.json.gz
aps5-trace-72a70f6d87ef-22380.json.gz
aps5-trace-72a70f6d87ef-27876.json.gz
aps5-trace-72a70f6d87ef-33088.json.gz
Digests of pair 2, from
python tools/trace_digest.py <trace>:base, aps5-trace-7b18631f34aa-17656.json.gz
frames 7500:300 from present 7500: 300 presents, frame p50 84.6 / p90 85.9 / p99 87.9 / max 90.5 ms, GPU busy 58.6 ms per present
NVIDIA GeForce RTX 5090, NVIDIA 617.42, Windows 10.0.26300, 3840x2160, commit 7b18631f34aa, dropped: yes
{"commit":"7b18631f34aa","dirty":false,"env":{"APS5_PAD_INPUT_FILE":"<path>","APS5_TRACE_FRAMES":"7500:300"},"gpu":"NVIDIA GeForce RTX 5090","driver":"NVIDIA 617.42","os":"Windows 10.0.26300","resolution":"3840x2160","window":{"spec":"frames 7500:300","first_present":7500,"ms":25427.01},"presents":300,"frame_ms":{"p50":84.639,"p90":85.939,"p99":87.886,"max":90.503},"gpu_busy_ms_per_present":58.649,"worker_busy_pct":{"queue worker 0x0":3259.212,"queue worker 0x38":51.112,"queue worker 0x30":41.957,"queue worker 0x20":81.68,"queue worker 0x28":63.741},"top_phases_ms_per_frame":{"Driver.EndSubmission":2681.263,"Driver.Packet":281.364,"Driver.Packet.memory_wait":158.059,"Driver.Packet.draw":64.121,"Driver.Draw":63.798,"Driver.Packet.dispatch":51.39,"Driver.Draw.draw_enqueued":38.59,"Graphics.Draw":34.733},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":8.396,"events_lost":535277,"totals_full":false},"draw committer":{"events_full_after_s":23.631,"events_lost":19898,"totals_full":false}},"trace":"aps5-trace-7b18631f34aa-17656.json.gz"}Slowest frames (largest slices inside each, inclusive)
Threads (ms per frame)
Largest slices (ms per frame, inclusive, all threads): Driver.EndSubmission 880.8, Driver.Packet 223.8, Driver.Packet.memory_wait 157.2, Driver.WorkerWait 135.0, Driver.WorkerWait.idle_and_completion_poll 135.0, batch 58.6, Driver.Packet.dispatch 46.9, GpuMutex.wait.draw 27.8, Graphics.Draw 23.4, Graphics.Draw.draw_and_resource_release 19.0
Longest waits
Largest GPU batches (GPU ranges inside, and the CPU slices that recorded each, inclusive)
change, aps5-trace-72a70f6d87ef-27876.json.gz
frames 7500:300 from present 7500: 300 presents, frame p50 81.3 / p90 82.7 / p99 85.4 / max 85.5 ms, GPU busy 59.1 ms per present
NVIDIA GeForce RTX 5090, NVIDIA 617.42, Windows 10.0.26300, 3840x2160, commit 72a70f6d87ef, dropped: yes
{"commit":"72a70f6d87ef","dirty":false,"env":{"APS5_PAD_INPUT_FILE":"<path>","APS5_TRACE_FRAMES":"7500:300"},"gpu":"NVIDIA GeForce RTX 5090","driver":"NVIDIA 617.42","os":"Windows 10.0.26300","resolution":"3840x2160","window":{"spec":"frames 7500:300","first_present":7500,"ms":24436.965},"presents":300,"frame_ms":{"p50":81.301,"p90":82.676,"p99":85.448,"max":85.534},"gpu_busy_ms_per_present":59.143,"worker_busy_pct":{"queue worker 0x0":3478.718,"queue worker 0x38":48.398,"queue worker 0x30":50.894,"queue worker 0x20":88.089,"queue worker 0x28":54.915},"top_phases_ms_per_frame":{"Driver.EndSubmission":2755.037,"Driver.Packet":274.103,"Driver.Packet.memory_wait":157.061,"Driver.Packet.dispatch":54.144,"Graphics.Draw":53.161,"Driver.Dispatch":51.988,"Graphics.Draw.draw_and_resource_release":47.69,"Driver.Packet.draw":36.649},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":8.19,"events_lost":524642,"totals_full":false},"draw committer":{"events_full_after_s":23.435,"events_lost":11125,"totals_full":false}},"trace":"aps5-trace-72a70f6d87ef-27876.json.gz"}Slowest frames (largest slices inside each, inclusive)
Threads (ms per frame)
Largest slices (ms per frame, inclusive, all threads): Driver.EndSubmission 921.9, Driver.Packet 218.4, Driver.Packet.memory_wait 155.7, Driver.WorkerWait 124.9, Driver.WorkerWait.idle_and_completion_poll 124.9, batch 59.1, Driver.Packet.dispatch 45.7, Driver.Dispatch 43.8, Graphics.Draw 42.0, Graphics.Draw.draw_and_resource_release 37.4
Longest waits
Largest GPU batches (GPU ranges inside, and the CPU slices that recorded each, inclusive)
Checklist
main; no other open PR implements the same functionsNotImplemented_nid_no_patch); silent stubs are listed under Silent stubs in their library's technical debt file.mdfiles or images added to the repository (attach them to this PR)