在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!
我读过here,但实际上并没有明确说明在不存在Eigen
的情况下如何实际运行OpenMP
的并行模式!
我也进行了很多搜索,但是所有搜索都与OpenMP
一起使用!
发生了什么事? Eigen
仅支持OpenMP
进行多线程处理还是它也具有内置的多线程处理?
提前谢谢!
答案 0 :(得分:0)
Eigen的内置多线程功能仅适用于已激活的OpenMP。如果您未使用OpenMP进行编译,则Eigen::setNbThreads(6);
实际上什么也不做,否则从本质上讲等效于调用omp_set_num_threads
(从Eigen的角度来看)。
您可以在本身是多线程的应用程序中使用Eigen(要注意的主要警告是对setRandom()
的调用以及相关的调用,如所链接的页面所述)。
此外,如果您自己的多线程基于OpenMP,但是您不希望Eigen利用多线程,则可以在编译时通过定义EIGEN_DONT_PARALLELIZE
来禁用它,也可以在本地通过设置{{1 }}。