diff --git a/com.amd.aparapi.jni/src/cpp/invoke/OpenCLJNI.cpp b/com.amd.aparapi.jni/src/cpp/invoke/OpenCLJNI.cpp index 7e499fa7255273af374c207a1ddfa7ef5a78e5bc..0951f3eef7a6d31fbff1bbf5146511fe776eea24 100644 --- a/com.amd.aparapi.jni/src/cpp/invoke/OpenCLJNI.cpp +++ b/com.amd.aparapi.jni/src/cpp/invoke/OpenCLJNI.cpp @@ -253,9 +253,12 @@ void getArg(JNIEnv *jenv, cl_context context, cl_command_queue commandQueue, cl_ JNI_JAVA(jobject, OpenCLJNI, getProfileInfo) (JNIEnv *jenv, jobject jobj, jobject programInstance) { jobject returnList = JNIHelper::createInstance(jenv, ArrayListClass, VoidReturn ); - for (int i=0; i< 5; i++){ - jobject writeProfileInfo = NULL; - JNIHelper::callVoid(jenv, returnList, "add", ArgsBooleanReturn(ObjectClassArg), writeProfileInfo); + ProfileInfo **profileInfoArr = OpenCLProgram::getProfileInfo(jenv, programInstance); + if (profileInfoArr != NULL){ + for (int i=0; profileInfoArr[i] != NULL; i++){ + jobject writeProfileInfo = profileInfoArr[i]->createProfileInfoInstance(jenv); + JNIHelper::callVoid(jenv, returnList, "add", ArgsBooleanReturn(ObjectClassArg), writeProfileInfo); + } } return(returnList); } @@ -269,6 +272,14 @@ JNI_JAVA(void, OpenCLJNI, disposeProgram) clReleaseCommandQueue(commandQueue); cl_context context = OpenCLProgram::getContext(jenv, programInstance); clReleaseContext(context); + ProfileInfo **profileInfoArr = OpenCLProgram::getProfileInfo(jenv, programInstance); + if (profileInfoArr != NULL){ + for (int i=0; profileInfoArr[i] != NULL; i++){ + //fprintf(stdout, "removed prev profile %d\n", i); + delete profileInfoArr[i]; + } + delete[] profileInfoArr; + } } JNI_JAVA(void, OpenCLJNI, disposeKernel) @@ -300,6 +311,8 @@ JNI_JAVA(void, OpenCLJNI, disposeKernel) clReleaseKernel(kernel); } +extern cl_int profile(ProfileInfo *profileInfo, cl_event *event, jint type, char* name, cl_ulong profileBaseTime ); + /** */ JNI_JAVA(void, OpenCLJNI, invoke) @@ -379,9 +392,31 @@ JNI_JAVA(void, OpenCLJNI, invoke) getArg(jenv, context, commandQueue, events, &eventc, argIndex, argDef, arg); } status = clWaitForEvents(eventc, events); + ProfileInfo **profileInfoArr = OpenCLProgram::getProfileInfo(jenv, programInstance); + if (profileInfoArr != NULL){ + for (int i=0; profileInfoArr[i] != NULL; i++){ + //fprintf(stdout, "removed prev profile %d\n", i); + delete profileInfoArr[i]; + } + //fprintf(stdout, "removed prev profile list\n"); + delete[] profileInfoArr; + }else{ + //fprintf(stdout, "prev profile list was NULL\n"); + } + profileInfoArr = NULL; + + profileInfoArr = new ProfileInfo*[eventc+1]; // add NULL to end! + //fprintf(stdout, "allocated a new list %d\n", eventc+1); for (int i=0;i<eventc; i++){ + profileInfoArr[i] = new ProfileInfo(); + //fprintf(stdout, "allocated a new ProfileInfo for %d\n", i); + int type = (i>(writes+1))?2:((i>writes)?1:0); + profile(profileInfoArr[i], &events[i], type, "unknown", 0L); + //fprintf(stdout, "type = %d\n", type); clReleaseEvent(events[i]); } + profileInfoArr[eventc]=NULL; + OpenCLProgram::setProfileInfo(jenv, programInstance, profileInfoArr); if (status != CL_SUCCESS) { fprintf(stderr, "error waiting for events !\n"); } diff --git a/com.amd.aparapi.jni/src/cpp/invoke/OpenCLProgram.h b/com.amd.aparapi.jni/src/cpp/invoke/OpenCLProgram.h index e0928d6fd7536e5d5777245e0afa947bb25ff347..35a5ccaf2e2472611d4118c81deaa85e0860c2f7 100644 --- a/com.amd.aparapi.jni/src/cpp/invoke/OpenCLProgram.h +++ b/com.amd.aparapi.jni/src/cpp/invoke/OpenCLProgram.h @@ -3,6 +3,7 @@ #define OPEN_CL_PROGRAM_H #include "JNIHelper.h" +#include "ProfileInfo.h" class OpenCLProgram{ public: @@ -21,6 +22,12 @@ class OpenCLProgram{ static cl_program getProgram(JNIEnv *jenv, jobject programInstance){ return((cl_program) JNIHelper::getInstanceField<jlong>(jenv, programInstance, "programId")); } + static ProfileInfo** getProfileInfo(JNIEnv *jenv, jobject programInstance){ + return((ProfileInfo**) JNIHelper::getInstanceField<jlong>(jenv, programInstance, "profileInfo")); + } + static void setProfileInfo(JNIEnv *jenv, jobject programInstance, ProfileInfo **profileInfo){ + JNIHelper::setInstanceField<jlong>(jenv, programInstance, "profileInfo", (jlong)profileInfo); + } static cl_command_queue getCommandQueue(JNIEnv *jenv, jobject programInstance){ return((cl_command_queue)JNIHelper::getInstanceField<jlong>(jenv, programInstance, "queueId")); } diff --git a/com.amd.aparapi.jni/src/cpp/runKernel/ProfileInfo.cpp b/com.amd.aparapi.jni/src/cpp/runKernel/ProfileInfo.cpp index 2a5172789d8d8352434b3f4bee555109ab572112..11c77eae9fc335731dfd50c05e10af5159a9fda5 100644 --- a/com.amd.aparapi.jni/src/cpp/runKernel/ProfileInfo.cpp +++ b/com.amd.aparapi.jni/src/cpp/runKernel/ProfileInfo.cpp @@ -58,3 +58,4 @@ jobject ProfileInfo::createProfileInfoInstance(JNIEnv *jenv){ ((jlong)submit)); return(profileInstance); } + 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 4ec4cbcfaa81691f510bd996542346c3b3bb83a0..588960586aec5e585d3bcfa9e6f54f8b5e10ce99 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 @@ -182,10 +182,6 @@ public class OpenCLDevice extends Device{ } else if (method.getName().equals("end")) { System.out.println("end not implemented"); } else if (method.getName().equals("getProfileInfo")){ - // public List<ProfileInfo> getProfileInfo() { - // return (kernelRunner.getProfileInfo()); - // } - System.out.println("get profile info"); proxy = (Object)program.getProfileInfo(); } } 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 91ecff5c7976c50eec64bcc5836bf7c5d2c56192..05e9795563738796a6679fe39506c663be9f5e87 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 @@ -16,6 +16,8 @@ public class OpenCLProgram extends OpenCLJNI{ private final long contextId; + private final long profileInfo = 0L; + private final OpenCLDevice device; private final String source; 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 9c6f2a608b9d9d77ee75ecfc6e104c1f03b7b588..e2b2aa4814ec8baf558f6a24fa92e8c54cc3c9cf 100644 --- a/samples/extension/src/com/amd/aparapi/sample/extension/SquareExample.java +++ b/samples/extension/src/com/amd/aparapi/sample/extension/SquareExample.java @@ -73,12 +73,15 @@ public class SquareExample{ for (int i = 0; i < size; i++) { System.out.println(l+" "+ in[i] + " " + squares[i] + " " + quads[i]); } - List<ProfileInfo> profileInfo =squarer.getProfileInfo(); - for (ProfileInfo pi:profileInfo){ - System.out.println("whooo"); - } + final List<ProfileInfo> profileInfo = squarer.getProfileInfo(); + if ((profileInfo != null) && (profileInfo.size() > 0)) { + for (final ProfileInfo p : profileInfo) { + System.out.print(" " + p.getType() + " " + p.getLabel() + " " + (p.getStart() / 1000) + " .. " + + (p.getEnd() / 1000) + " " + ((p.getEnd() - p.getStart()) / 1000) + "us"); + System.out.println(); + } + } squarer.dispose(); - } } }