New user self-registration is currently disabled. Please email eigen-core-team @ lists.tuxfamily.org if you need an account.
Bug 1115 - Static alignment is still disabled altogether on ARM
Static alignment is still disabled altogether on ARM
Status: RESOLVED FIXED
Product: Eigen
Classification: Unclassified
Component: Core - vectorization
3.3 (current stable)
ARM - NEON All
: Normal Performance Problem
Assigned To: Nobody
:
Depends on:
Blocks:
  Show dependency treegraph
 
Reported: 2015-11-17 17:04 UTC by Benoit Jacob
Modified: 2015-11-18 16:00 UTC (History)
4 users (show)



Attachments
Enable static alignment on ARM (1.62 KB, patch)
2015-11-17 17:04 UTC, Benoit Jacob
no flags Details | Diff

Description Benoit Jacob 2015-11-17 17:04:54 UTC
Created attachment 626 [details]
Enable static alignment on ARM

This code is disabling static alignment, thus vectorization of all fixed-size objects, altogether, on ARM:

https://bitbucket.org/eigen/eigen/src/af48a2d79e699f1f79e3a0cc9ca6b65efb5a6d1a/Eigen/src/Core/util/Macros.h?at=default&fileviewer=file-view-default

  // 16 byte alignment is only useful for vectorization. Since it affects the ABI, we need to enable
  // 16 byte alignment on all platforms where vectorization might be enabled. In theory we could always
  // enable alignment, but it can be a cause of problems on some platforms, so we just disable it in
  // certain common platform (compiler+architecture combinations) to avoid these problems.
  // Only static alignment is really problematic (relies on nonstandard compiler extensions that don't
  // work everywhere, for example don't work on GCC/ARM), try to keep heap alignment even
  // when we have to disable static alignment.
  #if EIGEN_COMP_GNUC && !(EIGEN_ARCH_i386_OR_x86_64 || EIGEN_ARCH_PPC || EIGEN_ARCH_IA64)
  #define EIGEN_GCC_AND_ARCH_DOESNT_WANT_STACK_ALIGNMENT 1
  #else
  #define EIGEN_GCC_AND_ARCH_DOESNT_WANT_STACK_ALIGNMENT 0
  #endif


See how the whitelist of architectures there ^ does not include ARM; the comment above even refers to GCC/ARM issues.

However, this comment doesn't offer any detail on what the affected toolchain versions are, and seems to have been around here for a long time.

Given the attention that ARM has received over the past 5 years, it would be surprising if static alignment were still broken; and few people care about old compilers on ARM - while Android isn't the fastest to upgrade toolchains, it is still the case that hardly anyone seems to use GCC < 4.8 or Clang < 3.5 on Android/ARM at the moment.

On the other hand, vectorization of fixed-size objects is very important for many applications.

So, I would like to just add ARM/ARM64 in the above whitelist of architectures.

Patch attached.
Comment 1 Gael Guennebaud 2015-11-18 06:21:45 UTC
I guess that you successfully tested it with such recent compilers. So I'm ok with it, but we could perhaps enable ARM for gcc>=4.8 only to be safe, as we know it will break arm+gccc-old, with old>=4.4 (I don't know for 4.5, 4.6, and 4.7)
Comment 2 Benoit Jacob 2015-11-18 15:59:48 UTC
Good tip, thanks! I pushed something like this:
https://bitbucket.org/eigen/eigen/commits/fbed442752cba3f318242e05763dde73a3d7e0dc

Here, all the toolchains we seem to be using seem to pass, but I don't know if that includes any toolchain based on GCC < 4.8. I still enabled alignment on 4.7, because I know it's been used in Android NDK until recently (Android 4.4 I think) and so I would be very surprised if alignment were still broken there, and I suppose some people still care about performance with this toolchain. GCC <= 4.6 remain without static alignment.

Note You need to log in before you can comment on or make changes to this bug.