Add a generic Eigen backend based on clang vector extensions

The goal of this MR is to implement a generic SIMD backend (packet ops) for Eigen that uses clang vector extensions instead of platform-dependent intrinsics. Ideally, this should make it possible to build Eigen and achieve reasonable speed on any platform that has a recent clang compiler, without having to write any inline assembly or intrinsics.

Caveats:

* The current implementation is a proof of concept and supports vectorization for float, double, int32_t, and int64_t using fixed-size 512-bit vectors (a somewhat arbitrary choice). I have not done much to tune this for speed yet.
* For now, there is no way to enable this other than setting -DEIGEN_VECTORIZE_GENERIC on the command line.
* This only compiles with newer versions of clang. I have tested that it compiles and all tests pass with clang 19.1.7.

https://clang.llvm.org/docs/LanguageExtensions.html#vectors-and-extended-vectors

Closes #2998 and #2997

See merge request libeigen/eigen!2051

Co-authored-by: Rasmus Munk Larsen <rmlarsen@google.com>
Co-authored-by: Antonio Sánchez <cantonios@google.com>
This commit is contained in:
Rasmus Munk Larsen
2025-11-06 21:52:19 +00:00
parent 7c7d84735e
commit ec93a6d098
17 changed files with 1161 additions and 39 deletions

View File

@@ -11,6 +11,18 @@
#ifndef EIGEN_CONFIGURE_VECTORIZATION_H
#define EIGEN_CONFIGURE_VECTORIZATION_H
// Prepare for using the generic clang backend if requested.
#if defined(EIGEN_VECTORIZE_GENERIC) && !defined(EIGEN_DONT_VECTORIZE) && !defined(EIGEN_DONT_ALIGN)
#if !EIGEN_ARCH_VECTOR_EXTENSIONS
#error "The compiler does not support clang vector extensions."
#endif
#define EIGEN_VECTORIZE
#ifndef EIGEN_GENERIC_VECTOR_SIZE_BYTES
#define EIGEN_GENERIC_VECTOR_SIZE_BYTES 64
#endif
#define EIGEN_MAX_ALIGN_BYTES EIGEN_GENERIC_VECTOR_SIZE_BYTES
#endif
//------------------------------------------------------------------------------------------
// Static and dynamic alignment control
//
@@ -504,7 +516,7 @@ extern "C" {
namespace Eigen {
inline static const char *SimdInstructionSetsInUse(void) {
inline static const char* SimdInstructionSetsInUse(void) {
#if defined(EIGEN_VECTORIZE_AVX512)
return "AVX512, FMA, AVX2, AVX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2";
#elif defined(EIGEN_VECTORIZE_AVX)