diff options
author | Michael Bien <[email protected]> | 2010-01-19 00:14:28 +0100 |
---|---|---|
committer | Michael Bien <[email protected]> | 2010-01-19 00:14:28 +0100 |
commit | 21f0d9231227a4d2c96cb70b5061c18145591fba (patch) | |
tree | 392c64edb0571127fb83ccb003d491f179a0efa2 /src | |
parent | 09ac312a0645bd0d9adff580f29f20382dfbf8c9 (diff) |
temporary dissabled non direct NIO binding for methods containing long[] since its broken on 32bit systems.
refactored high level binding to use direct NIO exclusively.
temporary dissabled low level binding junit tests.
green bar on 32 and 64 bit systems.
Diffstat (limited to 'src')
-rw-r--r-- | src/com/mbien/opencl/CLContext.java | 14 | ||||
-rw-r--r-- | src/com/mbien/opencl/CLKernel.java | 13 | ||||
-rw-r--r-- | src/com/mbien/opencl/CLPlatform.java | 39 | ||||
-rw-r--r-- | src/com/mbien/opencl/CLProgram.java | 65 | ||||
-rw-r--r-- | src/com/mbien/opencl/CLUtils.java | 12 |
5 files changed, 80 insertions, 63 deletions
diff --git a/src/com/mbien/opencl/CLContext.java b/src/com/mbien/opencl/CLContext.java index 3db9be2d..6fbad0df 100644 --- a/src/com/mbien/opencl/CLContext.java +++ b/src/com/mbien/opencl/CLContext.java @@ -4,6 +4,7 @@ import com.mbien.opencl.CLMemory.Mem; import com.mbien.opencl.CLSampler.AddressingMode; import com.mbien.opencl.CLSampler.FilteringMode; import com.sun.gluegen.runtime.CPU; +import com.sun.gluegen.runtime.PointerBuffer; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -58,13 +59,13 @@ public class CLContext implements CLResource { if (devices == null) { int sizeofDeviceID = CPU.is32Bit() ? 4 : 8; - long[] longBuffer = new long[1]; + PointerBuffer deviceCount = PointerBuffer.allocateDirect(1); - int ret = cl.clGetContextInfo(ID, CL.CL_CONTEXT_DEVICES, 0, null, longBuffer, 0); + int ret = cl.clGetContextInfo(ID, CL.CL_CONTEXT_DEVICES, 0, null, deviceCount); checkForError(ret, "can not enumerate devices"); - ByteBuffer deviceIDs = ByteBuffer.allocate((int) longBuffer[0]).order(ByteOrder.nativeOrder()); - ret = cl.clGetContextInfo(ID, CL.CL_CONTEXT_DEVICES, deviceIDs.capacity(), deviceIDs, null, 0); + ByteBuffer deviceIDs = ByteBuffer.allocateDirect((int)deviceCount.get()).order(ByteOrder.nativeOrder()); + ret = cl.clGetContextInfo(ID, CL.CL_CONTEXT_DEVICES, deviceIDs.capacity(), deviceIDs, null); checkForError(ret, "can not enumerate devices"); devices = new CLDevice[deviceIDs.capacity() / sizeofDeviceID]; @@ -166,15 +167,12 @@ public class CLContext implements CLResource { if(platforms.length > 0) platform = platforms[0]; } -// System.out.println(platform.ID); -// System.out.println((int)platform.ID); Buffer properties = null; if(platform != null) { if(CPU.is32Bit()){ - int id = (int)platform.ID;// (int)(platform.ID & 0x00000000FFFFFFFFL); properties = ByteBuffer.allocate(4*3).order(ByteOrder.nativeOrder()) - .putInt(CL.CL_CONTEXT_PLATFORM).putInt(id).putInt(0); // 0 terminated array + .putInt(CL.CL_CONTEXT_PLATFORM).putInt((int)platform.ID).putInt(0); // 0 terminated array }else{ properties = LongBuffer.allocate(3) .put(CL.CL_CONTEXT_PLATFORM).put(platform.ID).put(0); // 0 terminated array diff --git a/src/com/mbien/opencl/CLKernel.java b/src/com/mbien/opencl/CLKernel.java index 33d30730..5e7330e7 100644 --- a/src/com/mbien/opencl/CLKernel.java +++ b/src/com/mbien/opencl/CLKernel.java @@ -2,6 +2,7 @@ package com.mbien.opencl; import com.sun.gluegen.runtime.BufferFactory; import com.sun.gluegen.runtime.CPU; +import com.sun.gluegen.runtime.PointerBuffer; import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.ByteOrder; @@ -37,21 +38,21 @@ public class CLKernel implements CLResource { this.cl = program.context.cl; this.buffer = BufferFactory.newDirectByteBuffer(8); - long[] longArray = new long[1]; + PointerBuffer pb = PointerBuffer.allocateDirect(1); // get function name - int ret = cl.clGetKernelInfo(ID, CL_KERNEL_FUNCTION_NAME, 0, null, longArray, 0); + int ret = cl.clGetKernelInfo(ID, CL_KERNEL_FUNCTION_NAME, 0, null, pb); checkForError(ret, "error while asking for kernel function name"); - ByteBuffer bb = ByteBuffer.allocate((int)longArray[0]).order(ByteOrder.nativeOrder()); + ByteBuffer bb = ByteBuffer.allocateDirect((int)pb.get(0)).order(ByteOrder.nativeOrder()); - ret = cl.clGetKernelInfo(ID, CL_KERNEL_FUNCTION_NAME, bb.capacity(), bb, null, 0); + ret = cl.clGetKernelInfo(ID, CL_KERNEL_FUNCTION_NAME, bb.capacity(), bb, null); checkForError(ret, "error while asking for kernel function name"); - this.name = CLUtils.clString2JavaString(bb.array(), bb.capacity()); + this.name = CLUtils.clString2JavaString(bb, bb.capacity()); // get number of arguments - ret = cl.clGetKernelInfo(ID, CL_KERNEL_NUM_ARGS, bb.capacity(), bb, null, 0); + ret = cl.clGetKernelInfo(ID, CL_KERNEL_NUM_ARGS, bb.capacity(), bb, null); checkForError(ret, "error while asking for number of function arguments."); numArgs = bb.getInt(0); diff --git a/src/com/mbien/opencl/CLPlatform.java b/src/com/mbien/opencl/CLPlatform.java index f669cb0d..80bd4d60 100644 --- a/src/com/mbien/opencl/CLPlatform.java +++ b/src/com/mbien/opencl/CLPlatform.java @@ -1,7 +1,10 @@ package com.mbien.opencl; import com.mbien.opencl.impl.CLImpl; +import com.sun.gluegen.runtime.PointerBuffer; import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.IntBuffer; import static com.mbien.opencl.CLException.*; import static com.mbien.opencl.CL.*; @@ -35,20 +38,20 @@ public final class CLPlatform { */ public static CLPlatform[] listCLPlatforms() { - int[] intBuffer = new int[1]; + IntBuffer ib = ByteBuffer.allocateDirect(4).order(ByteOrder.nativeOrder()).asIntBuffer(); // find all available OpenCL platforms - int ret = cl.clGetPlatformIDs(0, null, 0, intBuffer, 0); + int ret = cl.clGetPlatformIDs(0, null, ib); checkForError(ret, "can not enumerate platforms"); // receive platform ids - long[] platformId = new long[intBuffer[0]]; - ret = cl.clGetPlatformIDs(platformId.length, platformId, 0, null, 0); + PointerBuffer platformId = PointerBuffer.allocateDirect(ib.get(0)); + ret = cl.clGetPlatformIDs(platformId.capacity(), platformId, null); checkForError(ret, "can not enumerate platforms"); - CLPlatform[] platforms = new CLPlatform[platformId.length]; + CLPlatform[] platforms = new CLPlatform[platformId.capacity()]; - for (int i = 0; i < platformId.length; i++) - platforms[i] = new CLPlatform(platformId[i]); + for (int i = 0; i < platformId.capacity(); i++) + platforms[i] = new CLPlatform(platformId.get(i)); return platforms; } @@ -73,21 +76,21 @@ public final class CLPlatform { */ public CLDevice[] listCLDevices(CLDevice.Type type) { - int[] intBuffer = new int[1]; + IntBuffer ib = ByteBuffer.allocateDirect(4).order(ByteOrder.nativeOrder()).asIntBuffer(); //find all devices - int ret = cl.clGetDeviceIDs(ID, type.TYPE, 0, null, 0, intBuffer, 0); + int ret = cl.clGetDeviceIDs(ID, type.TYPE, 0, null, ib); checkForError(ret, "error while enumerating devices"); - long[] deviceIDs = new long[intBuffer[0]]; - ret = cl.clGetDeviceIDs(ID, type.TYPE, deviceIDs.length, deviceIDs, 0, null, 0); + PointerBuffer deviceIDs = PointerBuffer.allocateDirect(ib.get(0)); + ret = cl.clGetDeviceIDs(ID, type.TYPE, deviceIDs.capacity(), deviceIDs, null); checkForError(ret, "error while enumerating devices"); - CLDevice[] devices = new CLDevice[deviceIDs.length]; + CLDevice[] devices = new CLDevice[deviceIDs.capacity()]; //print device info - for (int i = 0; i < deviceIDs.length; i++) - devices[i] = new CLDevice(cl, deviceIDs[i]); + for (int i = 0; i < deviceIDs.capacity(); i++) + devices[i] = new CLDevice(cl, deviceIDs.get(i)); return devices; @@ -176,13 +179,13 @@ public final class CLPlatform { * Returns a info string in exchange for a key (CL_PLATFORM_*). */ public String getInfoString(int key) { - long[] longBuffer = new long[1]; - ByteBuffer bb = ByteBuffer.allocate(512); + PointerBuffer pb = PointerBuffer.allocateDirect(1); + ByteBuffer bb = ByteBuffer.allocateDirect(512); - int ret = cl.clGetPlatformInfo(ID, key, bb.capacity(), bb, longBuffer, 0); + int ret = cl.clGetPlatformInfo(ID, key, bb.capacity(), bb, pb); checkForError(ret, "can not receive info string"); - return CLUtils.clString2JavaString(bb.array(), (int)longBuffer[0]); + return CLUtils.clString2JavaString(bb, (int)pb.get(0)); } @Override diff --git a/src/com/mbien/opencl/CLProgram.java b/src/com/mbien/opencl/CLProgram.java index 4b7fac7c..9e141dde 100644 --- a/src/com/mbien/opencl/CLProgram.java +++ b/src/com/mbien/opencl/CLProgram.java @@ -1,8 +1,10 @@ package com.mbien.opencl; import com.sun.gluegen.runtime.CPU; +import com.sun.gluegen.runtime.PointerBuffer; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.nio.IntBuffer; import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -31,29 +33,30 @@ public class CLProgram implements CLResource { this.cl = context.cl; this.context = context; - int[] intArray = new int[1]; + IntBuffer ib = ByteBuffer.allocateDirect(4).order(ByteOrder.nativeOrder()).asIntBuffer(); // Create the program - ID = cl.clCreateProgramWithSource(context.ID, 1, new String[] {src}, new long[]{src.length()}, 0, intArray, 0); - checkForError(intArray[0], "can not create program with source"); + ID = cl.clCreateProgramWithSource(context.ID, 1, new String[] {src}, + PointerBuffer.allocateDirect(1).put(src.length()), ib); + checkForError(ib.get(), "can not create program with source"); } private final void initKernels() { if(kernels == null) { - int[] numKernels = new int[1]; - int ret = cl.clCreateKernelsInProgram(ID, 0, null, 0, numKernels, 0); + IntBuffer numKernels = ByteBuffer.allocateDirect(4).order(ByteOrder.nativeOrder()).asIntBuffer(); + int ret = cl.clCreateKernelsInProgram(ID, 0, null, numKernels); checkForError(ret, "can not create kernels for program"); - if(numKernels[0] > 0) { + if(numKernels.get(0) > 0) { HashMap<String, CLKernel> map = new HashMap<String, CLKernel>(); - long[] kernelIDs = new long[numKernels[0]]; - ret = cl.clCreateKernelsInProgram(ID, kernelIDs.length, kernelIDs, 0, null, 0); + PointerBuffer kernelIDs = PointerBuffer.allocateDirect(numKernels.get(0)); + ret = cl.clCreateKernelsInProgram(ID, kernelIDs.capacity(), kernelIDs, null); checkForError(ret, "can not create kernels for program"); - for (int i = 0; i < kernelIDs.length; i++) { - CLKernel kernel = new CLKernel(this, kernelIDs[i]); + for (int i = 0; i < kernelIDs.capacity(); i++) { + CLKernel kernel = new CLKernel(this, kernelIDs.get(i)); map.put(kernel.name, kernel); } this.kernels = map; @@ -89,37 +92,37 @@ public class CLProgram implements CLResource { private final String getBuildInfoString(long device, int flag) { - long[] longArray = new long[1]; + PointerBuffer pb = PointerBuffer.allocateDirect(1); - int ret = cl.clGetProgramBuildInfo(ID, device, flag, 0, null, longArray, 0); + int ret = cl.clGetProgramBuildInfo(ID, device, flag, 0, null, pb); checkForError(ret, "on clGetProgramBuildInfo"); - ByteBuffer bb = ByteBuffer.allocate((int)longArray[0]).order(ByteOrder.nativeOrder()); + ByteBuffer bb = ByteBuffer.allocateDirect((int)pb.get(0)).order(ByteOrder.nativeOrder()); - ret = cl.clGetProgramBuildInfo(ID, device, flag, bb.capacity(), bb, null, 0); + ret = cl.clGetProgramBuildInfo(ID, device, flag, bb.capacity(), bb, null); checkForError(ret, "on clGetProgramBuildInfo"); - return CLUtils.clString2JavaString(bb.array(), (int)longArray[0]); + return CLUtils.clString2JavaString(bb, (int)pb.get(0)); } private final String getProgramInfoString(int flag) { - long[] longArray = new long[1]; + PointerBuffer pb = PointerBuffer.allocateDirect(1); - int ret = cl.clGetProgramInfo(ID, flag, 0, null, longArray, 0); + int ret = cl.clGetProgramInfo(ID, flag, 0, null, pb); checkForError(ret, "on clGetProgramInfo"); - ByteBuffer bb = ByteBuffer.allocate((int)longArray[0]).order(ByteOrder.nativeOrder()); + ByteBuffer bb = ByteBuffer.allocateDirect((int)pb.get(0)).order(ByteOrder.nativeOrder()); - ret = cl.clGetProgramInfo(ID, flag, bb.capacity(), bb, null, 0); + ret = cl.clGetProgramInfo(ID, flag, bb.capacity(), bb, null); checkForError(ret, "on clGetProgramInfo"); - return CLUtils.clString2JavaString(bb.array(), (int)longArray[0]); + return CLUtils.clString2JavaString(bb, (int)pb.get(0)); } // private int getProgramInfoInt(int flag) { // -// ByteBuffer bb = ByteBuffer.allocate(4).order(ByteOrder.nativeOrder()); +// ByteBuffer bb = ByteBuffer.allocateDirect(4).order(ByteOrder.nativeOrder()); // // int ret = cl.clGetProgramInfo(programID, flag, bb.capacity(), bb, null, 0); // checkForError(ret, ""); @@ -129,9 +132,9 @@ public class CLProgram implements CLResource { private int getBuildInfoInt(long device, int flag) { - ByteBuffer bb = ByteBuffer.allocate(4).order(ByteOrder.nativeOrder()); + ByteBuffer bb = ByteBuffer.allocateDirect(4).order(ByteOrder.nativeOrder()); - int ret = cl.clGetProgramBuildInfo(ID, device, flag, bb.capacity(), bb, null, 0); + int ret = cl.clGetProgramBuildInfo(ID, device, flag, bb.capacity(), bb, null); checkForError(ret, "error on clGetProgramBuildInfo"); return bb.getInt(); @@ -256,12 +259,12 @@ public class CLProgram implements CLResource { */ public CLDevice[] getCLDevices() { - long[] longArray = new long[1]; - int ret = cl.clGetProgramInfo(ID, CL_PROGRAM_DEVICES, 0, null, longArray, 0); + PointerBuffer pb = PointerBuffer.allocateDirect(1); + int ret = cl.clGetProgramInfo(ID, CL_PROGRAM_DEVICES, 0, null, pb); checkForError(ret, "on clGetProgramInfo"); - ByteBuffer bb = ByteBuffer.allocate((int) longArray[0]).order(ByteOrder.nativeOrder()); - ret = cl.clGetProgramInfo(ID, CL_PROGRAM_DEVICES, bb.capacity(), bb, null, 0); + ByteBuffer bb = ByteBuffer.allocateDirect((int) pb.get(0)).order(ByteOrder.nativeOrder()); + ret = cl.clGetProgramInfo(ID, CL_PROGRAM_DEVICES, bb.capacity(), bb, null); checkForError(ret, "on clGetProgramInfo"); int count = bb.capacity() / (CPU.is32Bit()?4:8); @@ -341,16 +344,16 @@ public class CLProgram implements CLResource { CLDevice[] devices = getCLDevices(); - ByteBuffer sizes = ByteBuffer.allocate(8*devices.length).order(ByteOrder.nativeOrder()); - int ret = cl.clGetProgramInfo(ID, CL_PROGRAM_BINARY_SIZES, sizes.capacity(), sizes, null, 0); + ByteBuffer sizes = ByteBuffer.allocateDirect(8*devices.length).order(ByteOrder.nativeOrder()); + int ret = cl.clGetProgramInfo(ID, CL_PROGRAM_BINARY_SIZES, sizes.capacity(), sizes, null); checkForError(ret, "on clGetProgramInfo"); int binarySize = 0; while(sizes.remaining() != 0) binarySize += (int)sizes.getLong(); - ByteBuffer binaries = ByteBuffer.allocate(binarySize).order(ByteOrder.nativeOrder()); - ret = cl.clGetProgramInfo(ID, CL_PROGRAM_BINARIES, binaries.capacity(), binaries, null, 0); // TODO crash, driver bug? + ByteBuffer binaries = ByteBuffer.allocateDirect(binarySize).order(ByteOrder.nativeOrder()); + ret = cl.clGetProgramInfo(ID, CL_PROGRAM_BINARIES, binaries.capacity(), binaries, null); // TODO crash, driver bug? checkForError(ret, "on clGetProgramInfo"); Map<CLDevice, byte[]> map = new HashMap<CLDevice, byte[]>(); diff --git a/src/com/mbien/opencl/CLUtils.java b/src/com/mbien/opencl/CLUtils.java index c19292b6..a926e8ed 100644 --- a/src/com/mbien/opencl/CLUtils.java +++ b/src/com/mbien/opencl/CLUtils.java @@ -1,5 +1,7 @@ package com.mbien.opencl; +import java.nio.ByteBuffer; + /** * * @author Michael Bien @@ -10,4 +12,14 @@ class CLUtils { return clLength==0 ? "" : new String(chars, 0, clLength-1); } + public static String clString2JavaString(ByteBuffer chars, int clLength) { + if (clLength==0) { + return ""; + }else{ + byte[] array = new byte[clLength-1]; // last char is always null + chars.get(array).rewind(); + return new String(array, 0, clLength-1); + } + } + } |