<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1252">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div><span>Hi Alexey,<br>
</span></div>
<div><br>
</div>
<div><br>
</div>
<div>Thanks for the clarification.<br>
</div>
<div><br>
</div>
<div><br>
</div>
<div>> SYCL compiler re-use generic support for these attributes as is and modifies<br>
</div>
<div>> Sema and CodeGen libraries.<br>
</div>
<div><br>
</div>
<div>Can you elaborate on your modifications in Sema and CodeGen, please?<br>
</div>
<div><br>
</div>
<div>> The main difference with OpenCL mode is that SYCL<br>
</div>
<div>> mode (similar to other single-source GPU programming modes like<br>
</div>
<div>> OpenMP/CUDA/HIP)<br>
</div>
<div>> keeps "default" address space for the declaration without address space<br>
</div>
<div>> attribute annotations.<br>
</div>
<div><br>
</div>
<div>Just FYI in C++ mode, Clang implements default/generic address space as<br>
</div>
<div>specified in embedded C (ISO/IEC TR 18037) s5.1 - 5.3.<br>
</div>
<div><br>
</div>
<div>"When not specified otherwise, objects are allocated by default in a generic<br>
</div>
<div>address space, which corresponds to the single address space of ISO/IEC<br>
</div>
<div>9899:1999."<br>
</div>
<div><br>
</div>
<div>"Objects are allocated in one or more address spaces. A unique generic address<br>
</div>
<div>space always exists. Every address space other than the generic one has a unique<br>
</div>
<div>name in the form of an identifier. Address spaces other than the generic one are<br>
</div>
<div>called named address spaces. An object is always completely allocated into at<br>
</div>
<div>least one address space. Unless otherwise specified, objects are allocated in<br>
</div>
<div>the generic address space."<br>
</div>
<div><br>
</div>
<div>It feels to me this is the model you intend to follow? If you use OpenCL address<br>
</div>
<div>space attributes outside of OpenCL mode there is limited logic that you will<br>
</div>
<div>inherit. For example deduction of address spaces wouldn't work but conversions<br>
</div>
<div>or generation to IR should work fine. It generally sounds like a viable approach<br>
</div>
<div>but OpenCL however used Default (no address space) as private AS for a very long<br>
</div>
<div>time and there are still a number of places where this assumption is inherent in<br>
</div>
<div>the implementation. This is not entirely strange as Default is use by many</div>
<div>languages for automatic storage anyway. My worry is there could be difficulties</div>
<div>in reusing the OpenCL address space model due to this.<br>
</div>
<div><br>
</div>
<div>Btw can you elaborate on your implementation of constant addr space?<br>
</div>
<div><br>
</div>
<div>> This keeps the code shared between the host and device<br>
</div>
<div>> semantically-correct for both compilers: regular C++ host compiler and SYCL<br>
</div>
<div>> compiler.<br>
</div>
<div><br>
</div>
<div>Sorry perhaps I am not following this thought but can you explain how<br>
</div>
<div>address spaces make code semantically incorrect?<br>
</div>
<div><br>
</div>
<div>> To make all pointers without an explicit address space qualifier to be<br>
</div>
<div>> pointers<br>
</div>
<div>> in generic address space, we updated SPIR target address space map, which<br>
</div>
<div>> currently maps default pointers to "private" address space.<br>
</div>
<div><br>
</div>
<div>The address space map in Clang is not specific to pointer types. How do you<br>
</div>
<div>make it work for pointers only?<br>
</div>
<div><br>
</div>
<div>> We made this change<br>
</div>
<div>> specific to SYCL by adding SYCL environment component to the Triple to avoid<br>
</div>
<div>> impact on other modes targeting SPIR target (e.g. OpenCL). We would be glad to<br>
</div>
<div>> see get a feedback from the community if changing this mapping is applicable<br>
</div>
<div>> for all the modes and additional specialization can be avoided (e.g.<br>
</div>
<div>> [AMDGPU](https://github.com/llvm/llvm-project/blob/master/clang/lib/Basic/Targets/AMDGPU.cpp#L329)<br>
</div>
<div>> maps default to "generic" address space with a couple of exceptions).<br>
</div>
<div><br>
</div>
<div>Ok, does it mean that you map Default address space to OpenCL generic?<br>
</div>
<div>Please note that Default address space is used outside of OpenCL for all<br>
</div>
<div>other languages so remapping this unconditionally will have a wider impact.<br>
</div>
<div><br>
</div>
<div>> There are a few cases when CodeGen assigns non-default address space:<br>
</div>
<div>> <br>
</div>
<div>> 1. For declaration explicitly annotated with address space attribute<br>
</div>
<div><br>
</div>
<div>This is generally how CodeGen works mapping language address spaces to target<br>
</div>
<div>address spaces. Is there something different you do here for SYCL?<br>
</div>
<div><br>
</div>
<div>> 2. Variables with static storage duration and string literals are allocated in<br>
</div>
<div>>  global address space unless specific address space it specified.<br>
</div>
<div>> 3. Variables with automatic storage durations are allocated in private address<br>
</div>
<div>>   space. It's current compiler behavior and it doesn't require additional<br>
</div>
<div>>   changes.<br>
</div>
<div><br>
</div>
<div>We already have this logic for OpenCL in Sema. I am not an expert in CodeGen but<br>
</div>
<div>I believe its primary task is to map language constructs onto the target specific IR</div>
<div>i.e. map from AST into IR. However, you are making it dial with language semantic</div>
<div>instead i.e. add missing AST logic such as address space attribute. I believe there</div>
<div>are good reasons to have layering architecture that separates various concerns.</div>
<div>What drives your decision for moving this logic into CodeGen?<br>
</div>
<div><br>
</div>
<div>> For (2) and (3) cases, once "default" pointer to such variable is obtained, it<br>
</div>
<div>> is immediately addrspacecast'ed to generic, because a user does not (and<br>
</div>
<div>> should not) specify address space for pointers in source code.<br>
</div>
<div><br>
</div>
<div>Can you explain why you need this cast? Can user not specify address spaces using<br>
</div>
<div>pointer classes that map into address space attributed types i.e. ending up with</div>
<div>pointer<span> with address spaces originating from the user code?</span></div>
<div><span><br>
</span></div>
<div><span>Cheers,</span></div>
<div><span>Anastasia</span><br>
</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
<span style="left:84.9981px; top:557.799px; font-size:18.4px; font-family:sans-serif"></span><br>
</div>
<div id="appendonsend"></div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
<br>
</div>
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="divRplyFwdMsg" dir="ltr"><font style="font-size:11pt" face="Calibri, sans-serif" color="#000000"><b>From:</b> Bader, Alexey <alexey.bader@intel.com><br>
<b>Sent:</b> 26 June 2020 13:04<br>
<b>To:</b> cfe-dev (cfe-dev@lists.llvm.org) <cfe-dev@lists.llvm.org>; Anastasia Stulova <Anastasia.Stulova@arm.com>; rjmccall@apple.com <rjmccall@apple.com><br>
<b>Subject:</b> [RFC] Re-use OpenCL address space attributes for SYCL</font>
<div> </div>
</div>
<div lang="RU">
<div class="x_WordSection1">
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">Hi,</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US"> </span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">We would like to re-use OpenCL address space attributes for SYCL to target</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">SPIR-V format and enable efficient memory access on GPUs.</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US"> </span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">```c++</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">  __attribute__((opencl_global))</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">  __attribute__((opencl_local))</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">  __attribute__((opencl_private))</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">```</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US"> </span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">The first patch enabling conversion between pointers annotated with OpenCL</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">address space attribute and "default" pointers is being reviewed here</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">https://reviews.llvm.org/D80932.</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US"> </span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">Before moving further with the implementation we would like to discuss two</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">questions raised in review comments (https://reviews.llvm.org/D80932#2085848).</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US"> </span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<b><span lang="EN-US">## Using attributes to annotate memory allocations</span></b><span lang="EN-US"></span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US"> </span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">Introduction section of SYCL-1.2.1 specification describes multiple compilation</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">flows intended by the design:</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US"> </span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">> SYCL is designed to allow a compilation flow where the source file is passed</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">> through multiple different compilers, including a standard C++ host compiler</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">> of the developer’s choice, and where the resulting application combines the</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">> results of these compilation passes. This is distinct from a single-source</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">> flow that might use language extensions that preclude the use of a standard</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">> host compiler. The SYCL standard does not preclude the use of a single</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">> compiler flow, but is designed to not require it.</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">> </span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">> The advantages of this design are two-fold. First, it offers better</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">> integration with existing tool chains. An application that already builds</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">> using a chosen compiler can continue to do so when SYCL code is added. Using</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">> the SYCL tools on a source file within a project will both compile for an</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">> OpenCL device and let the same source file be compiled using the same host</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">> compiler that the rest of the project is compiled with. Linking and library</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">> relationships are unaffected. This design simplifies porting of pre-existing</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">> applications to SYCL. Second, the design allows the optimal compiler to be</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">> chosen for each device where different vendors may provide optimized</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">> tool-chains.</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">> </span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">> SYCL is designed to be as close to standard C++ as possible. In practice,</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">> this means that as long as no dependence is created on SYCL’s integration</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">> with OpenCL, a standard C++ compiler can compile the SYCL programs and they</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">> will run correctly on host CPU. Any use of specialized low-level features</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">> can be masked using the C preprocessor in the same way that</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">> compiler-specific intrinsics may be hidden to ensure portability between</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">> different host compilers.</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US"> </span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">Following this approach, SYCL uses C++ templates to represent pointers to</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">disjoint memory regions on an accelerator to enable compilation with standard</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">C++ toolchain and SYCL compiler toolchain.</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US"> </span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">For instance:</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US"> </span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">```c++</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">// CPU/host implementation</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">template <typename T, address_space AS> class multi_ptr {</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">  T *data; // ignore address space parameter on CPU</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">  public:</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">  T *get_pointer() { return data; }</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">}</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US"> </span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">// check that SYCL mode is ON and we can use non-standard annotations</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">#if defined(__SYCL_DEVICE_ONLY__)</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">// GPU/accelerator implementation</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">template <typename T, address_space AS> class multi_ptr {</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">  // GetAnnotatedPointer<T, global>::type == "__attribute__((opencl_global)) T"</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">  using pointer_t = typename GetAnnotatedPointer<T, AS>::type *;</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US"> </span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">  pointer_t data;</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">  public:</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">  pointer_t get_pointer() { return data; }</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">}</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">#endif</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">```</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US"> </span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">User can use `multi_ptr` class as regular user-defined type in regular C++ code:</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US"> </span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">```c++</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">int *UserFunc(multi_ptr<int, global> ptr) {</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">  /// ...</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">  return ptr.get_pointer();</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">}</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">```</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US"> </span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">Depending on the compiler mode `multi_ptr` will either annotate internal data</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">with address space attribute or not.</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US"> </span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<b><span lang="EN-US">## Implementation details</span></b><span lang="EN-US"></span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US"> </span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">OpenCL attributes are handled by Parser in all modes. OpenCL mode has specific</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">logic in Sema and CodeGen components for these attributes.</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US"> </span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">SYCL compiler re-use generic support for these attributes as is and modifies</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">Sema and CodeGen libraries. The main difference with OpenCL mode is that SYCL</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">mode (similar to other single-source GPU programming modes like OpenMP/CUDA/HIP)</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">keeps "default" address space for the declaration without address space</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">attribute annotations. This keeps the code shared between the host and device</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">semantically-correct for both compilers: regular C++ host compiler and SYCL</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">compiler.</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US"> </span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">To make all pointers without an explicit address space qualifier to be pointers</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">in generic address space, we updated SPIR target address space map, which</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">currently maps default pointers to "private" address space. We made this change</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">specific to SYCL by adding SYCL environment component to the Triple to avoid</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">impact on other modes targeting SPIR target (e.g. OpenCL). We would be glad to</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">see get a feedback from the community if changing this mapping is applicable for</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">all the modes and additional specialization can be avoided (e.g.</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">[AMDGPU](<u>https://github.com/llvm/llvm-project/blob/master/clang/lib/Basic/Targets/AMDGPU.cpp#L329</u>)</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">maps default to "generic" address space with a couple of exceptions).</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US"> </span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">There are a few cases when CodeGen assigns non-default address space:</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US"> </span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">1. For declaration explicitly annotated with address space attribute</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">2. Variables with static storage duration and string literals are allocated in</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">   global address space unless specific address space it specified.</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">3. Variables with automatic storage durations are allocated in private address</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">   space. It's current compiler behavior and it doesn't require additional</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">   changes.</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US"> </span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">For (2) and (3) cases, once "default" pointer to such variable is obtained, it</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">is immediately addrspacecast'ed to generic, because a user does not (and should</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">not) specify address space for pointers in source code.</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US"> </span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">A draft patch containing complete change-set is available </span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">[here](<u>https://github.com/bader/llvm/pull/18/</u>).</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US"> </span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US">Does this approach seem reasonable?</span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US"> </span></p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
Thanks,</p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
Alexey</p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
 </p>
<p class="x_MsoNormal" style="margin-top: 0px; margin-bottom: 0px;margin:0cm 0cm 0.0001pt; font-size:11pt; font-family:"Calibri",sans-serif">
<span lang="EN-US"> </span></p>
</div>
</div>
</body>
</html>