2016-07-21 10 views
0

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?

Antwort

0

Ich kann Ihr Problem mit Icpc 16.0.3, Eigen 3.2.9 und dem folgenden Code nicht reproduzieren. Sie können den Compiler und die Eigenbibliothek aktualisieren oder einen MCVE-Code erstellen, der das Problem reproduziert.

#include <Eigen/Eigen> 

int main() { 
    Eigen::Matrix2f tmp; 
    tmp << 2, 1, 1, 2; 
    const Eigen::Matrix2f ncov = tmp; 
    Eigen::Vector2f ev = ncov.selfadjointView<Eigen::Lower>().eigenvalues(); 
    return 0; 
}