<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:DengXian;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"\@DengXian";
        panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
p.xmsonormal, li.xmsonormal, div.xmsonormal
        {mso-style-name:x_msonormal;
        margin:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
p.xmsoplaintext, li.xmsoplaintext, div.xmsoplaintext
        {mso-style-name:x_msoplaintext;
        margin:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle22
        {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" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal">Hi Sjoerd,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">As I understand it the interleave count is orthogonal to the vectorization factor and<o:p></o:p></p>
<p class="MsoNormal">one does not imply the other. I think the clang documentation gives an example of<o:p></o:p></p>
<p class="MsoNormal">this:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">  #pragma clang loop vectorize_width(2)<o:p></o:p></p>
<p class="MsoNormal">  #pragma clang loop interleave_count(2)<o:p></o:p></p>
<p class="MsoNormal">  for(...) {<o:p></o:p></p>
<p class="MsoNormal">    ...<o:p></o:p></p>
<p class="MsoNormal">  }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Also, I believe that each pragma that we set is a hint for one unit of the<o:p></o:p></p>
<p class="MsoNormal">loop vectorizer. It is true that vectorize_predicate enables vectorization, but<o:p></o:p></p>
<p class="MsoNormal">the vectorizer will always choose what it thinks is the most profitable<o:p></o:p></p>
<p class="MsoNormal">vectorization factor, which could be fixed or scalable. If you wanted to hint<o:p></o:p></p>
<p class="MsoNormal">to the compiler that we should use scalable vectors with my proposal you’d<o:p></o:p></p>
<p class="MsoNormal">simply add an extra pragma, i.e.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span lang="FR">#clang loop vectorize_predicate(enable) vectorize_width(scalable)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="FR"><o:p> </o:p></span></p>
<p class="MsoNormal">Kind Regards,<o:p></o:p></p>
<p class="MsoNormal">David.<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 0cm 0cm 0cm">
<p class="MsoNormal"><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<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal"><span style="font-size:12.0pt;color:black">Hi David,<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">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.<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">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:<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">#pragma clang loop interleave_count(some-number)<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">or<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">#pragma clang loop vectorize_predicate(enable)<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">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.<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 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:<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">vectorize_width(VF)<o:p></o:p></span></p>
</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"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><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.<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"> 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="MsoNormal"> <o:p></o:p></p>
</div>
</div>
<div>
<div>
<p class="xmsonormal">Hi,<o:p></o:p></p>
<p class="xmsonormal"> <o:p></o:p></p>
<p class="xmsonormal">At the moment the vectorize_width(X) #pragma is used to provide hints to LLVM<o:p></o:p></p>
<p class="xmsonormal">about which vectorisation factor to use. The unsigned argument ‘X’ used to match<o:p></o:p></p>
<p class="xmsonormal">the NumElements property in the VectorType class, however VectorType is now<o:p></o:p></p>
<p class="xmsonormal">defined in terms of a ElementCount class.<o:p></o:p></p>
<p class="xmsonormal"> <o:p></o:p></p>
<p class="xmsonormal">I’d like to propose an extension to the vectorize_width #pragma that now takes<o:p></o:p></p>
<p class="xmsonormal">an optional second parameter of ‘fixed’ or ‘scalable’ that matches up with<o:p></o:p></p>
<p class="xmsonormal">ElementCount. When not specified the default value would be ‘fixed’. A few<o:p></o:p></p>
<p class="xmsonormal">examples of how this would look like are shown below:<o:p></o:p></p>
<p class="xmsonormal"> <o:p></o:p></p>
<p class="xmsoplaintext">  // Vectorize the loop with <4 x eltty><o:p></o:p></p>
<p class="xmsoplaintext">  #pragma clang loop vectorize_width(4)<o:p></o:p></p>
<p class="xmsoplaintext">  #pragma clang loop vectorize_width(4, fixed)<o:p></o:p></p>
<p class="xmsoplaintext"> <o:p></o:p></p>
<p class="xmsoplaintext">  // Vectorize the loop with <vscale x 4 x eltty><o:p></o:p></p>
<p class="xmsoplaintext">  #pragma clang loop vectorize_width(4, scalable)<o:p></o:p></p>
<p class="xmsonormal"> <o:p></o:p></p>
<p class="xmsonormal">As a further extension I’d also like to permit vectorize_width(fixed|scalable) to<o:p></o:p></p>
<p class="xmsonormal">allow users to hint at the type of vector used without specifying the<o:p></o:p></p>
<p class="xmsonormal">vectorisation factor. Examples of this would be:<o:p></o:p></p>
<p class="xmsonormal"> <o:p></o:p></p>
<p class="xmsoplaintext">  // Vectorize the loop with <N x eltty> for a profitable N<o:p></o:p></p>
<p class="xmsoplaintext">  #pragma clang loop vectorize_width(fixed)<o:p></o:p></p>
<p class="xmsoplaintext"> <o:p></o:p></p>
<p class="xmsoplaintext">  // Vectorize the loop with <vscale x N x eltty> for a profitable N<o:p></o:p></p>
<p class="xmsoplaintext">  #pragma clang loop vectorize_width(scalable)<o:p></o:p></p>
<p class="xmsonormal"> <o:p></o:p></p>
<p class="xmsonormal">Any thoughts you have would be much appreciated!<o:p></o:p></p>
<p class="xmsonormal"> <o:p></o:p></p>
<p class="xmsonormal">Kind Regards,<o:p></o:p></p>
<p class="xmsonormal">David Sherwood.<o:p></o:p></p>
<p class="xmsonormal"> <o:p></o:p></p>
</div>
</div>
</div>
</body>
</html>