[LLVMdev] [RFC][PATCH][OPENCL] synchronization scopes redux
Sameer Sahasrabuddhe
sameer.sahasrabuddhe at amd.com
Thu Jan 8 20:48:19 PST 2015
On 1/9/2015 4:14 AM, Chandler Carruth wrote:
> On Wed, Jan 7, 2015 at 8:03 PM, Sahasrabuddhe, Sameer
> <sameer.sahasrabuddhe at amd.com <mailto:sameer.sahasrabuddhe at amd.com>>
> wrote:
>
> Here's what this looks like to me:
>
> 1. LLVM text format will use string symbols for memory scopes,
> and not numbers. The set of strings is target defined, but
> "singlethread" and "system" are reserved and have a well-known
> meaning.
>
> 2. "The keyword informally known as system" represents the set of
> all threads that could possibly synchronize on the location
> being accessed by the current atomic instruction. These
> threads could be local, remote, executing on different agents,
> or whatever else is admissible on that particular platform. We
> still need to agree on the keyword to be used.
>
> 3. The bitcode will store memory scopes as unsigned integers,
> since that is the easiest way to maintain compatibility. The
> values 0 and 1 are special. All other values are meaningful
> only within that bc file. The file will also provide a map
> from unsigned integers to string symbols which should be used
> to interpret all the non-standard integers.
> 1. The map must not include 0 and 1, since the reader will
> internally map them to singlethread" and "system"
> respectively.
> 2. If the map is empty or non-existent, then all non-zero
> values will be mapped to "system", which is the current
> behaviour.
>
> 4. The in-memory structure for an atomic instruction will
> represent memory scope as a reference to a uniqued strings.
> This eliminates any notion of performing arithmetic on the
> scope indicator, or to write code that is sensitive to its
> numerical value.
>
> 5. Behaviour is undefined if a symbolic scope used in the IR is
> not supported by the target. This is true for "singlethread"
> and "system" also, since some targets may not have those scopes.
>
> Is this correct?
>
> Generally, yes.
>
> Regarding the specific way of using strings, see the email I just sent
> about metadata being used poorly, this is a place where we might use
> metadata to encode the string, or we might do something more direct as
> you propose. I think it would be good to do something like what I
> propose in that thread to have nicely uniqued opaque string entities
> in the IR, and then use them here for marking scopes.
So I see the following large chunks of work that are difficult to isolate:
1. Modifying the bitcode and assembly readers and writers.
2. Updating Clang (simultaneously?) to generate the new kind of IR with
symbol/number mappings.
3. Updating language bindings to deal with the new IR.
As far as I can see, the following can be decoupled from the above, but
they are closely tied to each other:
4. Implementing uniqued opaque strings in the most desirable way, and
using it for the in-memory format.
5. Creating an interface to convert the opaque symbols into suitable
target-specific DAG nodes.
All this work, just to ensure readability in the LLVM text format. I am
not entirely convinced that it is worth it, when opaque integers can get
the job done just like address spaces ... are you?
> But how does this work in the SelectionDAG? Also, what will this
> look like in TableGen files?
>
> Not sure what you mean here? I haven't looked at implementing it, but
> from the DAG down you should get to collapse this rapidly toward
> target-specific nodes / structures / representations?
Sorry, that was just me being lazy and not reading up on the
SelectionDAG. I expect that we will translate the the symbols into
integer TargetConstant SDNodes ... do you see the need to be more
flexible than that?
Sameer.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150109/b3722ee9/attachment.html>
More information about the llvm-dev
mailing list