From baf07b12a2a62003334d17113e8dad1e92b80029 Mon Sep 17 00:00:00 2001 From: Michael Bien Date: Wed, 21 Sep 2011 06:25:20 +0200 Subject: bugfixes for parallel reduction primitive - wrong cache size - illegal read from cache on overflow -> read from gloabal mem --- src/com/jogamp/opencl/util/pp/Reduction.java | 2 +- src/com/jogamp/opencl/util/pp/reduce.cl | 4 ++-- test/com/jogamp/opencl/util/pp/ReductionTest.java | 20 +++++++++++--------- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/com/jogamp/opencl/util/pp/Reduction.java b/src/com/jogamp/opencl/util/pp/Reduction.java index c2d47f7..77a37e7 100644 --- a/src/com/jogamp/opencl/util/pp/Reduction.java +++ b/src/com/jogamp/opencl/util/pp/Reduction.java @@ -122,7 +122,7 @@ public class Reduction implements CLResource { int workItems = CLUtil.roundUp(realSize, groupSize*2) / 2; int groups = workItems / groupSize; - int sharedBufferSize = groupSize / 2 * ELEMENT.SIZE*VECTOR_SIZE; + int sharedBufferSize = groupSize * ELEMENT.SIZE*VECTOR_SIZE; int outputSize = groups * ELEMENT.SIZE*VECTOR_SIZE; diff --git a/src/com/jogamp/opencl/util/pp/reduce.cl b/src/com/jogamp/opencl/util/pp/reduce.cl index d820ffe..5f124d6 100644 --- a/src/com/jogamp/opencl/util/pp/reduce.cl +++ b/src/com/jogamp/opencl/util/pp/reduce.cl @@ -50,9 +50,9 @@ kernel void reduce(const global TYPE* input, global TYPE* output, local TYPE* sh #elif OP_MUL shared[localID] = 1; #elif OP_MIN - shared[localID] = shared[0]; + shared[localID] = input[0]; #elif OP_MAX - shared[localID] = shared[0]; + shared[localID] = input[0]; #endif } diff --git a/test/com/jogamp/opencl/util/pp/ReductionTest.java b/test/com/jogamp/opencl/util/pp/ReductionTest.java index 94d1f53..5096e43 100644 --- a/test/com/jogamp/opencl/util/pp/ReductionTest.java +++ b/test/com/jogamp/opencl/util/pp/ReductionTest.java @@ -34,7 +34,9 @@ import com.jogamp.common.nio.Buffers; import com.jogamp.opencl.CLCommandQueue; import com.jogamp.opencl.CLContext; import com.jogamp.opencl.CLDevice; +import com.jogamp.opencl.CLErrorHandler; import com.jogamp.opencl.CLPlatform; +import java.nio.ByteBuffer; import java.nio.DoubleBuffer; import java.nio.FloatBuffer; import java.nio.IntBuffer; @@ -86,7 +88,7 @@ public class ReductionTest { max.release(); assertTrue(max.isReleased()); - assertEquals(expected_max, output.get(0)); + assertEquals("max", expected_max, output.get(0)); Reduction min = Reduction.create(context, Op.MIN, IntBuffer.class); min.reduce(queue, input, output); @@ -95,7 +97,7 @@ public class ReductionTest { min.release(); assertTrue(min.isReleased()); - assertEquals(expected_min, output.get(0)); + assertEquals("min", expected_min, output.get(0)); Reduction sum = Reduction.create(context, Op.ADD, IntBuffer.class); sum.reduce(queue, input, output); @@ -104,7 +106,7 @@ public class ReductionTest { sum.release(); assertTrue(sum.isReleased()); - assertEquals(expected_sum, output.get(0)); + assertEquals("sum", expected_sum, output.get(0)); }finally{ context.release(); @@ -143,7 +145,7 @@ public class ReductionTest { max.release(); assertTrue(max.isReleased()); - assertEquals(expected_max, output.get(0), EPSILON); + assertEquals("max", expected_max, output.get(0), EPSILON); Reduction min = Reduction.create(context, Op.MIN, FloatBuffer.class); min.reduce(queue, input, output); @@ -152,14 +154,14 @@ public class ReductionTest { min.release(); assertTrue(min.isReleased()); - assertEquals(expected_min, output.get(0), EPSILON); + assertEquals("min", expected_min, output.get(0), EPSILON); Reduction sum = Reduction.create(context, Op.ADD, FloatBuffer.class); sum.reduce(queue, input, output); output.rewind(); sum.release(); - assertTrue(sum.isReleased()); + assertTrue("sum", sum.isReleased()); assertEquals(expected_sum, output.get(0), Math.ulp(expected_sum)*SUM_EPSILON); @@ -200,7 +202,7 @@ public class ReductionTest { max.release(); assertTrue(max.isReleased()); - assertEquals(expected_max, output.get(0), EPSILON); + assertEquals("max", expected_max, output.get(0), EPSILON); Reduction min = Reduction.create(context, Op.MIN, DoubleBuffer.class); min.reduce(queue, input, output); @@ -209,7 +211,7 @@ public class ReductionTest { min.release(); assertTrue(min.isReleased()); - assertEquals(expected_min, output.get(0), EPSILON); + assertEquals("min", expected_min, output.get(0), EPSILON); Reduction sum = Reduction.create(context, Op.ADD, DoubleBuffer.class); sum.reduce(queue, input, output); @@ -218,7 +220,7 @@ public class ReductionTest { sum.release(); assertTrue(sum.isReleased()); - assertEquals(expected_sum, output.get(0), Math.ulp(expected_sum)*SUM_EPSILON); + assertEquals("sum", expected_sum, output.get(0), Math.ulp(expected_sum)*SUM_EPSILON); }finally{ context.release(); -- cgit v1.2.3