diff src/share/vm/runtime/compilationPolicy.cpp @ 13731:9161ed8ce796

Add graal-specific option -XX:+GPUOffload to trigger all GPU offload functionality. Cleanup function to decide GPU offload. Exclude GPU sources from nongraal builds.
author S.Bharadwaj Yadavalli <bharadwaj.yadavalli@oracle.com>
date Wed, 22 Jan 2014 16:06:47 -0500
parents de839ec35cc7
children 49db2c1e3bee
line wrap: on
line diff
--- a/src/share/vm/runtime/compilationPolicy.cpp	Wed Jan 22 15:27:31 2014 +0100
+++ b/src/share/vm/runtime/compilationPolicy.cpp	Wed Jan 22 16:06:47 2014 -0500
@@ -105,30 +105,7 @@
 
   if (m->has_compiled_code()) return false;       // already compiled
 
-#ifdef GRAAL
-  // Check if this is a Lambda method that can be compiled to a GPU.
-  if (m->is_lambda()) {
-    // If GPU is available and the necessary linkage is available
-    // rerurn true indicatin that this method must be compiled.
-    if (gpu::is_available() && gpu::has_gpu_linkage()) {
-      if (TraceGPUInteraction) {
-        tty->print("Compiling Lambda method");
-        m->print_short_name();
-        switch (gpu::get_target_il_type()) {
-        case gpu::PTX :
-          tty->print_cr(" to PTX");
-          break;
-        case gpu::HSAIL :
-          tty->print_cr(" to HSAIL");
-          break;
-        default :
-          tty->print_cr(" to Unknown GPU!!!");
-        }
-      }
-      return true;
-    }
-  }
-#endif
+  if (CompilationPolicy::can_be_offloaded_to_gpu(m)) return true;
 
   if (!can_be_compiled(m, comp_level)) return false;
 
@@ -184,6 +161,58 @@
   return (result && can_be_compiled(m, comp_level));
 }
 
+bool CompilationPolicy::can_be_offloaded_to_gpu(methodHandle m) {
+#ifdef GRAAL
+  if (GPUOffload) {
+    // Check if this method can be offloaded to GPU.
+    // 1. Offload it to GPU if it is a Lambda method
+    if (m->is_synthetic()) {
+      // A lambda method is a syntheric method.
+      Symbol * klass_name = m->method_holder()->name();
+      Symbol * method_name = m->name();
+      bool offloadToGPU = false;
+      {
+        ResourceMark rm;
+        if (klass_name != NULL) {
+          if (klass_name != NULL && method_name != NULL) {
+            const char* lambdaPrefix = "lambda$";
+            char* methodPrefix = strstr(method_name->as_C_string(), lambdaPrefix);
+            if (methodPrefix != 0) {
+              if ((strncmp(lambdaPrefix, methodPrefix, strlen(lambdaPrefix)) == 0)) {
+                offloadToGPU = true;
+              }
+            }
+          }
+        }
+      }
+      if (offloadToGPU) {
+        // If GPU is available and the necessary linkage is available
+        // return true indicatin that this method must be compiled.
+        if (gpu::is_available() && gpu::has_gpu_linkage()) {
+          if (TraceGPUInteraction) {
+            tty->print("Compiling Lambda method ");
+            m->print_short_name();
+            switch (gpu::get_target_il_type()) {
+            case gpu::PTX :
+              tty->print_cr("to PTX");
+              break;
+            case gpu::HSAIL :
+              tty->print_cr("to HSAIL");
+              break;
+            default :
+              tty->print_cr("to Unknown GPU!!!");
+            }
+          }
+          return true;
+        }
+      }
+    }
+  }
+#endif
+
+  return false;
+}
+
 bool CompilationPolicy::is_compilation_enabled() {
   // NOTE: CompileBroker::should_compile_new_jobs() checks for UseCompiler
   return !delay_compilation_during_startup() && CompileBroker::should_compile_new_jobs();