Eigen 中的多线程(未使用 OpenMP)

Nim*_*rab 1 c++ parallel-processing qt multithreading 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();
}
Run Code Online (Sandbox Code Playgroud)

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

我读到这里,但它实际上并没有清楚地说明我们如何在不存在的情况下实际Eigen以并行模式运行!OpenMP

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

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

提前致谢!

cht*_*htz 5

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

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

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