Split off from engine#123. The in-range (2049-32768) residual fault is ambient page migration, not the multipass.
Measurements (gfx1151, pinned f5b7f4ad)
- Clean sequential in-range A/B (d2100, production alignment 4096, N=6 separate
llama-bench -p 0 -n 8 -d 2100 -r 1): multipass 0/6 faults, fallback (GGML_HRX_DISABLE_DISPATCH=flash_attention_decode_split) 1/6.
- 4-concurrent (2xd2100 + 2xd3000, 8 rounds, 32 runs/condition): fallback 2/32 faulting runs vs split 1/32.
So the fault hits the FALLBACK at least as often as the multipass: it is shared-device memory pressure, not the decode-split. Declining the multipass to the fallback cannot reduce it (and would restore the -32% cliff).
Named root fix (from the #123 analysis)
HRX's device buffers here are pageable system memory: the transient arena is one reused hrx_allocator_allocate_buffer(hrx_device_allocator(device), {HRX_MEMORY_TYPE_DEVICE_LOCAL, ...}) (runtime/transient-arena.cpp), and hrx_buffer_params_t in libhrx/include/hrx_runtime.h is {type, access, usage, queue_affinity} with no pin/lock/advise field. The fix belongs in libhrx/hrx-system: pin the allocation, or allocate the transients as non-migratable virtual memory (the pinned runtime already carries the HIP VMM mechanism). That is a runtime change, outside the fork+engine scope of #123.
Filed so #123 can close on its own multipass defect.
Split off from engine#123. The in-range (2049-32768) residual fault is ambient page migration, not the multipass.
Measurements (gfx1151, pinned f5b7f4ad)
llama-bench -p 0 -n 8 -d 2100 -r 1): multipass 0/6 faults, fallback (GGML_HRX_DISABLE_DISPATCH=flash_attention_decode_split) 1/6.So the fault hits the FALLBACK at least as often as the multipass: it is shared-device memory pressure, not the decode-split. Declining the multipass to the fallback cannot reduce it (and would restore the -32% cliff).
Named root fix (from the #123 analysis)
HRX's device buffers here are pageable system memory: the transient arena is one reused
hrx_allocator_allocate_buffer(hrx_device_allocator(device), {HRX_MEMORY_TYPE_DEVICE_LOCAL, ...})(runtime/transient-arena.cpp), andhrx_buffer_params_tinlibhrx/include/hrx_runtime.his{type, access, usage, queue_affinity}with no pin/lock/advise field. The fix belongs inlibhrx/hrx-system: pin the allocation, or allocate the transients as non-migratable virtual memory (the pinned runtime already carries the HIP VMM mechanism). That is a runtime change, outside the fork+engine scope of #123.Filed so #123 can close on its own multipass defect.