<div dir="ltr">I think I can resolve this issue:<div><br></div><div style>In fact with "A a()" the Vc memory is correctly aligned in the stack while "A * a = new A()" does not align the object per default.</div>
<div style>@Georgios: I have written a custom new operator which achieves this. It is in the repository.</div><div style><br></div><div style>Best</div><div style><br></div><div style>Sandro</div></div><div class="gmail_extra">
<br><br><div class="gmail_quote">2014-02-20 14:42 GMT+01:00 Georgios Bitzes <span dir="ltr"><<a href="mailto:georgios.bitzes@cern.ch" target="_blank">georgios.bitzes@cern.ch</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr"><div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small">Hi everyone,</div><div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small">


I would like to report an issue I came across while using Vc. Here is a short example that reproduces it:</div><div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small"><br></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">


<div class="gmail_default"><div class="gmail_default"><div class="gmail_default"><div class="gmail_default"><font face="verdana, sans-serif">#include <Vc/Vc></font></div><div class="gmail_default"><font face="verdana, sans-serif"><br>


</font></div><div class="gmail_default"><font face="verdana, sans-serif">class A {</font></div><div class="gmail_default"><font face="verdana, sans-serif">    private:</font></div><div class="gmail_default"><font face="verdana, sans-serif">        Vc::Memory<Vc::double_v, 3> internal;</font></div>


<div class="gmail_default"><font face="verdana, sans-serif">};</font></div><div class="gmail_default"><font face="verdana, sans-serif"><br></font></div><div class="gmail_default"><font face="verdana, sans-serif">int main() {</font></div>


<div class="gmail_default"><font face="verdana, sans-serif">    std::cout << "size: " << Vc::double_v::Size << std::endl;</font></div><div class="gmail_default"><font face="verdana, sans-serif">    A *a = new A();</font></div>


<div class="gmail_default"><font face="verdana, sans-serif">    return 0;</font></div><div class="gmail_default"><font face="verdana, sans-serif">}</font></div></div></div></div></blockquote><div class="gmail_default"><div style="font-family:verdana,sans-serif;font-size:small">


<br></div><div style="font-family:verdana,sans-serif;font-size:small">The example compiles but segfaults during the creation of object a.</div></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_default">


<div><div><font face="verdana, sans-serif">$ ./a.out </font></div></div></div><div class="gmail_default"><div><div><font face="verdana, sans-serif">size: 4</font></div></div></div><div class="gmail_default"><div><div><font face="verdana, sans-serif">Segmentation fault</font></div>


</div></div></blockquote><div class="gmail_default"><div><div style="font-family:verdana,sans-serif;font-size:small"><br></div></div><div style="font-family:verdana,sans-serif;font-size:small">Backtrace:</div></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px">


<font face="verdana, sans-serif">$ gdb ./a.out<br> GNU gdb (GDB) 7.5.91.20130417-cvs-ubuntu<br>Copyright (C) 2013 Free Software Foundation, Inc.<br>License GPLv3+: GNU GPL version 3 or later <<a href="http://gnu.org/licenses/gpl.html" target="_blank">http://gnu.org/licenses/gpl.html</a>><br>


This is free software: you are free to change and redistribute it.<br>There is NO WARRANTY, to the extent permitted by law.  Type "show copying"<br>and "show warranty" for details.<br>This GDB was configured as "x86_64-linux-gnu".<br>


For bug reporting instructions, please see:<br><<a href="http://www.gnu.org/software/gdb/bugs/" target="_blank">http://www.gnu.org/software/gdb/bugs/</a>>...<br>Reading symbols from /tmp/vcmemory/a.out...done.<br>(gdb) r<br>
Starting program: /tmp/vcmemory/a.out<br>

 size: 4<br>Program received signal SIGSEGV, Segmentation fault.<br>0x000000000040142f in _mm256_store_pd (__A=..., __P=0x604010) at /usr/lib/gcc/x86_64-linux-gnu/4.7/include/avxintrin.h:829<br>829  *(__m256d *)__P = __A;<br>


(gdb) bt<br>#0  0x000000000040142f in _mm256_store_pd (__A=..., __P=0x604010) at /usr/lib/gcc/x86_64-linux-gnu/4.7/include/avxintrin.h:829<br>#1  store<Vc::v0::Public::{anonymous}::LoadStoreFlags<> > (x=..., mem=0x604010) at /opt/Vc-a1d8b9fc31060d870386613cc72319546c850b87/include/Vc/avx/vectorhelper.h:106<br>


#2  store<double, Vc::v0::Public::{anonymous}::LoadStoreFlags<> > (flags=..., mem=0x604010, this=0x7fffffffe420) at /opt/Vc-a1d8b9fc31060d870386613cc72319546c850b87/include/Vc/avx/vector.tcc:236<br>#3  store<Vc::v0::Public::{anonymous}::LoadStoreFlags<> > (flags=..., mem=0x604010, this=<optimized out>) at /opt/Vc-a1d8b9fc31060d870386613cc72319546c850b87/include/Vc/avx/vector.h:174<br>


#4  operator=<Vc::v0::AVX::Vector<double> > (x=..., this=0x604010) at /opt/Vc-a1d8b9fc31060d870386613cc72319546c850b87/include/Vc/common/memorybase.h:85<br>#5  Vc::v0::Common::Memory<Vc::v0::AVX::Vector<double>, 3ul, 0ul, true>::Memory (this=0x604010) at /opt/Vc-a1d8b9fc31060d870386613cc72319546c850b87/include/Vc/common/memory.h:293<br>


#6  0x00000000004011aa in A::A (this=0x604010) at main.cpp:4<br>#7  0x00000000004010fa in main () at main.cpp:11</font></blockquote><div class="gmail_default"><div style="font-family:verdana,sans-serif;font-size:small"><br>


</div></div><div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small">The above code was compiled with: </div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small">


g++ -fabi-version=6 -m64 -std=c++11  -g -fpermissive -ffast-math  -finline-limit=10000000 -mavx -ftree-vectorize main.cpp -I/opt/Vc-a1d8b9fc31060d870386613cc72319546c850b87/include -L/opt/Vc-a1d8b9fc31060d870386613cc72319546c850b87/lib/ -lVc -std=c++11</div>


</blockquote><div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small">I took the latest commit of Vc (a1d8b9fc31060d870386613cc72319546c850b87), compiled and run on a Xeon E3-1280 v3 (Haswell) @ 3.60 GHz by g++ version 4.7.3-2ubuntu4.</div>


<div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small">On the contrary, if I replace "A *a = new A()" with "A a()" it runs fine. This appears to happen only when the object is allocated on the heap, not on the stack.</div>


<div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small">Is this a bug on the part of Vc or am I doing something wrong?</div>


<div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small">Cheers</div></div>
<br>_______________________________________________<br>
Vc mailing list<br>
<a href="mailto:Vc@compeng.uni-frankfurt.de">Vc@compeng.uni-frankfurt.de</a><br>
<a href="https://compeng.uni-frankfurt.de/mailman/listinfo/vc" target="_blank">https://compeng.uni-frankfurt.de/mailman/listinfo/vc</a><br>
<br></blockquote></div><br></div>