mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-08-12 11:49:02 +08:00
Fix up PowerPC MMA flags so it builds by default.
This commit is contained in:
parent
518fc321cb
commit
591906477b
@ -17,24 +17,28 @@
|
|||||||
|
|
||||||
#include "MatrixProductCommon.h"
|
#include "MatrixProductCommon.h"
|
||||||
|
|
||||||
// Since LLVM doesn't support dynamic dispatching, force either always MMA or VSX
|
// Check for MMA builtin support.
|
||||||
#if EIGEN_COMP_LLVM
|
#if !defined(EIGEN_ALTIVEC_DISABLE_MMA) && defined(__has_builtin)
|
||||||
#if !defined(EIGEN_ALTIVEC_DISABLE_MMA) && !defined(EIGEN_ALTIVEC_MMA_ONLY)
|
|
||||||
#ifdef __MMA__
|
|
||||||
#define EIGEN_ALTIVEC_MMA_ONLY
|
|
||||||
#else
|
|
||||||
#define EIGEN_ALTIVEC_DISABLE_MMA
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __has_builtin
|
|
||||||
#if __has_builtin(__builtin_mma_assemble_acc)
|
#if __has_builtin(__builtin_mma_assemble_acc)
|
||||||
#define ALTIVEC_MMA_SUPPORT
|
#define EIGEN_ALTIVEC_MMA_SUPPORT
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(ALTIVEC_MMA_SUPPORT) && !defined(EIGEN_ALTIVEC_DISABLE_MMA)
|
// Check if and how we should actually use MMA if supported.
|
||||||
|
#if defined(EIGEN_ALTIVEC_MMA_SUPPORT)
|
||||||
|
|
||||||
|
|
||||||
|
// Check if we want to enable dynamic dispatch. Not supported by LLVM.
|
||||||
|
if defined(EIGEN_ALTIVEC_ENABLE_MMA_DYNAMIC_DISPATCH) && !EIGEN_COMP_LLVM
|
||||||
|
#define EIGEN_ALTIVEC_MMA_DYNAMIC_DISPATCH 1
|
||||||
|
// Otherwise, use MMA by default if available.
|
||||||
|
#elif defined(__MMA__)
|
||||||
|
#define EIGEN_ALTIVEC_MMA_ONLY 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // EIGEN_ALTIVEC_MMA_SUPPORT
|
||||||
|
|
||||||
|
#if defined(EIGEN_ALTIVEC_MMA_ONLY) || defined(EIGEN_ALTIVEC_MMA_DYNAMIC_DISPATCH)
|
||||||
#include "MatrixProductMMA.h"
|
#include "MatrixProductMMA.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -2481,10 +2485,10 @@ void gebp_kernel<float, float, Index, DataMapper, mr, nr, ConjugateLhs, Conjugat
|
|||||||
const Index accCols = quad_traits<float>::size;
|
const Index accCols = quad_traits<float>::size;
|
||||||
void (*gemm_function)(const DataMapper&, const float*, const float*, Index, Index, Index, float, Index, Index, Index, Index);
|
void (*gemm_function)(const DataMapper&, const float*, const float*, Index, Index, Index, float, Index, Index, Index, Index);
|
||||||
|
|
||||||
#ifdef EIGEN_ALTIVEC_MMA_ONLY
|
#if defined(EIGEN_ALTIVEC_MMA_ONLY)
|
||||||
//generate with MMA only
|
//generate with MMA only
|
||||||
gemm_function = &Eigen::internal::gemmMMA<float, Index, Packet, RhsPacket, DataMapper, accRows, accCols>;
|
gemm_function = &Eigen::internal::gemmMMA<float, Index, Packet, RhsPacket, DataMapper, accRows, accCols>;
|
||||||
#elif defined(ALTIVEC_MMA_SUPPORT) && !defined(EIGEN_ALTIVEC_DISABLE_MMA)
|
#elif defined(EIGEN_ALTIVEC_MMA_DYNAMIC_DISPATCH)
|
||||||
if (__builtin_cpu_supports ("arch_3_1") && __builtin_cpu_supports ("mma")){
|
if (__builtin_cpu_supports ("arch_3_1") && __builtin_cpu_supports ("mma")){
|
||||||
gemm_function = &Eigen::internal::gemmMMA<float, Index, Packet, RhsPacket, DataMapper, accRows, accCols>;
|
gemm_function = &Eigen::internal::gemmMMA<float, Index, Packet, RhsPacket, DataMapper, accRows, accCols>;
|
||||||
}
|
}
|
||||||
@ -2520,10 +2524,10 @@ void gebp_kernel<std::complex<float>, std::complex<float>, Index, DataMapper, mr
|
|||||||
void (*gemm_function)(const DataMapper&, const std::complex<float>*, const std::complex<float>*,
|
void (*gemm_function)(const DataMapper&, const std::complex<float>*, const std::complex<float>*,
|
||||||
Index, Index, Index, std::complex<float>, Index, Index, Index, Index);
|
Index, Index, Index, std::complex<float>, Index, Index, Index, Index);
|
||||||
|
|
||||||
#ifdef EIGEN_ALTIVEC_MMA_ONLY
|
#if defined(EIGEN_ALTIVEC_MMA_ONLY)
|
||||||
//generate with MMA only
|
//generate with MMA only
|
||||||
gemm_function = &Eigen::internal::gemm_complexMMA<std::complex<float>, std::complex<float>, std::complex<float>, float, Index, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, false, false>;
|
gemm_function = &Eigen::internal::gemm_complexMMA<std::complex<float>, std::complex<float>, std::complex<float>, float, Index, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, false, false>;
|
||||||
#elif defined(ALTIVEC_MMA_SUPPORT) && !defined(EIGEN_ALTIVEC_DISABLE_MMA)
|
#elif defined(EIGEN_ALTIVEC_MMA_DYNAMIC_DISPATCH)
|
||||||
if (__builtin_cpu_supports ("arch_3_1") && __builtin_cpu_supports ("mma")){
|
if (__builtin_cpu_supports ("arch_3_1") && __builtin_cpu_supports ("mma")){
|
||||||
gemm_function = &Eigen::internal::gemm_complexMMA<std::complex<float>, std::complex<float>, std::complex<float>, float, Index, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, false, false>;
|
gemm_function = &Eigen::internal::gemm_complexMMA<std::complex<float>, std::complex<float>, std::complex<float>, float, Index, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, false, false>;
|
||||||
}
|
}
|
||||||
@ -2558,10 +2562,10 @@ void gebp_kernel<float, std::complex<float>, Index, DataMapper, mr, nr, Conjugat
|
|||||||
const Index accCols = quad_traits<float>::size;
|
const Index accCols = quad_traits<float>::size;
|
||||||
void (*gemm_function)(const DataMapper&, const float*, const std::complex<float>*,
|
void (*gemm_function)(const DataMapper&, const float*, const std::complex<float>*,
|
||||||
Index, Index, Index, std::complex<float>, Index, Index, Index, Index);
|
Index, Index, Index, std::complex<float>, Index, Index, Index, Index);
|
||||||
#ifdef EIGEN_ALTIVEC_MMA_ONLY
|
#if defined(EIGEN_ALTIVEC_MMA_ONLY)
|
||||||
//generate with MMA only
|
//generate with MMA only
|
||||||
gemm_function = &Eigen::internal::gemm_complexMMA<float, std::complex<float>, std::complex<float>, float, Index, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, true, false>;
|
gemm_function = &Eigen::internal::gemm_complexMMA<float, std::complex<float>, std::complex<float>, float, Index, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, true, false>;
|
||||||
#elif defined(ALTIVEC_MMA_SUPPORT) && !defined(EIGEN_ALTIVEC_DISABLE_MMA)
|
#elif defined(EIGEN_ALTIVEC_MMA_DYNAMIC_DISPATCH)
|
||||||
if (__builtin_cpu_supports ("arch_3_1") && __builtin_cpu_supports ("mma")){
|
if (__builtin_cpu_supports ("arch_3_1") && __builtin_cpu_supports ("mma")){
|
||||||
gemm_function = &Eigen::internal::gemm_complexMMA<float, std::complex<float>, std::complex<float>, float, Index, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, true, false>;
|
gemm_function = &Eigen::internal::gemm_complexMMA<float, std::complex<float>, std::complex<float>, float, Index, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, true, false>;
|
||||||
}
|
}
|
||||||
@ -2596,10 +2600,10 @@ void gebp_kernel<std::complex<float>, float, Index, DataMapper, mr, nr, Conjugat
|
|||||||
const Index accCols = quad_traits<float>::size;
|
const Index accCols = quad_traits<float>::size;
|
||||||
void (*gemm_function)(const DataMapper&, const std::complex<float>*, const float*,
|
void (*gemm_function)(const DataMapper&, const std::complex<float>*, const float*,
|
||||||
Index, Index, Index, std::complex<float>, Index, Index, Index, Index);
|
Index, Index, Index, std::complex<float>, Index, Index, Index, Index);
|
||||||
#ifdef EIGEN_ALTIVEC_MMA_ONLY
|
#if defined(EIGEN_ALTIVEC_MMA_ONLY)
|
||||||
//generate with MMA only
|
//generate with MMA only
|
||||||
gemm_function = &Eigen::internal::gemm_complexMMA<std::complex<float>, float, std::complex<float>, float, Index, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, false, true>;
|
gemm_function = &Eigen::internal::gemm_complexMMA<std::complex<float>, float, std::complex<float>, float, Index, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, false, true>;
|
||||||
#elif defined(ALTIVEC_MMA_SUPPORT) && !defined(EIGEN_ALTIVEC_DISABLE_MMA)
|
#elif defined(EIGEN_ALTIVEC_MMA_DYNAMIC_DISPATCH)
|
||||||
if (__builtin_cpu_supports ("arch_3_1") && __builtin_cpu_supports ("mma")){
|
if (__builtin_cpu_supports ("arch_3_1") && __builtin_cpu_supports ("mma")){
|
||||||
gemm_function = &Eigen::internal::gemm_complexMMA<std::complex<float>, float, std::complex<float>, float, Index, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, false, true>;
|
gemm_function = &Eigen::internal::gemm_complexMMA<std::complex<float>, float, std::complex<float>, float, Index, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, false, true>;
|
||||||
}
|
}
|
||||||
@ -2633,10 +2637,10 @@ void gebp_kernel<double, double, Index, DataMapper, mr, nr, ConjugateLhs, Conjug
|
|||||||
const Index accCols = quad_traits<double>::size;
|
const Index accCols = quad_traits<double>::size;
|
||||||
void (*gemm_function)(const DataMapper&, const double*, const double*, Index, Index, Index, double, Index, Index, Index, Index);
|
void (*gemm_function)(const DataMapper&, const double*, const double*, Index, Index, Index, double, Index, Index, Index, Index);
|
||||||
|
|
||||||
#ifdef EIGEN_ALTIVEC_MMA_ONLY
|
#if defined(EIGEN_ALTIVEC_MMA_ONLY)
|
||||||
//generate with MMA only
|
//generate with MMA only
|
||||||
gemm_function = &Eigen::internal::gemmMMA<double, Index, Packet, RhsPacket, DataMapper, accRows, accCols>;
|
gemm_function = &Eigen::internal::gemmMMA<double, Index, Packet, RhsPacket, DataMapper, accRows, accCols>;
|
||||||
#elif defined(ALTIVEC_MMA_SUPPORT) && !defined(EIGEN_ALTIVEC_DISABLE_MMA)
|
#elif defined(EIGEN_ALTIVEC_MMA_DYNAMIC_DISPATCH)
|
||||||
if (__builtin_cpu_supports ("arch_3_1") && __builtin_cpu_supports ("mma")){
|
if (__builtin_cpu_supports ("arch_3_1") && __builtin_cpu_supports ("mma")){
|
||||||
gemm_function = &Eigen::internal::gemmMMA<double, Index, Packet, RhsPacket, DataMapper, accRows, accCols>;
|
gemm_function = &Eigen::internal::gemmMMA<double, Index, Packet, RhsPacket, DataMapper, accRows, accCols>;
|
||||||
}
|
}
|
||||||
@ -2671,10 +2675,10 @@ void gebp_kernel<std::complex<double>, std::complex<double>, Index, DataMapper,
|
|||||||
const Index accCols = quad_traits<double>::size;
|
const Index accCols = quad_traits<double>::size;
|
||||||
void (*gemm_function)(const DataMapper&, const std::complex<double>*, const std::complex<double>*,
|
void (*gemm_function)(const DataMapper&, const std::complex<double>*, const std::complex<double>*,
|
||||||
Index, Index, Index, std::complex<double>, Index, Index, Index, Index);
|
Index, Index, Index, std::complex<double>, Index, Index, Index, Index);
|
||||||
#ifdef EIGEN_ALTIVEC_MMA_ONLY
|
#if defined(EIGEN_ALTIVEC_MMA_ONLY)
|
||||||
//generate with MMA only
|
//generate with MMA only
|
||||||
gemm_function = &Eigen::internal::gemm_complexMMA<std::complex<double>, std::complex<double>, std::complex<double>, double, Index, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, false, false>;
|
gemm_function = &Eigen::internal::gemm_complexMMA<std::complex<double>, std::complex<double>, std::complex<double>, double, Index, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, false, false>;
|
||||||
#elif defined(ALTIVEC_MMA_SUPPORT) && !defined(EIGEN_ALTIVEC_DISABLE_MMA)
|
#elif defined(EIGEN_ALTIVEC_MMA_DYNAMIC_DISPATCH)
|
||||||
if (__builtin_cpu_supports ("arch_3_1") && __builtin_cpu_supports ("mma")){
|
if (__builtin_cpu_supports ("arch_3_1") && __builtin_cpu_supports ("mma")){
|
||||||
gemm_function = &Eigen::internal::gemm_complexMMA<std::complex<double>, std::complex<double>, std::complex<double>, double, Index, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, false, false>;
|
gemm_function = &Eigen::internal::gemm_complexMMA<std::complex<double>, std::complex<double>, std::complex<double>, double, Index, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, false, false>;
|
||||||
}
|
}
|
||||||
@ -2709,10 +2713,10 @@ void gebp_kernel<std::complex<double>, double, Index, DataMapper, mr, nr, Conjug
|
|||||||
const Index accCols = quad_traits<double>::size;
|
const Index accCols = quad_traits<double>::size;
|
||||||
void (*gemm_function)(const DataMapper&, const std::complex<double>*, const double*,
|
void (*gemm_function)(const DataMapper&, const std::complex<double>*, const double*,
|
||||||
Index, Index, Index, std::complex<double>, Index, Index, Index, Index);
|
Index, Index, Index, std::complex<double>, Index, Index, Index, Index);
|
||||||
#ifdef EIGEN_ALTIVEC_MMA_ONLY
|
#if defined(EIGEN_ALTIVEC_MMA_ONLY)
|
||||||
//generate with MMA only
|
//generate with MMA only
|
||||||
gemm_function = &Eigen::internal::gemm_complexMMA<std::complex<double>, double, std::complex<double>, double, Index, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, false, true>;
|
gemm_function = &Eigen::internal::gemm_complexMMA<std::complex<double>, double, std::complex<double>, double, Index, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, false, true>;
|
||||||
#elif defined(ALTIVEC_MMA_SUPPORT) && !defined(EIGEN_ALTIVEC_DISABLE_MMA)
|
#elif defined(EIGEN_ALTIVEC_MMA_DYNAMIC_DISPATCH)
|
||||||
if (__builtin_cpu_supports ("arch_3_1") && __builtin_cpu_supports ("mma")){
|
if (__builtin_cpu_supports ("arch_3_1") && __builtin_cpu_supports ("mma")){
|
||||||
gemm_function = &Eigen::internal::gemm_complexMMA<std::complex<double>, double, std::complex<double>, double, Index, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, false, true>;
|
gemm_function = &Eigen::internal::gemm_complexMMA<std::complex<double>, double, std::complex<double>, double, Index, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, false, true>;
|
||||||
}
|
}
|
||||||
@ -2747,10 +2751,10 @@ void gebp_kernel<double, std::complex<double>, Index, DataMapper, mr, nr, Conjug
|
|||||||
const Index accCols = quad_traits<double>::size;
|
const Index accCols = quad_traits<double>::size;
|
||||||
void (*gemm_function)(const DataMapper&, const double*, const std::complex<double>*,
|
void (*gemm_function)(const DataMapper&, const double*, const std::complex<double>*,
|
||||||
Index, Index, Index, std::complex<double>, Index, Index, Index, Index);
|
Index, Index, Index, std::complex<double>, Index, Index, Index, Index);
|
||||||
#ifdef EIGEN_ALTIVEC_MMA_ONLY
|
#if defined(EIGEN_ALTIVEC_MMA_ONLY)
|
||||||
//generate with MMA only
|
//generate with MMA only
|
||||||
gemm_function = &Eigen::internal::gemm_complexMMA<double, std::complex<double>, std::complex<double>, double, Index, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, true, false>;
|
gemm_function = &Eigen::internal::gemm_complexMMA<double, std::complex<double>, std::complex<double>, double, Index, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, true, false>;
|
||||||
#elif defined(ALTIVEC_MMA_SUPPORT) && !defined(EIGEN_ALTIVEC_DISABLE_MMA)
|
#elif defined(EIGEN_ALTIVEC_MMA_DYNAMIC_DISPATCH)
|
||||||
if (__builtin_cpu_supports ("arch_3_1") && __builtin_cpu_supports ("mma")){
|
if (__builtin_cpu_supports ("arch_3_1") && __builtin_cpu_supports ("mma")){
|
||||||
gemm_function = &Eigen::internal::gemm_complexMMA<double, std::complex<double>, std::complex<double>, double, Index, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, true, false>;
|
gemm_function = &Eigen::internal::gemm_complexMMA<double, std::complex<double>, std::complex<double>, double, Index, Packet, Packetc, RhsPacket, DataMapper, accRows, accCols, ConjugateLhs, ConjugateRhs, true, false>;
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,9 @@
|
|||||||
#ifndef EIGEN_MATRIX_PRODUCT_MMA_ALTIVEC_H
|
#ifndef EIGEN_MATRIX_PRODUCT_MMA_ALTIVEC_H
|
||||||
#define EIGEN_MATRIX_PRODUCT_MMA_ALTIVEC_H
|
#define EIGEN_MATRIX_PRODUCT_MMA_ALTIVEC_H
|
||||||
|
|
||||||
#if !EIGEN_COMP_LLVM
|
// If using dynamic dispatch, set the CPU target.
|
||||||
|
#if defined(EIGEN_ALTIVEC_MMA_DYNAMIC_DISPATCH)
|
||||||
|
#pragma GCC push_options
|
||||||
#pragma GCC target("cpu=power10,htm")
|
#pragma GCC target("cpu=power10,htm")
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -615,12 +617,13 @@ void gemm_complexMMA(const DataMapper& res, const LhsScalar* blockAc, const RhsS
|
|||||||
#undef advanceRows
|
#undef advanceRows
|
||||||
#undef advanceCols
|
#undef advanceCols
|
||||||
|
|
||||||
#if !EIGEN_COMP_LLVM
|
|
||||||
#pragma GCC reset_options
|
|
||||||
#endif
|
|
||||||
} // end namespace internal
|
} // end namespace internal
|
||||||
|
|
||||||
} // end namespace Eigen
|
} // end namespace Eigen
|
||||||
|
|
||||||
|
#if defined(EIGEN_ALTIVEC_MMA_DYNAMIC_DISPATCH)
|
||||||
|
#pragma GCC pop_options
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // EIGEN_MATRIX_PRODUCT_MMA_ALTIVEC_H
|
#endif // EIGEN_MATRIX_PRODUCT_MMA_ALTIVEC_H
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user