Mercurial > hg > graal-jvmci-8
diff src/share/vm/graal/graalCompilerToGPU.cpp @ 11822:365d8f385fb5
PTX: one-dimensional parallel warp invocation, ParallelOver annotation
author | Morris Meyer <morris.meyer@oracle.com> |
---|---|
date | Sun, 29 Sep 2013 14:47:12 -0400 |
parents | 91e5f927af63 |
children | 8d8f63069f58 |
line wrap: on
line diff
--- a/src/share/vm/graal/graalCompilerToGPU.cpp Sat Sep 28 21:06:12 2013 -0400 +++ b/src/share/vm/graal/graalCompilerToGPU.cpp Sun Sep 29 14:47:12 2013 -0400 @@ -103,6 +103,45 @@ C2V_END +C2V_VMENTRY(jobject, executeParallelMethodVarargs, (JNIEnv *env, + jobject, + jint dimX, jint dimY, jint dimZ, + jobject args, jobject hotspotInstalledCode)) + ResourceMark rm; + HandleMark hm; + + if (gpu::is_available() == false || gpu::has_gpu_linkage() == false && gpu::is_initialized()) { + tty->print_cr("executeExternalMethodVarargs - not available / no linkage / not initialized"); + return NULL; + } + jlong nmethodValue = HotSpotInstalledCode::codeBlob(hotspotInstalledCode); + nmethod* nm = (nmethod*) (address) nmethodValue; + methodHandle mh = nm->method(); + Symbol* signature = mh->signature(); + + // start value is the kernel + jlong startValue = HotSpotInstalledCode::codeStart(hotspotInstalledCode); + + PTXKernelArguments ptxka(signature, (arrayOop) JNIHandles::resolve(args), mh->is_static()); + JavaValue result(ptxka.get_ret_type()); +if (!gpu::execute_warp(dimX, dimY, dimZ, (address)startValue, ptxka, result)) { + return NULL; + } + + if (ptxka.get_ret_type() == T_VOID) { + return NULL; + } else if (ptxka.get_ret_type() == T_OBJECT || ptxka.get_ret_type() == T_ARRAY) { + return JNIHandles::make_local((oop) result.get_jobject()); + } else { + oop o = java_lang_boxing_object::create(ptxka.get_ret_type(), (jvalue *) result.get_value_addr(), CHECK_NULL); + if (TraceGPUInteraction) { + tty->print_cr("GPU execution returned %d", result.get_jint()); + } + return JNIHandles::make_local(o); + } + +C2V_END + C2V_VMENTRY(jboolean, deviceInit, (JNIEnv *env, jobject)) if (gpu::is_available() == false || gpu::has_gpu_linkage() == false) { tty->print_cr("deviceInit - not available / no linkage"); @@ -157,10 +196,11 @@ #define GPUSPACE_METHOD "J" JNINativeMethod CompilerToGPU_methods[] = { - {CC"generateKernel", CC"([B" STRING ")"GPUSPACE_METHOD, FN_PTR(generateKernel)}, - {CC"deviceInit", CC"()Z", FN_PTR(deviceInit)}, - {CC"deviceDetach", CC"()Z", FN_PTR(deviceDetach)}, - {CC"executeExternalMethodVarargs", CC"(["OBJECT HS_INSTALLED_CODE")"OBJECT, FN_PTR(executeExternalMethodVarargs)}, + {CC"generateKernel", CC"([B" STRING ")"GPUSPACE_METHOD, FN_PTR(generateKernel)}, + {CC"deviceInit", CC"()Z", FN_PTR(deviceInit)}, + {CC"deviceDetach", CC"()Z", FN_PTR(deviceDetach)}, + {CC"executeExternalMethodVarargs", CC"(["OBJECT HS_INSTALLED_CODE")"OBJECT, FN_PTR(executeExternalMethodVarargs)}, + {CC"executeParallelMethodVarargs", CC"(III["OBJECT HS_INSTALLED_CODE")"OBJECT, FN_PTR(executeParallelMethodVarargs)}, }; int CompilerToGPU_methods_count() {