<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=utf-8">
<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;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        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:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
p.xmsonormal, li.xmsonormal, div.xmsonormal
        {mso-style-name:x_msonormal;
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
p.xxmsonormal, li.xxmsonormal, div.xxmsonormal
        {mso-style-name:x_xmsonormal;
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
p.xxmsoplaintext, li.xxmsoplaintext, div.xxmsoplaintext
        {mso-style-name:x_xmsoplaintext;
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
p.xmsochpdefault, li.xmsochpdefault, div.xmsochpdefault
        {mso-style-name:x_msochpdefault;
        mso-margin-top-alt:auto;
        margin-right:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:10.0pt;
        font-family:"Calibri",sans-serif;}
span.xmsohyperlink
        {mso-style-name:x_msohyperlink;
        color:blue;
        text-decoration:underline;}
span.xemailstyle22
        {mso-style-name:x_emailstyle22;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.EmailStyle25
        {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:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
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-GB" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">My feeling is this is not just a question of style but includes an element of design.  Where possible we want to express vectorisation factors/element counts as a single unit, hence the proposal to extend vectorize_width as this is the
 unit of information that it controls.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span style="font-size:12.0pt;color:black">From: </span></b><span style="font-size:12.0pt;color:black">Sjoerd Meijer <Sjoerd.Meijer@arm.com><br>
<b>Date: </b>Wednesday, 25 November 2020 at 16:15<br>
<b>To: </b>David Sherwood <David.Sherwood@arm.com>, "cfe-dev@lists.llvm.org" <cfe-dev@lists.llvm.org><br>
<b>Cc: </b>Paul Walker <Paul.Walker@arm.com>, Sander De Smalen <Sander.DeSmalen@arm.com><br>
<b>Subject: </b>Re: Proposed changes to vectorize_width #pragma<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<blockquote style="border:none #C8C8C8 1.0pt;border-left:solid #C8C8C8 2.25pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<p><span lang="FR" style="color:black">If you wanted to hint<o:p></o:p></span></p>
<p><span lang="FR" style="color:black">to the compiler that we should use scalable vectors with my proposal you’d<o:p></o:p></span></p>
<p><span lang="FR" style="color:black">simply add an extra pragma, i.e.<o:p></o:p></span></p>
<p><span lang="FR" style="color:black"> <o:p></o:p></span></p>
<p><span lang="FR" style="color:black">#clang loop vectorize_predicate(enable) vectorize_width(scalable)<o:p></o:p></span></p>
</div>
</blockquote>
<div>
<p class="MsoNormal"><span style="font-size:12.0pt;color:black">Ah yes, that might have been the thing that I missed, but that would indeed then be equivalent with:
<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12.0pt;color:black"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12.0pt;color:black">    </span><span lang="FR" style="font-size:12.0pt;color:black">#clang loop vectorize_predicate(enable) vectorize_style(scalable)</span><span style="font-size:12.0pt;color:black"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12.0pt;color:black"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12.0pt;color:black">I think that leaves us with 2 options that can express the same things, i.e. change or introduce:<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12.0pt;color:black"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12.0pt;color:black">1)  <o:p></o:p></span></p>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:12.0pt;color:black">vectorize_width(VF, fixed|scalable)<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12.0pt;color:black">vectorize_width(fixed|scalable)<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12.0pt;color:black">vectorize_width(VF)<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>
<p class="MsoNormal"><span style="font-size:12.0pt;color:black">2) <o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12.0pt;color:black">vectorize_style(fixed|scalable)<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12.0pt;color:black"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12.0pt;color:black">And then it's probably more of a style question and not that important if there are no implementation or usability issues overloading vectorize_width.<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12.0pt;color:black"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12.0pt;color:black">Cheers,<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12.0pt;color:black">Sjoerd.<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12.0pt;color:black"><o:p> </o:p></span></p>
</div>
<div class="MsoNormal" align="center" style="text-align:center">
<hr size="2" width="98%" align="center">
</div>
<div id="divRplyFwdMsg">
<p class="MsoNormal"><b><span style="color:black">From:</span></b><span style="color:black"> David Sherwood <David.Sherwood@arm.com><br>
<b>Sent:</b> 25 November 2020 15:50<br>
<b>To:</b> Sjoerd Meijer <Sjoerd.Meijer@arm.com>; cfe-dev@lists.llvm.org <cfe-dev@lists.llvm.org><br>
<b>Cc:</b> Paul Walker <Paul.Walker@arm.com>; Sander De Smalen <Sander.DeSmalen@arm.com><br>
<b>Subject:</b> RE: Proposed changes to vectorize_width #pragma</span> <o:p></o:p></p>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="xmsonormal">Hi Sjoerd,<o:p></o:p></p>
<p class="xmsonormal"> <o:p></o:p></p>
<p class="xmsonormal">As I understand it the interleave count is orthogonal to the vectorization factor and<o:p></o:p></p>
<p class="xmsonormal">one does not imply the other. I think the clang documentation gives an example of<o:p></o:p></p>
<p class="xmsonormal">this:<o:p></o:p></p>
<p class="xmsonormal"> <o:p></o:p></p>
<p class="xmsonormal">  #pragma clang loop vectorize_width(2)<o:p></o:p></p>
<p class="xmsonormal">  #pragma clang loop interleave_count(2)<o:p></o:p></p>
<p class="xmsonormal">  for(...) {<o:p></o:p></p>
<p class="xmsonormal">    ...<o:p></o:p></p>
<p class="xmsonormal">  }<o:p></o:p></p>
<p class="xmsonormal"> <o:p></o:p></p>
<p class="xmsonormal">Also, I believe that each pragma that we set is a hint for one unit of the<o:p></o:p></p>
<p class="xmsonormal">loop vectorizer. It is true that vectorize_predicate enables vectorization, but<o:p></o:p></p>
<p class="xmsonormal">the vectorizer will always choose what it thinks is the most profitable<o:p></o:p></p>
<p class="xmsonormal">vectorization factor, which could be fixed or scalable. If you wanted to hint<o:p></o:p></p>
<p class="xmsonormal">to the compiler that we should use scalable vectors with my proposal you’d<o:p></o:p></p>
<p class="xmsonormal">simply add an extra pragma, i.e.<o:p></o:p></p>
<p class="xmsonormal"> <o:p></o:p></p>
<p class="xmsonormal"><span lang="FR">#clang loop vectorize_predicate(enable) vectorize_width(scalable)</span><o:p></o:p></p>
<p class="xmsonormal"><span lang="FR"> </span><o:p></o:p></p>
<p class="xmsonormal">Kind Regards,<o:p></o:p></p>
<p class="xmsonormal">David.<o:p></o:p></p>
<p class="xmsonormal"> <o:p></o:p></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="xmsonormal"><b><span lang="EN-US">From:</span></b><span lang="EN-US"> Sjoerd Meijer <Sjoerd.Meijer@arm.com>
<br>
<b>Sent:</b> 25 November 2020 13:14<br>
<b>To:</b> cfe-dev@lists.llvm.org; David Sherwood <David.Sherwood@arm.com><br>
<b>Subject:</b> Re: Proposed changes to vectorize_width #pragma</span><o:p></o:p></p>
</div>
</div>
<p class="xmsonormal"> <o:p></o:p></p>
<div>
<p class="xmsonormal"><span style="font-size:12.0pt;color:black">Hi David,</span><o:p></o:p></p>
</div>
<div>
<p class="xmsonormal"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></p>
</div>
<div>
<p class="xmsonormal"><span style="font-size:12.0pt;color:black">Thanks for bringing this up here. We have discussed this already on
<a href="https://reviews.llvm.org/D89031">https://reviews.llvm.org/D89031</a> and a bit offline, and it would be good to get some other opinions on this too.</span><o:p></o:p></p>
</div>
<div>
<p class="xmsonormal"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></p>
</div>
<div>
<p class="xmsonormal"><span style="font-size:12.0pt;color:black">What we achieve with this extension is that we can toggle fixed/scalable vectorisation. The proposal is to add this property to vectorize_width, because it kind of defines the VectorType which
 consists of the elementcount and the scalable/fixed part, which sounds reasonable. However, there are other loop pragmas that (implicitly) enable vectorisation:</span><o:p></o:p></p>
</div>
<div>
<p class="xmsonormal"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></p>
</div>
<div>
<p class="xmsonormal"><span style="font-size:12.0pt;color:black">#pragma clang loop interleave_count(some-number)</span><o:p></o:p></p>
</div>
<div>
<p class="xmsonormal"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></p>
</div>
<div>
<p class="xmsonormal"><span style="font-size:12.0pt;color:black">or</span><o:p></o:p></p>
</div>
<div>
<p class="xmsonormal"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></p>
</div>
<div>
<p class="xmsonormal"><span style="font-size:12.0pt;color:black">#pragma clang loop vectorize_predicate(enable)</span><o:p></o:p></p>
</div>
<div>
<p class="xmsonormal"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></p>
</div>
<div>
<p class="xmsonormal"><span style="font-size:12.0pt;color:black">for which you may want to toggle fixed|scalable vectorisation. If this is correct, then I think the current proposal/implementation is incomplete and/or inconsistent.</span><o:p></o:p></p>
</div>
<div>
<p class="xmsonormal"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></p>
</div>
<div>
<p class="xmsonormal"><span style="font-size:12.0pt;color:black">I think your own suggestion was to introduce a vectorization_style(enable|disable) at some point, but my proposal would be to use that instead of adjusting vectorize_width as that would address
 the issue incompleteness/inconsistency issue. Besides this, but more subjective, I don't see all the new combinations of vectorize_width() as making things clearer:</span><o:p></o:p></p>
</div>
<div>
<p class="xmsonormal"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></p>
</div>
<div>
<p class="xmsonormal"><span style="font-size:12.0pt;color:black">vectorize_width(VF)</span><o:p></o:p></p>
</div>
<div>
<p class="xmsonormal"><span style="font-size:12.0pt;color:black">vectorize_width(VF, fixed|scalable)</span><o:p></o:p></p>
</div>
<div>
<p class="xmsonormal"><span style="font-size:12.0pt;color:black">vectorize_width(fixed|scalable)</span><o:p></o:p></p>
</div>
<div>
<p class="xmsonormal"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></p>
</div>
<div>
<p class="xmsonormal"><span style="font-size:12.0pt;color:black">Probably the implementation of adding vectorization_style(enable|disable) is easier and less contentious than adjusting an existing one, so all together I don't see why the approach of adjusting
 vectorize_wdith would be preferred. But I might be wrong, might be missing something, so welcome other views on this.</span><o:p></o:p></p>
</div>
<div>
<p class="xmsonormal"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></p>
</div>
<div>
<p class="xmsonormal"><span style="font-size:12.0pt;color:black">Cheers,</span><o:p></o:p></p>
</div>
<div>
<p class="xmsonormal"><span style="font-size:12.0pt;color:black">Sjoerd.</span><o:p></o:p></p>
</div>
<div>
<p class="xmsonormal"><span style="font-size:12.0pt;color:black"> </span><o:p></o:p></p>
</div>
<div class="MsoNormal" align="center" style="text-align:center">
<hr size="2" width="98%" align="center">
</div>
<div id="x_divRplyFwdMsg">
<p class="xmsonormal"><b><span style="color:black">From:</span></b><span style="color:black"> cfe-dev <<a href="mailto:cfe-dev-bounces@lists.llvm.org">cfe-dev-bounces@lists.llvm.org</a>> on behalf of David Sherwood via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>><br>
<b>Sent:</b> 24 November 2020 09:04<br>
<b>To:</b> <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>><br>
<b>Subject:</b> [cfe-dev] Proposed changes to vectorize_width #pragma</span> <o:p>
</o:p></p>
<div>
<p class="xmsonormal"> <o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="xxmsonormal">Hi,<o:p></o:p></p>
<p class="xxmsonormal"> <o:p></o:p></p>
<p class="xxmsonormal">At the moment the vectorize_width(X) #pragma is used to provide hints to LLVM<o:p></o:p></p>
<p class="xxmsonormal">about which vectorisation factor to use. The unsigned argument ‘X’ used to match<o:p></o:p></p>
<p class="xxmsonormal">the NumElements property in the VectorType class, however VectorType is now<o:p></o:p></p>
<p class="xxmsonormal">defined in terms of a ElementCount class.<o:p></o:p></p>
<p class="xxmsonormal"> <o:p></o:p></p>
<p class="xxmsonormal">I’d like to propose an extension to the vectorize_width #pragma that now takes<o:p></o:p></p>
<p class="xxmsonormal">an optional second parameter of ‘fixed’ or ‘scalable’ that matches up with<o:p></o:p></p>
<p class="xxmsonormal">ElementCount. When not specified the default value would be ‘fixed’. A few<o:p></o:p></p>
<p class="xxmsonormal">examples of how this would look like are shown below:<o:p></o:p></p>
<p class="xxmsonormal"> <o:p></o:p></p>
<p class="xxmsoplaintext">  // Vectorize the loop with <4 x eltty><o:p></o:p></p>
<p class="xxmsoplaintext">  #pragma clang loop vectorize_width(4)<o:p></o:p></p>
<p class="xxmsoplaintext">  #pragma clang loop vectorize_width(4, fixed)<o:p></o:p></p>
<p class="xxmsoplaintext"> <o:p></o:p></p>
<p class="xxmsoplaintext">  // Vectorize the loop with <vscale x 4 x eltty><o:p></o:p></p>
<p class="xxmsoplaintext">  #pragma clang loop vectorize_width(4, scalable)<o:p></o:p></p>
<p class="xxmsonormal"> <o:p></o:p></p>
<p class="xxmsonormal">As a further extension I’d also like to permit vectorize_width(fixed|scalable) to<o:p></o:p></p>
<p class="xxmsonormal">allow users to hint at the type of vector used without specifying the<o:p></o:p></p>
<p class="xxmsonormal">vectorisation factor. Examples of this would be:<o:p></o:p></p>
<p class="xxmsonormal"> <o:p></o:p></p>
<p class="xxmsoplaintext">  // Vectorize the loop with <N x eltty> for a profitable N<o:p></o:p></p>
<p class="xxmsoplaintext">  #pragma clang loop vectorize_width(fixed)<o:p></o:p></p>
<p class="xxmsoplaintext"> <o:p></o:p></p>
<p class="xxmsoplaintext">  // Vectorize the loop with <vscale x N x eltty> for a profitable N<o:p></o:p></p>
<p class="xxmsoplaintext">  #pragma clang loop vectorize_width(scalable)<o:p></o:p></p>
<p class="xxmsonormal"> <o:p></o:p></p>
<p class="xxmsonormal">Any thoughts you have would be much appreciated!<o:p></o:p></p>
<p class="xxmsonormal"> <o:p></o:p></p>
<p class="xxmsonormal">Kind Regards,<o:p></o:p></p>
<p class="xxmsonormal">David Sherwood.<o:p></o:p></p>
<p class="xxmsonormal"> <o:p></o:p></p>
</div>
</div>
</div>
</div>
</div>
</body>
</html>