[LLVMdev] Loads moving across barriers
Matt Arsenault
Matthew.Arsenault at amd.com
Fri Dec 6 14:17:35 PST 2013
On 12/04/2013 05:25 PM, Andrew Trick wrote:
>
> On Dec 4, 2013, at 5:19 PM, Matt Arsenault <Matthew.Arsenault at amd.com
> <mailto:Matthew.Arsenault at amd.com>> wrote:
>
>> On 12/04/2013 04:29 PM, Andrew Trick wrote:
>>> On Dec 4, 2013, at 3:33 PM, Matt Arsenault
>>> <Matthew.Arsenault at amd.com <mailto:Matthew.Arsenault at amd.com>> wrote:
>>>
>>>> On 11/11/2013 03:13 PM, Andrew Trick wrote:
>>>>> On Nov 9, 2013, at 1:39 PM, Matt Arsenault <arsenm2 at gmail.com
>>>>> <mailto:arsenm2 at gmail.com>> wrote:
>>>>>
>>>>>> On Nov 9, 2013, at 3:14 AM, Chandler Carruth
>>>>>> <chandlerc at google.com <mailto:chandlerc at google.com>> wrote:
>>>>>>
>>>>>>> Perhaps you're instead trying to say that with certain address
>>>>>>> spaces "noalias" (and by inference, "restrict" at the language
>>>>>>> level) has a different semantic model than other address spaces?
>>>>>>> While it's less worrisome than the first interpretation, I still
>>>>>>> don't really like it.
>>>>>>>
>>>>>> This sounds right. With the constant address space, anything you
>>>>>> do is OK since it’s constant. Private address space is supposed
>>>>>> to be totally inaccessible from other workitems, so parallel
>>>>>> modifications aren’t a concern. The others require explicit
>>>>>> synchronization which noalias would need to be aware of.
>>>>> FWIW, it seems generally useful to me to have a nomemfence
>>>>> function attribute and intrinsic property. We should avoid memory
>>>>> optimization (and possibly other optimization) across these
>>>>> regardless of alias analysis.
>>>>>
>>>> I'm think I'll try implementing this. Ideally it would be
>>>> parameterized over the address space, so it makes more sense for it
>>>> to be a memfence attribute rather than a nomemfence. You would then
>>>> have an arbitrary number of memfence(N) attributes for each
>>>> required address space.
>>> So for correctness, would we need to tag all functions with
>>> memfence(0..M) until we can prove otherwise? That seem heinous.
>> I was thinking the absence of it would mean no memfence in any
>> address space, which is the current behavior. This adds the option of
>> fencing.
>>> Better to have an optional attribute that can be added to expose
>>> optimization. Is it important in practice to optimize the case of
>>> memfence(I) + nomemfence(J)?
>> I think it would be important for the GPU case. You never need a
>> memfence for private address space / addrspace 0, but you frequently
>> want them for local or global. The local or global writes can't be
>> reordered, but it could be very beneficial to move the private
>> accesses across fences which might help reduce register usage.
>>
>>> If so, is there a problem with nomemfence(N)?
>> nomemfence is the current assumption made on an arbitrary call, and
>> it's the common case. Specifying the absence of a fence seems
>> backwards of how this is used and more cumbersome to deal with. To
>> match the current behavior, it would require littering nomemfence for
>> any possible address space everywhere. In OpenCL you specify your
>> fences, so it would be more straightforward to map that. If I have a
>> memfence intrinsic, I just need to mark it with the fence attribute,
>> and then propogate it to its callers. There would generally only be a
>> few of them in any program compared to fenceless calls. To implement
>> this with nomemfence, I would have to mark every function with at
>> least 4 nomemfences, and remove them when encountering the memfence
>> intrinsic.
>
> Sure, but the program still needs to be correct if you skip attribute
> propagation.
> -Andy
Is that actually a real concern? My main problem with nomemfence is how
do you mark a function as not fencing any other address space you might
care about around call sites? I suppose nomemfence without an address
space could indicate nomemfence for any address space, but then that
just restricts the problem to when you do have a few fenced address
spaces. How do you know what other address spaces are relevant to be
marked? Add a nomemfence for any address spaces encountered in functions
with call sites? What if those in another module?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20131206/09e5a8f2/attachment.html>
More information about the llvm-dev
mailing list