From b942e4035b32fe1472d9ec65992b24a0b4200883 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Wed, 14 Oct 2020 10:44:41 +0200 Subject: [PATCH] piet-gpu/shader: ensure forward progress in decoupled lookback The Vulkan and OpenGL specifications offer only weak forward progress guarantees, and in practice several mobile devices fail to complete the decoupled lookback spinloop without mitigation. This patch implements Raph's suggestion from the "Forward Progress" section from https://raphlinus.github.io/gpu/2020/04/30/prefix-sum.html Signed-off-by: Elias Naur --- piet-gpu/shader/elements.comp | 27 ++++++++++++++++++++++++++- piet-gpu/shader/elements.spv | Bin 57244 -> 57980 bytes 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/piet-gpu/shader/elements.comp b/piet-gpu/shader/elements.comp index 29f8028..8bb9a4d 100644 --- a/piet-gpu/shader/elements.comp +++ b/piet-gpu/shader/elements.comp @@ -243,6 +243,9 @@ void main() { if (part_ix != 0) { // step 4 of paper: decoupled lookback uint look_back_ix = part_ix - 1; + + State their_agg; + uint their_ix = 0; while (true) { flag = state[state_flag_index(look_back_ix)]; if (flag == FLAG_PREFIX_READY) { @@ -250,11 +253,33 @@ void main() { exclusive = combine_state(their_prefix, exclusive); break; } else if (flag == FLAG_AGGREGATE_READY) { - State their_agg = State_read(state_aggregate_ref(look_back_ix)); + their_agg = State_read(state_aggregate_ref(look_back_ix)); exclusive = combine_state(their_agg, exclusive); look_back_ix--; + their_ix = 0; + continue; } // else spin + + // Unfortunately there's no guarantee of forward progress of other + // workgroups, so compute a bit of the aggregate before trying again. + // In the worst case, spinning stops when the aggregate is complete. + ElementRef ref = ElementRef((look_back_ix * PARTITION_SIZE + their_ix) * Element_size); + State s = map_element(ref); + if (their_ix == 0) { + their_agg = s; + } else { + their_agg = combine_state(their_agg, s); + } + their_ix++; + if (their_ix == PARTITION_SIZE) { + exclusive = combine_state(their_agg, exclusive); + if (look_back_ix == 0) { + break; + } + look_back_ix--; + their_ix = 0; + } } // step 5 of paper: compute inclusive prefix diff --git a/piet-gpu/shader/elements.spv b/piet-gpu/shader/elements.spv index 599465af04eaf3593fd5c651d2ac394e15f4cc4b..fed60fbd9d3ef3f21f09eb3ce043034ac95b0675 100644 GIT binary patch literal 57980 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 P@=RcL=jR&AUBmweobIbX literal 57244 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