graalCodeInstaller questions, recording scopes, etc.

Deneau, Tom tom.deneau at amd.com
Mon Jan 6 10:19:31 PST 2014


Doug --

I was using --vm server which we always use.

By setting up the function, I meant doing a skeleton implementation of installKernel0.
Below is the code for that (pretty much copied from installCode0 in graalCompilerToVM)

Some background:
  * Before you had set up the virtual get_scope_value, etc, I had patched graal CodeInstaller to
    skip the iteration thru values->length() if the compilationREsult was an ExternalCompilationResult.
    (This was so we could set up a skeleton ScopeDesc with bci, etc but without the values mapping).
    This worked fine.  Thru installKernel0 below, we are basically still using that patched graal CodeInstaller,
    so I suspect something in installKernel0.

I'll also keep the sending the patch offer in mind.

-- Tom


C2V_VMENTRY(jint, installKernel0, (JNIEnv *env, jobject, jobject compiled_code, jobject installed_code))
  if (gpu::is_available() == false || gpu::has_gpu_linkage() == false && gpu::is_initialized()) {
    tty->print_cr("installKernel0 - not available / no linkage / not initialized");
    return 1;
  }

  tty->print_cr("in installKernel0");


  ResourceMark rm;
  HandleMark hm;
  Handle compiled_code_handle = JNIHandles::resolve(compiled_code);
  CodeBlob* cb = NULL;
  Handle installed_code_handle = JNIHandles::resolve(installed_code);
  Handle triggered_deoptimizations_handle = JNIHandles::resolve(NULL);

  CodeInstaller installer = gpu::get_code_installer();
  GraalEnv::CodeInstallResult result = installer.install(compiled_code_handle, cb, installed_code_handle, triggered_deoptimizations_handle);
  

  if (PrintCodeCacheOnCompilation) {
    stringStream s;
    // Dump code cache  into a buffer before locking the tty,
    {
      MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
      CodeCache::print_summary(&s, false);
    }
    ttyLocker ttyl;
    tty->print_cr(s.as_string());
  }

  if (result != GraalEnv::ok) {
    assert(cb == NULL, "should be");
  } else {
    if (!installed_code_handle.is_null()) {
      assert(installed_code_handle->is_a(HotSpotInstalledCode::klass()), "wrong type");
      HotSpotInstalledCode::set_codeBlob(installed_code_handle, (jlong) cb);
      oop comp_result = HotSpotCompiledCode::comp(compiled_code_handle);
      if (comp_result->is_a(ExternalCompilationResult::klass())) {
        if (TraceGPUInteraction) {
          tty->print_cr("installKernel0: ExternalCompilationResult");
        }
        HotSpotInstalledCode::set_codeStart(installed_code_handle, ExternalCompilationResult::entryPoint(comp_result));
      } else {
        HotSpotInstalledCode::set_size(installed_code_handle, cb->size());
        HotSpotInstalledCode::set_codeStart(installed_code_handle, (jlong) cb->code_begin());
        HotSpotInstalledCode::set_codeSize(installed_code_handle, cb->code_size());
      }
      nmethod* nm = cb->as_nmethod_or_null();
      assert(nm == NULL || !installed_code_handle->is_scavengable() || nm->on_scavenge_root_list(), "nm should be scavengable if installed_code is scavengable");
    }
  }

  return result;
C2V_END


> -----Original Message-----
> From: Doug Simon [mailto:doug.simon at oracle.com]
> Sent: Monday, January 06, 2014 12:06 PM
> To: Deneau, Tom
> Cc: graal-dev at openjdk.java.net
> Subject: Re: graalCodeInstaller questions, recording scopes, etc.
> 
> 
> On Jan 6, 2014, at 6:48 PM, Deneau, Tom <tom.deneau at amd.com> wrote:
> 
> > While setting up the installKernel0 function, I see some sort of
> memory corruption happening in hotspot.
> 
> What do you mean by "setting up" the function?
> 
> > (for example sometimes a ci_metadata field in ciObjectFactory will be
> > 0xf1f1f1f1f1f1f1f1)
> 
> That's very strange since GraalVM by-passes ci altogether.
> 
> > What command line flags are good for tracking this down?
> 
> Did you try with a debug build (i.e. -vmbuild debug)? With some luck, an
> assertion will fire somewhere.
> 
> > I tried -XX:NativeMemoryTracking=detail (had never used this before)
> but that didn't flag anything.
> 
> Feel free to send me a patch and a mx command line that reproduces the
> problem (I have okra installed and working on my Linux box so you can
> rely on that if it simplifies things).
> 
> -Doug
> 
> >> -----Original Message-----
> >> From: Doug Simon [mailto:doug.simon at oracle.com]
> >> Sent: Thursday, January 02, 2014 5:17 PM
> >> To: Deneau, Tom
> >> Cc: graal-dev at openjdk.java.net
> >> Subject: Re: graalCodeInstaller questions, recording scopes, etc.
> >>
> >>
> >> On Jan 2, 2014, at 10:40 PM, Deneau, Tom <tom.deneau at amd.com> wrote:
> >>
> >>> See below...
> >>>
> >>>> -----Original Message-----
> >>>> From: Doug Simon [mailto:doug.simon at oracle.com]
> >>>> Sent: Thursday, January 02, 2014 12:02 PM
> >>>> To: Deneau, Tom
> >>>> Cc: graal-dev at openjdk.java.net
> >>>> Subject: Re: graalCodeInstaller questions, recording scopes, etc.
> >>>>
> >>>>
> >>>> On Dec 20, 2013, at 3:41 PM, Deneau, Tom <tom.deneau at amd.com>
> wrote:
> >>>>
> >>>>> Closing the loop again, for my original questions, adding answers
> >>>>> below that were relayed in the Skype call on Thursday...
> >>>>>
> >>>>>> -----Original Message-----
> >>>>>> From: Deneau, Tom
> >>>>>> Sent: Monday, December 16, 2013 3:58 PM
> >>>>>> To: graal-dev at openjdk.java.net
> >>>>>> Subject: graalCodeInstaller questions, recording scopes, etc.
> >>>>>>
> >>>>
> >>>> <snip>
> >>>>
> >>>>>  * Our infopoints have byteCodePositions.  The ones that get
> >>>>>>    "recorded" go thru record_scope which has all sorts of
> >>>>>>    host-specific checking on the scope info.  For instance,
> >>>>>>    get_hotspot_value will compare a register # with
> >>>>>>    RegisterImpl::number_of_registers (which refers to the host)
> >> and
> >>>>>>    if it is, assert that the type is FLOAT or DOUBLE.  None of
> >> this
> >>>>>>    holds with HSAIL registers.  What is the best way to resolve
> >>>>>>    this?
> >>>>>>
> >>>>>
> >>>>> This issue will be handled by the virtualization of some of the
> >>>>> calls in graalCodeInstaller that Doug will be implementing.
> >>>>
> >>>> I made the CodeInstaller class subclassable and the ScopeValue
> >>>> creation methods virtual[1]. At some point, I imagine
> >>>> CompilerToGPU.generateKernel() will be expanded to incorporate (and
> >>>> obsolete) HotSpotCodeCacheProvider.addExternalMethod(). This means
> >>>> the code for generateKernel in graalCompilerToGPU.cpp can use a GPU
> >>>> specific subclass of CodeInstaller to create GPU ScopeValues.
> >>>>
> >>>> -Doug
> >>>>
> >>>> [1] http://hg.openjdk.java.net/graal/graal/rev/03bb0ee05409
> >>>
> >>> Doug --
> >>>
> >>> Just to make sure I understand how we should fit all this
> together...
> >>>
> >>> * HSAILCompilationResult currently calls
> >>> providers.getCodeCache()).addExternalMethod
> >>>
> >>> * We already have a HSAILHotSpotCodeCacheProvider so we could
> >> override addExternalMethod with
> >>>   our own version.
> >>>
> >>> * in our own version of addExternalMethod, we could call our own
> >> version of vm.installCodeHSAIL
> >>>   (after adding that to the CompilerToVM interface, this seems
> messy.
> >> Maybe there should be
> >>>    a installCode in the CompilerToGPU interface)
> >>>
> >>> * installCodeHSAIL would have a line such as
> >>>     HSAILCodeInstaller installer(compiled_code_handle, result, cb,
> >>> installed_code_handle, triggered_deoptimizations_handle);
> >>>
> >>>     where HSAILCodeInstaller extends CodeInstaller and uses the new
> >>> virtual methods
> >>>
> >>>
> >>> Or alternatively (and maybe this is what you are suggesting)
> >>> * HSAILCompilationResult calls toGPU.generateKernel before it calls
> >>> providers.getCodeCache()).addExternalMethod
> >>>
> >>> * the logic for using HSAILCodeInstaller and the rest of the logic
> >>> in
> >> graalCompilerToVM.installCode0
> >>>   could be added to gpu::hsail::generateKernel
> >>>
> >>> * we would still need some way to get the InstalledCode back
> >> (currently returned by addExternalMethod)
> >>>   so we could store it in the HSAILCompilationResult
> >>
> >> Yes, the latter is what I was suggesting. In CompilerToGPU, we'd
> >> replace:
> >>
> >>    long generateKernel(byte[] code, String name) throws
> >> InvalidInstalledCodeException;
> >>
> >> with:
> >>
> >>    CodeInstallResult installKernel(HotSpotCompiledCode compiledCode,
> >> HotSpotInstalledCode code);
> >>
> >> The implementation of this in CompilerToGPUImpl would closely
> >> resemble HotSpotCodeCacheProvider.addExternalMethod (which would be
> removed).
> >>
> >> I've prototyped this change and have attached it as a patch (feel
> >> free to create and upload a webrev from it). You'd just need to make
> >> the changes in graalCompilerToGPU.cpp to implement
> >> CompilerToGPUImpl.installKernel0. Note that generateKernel is still a
> >> separate method so that a GPU kernel compilation can be performed
> >> without installing the result as an nmethod.
> >>
> >> -Doug
> >
> >
> 




More information about the graal-dev mailing list