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

Multi-Threading in Eigen (OpenMP is not used)

本文关键字:OpenMP 多线程 特征      更新时间:2023-10-16

我在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!

我在这里阅读,但它实际上并没有清楚地说明当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); 来禁用它。