【问题标题】:Error in Armadillo with intel C++ compiler使用英特尔 C++ 编译器的犰狳错误
【发布时间】:2015-10-04 14:50:30
【问题描述】:

我使用 Armadillo 4.2 版本(来自 linux mint 包管理器)已经有一段时间了。那个版本用icc编译没问题,用icc编译的代码跑得很快(比g++快10%-15%左右)。

最近我将犰狳升级到最近的 6.1 版本(来自官方网站)。但是在这种情况下,所有的代码都用icc正确编译,但运行时出错。

error: eig_sym(): failed to converge

terminate called after throwing an instance of 'std::runtime_error'
what():  eig_sym(): failed to converge
Aborted

使用 g++ 正确编译的代码可以完美运行。 我也试过以前的5.6版本,但同样的问题。 有什么解决办法??我必须恢复到旧的 4.2 版本才能从 icc 获得额外的速度......

【问题讨论】:

    标签: c++ gcc g++ armadillo icc


    【解决方案1】:

    众所周知,英特尔 C++ 编译器在处理诸如 Armadillo 之类的大量模板库时包含错误(参见例如 herehere)。

    您可以通过启用自动矢量化(使用 -O3)和使用本机机器指令集(使用 -march=native)来提高 gcc 编译代码的性能。例如:

    g++ code.cpp -o code -O3 -march=native -larmadillo
    

    还要确保您传递给eig_sym() 的矩阵实际上是对称的。

    【讨论】:

    • 感谢您的回答。不幸的是,英特尔 C++ 编译器中存在错误(即使它是最新版本)。我还在 icc 中遇到了一个关于使用初始化列表进行向量构造的错误。顺便说一句,我正在使用 -O3-march=native 与 g++,并且矩阵是对称的。
    • 根据我的经验,我不信任英特尔编译器。它提供的微小加速并不值得为它所拥有的所有错误而烦恼。我怀疑英特尔编译器的开发团队远小于 gcc 或 clang。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 2014-06-14
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多