[llvm-dev] [RFC] Late (OpenMP) GPU code "SPMD-zation"

Alexey Bataev via llvm-dev llvm-dev at lists.llvm.org
Tue Jan 22 11:46:39 PST 2019


No, we don't. We need to perform the different kind of the analysis for
SPMD mode constructs and Non-SPMD.

For SPMD mode we need to globalize only reduction/lastprivate variables.
For Non-SPMD mode, we need to globalize all the private/local variables,
that may escape their declaration context in the construct.

-------------
Best regards,
Alexey Bataev

22.01.2019 14:29, Doerfert, Johannes Rudolf пишет:
> We would still know that. We can do exactly the same reasoning as we
> do now.
>
> I think the important question is, how different is the code generated
> for either mode and can we hide (most of) the differences in the runtime.
>
>
> If I understand you correctly, you say the data sharing code looks
> very different and the differences cannot be hidden, correct?
>
> It would be helpful for me to understand your point if you could give
> me a piece of OpenMP for which the data sharing in SPMD mode and "guarded"
>
> mode are as different as possible. I can compile it in both modes
> myself so high-level OpenMP is fine (I will disable SPMD mode manually
> in the source if necessary).
>
>
> Thanks,
>
>   Johannes
>
>
>
>
> ------------------------------------------------------------------------
> *From:* llvm-dev <llvm-dev-bounces at lists.llvm.org> on behalf of Alexey
> Bataev via llvm-dev <llvm-dev at lists.llvm.org>
> *Sent:* Tuesday, January 22, 2019 13:10
> *To:* Doerfert, Johannes Rudolf
> *Cc:* Alexey Bataev; LLVM-Dev; Arpith Chacko Jacob;
> openmp-dev at lists.llvm.org; cfe-dev at lists.llvm.org
> *Subject:* Re: [llvm-dev] [RFC] Late (OpenMP) GPU code "SPMD-zation"
>  
> But we need to know the execution mode, SPMD or "guarded"
>
> -------------
> Best regards,
> Alexey Bataev
> 22.01.2019 13:54, Doerfert, Johannes Rudolf пишет:
>> We could still do that in clang, couldn't we?
>>
>> Get Outlook for Android <https://aka.ms/ghei36>
>>
>> ------------------------------------------------------------------------
>> *From:* Alexey Bataev <a.bataev at outlook.com>
>> <mailto:a.bataev at outlook.com>
>> *Sent:* Tuesday, January 22, 2019 12:52:42 PM
>> *To:* Doerfert, Johannes Rudolf; cfe-dev at lists.llvm.org
>> <mailto:cfe-dev at lists.llvm.org>
>> *Cc:* openmp-dev at lists.llvm.org <mailto:openmp-dev at lists.llvm.org>;
>> LLVM-Dev; Finkel, Hal J.; Alexey Bataev; Arpith Chacko Jacob
>> *Subject:* Re: [RFC] Late (OpenMP) GPU code "SPMD-zation"
>>  
>>
>> The globalization for the local variables, for example. It must be
>> implemented in the compiler to get the good performance, not in the
>> runtime.
>>
>>
>> -------------
>> Best regards,
>> Alexey Bataev
>> 22.01.2019 13:43, Doerfert, Johannes Rudolf пишет:
>>> Could you elaborate on what you refer to wrt data sharing. What do
>>> we currently do in the clang code generation that we could not
>>> effectively implement in the runtime, potentially with support of an
>>> llvm pass.
>>>
>>> Thanks,
>>>   James
>>>
>>> Get Outlook for Android <https://aka.ms/ghei36>
>>>
>>> ------------------------------------------------------------------------
>>> *From:* Alexey Bataev <a.bataev at outlook.com>
>>> <mailto:a.bataev at outlook.com>
>>> *Sent:* Tuesday, January 22, 2019 12:34:01 PM
>>> *To:* Doerfert, Johannes Rudolf; cfe-dev at lists.llvm.org
>>> <mailto:cfe-dev at lists.llvm.org>
>>> *Cc:* openmp-dev at lists.llvm.org <mailto:openmp-dev at lists.llvm.org>;
>>> LLVM-Dev; Finkel, Hal J.; Alexey Bataev; Arpith Chacko Jacob
>>> *Subject:* Re: [RFC] Late (OpenMP) GPU code "SPMD-zation"
>>>  
>>>
>>>
>>> -------------
>>> Best regards,
>>> Alexey Bataev
>>> 22.01.2019 13:17, Doerfert, Johannes Rudolf пишет:
>>>> Where we are
>>>> ------------
>>>>
>>>> Currently, when we generate OpenMP target offloading code for GPUs, we
>>>> use sufficient syntactic criteria to decide between two execution modes:
>>>>   1)      SPMD -- All target threads (in an OpenMP team) run all the code.
>>>>   2) "Guarded" -- The master thread (of an OpenMP team) runs the user
>>>>                   code. If an OpenMP distribute region is encountered, thus
>>>>                   if all threads (in the OpenMP team) are supposed to
>>>>                   execute the region, the master wakes up the idling
>>>>                   worker threads and points them to the correct piece of
>>>>                   code for distributed execution.
>>>>
>>>> For a variety of reasons we (generally) prefer the first execution mode.
>>>> However, depending on the code, that might not be valid, or we might
>>>> just not know if it is in the Clang code generation phase.
>>>>
>>>> The implementation of the "guarded" execution mode follows roughly the
>>>> state machine description in [1], though the implementation is different
>>>> (more general) nowadays.
>>>>
>>>>
>>>> What we want
>>>> ------------
>>>>
>>>> Increase the amount of code executed in SPMD mode and the use of
>>>> lightweight "guarding" schemes where appropriate.
>>>>
>>>>
>>>> How we get (could) there
>>>> ------------------------
>>>>
>>>> We propose the following two modifications in order:
>>>>
>>>>   1) Move the state machine logic into the OpenMP runtime library. That
>>>>      means in SPMD mode all device threads will start the execution of
>>>>      the user code, thus emerge from the runtime, while in guarded mode
>>>>      only the master will escape the runtime and the other threads will
>>>>      idle in their state machine code that is now just "hidden".
>>>>
>>>>      Why:
>>>>      - The state machine code cannot be (reasonably) optimized anyway,
>>>>        moving it into the library shouldn't hurt runtime but might even
>>>>        improve compile time a little bit.
>>>>      - The change should also simplify the Clang code generation as we
>>>>        would generate structurally the same code for both execution modes
>>>>        but only the runtime library calls, or their arguments, would
>>>>        differ between them.
>>>>      - The reason we should not "just start in SPMD mode" and "repair"
>>>>        it later is simple, this way we always have semantically correct
>>>>        and executable code.
>>>>      - Finally, and most importantly, there is now only little
>>>>        difference (see above) between the two modes in the code
>>>>        generated by clang. If we later analyze the code trying to decide
>>>>        if we can use SPMD mode instead of guarded mode the analysis and
>>>>        transformation becomes much simpler.
>>>
>>> The last item is wrong, unfortunately. A lot of things in the
>>> codegen depend on the execution mode, e.g. correct support of the
>>> data-sharing. Of course, we can try to generalize the codegen and
>>> rely completely on the runtime, but the performance is going to be
>>> very poor.
>>>
>>> We still need static analysis in the compiler. I agree, that it is
>>> better to move this analysis to the backend, at least after the
>>> inlining, but at the moment it is not possible. We need the support
>>> for the late outlining, which will allow to implement better
>>> detection of the SPMD constructs + improve performance.
>>>
>>>>  2) Implement a middle-end LLVM-IR pass that detects the guarded mode,
>>>>     e.g., through the runtime library calls used, and that tries to
>>>>     convert it into the SPMD mode potentially by introducing lightweight
>>>>     guards in the process.
>>>>
>>>>     Why:
>>>>     - After the inliner, and the canonicalizations, we have a clearer
>>>>       picture of the code that is actually executed in the target
>>>>       region and all the side effects it contains. Thus, we can make an
>>>>       educated decision on the required amount of guards that prevent
>>>>       unwanted side effects from happening after a move to SPMD mode.
>>>>     - At this point we can more easily introduce different schemes to
>>>>       avoid side effects by threads that were not supposed to run. We
>>>>       can decide if a state machine is needed, conditionals should be
>>>>       employed, masked instructions are appropriate, or "dummy" local
>>>>       storage can be used to hide the side effect from the outside
>>>>       world.
>>>>
>>>>
>>>> None of this was implemented yet but we plan to start in the immediate
>>>> future. Any comments, ideas, criticism is welcome!
>>>>
>>>>
>>>> Cheers,
>>>>   Johannes
>>>>
>>>>
>>>> P.S. [2-4] Provide further information on implementation and features.
>>>>
>>>> [1] https://ieeexplore.ieee.org/document/7069297
>>>> [2] https://dl.acm.org/citation.cfm?id=2833161
>>>> [3] https://dl.acm.org/citation.cfm?id=3018870
>>>> [4] https://dl.acm.org/citation.cfm?id=3148189
>>>>
>>>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190122/7a0bfb89/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190122/7a0bfb89/attachment.sig>


More information about the llvm-dev mailing list