diff --git a/juno_samples/rodinia/bfs/src/bfs.jn b/juno_samples/rodinia/bfs/src/bfs.jn index 2534a89c627f137bf4a65a7f3d61879c3d3670e6..3d0280f1535b35bfd19bb4c1032eb3a224ac5a0d 100644 --- a/juno_samples/rodinia/bfs/src/bfs.jn +++ b/juno_samples/rodinia/bfs/src/bfs.jn @@ -44,11 +44,12 @@ fn bfs<n, m: usize>(graph_nodes: Node[n], source: u32, edges: u32[m]) -> i32[n] @loop2 for i in 0..n { stop = stop && !updated[i]; - if updated[i] { - mask[i] = true; - visited[i] = true; - updated[i] = false; - } + } + + @loop3 for i in 0..n { + mask[i] = mask[i] || updated[i]; + visited[i] = visited[i] || updated[i]; + updated[i] = false; } } diff --git a/juno_samples/rodinia/bfs/src/cpu.sch b/juno_samples/rodinia/bfs/src/cpu.sch index f94c473fb83dd9c62486de97bb9e8f80a0a4f221..a33e361db3d4b9634f669226cf5f7198f010869e 100644 --- a/juno_samples/rodinia/bfs/src/cpu.sch +++ b/juno_samples/rodinia/bfs/src/cpu.sch @@ -11,9 +11,9 @@ macro simpl!(X) { phi-elim(bfs); no-memset(bfs@cost); let init = outline(bfs@cost_init); -let loop1 = outline(bfs@loop1); -let loop2 = outline(bfs@loop2); -parallel-reduce(loop1); +let traverse = outline(bfs@loop1); +let collect = outline(bfs@loop2 | bfs@loop3); +parallel-reduce(traverse); simpl!(*); predication(*); @@ -27,13 +27,15 @@ fixpoint { simpl!(*); predication(*); simpl!(*); +reduce-slf(*); +simpl!(*); -fork-tile[32, 0, false, false](loop1); -let split = fork-split(loop1); -let out = outline(split.bfs_1.fj1); -unforkify(out); -inline(bfs@loop1); -delete-uncalled(*); +fixpoint { + forkify(collect); + fork-guard-elim(collect); +} +fork-fusion(collect); +simpl!(collect); -unforkify(init); +unforkify(init, traverse, collect); gcm(*);