Re: [eigen] How do you link multiple versions (e.g. AVX vs SSE) of the same Eigen code?

[ Thread Index | Date Index | More Archives ]

Support for AVX is not completely finalized.. In particular we still have to re-enable vectorization for 128bits width vectors. So finally Vector4f will still be 16 bytes aligned and vectorized.

Then regarding alignment/ABI issues, I would keep the current behavior by default: if someone enable AVX, the best option is really to enable 32 bytes alignement, otherwise AVX gains would be strongly reduced. There are many other compiler options breaking the ABI anyway, so this only has to be clearly documented. For use cases as yours, we could offer compile-time options to choose the default maximal alignement requirement: 0, 16, 32, etc. instead of the current options that only allow you to disable alignement. Then it is up to the user to choose whether he prefers to enforce ABI compatibility by enabling 32B alignment on SSE or limit to 16B alignment for AVX.


On Wed, Jan 28, 2015 at 12:30 AM, Benoit Jacob <jacob.benoit.1@xxxxxxxxx> wrote:
Benoit, Gael, could you confirm that this change is intentional?

  improves perf of certain 4d ops
 - regresses perf of 4f ops, as now Vector4f isn't aligned anymore!!!!
 - breaks long-standing invariant that Eigen ABI is independent of compile flags


2015-01-27 18:22 GMT-05:00 Benoit Jacob <jacob.benoit.1@xxxxxxxxx>:

Ouch... you're right. From Macros.h:

  #if defined(__AVX__)
    #define EIGEN_ALIGN_BYTES 32

2015-01-27 18:19 GMT-05:00 Benoit Jacob <jacob.benoit.1@xxxxxxxxx>:

Oh --- I was still living in a world where the Eigen ABI is unaffected by vectorization, which was the case at least until AVX.

Is alignof(Vector4d) actually 32 with AVX by default? So ABI is now dependent on compile flags?


2015-01-27 18:17 GMT-05:00 Marc Glisse <marc.glisse@xxxxxxxx>:

On Tue, 27 Jan 2015, Benoit Jacob wrote:

An approach that works is to #define Eigen EigenAVX, but this is very
annoying because you can't anymore pass around Eigen objects, you have to
somehow reinterpret_cast them to EigenAVX objects.

I would expect EigenAVX::Vector4d to have an alignment of 32, and only 16 for EigenSSE::Vector4d (I did not check), which would mean they really are different types and you cannot pass the second one to a function expecting the first. So I am not sure how you intend to "pass around Eigen objects".

Marc Glisse

Mail converted by MHonArc 2.6.19+