我在 Eigen 库中使用多线程时遇到问题。 这是我的代码:

#include <QCoreApplication> 
#include <iostream> 
#include "Eigen/Core" 
#include <QDebug> 
 
using namespace Eigen; 
 
int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 
 
    Eigen::setNbThreads(6); 
    qDebug()  << Eigen::nbThreads( ); 
 
    int n = 1000; 
    MatrixXd A = MatrixXd::Ones(n,n); 
    MatrixXd B = MatrixXd::Ones(n,n); 
    MatrixXd C = MatrixXd::Ones(n,n); 
    C.noalias() += A*B; 
    std::cout << C.sum() << "\n"; 
 
 
    return a.exec(); 
} 

无论我做什么,Eigen::nbThreads( ) 总是返回 1,无论我在 Eigen::setNbThreads(6) 中使用什么数字!

我读到here但它实际上并没有明确说明当 OpenMP 不存在时,我们如何才能在并行模式下实际运行 Eigen!

我也做了很多搜索,但它们都与 OpenMP 一起使用!

刚刚发生了什么? Eigen 仅支持 OpenMP 多线程还是也有内置多线程?

提前致谢!

请您参考如下方法:

Eigen 的内置多线程仅适用于激活的 OpenMP。如果您没有使用 OpenMP 进行编译,则 Eigen::setNbThreads(6); 基本上不执行任何操作,否则它本质上相当于调用 omp_set_num_threads (从 Eigen 的角度来看) .

您可以在本身是多线程的应用程序中使用 Eigen(需要注意的主要警告是对 setRandom() 和相关内容的调用,如您链接到的页面上所述)。

此外,如果您自己的多线程基于 OpenMP,但您不希望 Eigen 利用多线程,则可以在编译时通过定义 EIGEN_DONT_PARALLELIZE 来禁用它,或者通过在本地设置Eigen::setNbThreads(1);


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!