From 7025cd2852c2ebc83d3e1987228db4fa25ce49c5 Mon Sep 17 00:00:00 2001 From: Gary Frost <frost.gary@gmail.com> Date: Thu, 4 Jul 2013 21:18:37 +0000 Subject: [PATCH] for issue 120 release kernel and program ids --- com.amd.aparapi.jni/src/cpp/invoke/OpenCLJNI.cpp | 10 +++++++++- .../java/com/amd/aparapi/device/OpenCLDevice.java | 13 ++++++++----- .../com/amd/aparapi/internal/jni/OpenCLJNI.java | 4 +++- .../amd/aparapi/internal/opencl/OpenCLKernel.java | 2 +- .../amd/aparapi/internal/opencl/OpenCLProgram.java | 4 ++++ .../amd/aparapi/sample/extension/SquareExample.java | 13 ++++++++----- 6 files changed, 33 insertions(+), 13 deletions(-) diff --git a/com.amd.aparapi.jni/src/cpp/invoke/OpenCLJNI.cpp b/com.amd.aparapi.jni/src/cpp/invoke/OpenCLJNI.cpp index e1ef0ef4..e985bd18 100644 --- a/com.amd.aparapi.jni/src/cpp/invoke/OpenCLJNI.cpp +++ b/com.amd.aparapi.jni/src/cpp/invoke/OpenCLJNI.cpp @@ -250,7 +250,14 @@ void getArg(JNIEnv *jenv, cl_context context, cl_command_queue commandQueue, cl_ } } -JNI_JAVA(void, OpenCLJNI, dispose) +JNI_JAVA(void, OpenCLJNI, disposeProgram) + (JNIEnv *jenv, jobject jobj, jobject programInstance) { + fprintf(stderr, "dispose program \n"); + cl_program program = OpenCLProgram::getProgram(jenv, programInstance); + clReleaseProgram(program); +} + +JNI_JAVA(void, OpenCLJNI, disposeKernel) (JNIEnv *jenv, jobject jobj, jobject kernelInstance) { cl_kernel kernel = OpenCLKernel::getKernel(jenv, kernelInstance); jobject programInstance = OpenCLKernel::getProgramInstance(jenv, kernelInstance); @@ -276,6 +283,7 @@ JNI_JAVA(void, OpenCLJNI, dispose) } } } + clReleaseKernel(kernel); } /** diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/device/OpenCLDevice.java b/com.amd.aparapi/src/java/com/amd/aparapi/device/OpenCLDevice.java index 6e1cbc13..ec9bed2f 100644 --- a/com.amd.aparapi/src/java/com/amd/aparapi/device/OpenCLDevice.java +++ b/com.amd.aparapi/src/java/com/amd/aparapi/device/OpenCLDevice.java @@ -104,13 +104,17 @@ public class OpenCLDevice extends Device{ private final Map<String, OpenCLKernel> map; private final OpenCLProgram program; - + private boolean disposed = false; public OpenCLInvocationHandler(OpenCLProgram _program, Map<String, OpenCLKernel> _map) { program = _program; map = _map; + disposed = false; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + if (disposed){ + throw new IllegalStateException("bound interface already disposed"); + } if (!isReservedInterfaceMethod(method)) { final OpenCLKernel kernel = map.get(method.getName()); if (kernel != null) { @@ -171,10 +175,9 @@ public class OpenCLDevice extends Device{ for (OpenCLKernel k:map.values()){ k.dispose(); } - // args = map.get(method.getName()); - // for (OpenCLArgDescriptor argDescriptor:args){ - - // } + program.dispose(); + map.clear(); + disposed=true; } else if (method.getName().equals("end")) { System.out.println("end not implemented"); } diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/internal/jni/OpenCLJNI.java b/com.amd.aparapi/src/java/com/amd/aparapi/internal/jni/OpenCLJNI.java index 34fd7edc..b69f5aeb 100644 --- a/com.amd.aparapi/src/java/com/amd/aparapi/internal/jni/OpenCLJNI.java +++ b/com.amd.aparapi/src/java/com/amd/aparapi/internal/jni/OpenCLJNI.java @@ -22,7 +22,9 @@ public abstract class OpenCLJNI{ protected native void invoke(OpenCLKernel openCLKernel, Object[] args); - protected native void dispose(OpenCLKernel openCLKernel); + protected native void disposeKernel(OpenCLKernel openCLKernel); + + protected native void disposeProgram(OpenCLProgram openCLProgram); protected native void remap(OpenCLProgram program, OpenCLMem mem, long address); diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/internal/opencl/OpenCLKernel.java b/com.amd.aparapi/src/java/com/amd/aparapi/internal/opencl/OpenCLKernel.java index 04a95501..19c06592 100644 --- a/com.amd.aparapi/src/java/com/amd/aparapi/internal/opencl/OpenCLKernel.java +++ b/com.amd.aparapi/src/java/com/amd/aparapi/internal/opencl/OpenCLKernel.java @@ -58,6 +58,6 @@ public class OpenCLKernel extends OpenCLJNI{ } public void dispose(){ - dispose(this); + disposeKernel(this); } } diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/internal/opencl/OpenCLProgram.java b/com.amd.aparapi/src/java/com/amd/aparapi/internal/opencl/OpenCLProgram.java index 27e0641e..23855513 100644 --- a/com.amd.aparapi/src/java/com/amd/aparapi/internal/opencl/OpenCLProgram.java +++ b/com.amd.aparapi/src/java/com/amd/aparapi/internal/opencl/OpenCLProgram.java @@ -84,4 +84,8 @@ public class OpenCLProgram extends OpenCLJNI{ addressToMem.remove(_oldAddress); addressToMem.put(_address, _mem); } + + public void dispose(){ + disposeProgram(this); + } } diff --git a/samples/extension/src/com/amd/aparapi/sample/extension/SquareExample.java b/samples/extension/src/com/amd/aparapi/sample/extension/SquareExample.java index cce44e44..23fc9b86 100644 --- a/samples/extension/src/com/amd/aparapi/sample/extension/SquareExample.java +++ b/samples/extension/src/com/amd/aparapi/sample/extension/SquareExample.java @@ -57,20 +57,23 @@ public class SquareExample{ if (device instanceof OpenCLDevice) { final OpenCLDevice openclDevice = (OpenCLDevice) device; + for (int l=0; l<1000; l++){ + final SquarerWithResource squarer = openclDevice.bind(SquarerWithResource.class); squarer.square(range, in, squares); for (int i = 0; i < size; i++) { - System.out.println(in[i] + " " + squares[i]); + System.out.println(l+" "+in[i] + " " + squares[i]); } - squarer.square(range, squares, quads); + // squarer.square(range, squares, quads); - for (int i = 0; i < size; i++) { - System.out.println(in[i] + " " + squares[i] + " " + quads[i]); - } + // for (int i = 0; i < size; i++) { + // System.out.println(l+" "+ in[i] + " " + squares[i] + " " + quads[i]); + //} squarer.dispose(); + } } } } -- GitLab