Mercurial > hg > graal-compiler
diff src/share/vm/graal/graalCompilerToGPU.cpp @ 10577:9c7d9e2c8326
PTX kernel execution - no args or return value
author | Morris Meyer <morris.meyer@oracle.com> |
---|---|
date | Sat, 29 Jun 2013 21:29:34 -0400 |
parents | 7a3499bf5e2c |
children | f0551e15a416 |
line wrap: on
line diff
--- a/src/share/vm/graal/graalCompilerToGPU.cpp Sat Jun 29 11:40:52 2013 +0200 +++ b/src/share/vm/graal/graalCompilerToGPU.cpp Sat Jun 29 21:29:34 2013 -0400 @@ -24,7 +24,9 @@ #include "precompiled.hpp" #include "graal/graalCompiler.hpp" +#include "graal/graalCompilerToVM.hpp" #include "graal/graalEnv.hpp" +#include "graal/graalJavaAccess.hpp" #include "runtime/gpu.hpp" @@ -53,12 +55,48 @@ jint len = env->GetArrayLength(code); const char *namestr = env->GetStringUTFChars(name, &is_copy); void *kernel = gpu::generate_kernel((unsigned char *)bytes, len, namestr); + tty->print_cr("generateKernel: %x", kernel); env->ReleaseByteArrayElements(code, bytes, 0); env->ReleaseStringUTFChars(name, namestr); return (jlong)kernel; C2V_END +C2V_VMENTRY(jobject, executeExternalMethodVarargs, (JNIEnv *env, jobject, 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(); + JavaCallArguments jca(mh->size_of_parameters()); + + JavaArgumentUnboxer jap(signature, &jca, (arrayOop) JNIHandles::resolve(args), mh->is_static()); + JavaValue result(jap.get_ret_type()); + jca.set_alternative_target(nm); + + // start value is the kernel + jlong startValue = HotSpotInstalledCode::start(hotspotInstalledCode); + + // JavaCalls::call(&result, mh, &jca, CHECK_NULL); + tty->print_cr("executeExternalMethodVarargs: start: %x", (address)startValue); + gpu::execute_kernel((address)startValue); + + if (jap.get_ret_type() == T_VOID) { + return NULL; + } else if (jap.get_ret_type() == T_OBJECT || jap.get_ret_type() == T_ARRAY) { + return JNIHandles::make_local((oop) result.get_jobject()); + } else { + oop o = java_lang_boxing_object::create(jap.get_ret_type(), (jvalue *) result.get_value_addr(), CHECK_NULL); + 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"); @@ -113,9 +151,10 @@ #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"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)}, }; int CompilerToGPU_methods_count() {