webrev to extend hsail allocation to allow gpu to refill tlab

Christian Thalinger christian.thalinger at oracle.com
Mon Jun 9 16:41:04 UTC 2014


graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java

Remove the space between the type and * for e.g. HSAILAllocationInfo *. Same in other files like src/gpu/hsail/vm/vmStructs_hsail.hpp.
graal/com.oracle.graal.lir.hsail/src/com/oracle/graal/lir/hsail/HSAILMove.java

+        public LoadOp(Kind kind, AllocatableValue result, HSAILAddressValue address, LIRFrameState state, boolean useLoadAcquire) {
+        public StoreOp(Kind kind, HSAILAddressValue address, AllocatableValue input, LIRFrameState state, boolean useRelease) {
I would prefer separate LoadAcquireOp/StoreReleaseOp classes.  It makes the uses more readable.

src/gpu/hsail/vm/gpu_hsail_Tlab.hpp
  26 #define GPU_HSAIL_TLAB_HPP
To be consistent with other header defines this should be:
  26 #define GPU_HSAIL_VM_GPU_HSAIL_TLAB_HPP
It seems this needs to be changed in existing files too.

As a general comment, can we make multi-line comments C-style (/* … */) comments instead of C++ style (// …)?  The C-style comments reformat themselves automatically if changed while the C++ ones don’t.

On Jun 9, 2014, at 9:28 AM, Christian Thalinger <christian.thalinger at oracle.com> wrote:

> I have the webrev still open ;-)
> 
> On Jun 9, 2014, at 8:25 AM, Deneau, Tom <tom.deneau at amd.com> wrote:
> 
>> Hi all --
>> 
>> Has anyone had a chance to look at this webrev posted last Tuesday?
>> 
>> -- Tom
>> 
>>> -----Original Message-----
>>> From: Deneau, Tom
>>> Sent: Tuesday, June 03, 2014 4:27 PM
>>> To: graal-dev at openjdk.java.net
>>> Subject: webrev to extend hsail allocation to allow gpu to refill tlab
>>> 
>>> I have placed a webrev up at
>>> http://cr.openjdk.java.net/~tdeneau/graal-webrevs/webrev-hsail-refill-
>>> tlab-gpu
>>> which we would like to get checked into the graal trunk.
>>> 
>>> This webrev extends the existing hsail heap allocation logic.  In the
>>> existing logic, when a workitem cannot allocate from the current tlab,
>>> it just deoptimizes.  In this webrev, we add logic to allocate a new
>>> tlab from the gpu.
>>> 
>>> The algorithm must deal with the fact that multiple hsa workitems can
>>> share a single tlab, and so multiple workitems can "overflow".  A
>>> workitem can tell if it is the "first overflower" and the first
>>> overflower is charged with getting a new tlab while the other workitems
>>> wait for the new tlab to be announced.
>>> 
>>> Workitems access a tlab thru a fixed register (sort of like a thread
>>> register) which instead of pointing to a donor thread now points to a
>>> HSAILTlabInfo structure, which is sort of a subset of a full tlab
>>> struct, containing just the fields that we would actually use on the
>>> gpu.
>>> 
>>>  struct HSAILTlabInfo {
>>>     HeapWord *  _start;                 // normal vm tlab fields,
>>> start, top, end, etc.
>>>     HeapWord *  _top;
>>>     HeapWord *  _end;
>>>     // additional data not in a normal tlab
>>>     HeapWord * _lastGoodTop;            // first overflower records
>>> this
>>>     JavaThread * _donor_thread;         // donor thread associated
>>> with this tlabInfo
>>>  }
>>> 
>>> The first overflower grabs a new tlabInfo structure and allocates a new
>>> tlab (using edenAllocate) and "publishes" the new tlabInfo for other
>>> workitems to start using.  See the routine called
>>> allocateFromTlabSlowPath in HSAILNewObjectSnippets.
>>> 
>>> Eventually when hsail function calls are supported, this slow path will
>>> not be inlined but will be called as a stub.
>>> 
>>> Other changes:
>>> 
>>>  * the allocation-related logic was removed from gpu_hsail.cpp into
>>>    gpu_hsail_tlab.hpp.  The HSAILHotSpotNmethod now keeps track of
>>>    whether a kernel uses allocation and avoids this logic if it does
>>>    not.
>>> 
>>>     * Before the kernel runs, the donor thread tlabs are used to set
>>>       up the initial tlabInfo records, and a tlab allocation is done
>>>       here if the donor thread tlab is empty.
>>> 
>>>     * When kernel is finished running, the cpu side will see a list
>>>       of one or more HSAILTlabInfos and basically postprocesses
>>>       these, fixing up any overflows and making them parsable and
>>>       copying them back to the appropriate donor thread as needed.
>>> 
>>>  * the inter-workitem communication required the use of the hsail
>>>    instructions for load_acquire and store_release from the
>>>    snippets.  The HSAILDirectLoadAcquireNode and
>>>    HSAILDirectStoreReleaseNode with associated NodeIntrinsics were
>>>    created to handle this.  A node for creating a workitemabsid
>>>    instruction was also created, it is not used in the algorithm as
>>>    such but was useful for adding debug traces.
>>> 
>>>  * In HSAILHotSpotBackend, the logic to decide whether a kernel uses
>>>    allocation or not was made more precise.  (This flag is also made
>>>    available at execute time.)  There were several atomic_add
>>>    related tests were falsely being marked as requiring
>>>    HSAILAllocation and thus HSAILDeoptimization support. This
>>>    marking was removed.
>>> 
>>> -- Tom Deneau
>> 
> 



More information about the graal-dev mailing list