diff options
Diffstat (limited to 'test/com/jogamp/opencl/CLProgramTest.java')
-rw-r--r-- | test/com/jogamp/opencl/CLProgramTest.java | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/test/com/jogamp/opencl/CLProgramTest.java b/test/com/jogamp/opencl/CLProgramTest.java new file mode 100644 index 00000000..8b5d4362 --- /dev/null +++ b/test/com/jogamp/opencl/CLProgramTest.java @@ -0,0 +1,224 @@ +package com.jogamp.opencl; + +import com.jogamp.opencl.util.CLBuildConfiguration; +import com.jogamp.opencl.util.CLProgramConfiguration; +import com.jogamp.opencl.CLProgram.Status; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.util.Map; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +import static org.junit.Assert.*; +import static java.lang.System.*; +import static com.jogamp.opencl.CLProgram.CompilerOptions.*; + +/** + * + * @author Michael Bien + */ +public class CLProgramTest { + + @Rule + public TemporaryFolder tmpFolder = new TemporaryFolder(); + + + @Test + public void enumsTest() { + + // CLProgram enums + for (Status e : Status.values()) { + assertEquals(e, Status.valueOf(e.STATUS)); + } + } + + @Test + public void rebuildProgramTest() throws IOException { + + out.println(" - - - CLProgramTest; rebuild program test - - - "); + + CLContext context = CLContext.create(); + CLProgram program = context.createProgram(getClass().getResourceAsStream("testkernels.cl")); + + try{ + program.createCLKernels(); + fail("expected exception but got none :("); + }catch(CLException ex) { + out.println("got expected exception: "+ex.getCLErrorString()); + assertEquals(ex.errorcode, CL.CL_INVALID_PROGRAM_EXECUTABLE); + } + + out.println(program.getBuildStatus()); + program.build(); + out.println(program.getBuildStatus()); + + assertTrue(program.isExecutable()); + + Map<String, CLKernel> kernels = program.createCLKernels(); + assertNotNull(kernels); + assertTrue("kernel map is empty", kernels.size() > 0); + + // rebuild + // 1. release kernels (internally) + // 2. build program + program.build(); + assertTrue(program.isExecutable()); + out.println(program.getBuildStatus()); + + // try again with rebuilt program + kernels = program.createCLKernels(); + assertNotNull(kernels); + assertTrue("kernel map is empty", kernels.size() > 0); + assertTrue(kernels.size() > 0); + + context.release(); + } + + @Test + public void programBinariesTest() throws IOException { + + out.println(" - - - CLProgramTest; down-/upload binaries test - - - "); + + CLContext context = CLContext.create(); + CLProgram program = context.createProgram(getClass().getResourceAsStream("testkernels.cl")) + .build(ENABLE_MAD, WARNINGS_ARE_ERRORS); + + // optain binaries + Map<CLDevice, byte[]> binaries = program.getBinaries(); + assertFalse(binaries.isEmpty()); + + CLDevice[] devices = program.getCLDevices(); + for (CLDevice device : devices) { + assertTrue(binaries.containsKey(device)); + } + + // 1. release program + // 2. re-create program with old binaries + program.release(); + + assertFalse(program.isExecutable()); + + assertNotNull(program.getBinaries()); + assertEquals(program.getBinaries().size(), 0); + + assertNotNull(program.getBuildLog()); + assertEquals(program.getBuildLog().length(), 0); + + assertNotNull(program.getSource()); + assertEquals(program.getSource().length(), 0); + + assertNotNull(program.getCLDevices()); + assertEquals(program.getCLDevices().length, 0); + + { + Map<String, CLKernel> kernels = program.createCLKernels(); + assertNotNull(kernels); + assertEquals(kernels.size(), 0); + } + assertNull(program.createCLKernel("foo")); + + program = context.createProgram(binaries); + + assertFalse(program.isExecutable()); + + assertNotNull(program.getCLDevices()); + assertTrue(program.getCLDevices().length != 0); + + assertNotNull(program.getBinaries()); + assertEquals(program.getBinaries().size(), 0); + + assertNotNull(program.getBuildLog()); + assertTrue(program.getBuildLog().length() != 0); + + assertNotNull(program.getSource()); + assertEquals(program.getSource().length(), 0); + + try{ + Map<String, CLKernel> kernels = program.createCLKernels(); + fail("expected an exception from createCLKernels but got: "+kernels); + }catch(CLException ex) { + // expected, not build yet + } + + out.println(program.getBuildStatus()); + program.build(); + out.println(program.getBuildStatus()); + + assertNotNull(program.createCLKernel("Test")); + + assertTrue(program.isExecutable()); + + } + + @Test + public void builderTest() throws IOException, ClassNotFoundException { + out.println(" - - - CLProgramTest; program builder test - - - "); + + CLContext context = CLContext.create(); + CLProgram program = context.createProgram(getClass().getResourceAsStream("testkernels.cl")); + + // same as program.build() + program.prepare().build(); + + assertTrue(program.isExecutable()); + + + // complex build + program.prepare().withOption(ENABLE_MAD) + .forDevice(context.getMaxFlopsDevice()) + .withDefine("RADIUS", 5) + .withDefine("ENABLE_FOOBAR") + .build(); + + assertTrue(program.isExecutable()); + + // reusable builder + CLBuildConfiguration builder = CLProgramBuilder.createConfiguration() + .withOption(ENABLE_MAD) + .forDevices(context.getDevices()) + .withDefine("RADIUS", 5) + .withDefine("ENABLE_FOOBAR"); + + out.println(builder); + + builder.setProgram(program).build(); + assertTrue(program.isExecutable()); + + // serialization test + File file = tmpFolder.newFile("foobar.builder"); + ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file)); + builder.save(oos); + oos.close(); + + // build configuration + ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file)); + CLBuildConfiguration buildConfig = CLProgramBuilder.loadConfiguration(ois); + ois.close(); + + assertEquals(builder, buildConfig); + + buildConfig.build(program); + assertTrue(program.isExecutable()); + + // program configuration + ois = new ObjectInputStream(new FileInputStream(file)); + CLProgramConfiguration programConfig = CLProgramBuilder.loadConfiguration(ois, context); + assertNotNull(programConfig.getProgram()); + ois.close(); + program = programConfig.build(); + assertTrue(program.isExecutable()); + + + // cloneing + assertEquals(builder, builder.clone()); + + } + + + +} |