diff options
author | Michael Bien <[email protected]> | 2010-02-26 17:32:34 +0100 |
---|---|---|
committer | Michael Bien <[email protected]> | 2010-02-26 17:32:34 +0100 |
commit | 75d392f3fff6d47fdccae9a8915fea61cdbef990 (patch) | |
tree | d4ea906c6ad2d744d33b2cd48a233d52dd358e29 | |
parent | 4d348191412077970954f3bc6e672a34f4a7980b (diff) |
improved CLProgramBuilder and implemented propper configuration loading.
-rw-r--r-- | src/com/mbien/opencl/CLBuildConfiguration.java | 24 | ||||
-rw-r--r-- | src/com/mbien/opencl/CLProgramBuilder.java | 90 | ||||
-rw-r--r-- | src/com/mbien/opencl/CLProgramConfiguration.java | 11 | ||||
-rw-r--r-- | test/com/mbien/opencl/CLProgramTest.java | 19 |
4 files changed, 131 insertions, 13 deletions
diff --git a/src/com/mbien/opencl/CLBuildConfiguration.java b/src/com/mbien/opencl/CLBuildConfiguration.java index 86b5cfa2..eee641a0 100644 --- a/src/com/mbien/opencl/CLBuildConfiguration.java +++ b/src/com/mbien/opencl/CLBuildConfiguration.java @@ -1,13 +1,14 @@ package com.mbien.opencl; import java.io.IOException; -import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.Map; /** * Configuration representing everything needed to build an OpenCL program. * @author Michael Bien + * @see CLProgramBuilder#createConfiguration() + * @see CLProgramBuilder#loadConfiguration(java.io.ObjectInputStream) */ public interface CLBuildConfiguration extends Cloneable { @@ -38,6 +39,21 @@ public interface CLBuildConfiguration extends Cloneable { public CLBuildConfiguration reset(); /** + * Resets this builder's configuration options. + */ + public CLBuildConfiguration resetOptions(); + + /** + * Resets this builder's macro definitions. + */ + public CLBuildConfiguration resetDefines(); + + /** + * Resets this builder's device list. + */ + public CLBuildConfiguration resetDevices(); + + /** * Adds the definition to the build configuration. * @see CLProgram#define(java.lang.String) */ @@ -78,8 +94,10 @@ public interface CLBuildConfiguration extends Cloneable { */ public CLBuildConfiguration clone(); + /** + * Saves this configuration to the ObjectOutputStream. + * The caller is responsible for closing the stream. + */ public void save(ObjectOutputStream oos) throws IOException; - public CLBuildConfiguration load(ObjectInputStream ois) throws IOException, ClassNotFoundException; - } diff --git a/src/com/mbien/opencl/CLProgramBuilder.java b/src/com/mbien/opencl/CLProgramBuilder.java index 5948309e..fef7d878 100644 --- a/src/com/mbien/opencl/CLProgramBuilder.java +++ b/src/com/mbien/opencl/CLProgramBuilder.java @@ -20,7 +20,8 @@ import java.util.Set; * @see CLProgram#prepare() * @see #createConfiguration() * @see #createConfiguration(com.mbien.opencl.CLProgram) - * @see #load(java.io.ObjectInputStream) + * @see #loadConfiguration(java.io.ObjectInputStream) + * @see #loadConfiguration(java.io.ObjectInputStream, com.mbien.opencl.CLContext) * @author Michael Bien */ public final class CLProgramBuilder implements CLProgramConfiguration, Serializable { @@ -54,14 +55,58 @@ public final class CLProgramBuilder implements CLProgramConfiguration, Serializa } } + /** + * Creates a new CLBuildConfiguration. + */ public static CLBuildConfiguration createConfiguration() { return createConfiguration(null); } + /** + * Creates a new CLProgramConfiguration for this program. + */ public static CLProgramConfiguration createConfiguration(CLProgram program) { return new CLProgramBuilder(program); } + /** + * Loads a CLBuildConfiguration. + * @param ois The ObjectInputStream for reading the object. + */ + public static CLBuildConfiguration loadConfiguration(ObjectInputStream ois) throws IOException, ClassNotFoundException { + return (CLBuildConfiguration) ois.readObject(); + } + + /** + * Loads a CLProgramConfiguration containing a CLProgram. + * The CLProgram is initialized and ready to be build after this method call. + * This method preferes program initialization from binaries if this fails or if + * no binaries have been found, it will try to load the program from sources. If + * This also fails an appropriate exception will be thrown. + * @param ois The ObjectInputStream for reading the object. + * @param context The context used for program initialization. + */ + public static CLProgramConfiguration loadConfiguration(ObjectInputStream ois, CLContext context) throws IOException, ClassNotFoundException { + CLProgramBuilder config = (CLProgramBuilder) ois.readObject(); + if(config.binariesMap.size() > 0 && config.binariesMap.values().iterator().next().length > 0) { + try{ + config.program = context.createProgram(config.binariesMap); + }catch(CLException.CLInvalidBinaryException ex) { + if(config.source != null) { + config.program = context.createProgram(config.source); + }else{ + throw new IOException("Program configuration contained invalid program binaries and no source.", ex); + } + } + }else if(config.source != null) { + config.program = context.createProgram(config.source); + }else{ + throw new IOException("Program configuration did not contain program sources or binaries"); + } + return config; + } + + @Override public void save(ObjectOutputStream oos) throws IOException { if(program != null) { this.source = program.getSource(); @@ -72,16 +117,14 @@ public final class CLProgramBuilder implements CLProgramConfiguration, Serializa oos.writeObject(this); } - public CLProgramConfiguration load(ObjectInputStream ois) throws IOException, ClassNotFoundException { - return (CLProgramConfiguration) ois.readObject(); - } - + @Override public CLProgramBuilder withOption(String option) { optionSet.add(option); return this; } + @Override public CLProgramBuilder withOptions(String... options) { for (String option : options) { optionSet.add(option); @@ -89,11 +132,13 @@ public final class CLProgramBuilder implements CLProgramConfiguration, Serializa return this; } + @Override public CLProgramBuilder withDefine(String name) { defineSet.add(CLProgram.define(name)); return this; } + @Override public CLProgramBuilder withDefines(String... names) { for (String name : names) { defineSet.add(CLProgram.define(name)); @@ -101,11 +146,13 @@ public final class CLProgramBuilder implements CLProgramConfiguration, Serializa return this; } + @Override public CLProgramBuilder withDefine(String name, Object value) { defineSet.add(CLProgram.define(name, value.toString())); return this; } + @Override public CLProgramBuilder withDefines(Map<String, String> defines) { for (String name : defines.keySet()) { defineSet.add(CLProgram.define(name, defines.get(name))); @@ -113,11 +160,13 @@ public final class CLProgramBuilder implements CLProgramConfiguration, Serializa return this; } + @Override public CLProgramBuilder forDevice(CLDevice device) { binariesMap.put(device, NO_BINARIES); return this; } + @Override public CLProgramBuilder forDevices(CLDevice... devices) { for (CLDevice device : devices) { binariesMap.put(device, NO_BINARIES); @@ -125,10 +174,12 @@ public final class CLProgramBuilder implements CLProgramConfiguration, Serializa return this; } + @Override public CLProgram build() { return build(program); } + @Override public CLProgram build(CLProgram program) { if(program == null) { throw new NullPointerException("no program has been set"); @@ -141,13 +192,32 @@ public final class CLProgramBuilder implements CLProgramConfiguration, Serializa return program.build(options, devices); } + @Override public CLProgramBuilder reset() { - optionSet.clear(); + resetOptions(); + resetDefines(); + resetDevices(); + return this; + } + + @Override + public CLProgramConfiguration resetDefines() { defineSet.clear(); + return this; + } + + @Override + public CLProgramConfiguration resetDevices() { binariesMap.clear(); return this; } + @Override + public CLProgramConfiguration resetOptions() { + optionSet.clear(); + return this; + } + private void writeObject(ObjectOutputStream out) throws IOException { out.defaultWriteObject(); out.writeInt(binariesMap.size()); @@ -177,6 +247,14 @@ public final class CLProgramBuilder implements CLProgramConfiguration, Serializa } @Override + public CLProgramBuilder asBuildConfiguration() { + CLProgramBuilder builder = new CLProgramBuilder(); + builder.defineSet.addAll(defineSet); + builder.optionSet.addAll(optionSet); + return builder; + } + + @Override public CLProgramBuilder clone() { CLProgramBuilder builder = new CLProgramBuilder(program, source, binariesMap); builder.defineSet.addAll(defineSet); diff --git a/src/com/mbien/opencl/CLProgramConfiguration.java b/src/com/mbien/opencl/CLProgramConfiguration.java index fdd0b804..fc074f33 100644 --- a/src/com/mbien/opencl/CLProgramConfiguration.java +++ b/src/com/mbien/opencl/CLProgramConfiguration.java @@ -7,6 +7,8 @@ import java.util.Map; * CLProgramConfiguration is a helper for building programs with more complex configurations or * building multiple programs with the similar configuration. * @see CLProgram#prepare() + * @see CLProgramBuilder#createConfiguration(com.mbien.opencl.CLProgram) + * @see CLProgramBuilder#loadConfiguration(java.io.ObjectInputStream, com.mbien.opencl.CLContext) * @author Michael Bien */ public interface CLProgramConfiguration extends CLBuildConfiguration { @@ -21,6 +23,12 @@ public interface CLProgramConfiguration extends CLBuildConfiguration { */ public CLProgram getProgram(); + /** + * Returns a new instance of of this configuration without a {@link CLProgram}, + * program binaries or sources associated with it. + */ + public CLBuildConfiguration asBuildConfiguration(); + // overwrite with CLProgramConfiguration as return type @Override public CLProgramConfiguration forDevice(CLDevice device); @@ -32,6 +40,9 @@ public interface CLProgramConfiguration extends CLBuildConfiguration { @Override public CLProgramConfiguration withOption(String option); @Override public CLProgramConfiguration withOptions(String... options); @Override public CLProgramConfiguration reset(); + @Override public CLProgramConfiguration resetOptions(); + @Override public CLProgramConfiguration resetDefines(); + @Override public CLProgramConfiguration resetDevices(); @Override public CLProgramConfiguration clone(); } diff --git a/test/com/mbien/opencl/CLProgramTest.java b/test/com/mbien/opencl/CLProgramTest.java index 16684738..647ba1cb 100644 --- a/test/com/mbien/opencl/CLProgramTest.java +++ b/test/com/mbien/opencl/CLProgramTest.java @@ -181,6 +181,8 @@ public class CLProgramTest { .forDevices(context.getDevices()) .withDefine("RADIUS", 5) .withDefine("ENABLE_FOOBAR"); + + out.println(builder); builder.setProgram(program).build(); assertTrue(program.isExecutable()); @@ -191,18 +193,27 @@ public class CLProgramTest { builder.save(oos); oos.close(); + // build configuration ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file)); - CLBuildConfiguration builder2 = builder.load(ois); + CLBuildConfiguration buildConfig = CLProgramBuilder.loadConfiguration(ois); ois.close(); - assertEquals(builder, builder2); + assertEquals(builder, buildConfig); + + buildConfig.build(program); + assertTrue(program.isExecutable()); - builder2.build(program); + // 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()); - } |