Eigen无法编译"参考EBX函数需要堆栈对齐"用AVX2编译时

时间:2016-07-21 23:35:03

标签: c++ eigen

我们正在将代码从SSE(-msse4.2)移植到AVX2(-march = core-avx2)并在__m256内在函数上使用__m128内在函数。

当Eigen像这样编译时:

/opt/intel/composer_xe_2015.2.164/bin/intel64/icpc -std=c++11 \
    -w2 -Werror -march=core-avx2  -O3 -g  ... 

这是未记录的模糊错误消息:

/eigen/eigen-3.2.5/Eigen/src/Core/products/SelfadjointProduct.h(87): \
  (col. 3) error #13212: Reference to EBX in function requiring stack alignment

以下是我们的代码,引用selfadjoint

   const Eigen::Matrix2f ncov = refLinv * covSlice * refLinv.transpose();
   Eigen::Vector2f ev = ncov.selfadjointView<Eigen::Lower>().eigenvalues();

供参考,这里是Eigen源代码(让我的眼睛流血以阅读模板参数):

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);
  }
};

使用-msse4.2编译好。

任何暗示EBX与AVX2有什么关系?

1 个答案:

答案 0 :(得分:0)

我无法使用icpc 16.0.3,Eigen 3.2.9和以下代码重现您的问题。您可能需要升级编译器和Eigen库,或者创建一个可以重现问题的MCVE代码。

#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;
}