我在 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( ) 总是返回 1,无论我在 Eigen::setNbThreads(6) 中使用什么数字!
我读到here但它实际上并没有明确说明当 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);。






