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);
.
我在 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);
.