package com.nativelibs4java.opencl; import java.util.Map; import static org.junit.Assert.assertEquals; import org.junit.BeforeClass; import org.junit.Test; import org.bridj.Pointer; import static org.bridj.Pointer.*; import java.util.List; import org.junit.Ignore; import org.junit.runners.Parameterized; /** * @author Kazo Csaba */ @SuppressWarnings("unchecked") public class BinaryKernelTest extends AbstractCommon { public BinaryKernelTest(CLDevice device) { super(device); } @Parameterized.Parameters public static List<Object[]> getDeviceParameters() { return AbstractCommon.getDeviceParameters(); } @Test public void simpleTest() throws CLBuildException { if (!context.getCacheBinaries()) { System.out.println("Skipping binaries caching test"); return; } CLProgram program = context.createProgram( "__kernel void copy(__global int* a, __global int* b) {\n" + " int i = get_global_id(0);\n" + " b[i]=a[i];\n" + "} "); program.build(); Map<CLDevice, byte[]> binaries = program.getBinaries(); String src = program.getSource(); program.release(); CLProgram binaryProgram = context.createProgram(binaries, null); CLKernel kernel = binaryProgram.createKernel("copy"); CLBuffer<Integer> a=context.createBuffer(CLMem.Usage.Input, Integer.class, 4); CLBuffer<Integer> b=context.createBuffer(CLMem.Usage.Output, Integer.class, 4); Pointer<Integer> source = allocateInts(4).order(context.getByteOrder()); for (int i=0; i<4; i++) source.set(i, 3*i+10); a.write(queue, source, true); kernel.setArgs(a, b); kernel.enqueueNDRange(queue, new int[]{4}).waitFor(); Pointer<Integer> target = b.read(queue); assertEquals(target.getValidElements(), source.getValidElements()); for (int i=0; i<4; i++) assertEquals(source.get(i), target.get(i)); } /** * Test from issue https://github.com/ochafik/nativelibs4java/issues/453 */ @Test public void cachingTest() { CLContext clcontext = JavaCL.createBestContext(); CLProgram ap = clcontext.createProgram("__kernel void add(int a, int b, __global int* c) { *c = a + b; }"); ap.createKernel("add"); Map<CLDevice, byte[]> addBins = ap.getBinaries(); Map<CLDevice, byte[]> subBins = clcontext.createProgram("__kernel void sub(int a, int b, __global int* c) { *c = a - b; }").getBinaries(); CLProgram ap2 = clcontext.createProgram(addBins, "__kernel void add(int a, int b, __global int* c) { *c = a + b; }"); ap2.createKernel("add"); CLProgram sp2 = clcontext.createProgram(subBins, "__kernel void sub(int a, int b, __global int* c) { *c = a - b; }"); sp2.setCached(true); // set to false and it works sp2.createKernel("sub"); } }