本征中的多线程(不使用OpenMP)

时间:2019-06-15 12:02:22

标签: c++ multithreading qt parallel-processing eigen

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( )中使用什么数字,无论我做什么,Eigen::setNbThreads(6)总是返回1!

我读过here,但实际上并没有明确说明在不存在Eigen的情况下如何实际运行OpenMP的并行模式!

我也进行了很多搜索,但是所有搜索都与OpenMP一起使用!

发生了什么事? Eigen仅支持OpenMP进行多线程处理还是它也具有内置的多线程处理?

提前谢谢!

1 个答案:

答案 0 :(得分:0)

Eigen的内置多线程功能仅适用于已激活的OpenMP。如果您未使用OpenMP进行编译,则Eigen::setNbThreads(6);实际上什么也不做,否则从本质上讲等效于调用omp_set_num_threads(从Eigen的角度来看)。

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

此外,如果您自己的多线程基于OpenMP,但是您不希望Eigen利用多线程,则可以在编译时通过定义EIGEN_DONT_PARALLELIZE来禁用它,也可以在本地通过设置{{1 }}。