Wir portieren Code von SSE (-msse4.2) zu AVX2 (-march = core-avx2) und verwenden __m256
intrinsics über __m128
Intrinsics.Eigenes Kompilieren mit "Referenz auf EBX in Funktion, die Stapelausrichtung erfordert" beim Kompilieren mit AVX2
Wenn Eigen wird wie folgt zusammengestellt:
/opt/intel/composer_xe_2015.2.164/bin/intel64/icpc -std=c++11 \
-w2 -Werror -march=core-avx2 -O3 -g ...
Dies ist die obskure Fehlermeldung, die nicht dokumentiert ist:
/eigen/eigen-3.2.5/Eigen/src/Core/products/SelfadjointProduct.h(87): \
(col. 3) error #13212: Reference to EBX in function requiring stack alignment
hier, um unseren Code, zu selfadjoint
bezieht:
const Eigen::Matrix2f ncov = refLinv * covSlice * refLinv.transpose();
Eigen::Vector2f ev = ncov.selfadjointView<Eigen::Lower>().eigenvalues();
Als Referenz ist hier der Eigen-Quellcode (lässt meine Augen bluten, um zu lesen die Template Argumente):
template<typename MatrixType, typename OtherType, int UpLo>
struct selfadjoint_product_selector<MatrixType,OtherType,UpLo,false>
{
static void run(MatrixType& mat, const OtherType& other, const typename MatrixType::Scalar& alpha)
{
typedef typename MatrixType::Scalar Scalar;
typedef typename MatrixType::Index Index;
typedef internal::blas_traits<OtherType> OtherBlasTraits;
typedef typename OtherBlasTraits::DirectLinearAccessType ActualOtherType;
typedef typename internal::remove_all<ActualOtherType>::type _ActualOtherType;
typename internal::add_const_on_value_type<ActualOtherType>::type actualOther = OtherBlasTraits::extract(other.derived());
Scalar actualAlpha = alpha * OtherBlasTraits::extractScalarFactor(other.derived());
enum { IsRowMajor = (internal::traits<MatrixType>::Flags&RowMajorBit) ? 1 : 0 };
internal::general_matrix_matrix_triangular_product<Index,
Scalar, _ActualOtherType::Flags&RowMajorBit ? RowMajor : ColMajor, OtherBlasTraits::NeedToConjugate && NumTraits<Scalar>::IsComplex,
Scalar, _ActualOtherType::Flags&RowMajorBit ? ColMajor : RowMajor, (!OtherBlasTraits::NeedToConjugate) && NumTraits<Scalar>::IsComplex,
MatrixType::Flags&RowMajorBit ? RowMajor : ColMajor, UpLo>
::run(mat.cols(), actualOther.cols(),
&actualOther.coeffRef(0,0), actualOther.outerStride(), &actualOther.coeffRef(0,0), actualOther.outerStride(),
mat.data(), mat.outerStride(), actualAlpha);
}
};
Dies kompiliert gut mit -msse4.2.
Irgendwelche Hinweise, was EBX mit AVX2 zu tun hat?