xref: /aosp_15_r20/external/eigen/doc/TopicMultithreading.dox (revision bf2c37156dfe67e5dfebd6d394bad8b2ab5804d4)
1namespace Eigen {
2
3/** \page TopicMultiThreading Eigen and multi-threading
4
5\section TopicMultiThreading_MakingEigenMT Make Eigen run in parallel
6
7Some %Eigen's algorithms can exploit the multiple cores present in your hardware.
8To this end, it is enough to enable OpenMP on your compiler, for instance:
9 - GCC: \c -fopenmp
10 - ICC: \c -openmp
11 - MSVC: check the respective option in the build properties.
12
13You can control the number of threads that will be used using either the OpenMP API or %Eigen's API using the following priority:
14\code
15 OMP_NUM_THREADS=n ./my_program
16 omp_set_num_threads(n);
17 Eigen::setNbThreads(n);
18\endcode
19Unless `setNbThreads` has been called, %Eigen uses the number of threads specified by OpenMP.
20You can restore this behavior by calling `setNbThreads(0);`.
21You can query the number of threads that will be used with:
22\code
23n = Eigen::nbThreads( );
24\endcode
25You can disable %Eigen's multi threading at compile time by defining the \link TopicPreprocessorDirectivesPerformance EIGEN_DONT_PARALLELIZE \endlink preprocessor token.
26
27Currently, the following algorithms can make use of multi-threading:
28 - general dense matrix - matrix products
29 - PartialPivLU
30 - row-major-sparse * dense vector/matrix products
31 - ConjugateGradient with \c Lower|Upper as the \c UpLo template parameter.
32 - BiCGSTAB with a row-major sparse matrix format.
33 - LeastSquaresConjugateGradient
34
35\warning On most OS it is <strong>very important</strong> to limit the number of threads to the number of physical cores, otherwise significant slowdowns are expected, especially for operations involving dense matrices.
36
37Indeed, the principle of hyper-threading is to run multiple threads (in most cases 2) on a single core in an interleaved manner.
38However, %Eigen's matrix-matrix product kernel is fully optimized and already exploits nearly 100% of the CPU capacity.
39Consequently, there is no room for running multiple such threads on a single core, and the performance would drops significantly because of cache pollution and other sources of overheads.
40At this stage of reading you're probably wondering why %Eigen does not limit itself to the number of physical cores?
41This is simply because OpenMP does not allow to know the number of physical cores, and thus %Eigen will launch as many threads as <i>cores</i> reported by OpenMP.
42
43\section TopicMultiThreading_UsingEigenWithMT Using Eigen in a multi-threaded application
44
45In the case your own application is multithreaded, and multiple threads make calls to %Eigen, then you have to initialize %Eigen by calling the following routine \b before creating the threads:
46\code
47#include <Eigen/Core>
48
49int main(int argc, char** argv)
50{
51  Eigen::initParallel();
52
53  ...
54}
55\endcode
56
57\note With %Eigen 3.3, and a fully C++11 compliant compiler (i.e., <a href="http://en.cppreference.com/w/cpp/language/storage_duration#Static_local_variables">thread-safe static local variable initialization</a>), then calling \c initParallel() is optional.
58
59\warning Note that all functions generating random matrices are \b not re-entrant nor thread-safe. Those include DenseBase::Random(), and DenseBase::setRandom() despite a call to `Eigen::initParallel()`. This is because these functions are based on `std::rand` which is not re-entrant.
60For thread-safe random generator, we recommend the use of c++11 random generators (\link DenseBase::NullaryExpr(Index, const CustomNullaryOp&) example \endlink) or `boost::random`.
61
62In the case your application is parallelized with OpenMP, you might want to disable %Eigen's own parallelization as detailed in the previous section.
63
64\warning Using OpenMP with custom scalar types that might throw exceptions can lead to unexpected behaviour in the event of throwing.
65*/
66
67}
68