[llvm-dev] [RFC] Heterogeneous LLVM-IR Modules
Johannes Doerfert via llvm-dev
llvm-dev at lists.llvm.org
Tue Jul 28 12:28:10 PDT 2020
On 7/28/20 2:25 PM, Mehdi AMINI wrote:
> On Tue, Jul 28, 2020 at 12:07 PM Johannes Doerfert <
> johannesdoerfert at gmail.com> wrote:
>
>> [I removed all but the data layout question, that is an important topic]
>> On 7/28/20 1:03 PM, Mehdi AMINI wrote:
>> > TL;DR
>> >> -----
>> >>
>> >> Let's allow to merge to LLVM-IR modules for different targets (with
>> >> compatible data layouts) into a single LLVM-IR module to facilitate
>> >> host-device code optimizations.
>> >>
>> >
>> > I think the main question I have is with respect to this limitation
>> on the
>> > datalayout: isn't it too limiting in practice?
>> > I understand that this is much easier to implement in LLVM today,
but it
>> > may get us into a fairly limited place in terms of what can be
>> supported in
>> > the future.
>> > Have you looked into what would it take to have heterogeneous modules
>> that
>> > have their own DL?
>>
>>
>> Let me share some thoughts on the data layouts situation, not all of
>> which are
>> fully matured but I guess we have to start somewhere:
>>
>> If we look at the host-device interface there has to be some agreement
>> on parts of the datalayout, namely what the data looks like the host
>> sends over and expects back. If I'm not mistaken, GPUs will match the
>> host in things like padding, endianness, etc. because you cannot
>> translate things "on the fly". That said, here might be additional
>> "address spaces" on either side that the other one is not matching/aware
>> of. Long story short, I think host & device need to, and in practice do,
>> agree on the data layout of the address space they use to communicate.
>>
>> The above is for me a strong hint that we could use address spaces to
>> identify/distinguish differences when we link the modules. However,
>> there might be the case that this is not sufficient, e.g., if the
>> default alloca address space differs. In that case I don't see a reason
>> to not pull the same "trick" as with the triple. We can specify
>> additional data layouts, one per device, and if you retrieve the data
>> layout, or triple, you need to pass a global symbol as a "anchor". For
>> all intraprocedural passes this should be sufficient as they are only
>> interested in the DL and triple of the function they look at. For IPOs
>> we have to distinguish the ones that know about the host-device calls
>> and the ones that don't. We might have to teach all of them about these
>> calls but as long as they are callbacks through a driver routine I don't
>> even think we need to.
>>
>> I'm curious if you or others see an immediate problem with both a device
>> specific DL and triple (optionally) associated with every global symbol.
>>
>
> Having a triple/DL per global symbols would likely solve everything, I
> didn't get from your original email that this was considered.
> If I understand correctly what you're describing, the DL on the Module
> would be a "default" and we'd need to make the DL/triple APIs on the
Module
> "private" to force queries to go through an API on GlobalValue to get the
> DL/triple?
That is what I tried to describe, yes. The "patch" I posted does this
"conceptually" for the triple. You make them private or require a global
value to be passed as part of the request, same result I guess. The key
is that the DL/triple is a property of the global symbol.
I'll respond to Renato's concerns on this as part of a response to him.
>>
>>
>> ~ Johannes
>>
>>
>
More information about the llvm-dev
mailing list