diff --git a/hercules_cg/src/rt.rs b/hercules_cg/src/rt.rs index 884129c712863a49d535d23f46893d8ed246c56b..ddfa9503765924cd972a2fc85be737fe9932da97 100644 --- a/hercules_cg/src/rt.rs +++ b/hercules_cg/src/rt.rs @@ -529,7 +529,7 @@ impl<'a> RTContext<'a> { write!(block, "{} = ", self.get_value(id, bb, true))?; let mut size_and_device = None; match self.module.constants[cons_id.idx()] { - Constant::Boolean(val) => write!(block, "{}bool", val)?, + Constant::Boolean(val) => write!(block, "{}", val)?, Constant::Integer8(val) => write!(block, "{}i8", val)?, Constant::Integer16(val) => write!(block, "{}i16", val)?, Constant::Integer32(val) => write!(block, "{}i32", val)?, diff --git a/juno_samples/edge_detection/src/cpu.sch b/juno_samples/edge_detection/src/cpu.sch index 8f715c39807dabc05f4ff9c54a894136a4cc9e95..a1974d0592f44938dc7d7d98305c57ecdeb48577 100644 --- a/juno_samples/edge_detection/src/cpu.sch +++ b/juno_samples/edge_detection/src/cpu.sch @@ -40,6 +40,14 @@ fixpoint { fork-coalesce(laplacian_estimate); } simpl!(laplacian_estimate); +let par = laplacian_estimate@image_loop \ laplacian_estimate@filter_loop; +fork-tile[4, 1, false, false](par); +fork-tile[4, 0, false, false](par); +fork-interchange[1, 2](par); +let split = fork-split(par); +let laplacian_estimate_body = outline(split._1_laplacian_estimate.fj2); +fork-coalesce(laplacian_estimate, laplacian_estimate_body); +simpl!(laplacian_estimate, laplacian_estimate_body); no-memset(zero_crossings@res, zero_crossings@shr1, zero_crossings@shr2); fixpoint { @@ -48,6 +56,14 @@ fixpoint { fork-coalesce(zero_crossings); } simpl!(zero_crossings); +let par = zero_crossings@image_loop \ zero_crossings@filter_loop; +fork-tile[4, 1, false, false](par); +fork-tile[4, 0, false, false](par); +fork-interchange[1, 2](par); +let split = fork-split(par); +let zero_crossings_body = outline(split._2_zero_crossings.fj2); +fork-coalesce(zero_crossings, zero_crossings_body); +simpl!(zero_crossings, zero_crossings_body); no-memset(gradient@res); fixpoint { @@ -89,8 +105,8 @@ simpl!(reject_zero_crossings); async-call(edge_detection@le, edge_detection@zc); -fork-split(gaussian_smoothing_body, laplacian_estimate, zero_crossings, gradient, reject_zero_crossings); -unforkify(gaussian_smoothing_body, laplacian_estimate, zero_crossings, gradient, reject_zero_crossings); +fork-split(gaussian_smoothing_body, laplacian_estimate, laplacian_estimate_body, zero_crossings, zero_crossings_body, gradient, reject_zero_crossings); +unforkify(gaussian_smoothing_body, laplacian_estimate, laplacian_estimate_body, zero_crossings, zero_crossings_body, gradient, reject_zero_crossings); simpl!(*); diff --git a/juno_samples/edge_detection/src/edge_detection.jn b/juno_samples/edge_detection/src/edge_detection.jn index 0b8e71da5b079a0828120dd347af20564271d39c..58f364dc1cea77b27c83ba2340bfbd11fde07f31 100644 --- a/juno_samples/edge_detection/src/edge_detection.jn +++ b/juno_samples/edge_detection/src/edge_detection.jn @@ -47,11 +47,11 @@ fn laplacian_estimate<n, m, sz: usize>( @shr1 let imageArea : f32[sz, sz]; @filter_loop for i = 0 to sz { for j = 0 to sz { - imageArea[i, j] = if row + i < r then MIN_BR - else if row + i - r > n - 1 then MIN_BR - else if col + j < r then MIN_BR - else if col + j - r > m - 1 then MIN_BR - else input[row + i - r, col + j - r]; + imageArea[i, j] = if row + i < r + || row + i - r > n - 1 + || col + j < r + || col + j - r > m - 1 then MIN_BR + else input[row + i - r, col + j - r]; } } @@ -67,11 +67,11 @@ fn laplacian_estimate<n, m, sz: usize>( @shr2 let imageArea : f32[sz, sz]; @filter_loop for i = 0 to sz { for j = 0 to sz { - imageArea[i, j] = if row + i < r then MAX_BR - else if row + i - r > n - 1 then MAX_BR - else if col + j < r then MAX_BR - else if col + j - r > m - 1 then MAX_BR - else input[row + i - r, col + j - r]; + imageArea[i, j] = if row + i < r + || row + i - r > n - 1 + || col + j < r + || col + j - r > m - 1 then MAX_BR + else input[row + i - r, col + j - r]; } } @@ -105,12 +105,11 @@ fn zero_crossings<n, m, sz: usize>( @shr1 let imageArea : f32[sz, sz]; @filter_loop for i = 0 to sz { for j = 0 to sz { - imageArea[i, j] = if row + i < r then MIN_BR - else if row + i - r > n - 1 then MIN_BR - else if col + j < r then MIN_BR - else if col + j - r > m - 1 then MIN_BR - else if input[row + i - r, col + j - r] > MIN_BR - then MAX_BR + imageArea[i, j] = if row + i < r + || row + i - r > n - 1 + || col + j < r + || col + j - r > m - 1 then MIN_BR + else if input[row + i - r, col + j - r] > MIN_BR then MAX_BR else MIN_BR; } } @@ -127,12 +126,11 @@ fn zero_crossings<n, m, sz: usize>( @shr2 let imageArea : f32[sz, sz]; @filter_loop for i = 0 to sz { for j = 0 to sz { - imageArea[i, j] = if row + i < r then MAX_BR - else if row + i - r > n - 1 then MAX_BR - else if col + j < r then MAX_BR - else if col + j - r > m - 1 then MAX_BR - else if input[row + i - r, col + j - r] > MIN_BR - then MAX_BR + imageArea[i, j] = if row + i < r + || row + i - r > n - 1 + || col + j < r + || col + j - r > m - 1 then MAX_BR + else if input[row + i - r, col + j - r] > MIN_BR then MAX_BR else MIN_BR; } } diff --git a/juno_samples/edge_detection/src/lib.rs b/juno_samples/edge_detection/src/lib.rs index dab84cf6206c3cb9b816c88c53c8ddfbec102994..aa44e2e7e7215ee21560fefefc8c748610e183ce 100644 --- a/juno_samples/edge_detection/src/lib.rs +++ b/juno_samples/edge_detection/src/lib.rs @@ -234,7 +234,14 @@ pub fn edge_detection_harness(args: EdgeDetectionInputs) { theta, ); - assert_eq!(result, rust_result); + let mut all = true; + for idx in 0..rust_result.len() { + if result[idx] != rust_result[idx] { + all = false; + println!("Found mismatch in images at {}.", idx); + } + } + assert!(all); println!("Frames {} match", i); if display_verify {