From e50d5c1f58f039504e884bfd79ee364aab456197 Mon Sep 17 00:00:00 2001 From: Raph Levien Date: Tue, 2 Nov 2021 10:15:52 -0700 Subject: [PATCH 1/2] Add memory barrier to elements shader The flag read needs acquire semantics. There are a number of ways that could be expressed, but a generally portable way is to have a barrier after. However, in the translation to Metal, that barrier needs to be in uniform control flow. This patch does some workarounds to ensure that. --- piet-gpu/shader/elements.comp | 69 ++++++++++++++++++++++------------ piet-gpu/shader/elements.spv | Bin 79964 -> 80952 bytes 2 files changed, 46 insertions(+), 23 deletions(-) diff --git a/piet-gpu/shader/elements.comp b/piet-gpu/shader/elements.comp index d37a2c6..bca2e2f 100644 --- a/piet-gpu/shader/elements.comp +++ b/piet-gpu/shader/elements.comp @@ -175,6 +175,7 @@ shared State sh_state[WG_SIZE]; shared uint sh_part_ix; shared State sh_prefix; +shared uint sh_flag; void main() { State th_state[N_ROWS]; @@ -230,27 +231,42 @@ void main() { flag = FLAG_PREFIX_READY; } state[state_flag_index(part_ix)] = flag; - if (part_ix != 0) { - // step 4 of paper: decoupled lookback - uint look_back_ix = part_ix - 1; + } + 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) { + State their_agg; + uint their_ix = 0; + while (true) { + if (gl_LocalInvocationID.x == WG_SIZE - 1) { + sh_flag = state[state_flag_index(look_back_ix)]; + } + // The flag load is done only in the last thread. However, because the + // translation of memoryBarrierBuffer to Metal requires uniform control + // flow, we broadcast it to all threads. + barrier(); + memoryBarrierBuffer(); + uint flag = sh_flag; + + if (flag == FLAG_PREFIX_READY) { + if (gl_LocalInvocationID.x == WG_SIZE - 1) { State their_prefix = State_read(state_prefix_ref(look_back_ix)); exclusive = combine_state(their_prefix, exclusive); - break; - } else if (flag == FLAG_AGGREGATE_READY) { + } + break; + } else if (flag == FLAG_AGGREGATE_READY) { + if (gl_LocalInvocationID.x == WG_SIZE - 1) { 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 + look_back_ix--; + their_ix = 0; + continue; + } + // else spin + if (gl_LocalInvocationID.x == WG_SIZE - 1) { // 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. @@ -265,22 +281,29 @@ void main() { if (their_ix == PARTITION_SIZE) { exclusive = combine_state(their_agg, exclusive); if (look_back_ix == 0) { - break; + sh_flag = FLAG_PREFIX_READY; + } else { + look_back_ix--; + their_ix = 0; } - look_back_ix--; - their_ix = 0; } } - - // step 5 of paper: compute inclusive prefix + barrier(); + flag = sh_flag; + if (flag == FLAG_PREFIX_READY) { + break; + } + } + // step 5 of paper: compute inclusive prefix + if (gl_LocalInvocationID.x == WG_SIZE - 1) { State inclusive_prefix = combine_state(exclusive, agg); sh_prefix = exclusive; State_write(state_prefix_ref(part_ix), inclusive_prefix); } - } - memoryBarrierBuffer(); - if (gl_LocalInvocationID.x == WG_SIZE - 1 && part_ix != 0) { - state[state_flag_index(part_ix)] = FLAG_PREFIX_READY; + memoryBarrierBuffer(); + if (gl_LocalInvocationID.x == WG_SIZE - 1) { + state[state_flag_index(part_ix)] = FLAG_PREFIX_READY; + } } barrier(); if (part_ix != 0) { diff --git a/piet-gpu/shader/elements.spv b/piet-gpu/shader/elements.spv index d1fd39a6b927d4e2afac6778088228a324cc60c3..4daf42de496b7080dd6ac3383d5140f99fc11baa 100644 GIT binary patch literal 80952 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 literal 79964 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 N3t)NsbB4;!@PA|02*&^b From 95aad3e6c713c7ef4f51657c734d51528fd1b912 Mon Sep 17 00:00:00 2001 From: Raph Levien Date: Tue, 2 Nov 2021 12:59:38 -0700 Subject: [PATCH 2/2] Put memory barrier reliably before flag write --- piet-gpu/shader/elements.comp | 7 +++++-- piet-gpu/shader/elements.spv | Bin 80952 -> 81040 bytes 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/piet-gpu/shader/elements.comp b/piet-gpu/shader/elements.comp index bca2e2f..e4bbfec 100644 --- a/piet-gpu/shader/elements.comp +++ b/piet-gpu/shader/elements.comp @@ -220,14 +220,16 @@ void main() { // Publish aggregate for this partition if (gl_LocalInvocationID.x == WG_SIZE - 1) { - // Note: with memory model, we'd want to generate the atomic store version of this. State_write(state_aggregate_ref(part_ix), agg); + if (part_ix == 0) { + State_write(state_prefix_ref(part_ix), agg); + } } + // Write flag with release semantics; this is done portably with a barrier. memoryBarrierBuffer(); if (gl_LocalInvocationID.x == WG_SIZE - 1) { uint flag = FLAG_AGGREGATE_READY; if (part_ix == 0) { - State_write(state_prefix_ref(part_ix), agg); flag = FLAG_PREFIX_READY; } state[state_flag_index(part_ix)] = flag; @@ -239,6 +241,7 @@ void main() { State their_agg; uint their_ix = 0; while (true) { + // Read flag with acquire semantics. if (gl_LocalInvocationID.x == WG_SIZE - 1) { sh_flag = state[state_flag_index(look_back_ix)]; } diff --git a/piet-gpu/shader/elements.spv b/piet-gpu/shader/elements.spv index 4daf42de496b7080dd6ac3383d5140f99fc11baa..60517b0e293c1da39bd83df9a416781c86c22633 100644 GIT binary patch delta 20165 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 vyS8%t@IBA-zTf-p@BQX7T>fU;SKnw`b?{0X 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 F{{vU?F(Uu~