summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Bien <[email protected]>2011-09-21 06:25:20 +0200
committerMichael Bien <[email protected]>2011-09-21 06:25:20 +0200
commitbaf07b12a2a62003334d17113e8dad1e92b80029 (patch)
tree7f1d345ed624bd38d909402051383cc1f43148b9
parentccfc0b128c0eeee54ded44fc3700de54e9532213 (diff)
bugfixes for parallel reduction primitive
- wrong cache size - illegal read from cache on overflow -> read from gloabal mem
-rw-r--r--src/com/jogamp/opencl/util/pp/Reduction.java2
-rw-r--r--src/com/jogamp/opencl/util/pp/reduce.cl4
-rw-r--r--test/com/jogamp/opencl/util/pp/ReductionTest.java20
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<B extends Buffer> 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<IntBuffer> 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<IntBuffer> 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<FloatBuffer> 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<FloatBuffer> 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<DoubleBuffer> 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<DoubleBuffer> 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();