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

Multi-Threading in Eigen (OpenMP is not used)

我在 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( ) 总是 returns 1 无论我在 Eigen::setNbThreads(6)!

中使用什么号码

我读过here,但它实际上并没有说清楚当OpenMP不存在时我们如何在并行模式下实际运行Eigen

我也搜索了很多,但是都用了 OpenMP!

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

提前致谢!

Eigen 的 built-in 多线程仅适用于激活的 OpenMP。如果您没有使用 OpenMP 进行编译,那么 Eigen::setNbThreads(6); 基本上什么都不做,否则它基本上等同于调用 omp_set_num_threads(从 Eigen 的角度来看)。

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

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