You can try setting EIGEN_MAX_ALIGN_BYTES=32.  See
https://eigen.tuxfamily.org/dox/TopicPreprocessorDirectives.html.
Otherwise the first will be 16-byte aligned, but the second 32-byte aligned.

On Wed, Apr 28, 2021 at 6:15 AM Xanthos Papanikolaou <
[email protected]> wrote:

> Dear all,
>
> i have started using Eigen for navigation-related projects; it is a great
> library!
> While messing with my Makefiles, i have noticed the following behavior:
>
> let's say i have a header file bar.h as follows:
> #include "eigen3/Eigen/Dense"
> Eigen::VectorXd vbar(int size);
>
> an implementation file bar.cc
> #include "bar.h"
> #include "eigen3/Eigen/Dense"
> Eigen::VectorXd vbar(int size) {
> Eigen::VectorXd x = Eigen::VectorXd(size);
> return x;
> }
>
> and a main function in foo.cc
> #include "eigen3/Eigen/Dense"
> #include "bar.h"
> int main() {
> int size;
> for (size=1; size<9; i++) {
> auto v = vbar(size);
> }
>
> return 0;
> }
>
> If i compile bar.cc using the "-march=native" flag (either with g++ or
> clang++) and then link with
> foo.cc without using the same flag, i get a core dump. That is:
> g++ -Wall -g -std=c++17 -march=native -c bar.cc -o bar_native.o
> g++ -Wall -g -std=c++17 foo.cc bar_native.o -o foo_error
> ./foo_error
> double free or corruption (out)
> Aborted (core dumped)
>
> using backtrace with gdb, i get the following:
> Program received signal SIGABRT, Aborted.
> 0x00007ffff7ace7d5 in raise () from /lib64/libc.so.6
> (gdb) bt
> #0  0x00007ffff7ace7d5 in raise () from /lib64/libc.so.6
> #1  0x00007ffff7ab7895 in abort () from /lib64/libc.so.6
> #2  0x00007ffff7b12627 in __libc_message () from /lib64/libc.so.6
> #3  0x00007ffff7b19b4c in malloc_printerr () from /lib64/libc.so.6
> #4  0x00007ffff7b1b190 in _int_free () from /lib64/libc.so.6
> #5  0x0000000000401585 in Eigen::internal::aligned_free (ptr=0x419ec0) at
> /usr/local/include/eigen3/Eigen/src/Core/util/Memory.h:203
> #6  0x0000000000401565 in Eigen::internal::conditional_aligned_free<true>
> (ptr=0x419ec0) at
> /usr/local/include/eigen3/Eigen/src/Core/util/Memory.h:259
> #7  0x000000000040152c in
> Eigen::internal::conditional_aligned_delete_auto<double, true>
> (ptr=0x419ec0, size=1) at
> /usr/local/include/eigen3/Eigen/src/Core/util/Memory.h:446
> #8  0x00000000004014ec in Eigen::DenseStorage<double, -1, -1, 1,
> 0>::~DenseStorage (this=0x7fffffffde38) at
> /usr/local/include/eigen3/Eigen/src/Core/DenseStorage.h:571
> #9  0x00000000004014c5 in Eigen::PlainObjectBase<Eigen::Matrix<double, -1,
> 1, 0, -1, 1> >::~PlainObjectBase (this=0x7fffffffde38) at
> /usr/local/include/eigen3/Eigen/src/Core/PlainObjectBase.h:98
> #10 0x0000000000401498 in Eigen::Matrix<double, -1, 1, 0, -1, 1>::~Matrix
> (this=0x7fffffffde38) at
> /usr/local/include/eigen3/Eigen/src/Core/Matrix.h:178
> #11 0x00000000004013d5 in main () at foo.cc:7
>
> I can see that my machine supports SSE/AVX,
> g++ -march=native -dM -E - </dev/null | grep SSE
> #define __SSE4_1__ 1
> #define __SSE4_2__ 1
> #define __MMX_WITH_SSE__ 1
> #define __SSE2_MATH__ 1
> #define __SSE_MATH__ 1
> #define __SSSE3__ 1
> #define __SSE__ 1
> #define __SSE2__ 1
> #define __SSE3__ 1
>
> g++ -march=native -dM -E - </dev/null | grep AVX
> #define __AVX__ 1
> #define __AVX2__ 1
>
> I know that i have messed up the compilation (using the native
> architecture in only the first step), but what exactly goes on here?
> Is it an error in an instruction? or maybe memory alignment? Am i
> completely wrong? If possible, i would like to dive in a little deeper
> here. Any help is
> deeply appreciated.
>
> Thanks in advance,
> Xanthos
>
>

Reply via email to