<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<!--[if !mso]><style>v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style><![endif]--><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
p.xmsonormal, li.xmsonormal, div.xmsonormal
        {mso-style-name:x_msonormal;
        margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
p.xxmsonormal, li.xxmsonormal, div.xxmsonormal
        {mso-style-name:x_xmsonormal;
        margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
p.xxxmsonormal, li.xxxmsonormal, div.xxxmsonormal
        {mso-style-name:x_xxmsonormal;
        margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
p.xxxxmsonormal, li.xxxxmsonormal, div.xxxxmsonormal
        {mso-style-name:x_xxxmsonormal;
        margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.xxxxcurrenthithighlight
        {mso-style-name:x_xxxcurrenthithighlight;}
p.xxxxxmsonormal, li.xxxxxmsonormal, div.xxxxxmsonormal
        {mso-style-name:x_xxxxmsonormal;
        margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle26
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">We will implement our proposal under cl_khr_device_enqueue_local_arg_types extension. Thanks.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Sam<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b>From:</b> Anastasia Stulova [mailto:Anastasia.Stulova@arm.com]
<br>
<b>Sent:</b> Thursday, January 11, 2018 12:44 PM<br>
<b>To:</b> Sumner, Brian <Brian.Sumner@amd.com>; Liu, Yaxun (Sam) <Yaxun.Liu@amd.com>; cfe-dev (cfe-dev@lists.llvm.org) <cfe-dev@lists.llvm.org>; Bader, Alexey (alexey.bader@intel.com) <alexey.bader@intel.com><br>
<b>Cc:</b> nd <nd@arm.com><br>
<b>Subject:</b> Re: [RFC][OpenCL] Pass alignment of arguments in local addr space for device-side enqueued kernel to __enqueue_kernel functions<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div id="divtagdefaultwrapper">
<p><span style="font-size:12.0pt;color:black">We don't have this extension unfortunately implemented upstream. But if AMD is willing to add, it would allow to do the optimization that Sam was suggesting earlier.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:12.0pt;color:black"><br>
Anastasia<o:p></o:p></span></p>
<div>
<div class="MsoNormal" align="center" style="text-align:center"><span style="font-size:12.0pt;color:black">
<hr size="2" width="98%" align="center">
</span></div>
<div id="divRplyFwdMsg">
<p class="MsoNormal"><b><span style="color:black">From:</span></b><span style="color:black"> Sumner, Brian <<a href="mailto:Brian.Sumner@amd.com">Brian.Sumner@amd.com</a>><br>
<b>Sent:</b> 11 January 2018 14:00<br>
<b>To:</b> Anastasia Stulova; Liu, Yaxun (Sam); cfe-dev (<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>); Bader, Alexey (<a href="mailto:alexey.bader@intel.com">alexey.bader@intel.com</a>)<br>
<b>Cc:</b> nd<br>
<b>Subject:</b> RE: [RFC][OpenCL] Pass alignment of arguments in local addr space for device-side enqueued kernel to __enqueue_kernel functions</span><span style="font-size:12.0pt;color:black">
<o:p></o:p></span></p>
<div>
<p class="MsoNormal"><span style="font-size:12.0pt;color:black"> <o:p></o:p></span></p>
</div>
</div>
<div>
<div>
<p class="xmsonormal"><span style="color:#1F497D">Hi Anastasia,</span><span style="font-size:12.0pt;color:black"><o:p></o:p></span></p>
<p class="xmsonormal"><span style="color:#1F497D"> </span><span style="font-size:12.0pt;color:black"><o:p></o:p></span></p>
<p class="xmsonormal"><span style="color:#1F497D">There is a 2.0 extension, cl_khr_device_enqueue_local_arg_types, that we requested when we first encountered this problem.  Clang should implement this if it hasn’t already, and ideally this would eventually
 become the default in the spec.</span><span style="font-size:12.0pt;color:black"><o:p></o:p></span></p>
<p class="xmsonormal"><span style="color:#1F497D"> </span><span style="font-size:12.0pt;color:black"><o:p></o:p></span></p>
<p class="xmsonormal"><span style="color:#1F497D">Thanks,</span><span style="font-size:12.0pt;color:black"><o:p></o:p></span></p>
<p class="xmsonormal"><span style="color:#1F497D">Brian</span><span style="font-size:12.0pt;color:black"><o:p></o:p></span></p>
<p class="xmsonormal"><span style="color:#1F497D"> </span><span style="font-size:12.0pt;color:black"><o:p></o:p></span></p>
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="xmsonormal"><b><span style="font-size:10.0pt;font-family:"Tahoma",sans-serif;color:black">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma",sans-serif;color:black"> Anastasia Stulova [<a href="mailto:Anastasia.Stulova@arm.com">mailto:Anastasia.Stulova@arm.com</a>]
<br>
<b>Sent:</b> Thursday, January 11, 2018 4:02 AM<br>
<b>To:</b> Sumner, Brian; Liu, Yaxun (Sam); cfe-dev (<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>); Bader, Alexey (<a href="mailto:alexey.bader@intel.com">alexey.bader@intel.com</a>)<br>
<b>Cc:</b> nd<br>
<b>Subject:</b> Re: [RFC][OpenCL] Pass alignment of arguments in local addr space for device-side enqueued kernel to __enqueue_kernel functions</span><span style="font-size:12.0pt;color:black"><o:p></o:p></span></p>
</div>
</div>
<p class="xmsonormal"><span style="font-size:12.0pt;color:black"> <o:p></o:p></span></p>
<div id="x_divtagdefaultwrapper">
<p><span style="font-size:12.0pt;color:black">Hi Brian,<o:p></o:p></span></p>
<p><span style="font-size:12.0pt;color:black"> <o:p></o:p></span></p>
<p><span style="font-size:12.0pt;color:black">Considering the current implementation there is no reason we couldn't generate code with arbitrary pointer types instead of void. This is anyways implemented as a custom check. I don't know though if there might
 be limitations if using different compilation toolchains or so. Although I can imagine this will require custom implementation anywhere. Should we clarify this in spec?<o:p></o:p></span></p>
<p><span style="font-size:12.0pt;color:black"> <o:p></o:p></span></p>
<p><span style="font-size:12.0pt;color:black">Cheers,<o:p></o:p></span></p>
<p><span style="font-size:12.0pt;color:black">Anastasia<o:p></o:p></span></p>
</div>
<div class="MsoNormal" align="center" style="text-align:center"><span style="font-size:12.0pt;color:black">
<hr size="2" width="98%" align="center">
</span></div>
<div id="x_divRplyFwdMsg">
<p class="xmsonormal"><b><span style="color:black">From:</span></b><span style="color:black"> Sumner, Brian <<a href="mailto:Brian.Sumner@amd.com">Brian.Sumner@amd.com</a>><br>
<b>Sent:</b> 10 January 2018 18:26:44<br>
<b>To:</b> Anastasia Stulova; Liu, Yaxun (Sam); cfe-dev (<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>); Bader, Alexey (<a href="mailto:alexey.bader@intel.com">alexey.bader@intel.com</a>)<br>
<b>Cc:</b> nd<br>
<b>Subject:</b> RE: [RFC][OpenCL] Pass alignment of arguments in local addr space for device-side enqueued kernel to __enqueue_kernel functions</span><span style="font-size:12.0pt;color:black">
<o:p></o:p></span></p>
<div>
<p class="xmsonormal"><span style="font-size:12.0pt;color:black"> <o:p></o:p></span></p>
</div>
</div>
<div>
<div>
<p class="xxmsonormal"><span style="color:#1F497D">From my perspective, this restriction is nonsense.  OpenCL kernel local* arguments are not required to point to void.  Why must block local* arguments point to void?  They have to be cast to actually be useful;
 this is an unnecessary extra step.  And unless the actual type is available, the kernel enqueue mechanism has no choice to align the storage to 128 bytes since any local void * could actually be a local ulong16 *.</span><span style="font-size:12.0pt;color:black"><o:p></o:p></span></p>
<p class="xxmsonormal"><span style="color:#1F497D"> </span><span style="font-size:12.0pt;color:black"><o:p></o:p></span></p>
<p class="xxmsonormal"><span style="color:#1F497D">Thanks,</span><span style="font-size:12.0pt;color:black"><o:p></o:p></span></p>
<p class="xxmsonormal"><span style="color:#1F497D">Brian</span><span style="font-size:12.0pt;color:black"><o:p></o:p></span></p>
<p class="xxmsonormal"><span style="color:#1F497D"> </span><span style="font-size:12.0pt;color:black"><o:p></o:p></span></p>
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="xxmsonormal"><b><span style="font-size:10.0pt;font-family:"Tahoma",sans-serif;color:black">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma",sans-serif;color:black"> Anastasia Stulova [<a href="mailto:Anastasia.Stulova@arm.com">mailto:Anastasia.Stulova@arm.com</a>]
<br>
<b>Sent:</b> Wednesday, January 10, 2018 9:55 AM<br>
<b>To:</b> Liu, Yaxun (Sam); cfe-dev (<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>); Bader, Alexey (<a href="mailto:alexey.bader@intel.com">alexey.bader@intel.com</a>)<br>
<b>Cc:</b> Sumner, Brian; nd<br>
<b>Subject:</b> Re: [RFC][OpenCL] Pass alignment of arguments in local addr space for device-side enqueued kernel to __enqueue_kernel functions</span><span style="font-size:12.0pt;color:black"><o:p></o:p></span></p>
</div>
</div>
<p class="xxmsonormal"><span style="font-size:12.0pt;color:black"> <o:p></o:p></span></p>
<div id="x_x_divtagdefaultwrapper">
<p><span style="font-size:12.0pt;color:black">Hi Sam,<o:p></o:p></span></p>
<p><span style="font-size:12.0pt;color:black"> <o:p></o:p></span></p>
<p><span style="font-size:12.0pt;color:black">There is a restriction in OpenCL spec I have referenced in my previous email - s6.13.17.2, which is implemented by Clang. If you look in the file test/SemaOpenCL/cl20-device-side-enqueue.cl around line 117, you
 will see that block_B is rejected to be passed into enqueue_kernel because it has a parameter which isn't "local void*". If you think this is wrong perhaps it would make sense to revisit this bit and understand whether the current spec should be changed to
 allow more optimal implementations to exist. But as for the current state, I don't think we can implement what you are suggesting because we can only have one block argument type for a block in enqueue.<o:p></o:p></span></p>
<p><span style="font-size:12.0pt;color:black"> <o:p></o:p></span></p>
<p><span style="font-size:12.0pt;color:black">Cheer,<o:p></o:p></span></p>
<p><span style="font-size:12.0pt;color:black">Anastasia<o:p></o:p></span></p>
<p class="xxmsonormal" style="margin-bottom:12.0pt"><span style="font-size:12.0pt;color:black"> <o:p></o:p></span></p>
<div>
<div class="MsoNormal" align="center" style="text-align:center"><span style="font-size:12.0pt;color:black">
<hr size="2" width="98%" align="center">
</span></div>
<div id="x_x_divRplyFwdMsg">
<p class="xxmsonormal"><b><span style="color:black">From:</span></b><span style="color:black"> Liu, Yaxun (Sam) <<a href="mailto:Yaxun.Liu@amd.com">Yaxun.Liu@amd.com</a>><br>
<b>Sent:</b> 08 January 2018 22:25<br>
<b>To:</b> Anastasia Stulova; cfe-dev (<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>); Bader, Alexey (<a href="mailto:alexey.bader@intel.com">alexey.bader@intel.com</a>)<br>
<b>Cc:</b> Sumner, Brian; nd<br>
<b>Subject:</b> RE: [RFC][OpenCL] Pass alignment of arguments in local addr space for device-side enqueued kernel to __enqueue_kernel functions</span><span style="font-size:12.0pt;color:black">
<o:p></o:p></span></p>
<div>
<p class="xxmsonormal"><span style="font-size:12.0pt;color:black"> <o:p></o:p></span></p>
</div>
</div>
<div>
<div>
<p class="xxxmsonormal"><span style="font-size:12.0pt;color:black">My comments are below.<o:p></o:p></span></p>
<p class="xxxmsonormal"><span style="font-size:12.0pt;color:black"> <o:p></o:p></span></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="xxxmsonormal"><b><span style="font-size:12.0pt;color:black">From:</span></b><span style="font-size:12.0pt;color:black"> Anastasia Stulova [<a href="mailto:Anastasia.Stulova@arm.com">mailto:Anastasia.Stulova@arm.com</a>]
<br>
<b>Sent:</b> Tuesday, December 19, 2017 10:21 AM<br>
<b>To:</b> Liu, Yaxun (Sam) <<a href="mailto:Yaxun.Liu@amd.com">Yaxun.Liu@amd.com</a>>; cfe-dev (<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>) <<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>>; Bader, Alexey (<a href="mailto:alexey.bader@intel.com">alexey.bader@intel.com</a>)
 <<a href="mailto:alexey.bader@intel.com">alexey.bader@intel.com</a>><br>
<b>Cc:</b> Sumner, Brian <<a href="mailto:Brian.Sumner@amd.com">Brian.Sumner@amd.com</a>>; nd <<a href="mailto:nd@arm.com">nd@arm.com</a>><br>
<b>Subject:</b> Re: [RFC][OpenCL] Pass alignment of arguments in local addr space for device-side enqueued kernel to __enqueue_kernel functions<o:p></o:p></span></p>
</div>
</div>
<p class="xxxmsonormal"><span style="font-size:12.0pt;color:black"> <o:p></o:p></span></p>
<div id="x_x_x_divtagdefaultwrapper">
<p class="xxxxmsonormal"><span style="font-size:12.0pt;color:black">> For example, if a block kernel has argument local int4*. Its alignment should be 16 bytes. <o:p></o:p></span></p>
<p class="xxxmsonormal"><span style="font-size:12.0pt;color:black"> <o:p></o:p></span></p>
<p class="xxxmsonormal" style="margin-bottom:12.0pt"><span style="font-size:12.0pt;color:black">Perhaps I am missing something but I still don't see anything in the spec that requires pointers themselves to take alignment from the pointee type. In your example
 int4* should be aligned to the pointer size (either 4 or 8 bites) while int4 should be 16 byte aligned. Clang will set the alignment of load and store operations correctly according to their data types specified in the source code (which is mainly inherited
 from C implementation apart from some special data types like vectors). The arguments passed to kernels are allocated elsewhere and OpenCL compiler has no control over this.<o:p></o:p></span></p>
<p class="xxxmsonormal" style="margin-bottom:12.0pt"><span style="font-size:12.0pt;color:black">  Sam: The spec (v2.0s6.1.5) requires “the pointee is always appropriately aligned as required by the data type”, which means the pointee of the kernel argument
 of int4* type should be aligned at 16 bytes.<o:p></o:p></span></p>
<p class="xxxmsonormal" style="margin-bottom:12.0pt"><span style="font-size:12.0pt;color:black"><br>
Regarding enqueued kernels as far as I understand you suggest to add block argument alignment info into builtin? Even though it shouldn't be strictly necessary I believe some implementation can indeed be done more efficiently using this. So I don't see any
 problem adding this. However, spec (s6.13.17.2) mandates that the enqueued block function only has void* types as parameters: "Each argument must be declared to be a void pointer to local memory."  So could you elaborate please where exactly do you plan to
 get the optimal alignment from?<o:p></o:p></span></p>
<p class="xxxmsonormal" style="margin-bottom:12.0pt"><span style="font-size:12.0pt;color:black">  Sam: The block function is passed to the builtin. The argument of the block function has the proper data type instead of void* type. Clang can deduce the alignment
 of the pointee of the kernel argument from the block function type.<o:p></o:p></span></p>
<p class="xxxmsonormal" style="margin-bottom:12.0pt"><span style="font-size:12.0pt;color:black"><br>
Thanks,<br>
Anastasia<o:p></o:p></span></p>
<div>
<div class="MsoNormal" align="center" style="text-align:center"><span style="font-size:12.0pt;color:black">
<hr size="2" width="98%" align="center">
</span></div>
<div id="x_x_x_divRplyFwdMsg">
<p class="xxxmsonormal"><b><span style="font-size:12.0pt;color:black">From:</span></b><span style="font-size:12.0pt;color:black"> Liu, Yaxun (Sam) <<a href="mailto:Yaxun.Liu@amd.com">Yaxun.Liu@amd.com</a>><br>
<b>Sent:</b> 15 December 2017 19:08<br>
<b>To:</b> Anastasia Stulova; cfe-dev (<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>); Bader, Alexey (<a href="mailto:alexey.bader@intel.com">alexey.bader@intel.com</a>)<br>
<b>Cc:</b> Sumner, Brian; nd<br>
<b>Subject:</b> RE: [RFC][OpenCL] Pass alignment of arguments in local addr space for device-side enqueued kernel to __enqueue_kernel functions
<o:p></o:p></span></p>
<div>
<p class="xxxmsonormal"><span style="font-size:12.0pt;color:black"> <o:p></o:p></span></p>
</div>
</div>
<div>
<div>
<p class="xxxxmsonormal"><span style="font-size:12.0pt;color:black">Spec reference:<o:p></o:p></span></p>
<p class="xxxxmsonormal"><span style="font-size:12.0pt;color:black"> <o:p></o:p></span></p>
<p class="xxxxmsonormal"><span style="font-size:12.0pt;color:black">OpenCL v2.0 s6.1.5<o:p></o:p></span></p>
<p class="xxxxmsonormal"><span style="font-size:12.0pt;color:black">The OpenCL compiler is responsible for aligning data items to the appropriate alignment as required by the data type. For arguments to a __kernel function declared to be a pointer to a data
 type, the OpenCL compiler can assume that the pointee is always appropriately aligned as required by the data type. The behavior of an unaligned load or store is undefined, except for the vloadn, vload_halfn, vstoren, and vstore_halfn functions defined in
 section 6.13.7.<o:p></o:p></span></p>
<p class="xxxxmsonormal"><span style="font-size:12.0pt;color:black"> <o:p></o:p></span></p>
<p class="xxxxmsonormal"><span style="font-size:12.0pt;color:black">s6.2.5<o:p></o:p></span></p>
<p class="xxxxmsonormal"><span style="font-size:12.0pt;color:black">Casting a pointer to a new type represents an unchecked assertion that the address is correctly aligned.<o:p></o:p></span></p>
<p class="xxxxmsonormal"><span style="font-size:12.0pt;color:black"> <o:p></o:p></span></p>
<p class="xxxxmsonormal"><span style="font-size:12.0pt;color:black">The C Standard, 6.3.2.3, paragraph 7 [ISO/IEC 9899:2011], states<o:p></o:p></span></p>
<p class="xxxxmsonormal"><span style="font-size:12.0pt;color:black"> <o:p></o:p></span></p>
<p class="xxxxmsonormal"><span style="font-size:12.0pt;color:black">A pointer to an object or incomplete type may be converted to a pointer to a different object or incomplete type. If the resulting pointer is not correctly aligned for the referenced type,
 the behavior is undefined.<o:p></o:p></span></p>
<p class="xxxxmsonormal"><span style="font-size:12.0pt;color:black"> <o:p></o:p></span></p>
<p class="xxxxmsonormal"><span style="font-size:12.0pt;color:black">For example, if a block kernel has argument local int4*. Its alignment should be 16 bytes. Passing a pointer aligned to 1 byte may result in undefined behavior. Most hardware can still load
 from the unaligned memory but will a performance hit. If runtime wants to avoid the performance hit, it has to allocate the buffer at maximum possible alignment e.g. 32 bytes, which will result in wasted memory.<o:p></o:p></span></p>
<p class="xxxxmsonormal"><span style="font-size:12.0pt;color:black"> <o:p></o:p></span></p>
<p class="xxxxmsonormal"><span style="font-size:12.0pt;color:black">Sam<o:p></o:p></span></p>
<p class="xxxxmsonormal"><span style="font-size:12.0pt;color:black"> <o:p></o:p></span></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="xxxxmsonormal"><b><span style="font-size:12.0pt;color:black">From:</span></b><span style="font-size:12.0pt;color:black"> Anastasia Stulova [<a href="mailto:Anastasia.Stulova@arm.com">mailto:Anastasia.Stulova@arm.com</a>]
<br>
<b>Sent:</b> Friday, December 15, 2017 10:40 AM<br>
<b>To:</b> Liu, Yaxun (Sam) <<a href="mailto:Yaxun.Liu@amd.com">Yaxun.Liu@amd.com</a>>; cfe-dev (<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>) <<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>>; Bader, Alexey (<a href="mailto:alexey.bader@intel.com">alexey.bader@intel.com</a>)
 <<a href="mailto:alexey.bader@intel.com">alexey.bader@intel.com</a>><br>
<b>Cc:</b> Sumner, Brian <<a href="mailto:Brian.Sumner@amd.com">Brian.Sumner@amd.com</a>>; nd <<a href="mailto:nd@arm.com">nd@arm.com</a>><br>
<b>Subject:</b> Re: [RFC][OpenCL] Pass alignment of arguments in local addr space for device-side enqueued kernel to __enqueue_kernel functions<o:p></o:p></span></p>
</div>
</div>
<p class="xxxxmsonormal"><span style="font-size:12.0pt;color:black"> <o:p></o:p></span></p>
<div id="x_x_x_x_divtagdefaultwrapper">
<p><span style="font-size:12.0pt;color:black"> <o:p></o:p></span></p>
<p><span style="font-size:12.0pt;color:black">><span class="xxxxcurrenthithighlight"> OpenCL</span> spec requires that a pointer should be aligned to at least the pointee type.<o:p></o:p></span></p>
<p><span style="font-size:12.0pt;color:black"> <o:p></o:p></span></p>
<p class="xxxxmsonormal"><span style="font-size:12.0pt;color:black">So a pointer to int16 would be 64 byte aligned? Seems strange though. Can you give me the spec reference?<br>
<br>
> Otherwise, __enqueue_kernel has to either allocate unaligned local buffer, which degrades performance, or allocates local buffer with extra alignment therefore wasted memory space.<br>
<br>
Can you explain in more details here, please.<br>
<br>
Cheer,<br>
Anastasia<o:p></o:p></span></p>
<div>
<div class="MsoNormal" align="center" style="text-align:center"><span style="font-size:12.0pt;color:black">
<hr size="2" width="98%" align="center">
</span></div>
<div id="x_x_x_x_divRplyFwdMsg">
<p class="xxxxmsonormal"><b><span style="font-size:12.0pt;color:black">From:</span></b><span style="font-size:12.0pt;color:black"> Liu, Yaxun (Sam) <<a href="mailto:Yaxun.Liu@amd.com">Yaxun.Liu@amd.com</a>><br>
<b>Sent:</b> 01 December 2017 19:45<br>
<b>To:</b> Anastasia Stulova; cfe-dev (<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>); Bader, Alexey (<a href="mailto:alexey.bader@intel.com">alexey.bader@intel.com</a>)<br>
<b>Cc:</b> Sumner, Brian<br>
<b>Subject:</b> [RFC][OpenCL] Pass alignment of arguments in local addr space for device-side enqueued kernel to __enqueue_kernel functions
<o:p></o:p></span></p>
<div>
<p class="xxxxmsonormal"><span style="font-size:12.0pt;color:black"> <o:p></o:p></span></p>
</div>
</div>
<div>
<div>
<p class="xxxxxmsonormal"><span style="font-size:12.0pt;color:black">Hi,<o:p></o:p></span></p>
<p class="xxxxxmsonormal"><span style="font-size:12.0pt;color:black"> <o:p></o:p></span></p>
<p class="xxxxxmsonormal"><span style="font-size:12.0pt;color:black">OpenCL spec requires that a pointer should be aligned to at least the pointee type. Therefore, if a device-side enqueued kernel has a local int* argument, it should be aligned to 4 bytes.<o:p></o:p></span></p>
<p class="xxxxxmsonormal"><span style="font-size:12.0pt;color:black"> <o:p></o:p></span></p>
<p class="xxxxxmsonormal"><span style="font-size:12.0pt;color:black">Since these buffers in local addr space are allocated by __enqueue_kernel, it needs to know the alignment of these buffers, not just their sizes.<o:p></o:p></span></p>
<p class="xxxxxmsonormal"><span style="font-size:12.0pt;color:black"> <o:p></o:p></span></p>
<p class="xxxxxmsonormal"><span style="font-size:12.0pt;color:black">Although such information is not passed to the original OpenCL builtin function enqueue_kernel, it can be obtained by checking the prototype of the block invoke function at compile time.<o:p></o:p></span></p>
<p class="xxxxxmsonormal"><span style="font-size:12.0pt;color:black"> <o:p></o:p></span></p>
<p class="xxxxxmsonormal"><span style="font-size:12.0pt;color:black">I would like to create a patch to pass this information to  __enqueue_kernel. Otherwise, __enqueue_kernel has to either allocate unaligned local buffer, which degrades performance, or allocates
 local buffer with extra alignment therefore wasted memory space.<o:p></o:p></span></p>
<p class="xxxxxmsonormal"><span style="font-size:12.0pt;color:black"> <o:p></o:p></span></p>
<p class="xxxxxmsonormal"><span style="font-size:12.0pt;color:black">Any comments?<o:p></o:p></span></p>
<p class="xxxxxmsonormal"><span style="font-size:12.0pt;color:black"> <o:p></o:p></span></p>
<p class="xxxxxmsonormal"><span style="font-size:12.0pt;color:black">Thanks.<o:p></o:p></span></p>
<p class="xxxxxmsonormal"><span style="font-size:12.0pt;color:black"> <o:p></o:p></span></p>
<p class="xxxxxmsonormal"><span style="font-size:12.0pt;color:black">Sam<o:p></o:p></span></p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>