我们正在将代码从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有什么关系?
答案 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;
}