package com.nativelibs4java.opencl.util; import com.nativelibs4java.opencl.*; import static com.nativelibs4java.opencl.JavaCL.createBestContext; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import org.bridj.Pointer; import static org.bridj.Pointer.*; import java.util.Arrays; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import com.nativelibs4java.opencl.util.ReductionUtils.Reductor; import com.nativelibs4java.util.NIOUtils; public class ReductionTest { //@BeforeClass //public static void setup() { // com.sun.jna.Native.setProtected(true); //} CLContext context; CLQueue queue; @Before public void init() { //context = createBestContext(CLPlatform.DeviceEvaluationStrategy.BestDoubleSupportThenBiggestMaxComputeUnits);// context = createBestContext(); //System.out.println("Context = " + Arrays.asList(context.getDevices())); queue = context.createDefaultQueue(); } @Test public void testMinMax() { try { CLBuffer<Integer> input = context.createBuffer(CLMem.Usage.Input, pointerToInts( 1110, 22, 35535, 3, 1 ), true); int maxReductionSize = 2; Pointer<Integer> result = allocateInt().order(context.getByteOrder()); Reductor<Integer> reductor = ReductionUtils.createReductor(context, ReductionUtils.Operation.Min, OpenCLType.Int, 1); reductor.reduce(queue, input, input.getElementCount(), result, maxReductionSize); queue.finish(); assertEquals(1, (int)result.get()); reductor = ReductionUtils.createReductor(context, ReductionUtils.Operation.Max, OpenCLType.Int, 1); reductor.reduce(queue, input, input.getElementCount(), result, maxReductionSize); queue.finish(); assertEquals(35535, (int)result.get()); } catch (Exception ex) { ex.printStackTrace(); assertTrue(ex.toString(), false); } } /// http://code.google.com/p/nativelibs4java/issues/detail?id=26 @Test public void testIssue26() { try { float[] array = new float[4097]; for (int i = 0; i < array.length; i++) array[i] = 1; CLBuffer<Float> clBufferInput = context.createBuffer(CLMem.Usage.Input, pointerToFloats(array), true); ReductionUtils.Reductor<Float> reductor = ReductionUtils.createReductor( context, ReductionUtils.Operation.Add, OpenCLType.Float, 1 ); Pointer<Float> result = reductor.reduce(queue, clBufferInput, 4097, 64); float sum = result.get(0); float expected = 4097; System.err.println("[Test of issue 26] Expected " + expected + ", got " + sum); assertEquals(expected, sum, 0); } catch (Exception ex) { ex.printStackTrace(); assertTrue(ex.toString(), false); } } @Test public void testAddReduction() { try { int dataSize = 12345; int channels = 1; int maxReductionSize = 64; Pointer<Integer> inBuf = allocateInts(channels * dataSize).order(context.getByteOrder()); for (int i = 0; i < dataSize; i++) { for (int c = 0; c < channels; c++) inBuf.set(i * channels + c, i); } CLBuffer<Integer> in = context.createBuffer(CLMem.Usage.Input, Integer.class, channels * dataSize); in.write(queue, inBuf, true); Pointer<Integer> check = in.read(queue); for (int i = 0; i < dataSize; i++) assertEquals((int)inBuf.get(i), (int)check.get(i)); Pointer<Integer> out = allocateInts(channels).order(context.getByteOrder()); Reductor<Integer> reductor = ReductionUtils.createReductor(context, ReductionUtils.Operation.Add, OpenCLType.Int, channels); //CLEvent evt = reductor.reduce(queue, in, dataSize, out, maxReductionSize); //if (evt != null) queue.finish(); // evt.waitFor(); //CLEvent[] evts = reductor.reduce(queue, in, 0, dataSize, out, maxReductionSize); //queue.enqueueWaitForEvents(evts); int expected = dataSize * (dataSize - 1) / 2; System.out.println("Expecting " + expected); for (int i = 0; i < channels; i++) { int value = out.get(i); System.out.println("out." + i + " = " + value); assertEquals(expected, value); } } catch (Exception ex) { ex.printStackTrace(); assertTrue(ex.toString(), false); } } }