Многопоточность в Eigen (OpenMP не используется) - PullRequest
0 голосов
/ 15 июня 2019

У меня проблема с использованием многопоточности в библиотеке 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)!

Я читаю здесь , нов действительности это не говорит о том, как мы можем запустить Eigen в параллельном режиме, когда OpenMP отсутствует!

Я также сделал много поисков, но все они используются с OpenMP!

Что только что произошло?Eigen поддерживает только OpenMP для многопоточности или имеет встроенную многопоточность?

Заранее спасибо!

1 Ответ

0 голосов
/ 15 июня 2019

Встроенная многопоточность Eigen работает только с активированным OpenMP. Если вы не компилировали с OpenMP, то Eigen::setNbThreads(6); по сути ничего не делает, в противном случае это по сути эквивалентно вызову omp_set_num_threads (с точки зрения Эйгена).

Вы можете использовать Eigen в приложении, которое само по себе является многопоточным (основное предостережение, с которым следует быть осторожным, это вызовы setRandom() и связанные с ними, как описано на странице, на которую вы ссылаетесь).

Кроме того, если ваша собственная многопоточность основана на OpenMP, но вы не хотите, чтобы Eigen использовал многопоточность, вы можете отключить ее во время компиляции, задав EIGEN_DONT_PARALLELIZE, или локально, установив Eigen::setNbThreads(1);.

...