关于C#:本征中的多线程(不使用OpenMP)

Multi-Threading in Eigen (OpenMP is not used)

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#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() <<"\
"
;


    return a.exec();
}

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

我在这里读过,但实际上并没有明确说明当OpenMP不存在时如何在并行模式下实际运行Eigen

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

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

谢谢!


Eigen \\的内置多线程功能仅适用于已激活的OpenMP。如果未使用OpenMP进行编译,则Eigen::setNbThreads(6);本质上不执行任何操作,否则本质上等效于调用omp_set_num_threads(从Eigen \\的angular来看)。

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

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