<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<p>Hi,</p>
<p>according to the doc (<a class="moz-txt-link-freetext"
href="https://releases.llvm.org/7.0.0/docs/Vectorizers.html">https://releases.llvm.org/7.0.0/docs/Vectorizers.html</a>)
floor, sin, cos should be vectorized.</p>
<p>I can confirm (using the great <a class="moz-txt-link-freetext"
href="https://gcc.godbolt.org/">https://gcc.godbolt.org/</a>
tool) that using the flags "-Ofast -mavx2 -fopenmp -ffast-math"
the right avx2 opcode (<span style="color: #0000ff;">vroundps</span>)
is emited for floor (in foo), but unfortunately not for sin, cos
or exp (e.g. see sin in bar below). <br>
</p>
<p>GCC 8.1+ and the Intel Compiler icc 13+ insert call to vectorized
implementations (<span style="color: #008080;">_ZGVbN4v_sinf</span>
or <span style="color: #008080;">__svml_sinf4 </span>), but
clang seems to have nothing like this.<br>
</p>
<div style="color: #000000;background-color:
#fffffe;font-family:
 Consolas, ">
<div><span style="color: #008080;"><font color="#000000">Here is
my small testcode:</font><br>
</span></div>
<div><span style="color: #008080;"><br>
</span></div>
</div>
<div style="color: #000000;background-color:
#fffffe;font-family:
 Consolas, ">
<div><span style="color: #0000ff;">#include</span><span
style="color: #000000;"> <cmath></span></div>
<br>
<div><span style="color: #0000ff;">void</span><span
style="color:
 #000000;"> foo(</span><span style="color:
#0000ff;">float</span><span style="color: #000000;"> * </span><span
style="color:
 #0000ff;">__restrict</span><span
style="color: #000000;"> __attribute((aligned(</span><span
style="color: #09885a;">32</span><span style="color: #000000;">)))
x</span></div>
<div><span style="color: #000000;">, </span><span
style="color:
 #0000ff;">float</span><span style="color:
#000000;"> * </span><span style="color: #0000ff;">__restrict</span><span
style="color:
 #000000;"> __attribute((aligned(</span><span
style="color:
 #09885a;">32</span><span style="color:
#000000;">))) y) {</span></div>
<div><span style="color: #000000;"> </span><span
style="color:
 #0000ff;">for</span><span style="color:
#000000;"> (</span><span style="color: #0000ff;">int</span><span
style="color:
 #000000;"> i = </span><span style="color:
#09885a;">0</span><span style="color: #000000;">; i < </span><span
style="color:
 #09885a;">4</span><span style="color:
#000000;">; ++i)</span></div>
<div><span style="color: #000000;"> y[i] = floor(x[i]);</span></div>
<div><span style="color: #000000;">}</span></div>
<br>
<br>
<div><span style="color: #0000ff;">void</span><span
style="color:
 #000000;"> bar(</span><span style="color:
#0000ff;">float</span><span style="color: #000000;"> * </span><span
style="color:
 #0000ff;">__restrict</span><span
style="color: #000000;"> __attribute((aligned(</span><span
style="color: #09885a;">32</span><span style="color: #000000;">)))
x</span></div>
<div><span style="color: #000000;">, </span><span
style="color:
 #0000ff;">float</span><span style="color:
#000000;"> * </span><span style="color: #0000ff;">__restrict</span><span
style="color:
 #000000;"> __attribute((aligned(</span><span
style="color:
 #09885a;">32</span><span style="color:
#000000;">))) y) {</span></div>
<div><span style="color: #000000;"> </span><span
style="color:
 #0000ff;">for</span><span style="color:
#000000;"> (</span><span style="color: #0000ff;">int</span><span
style="color:
 #000000;"> i = </span><span style="color:
#09885a;">0</span><span style="color: #000000;">; i < </span><span
style="color:
 #09885a;">4</span><span style="color:
#000000;">; ++i)</span></div>
<div><span style="color: #000000;"> y[i] = sin(x[i]);</span></div>
<div><span style="color: #000000;">}</span></div>
</div>
<div style="color: #000000;background-color:
#fffffe;font-family:
 Consolas, "><br>
</div>
<div style="color: #000000;background-color:
#fffffe;font-family:
 Consolas, ">I have reproduced this
behavior on different machines. Maybe I am doing s.th. wrong here,
but it seems like there is no vectorized implementation for sin,
cos etc. I am using h2lib for now (<a
class="moz-txt-link-freetext"
href="http://h2lib.org/doc/d1/d89/simd__avx_8h_source.html">http://h2lib.org/doc/d1/d89/simd__avx_8h_source.html</a>)
as a workaround, but I expect clang to do this job.</div>
<div style="color: #000000;background-color:
#fffffe;font-family:
 Consolas, "><br>
</div>
<div style="color: #000000;background-color:
#fffffe;font-family:
 Consolas, ">Can anybody comment on this
please?<br>
</div>
<div style="color: #000000;background-color:
#fffffe;font-family:
 Consolas, "><br>
</div>
Cheers<br>
Klaus
</body>
</html>