[Eigen中文文档] Eigen 和多线程

简介: 某些 Eigen 算法可以利用硬件中存在的多个内核。

文档总目录

英文原文(Eigen and multi-threading)

使 Eigen 并行运行

某些 Eigen 算法可以利用硬件中存在的多个内核。为此,在编译器上启用 OpenMP 就足够了,例如:

  • GCC:-fopenmp
  • ICC:-openmp
  • MSVC:检查构建属性中的相应选项。

可以使用 OpenMP API 或 Eigen 的 API 使用以下优先级来控制将使用的线程数:

OMP_NUM_THREADS=n ./my_program
omp_set_num_threads(n);
Eigen::setNbThreads(n);

除非调用了 setNbThreads,否则 Eigen 将使用 OpenMP 指定的线程数。可以通过调用 setNbThreads(0); 来恢复此行为。可以查询将使用的线程数:

n = Eigen::nbThreads( );

可以通过定义 EIGEN_DONT_PARALLELIZE 预处理器标记在编译时禁用 Eigen 的多线程。

目前,以下算法可以利用多线程:

警告:

在大多数操作系统上,将线程数量限制为物理核心数量非常重要,否则预计会显着降低速度,特别是对于涉及密集矩阵的操作。

确实,超线程的原理是在单个内核上以交错的方式运行多个线程(在大多数情况下为2)。然而,Eigen的矩阵乘积内核已经完全优化,并且已经利用了将近100%的CPU容量。因此,在单个核上运行多个此类线程的空间非常有限,性能会因为缓存污染和其他开销而显著下降。在阅读到这个阶段,可能会想知道为什么Eigen不仅限于物理核心的数量?这只是因为OpenMP不允许知道物理核心的数量,因此Eigen将启动与OpenMP报告的核心数一样多的线程。

在多线程应用程序中使用 Eigen

如果应用程序是多线程的,并且多个线程调用 Eigen,那么必须在创建线程之前通过调用以下例程来初始化 Eigen:

#include <Eigen/Core>

int main(int argc, char** argv)
{
   
  Eigen::initParallel();

  ...
}

注意:

使用 Eigen 3.3 和完全兼容 C++11 的编译器(即线程安全的静态局部变量初始化),调用 initParallel() 是可选的。

警告:

需要注意的是,所有生成随机矩阵的函数都不是可重入的,也不是线程安全的。这些函数包括DenseBase::Random()DenseBase::setRandom(),尽管它们调用了Eigen::initParallel()。这是因为这些函数是基于std::rand的,而std::rand不是可重入的。为了获得线程安全的随机生成器,我们建议使用c++11随机生成器或boost::random

如果应用程序与 OpenMP 并行化,可能需要禁用 Eigen 自己的并行化,如上一节所述。

警告:

OpenMP 与可能引发异常的自定义标量类型一起使用可能会在引发异常时导致意外行为。

相关文章
|
XML 并行计算 算法
[Eigen中文文档] 求解稀疏线性系统
在Eigen中,有多种方法可用于求解稀疏系数矩阵的线性系统。由于此类矩阵的特殊表示,必须特别小心以获得良好的性能。本文列出了Eigen中可用的稀疏求解器。还介绍了所有这些线性求解器共同的主要步骤。根据矩阵的属性、所需的准确度,最终用户可以调整这些步骤以提高其代码的性能。请注意,并不需要深入了解这些步骤背后的内容:最后一节介绍了一个基础例程,可轻松使用以获取所有可用求解器的性能洞察。
701 0
|
缓存 测试技术 编译器
[Eigen中文文档] 稠密矩阵分解函数对比
本文介绍了 Eigen 为各种方阵和过约束问题提供的稠密矩阵分解的速度比较。
289 0
|
9月前
|
机器学习/深度学习 人工智能 并行计算
《解锁 Eigen 库在 C++人工智能项目中的潜能与优化之道》
Eigen 库是 C++ 人工智能项目的得力助手,专注于线性代数运算,广泛应用于神经网络、数据预处理和优化算法等领域。其高效的内存布局、表达式模板和多线程并行计算等优化技巧,显著提升了项目性能,助力开发者构建高效的人工智能系统。
262 20
|
存储 并行计算 算法
[Eigen中文文档] 概述(总目录)
Eigen是基于线性代数的C ++模板库,主要用于矩阵,向量,数值求解器和相关算法。常用的Ceres、G2O等项目均是基于Eigen库。 本系列文章将通过官方文档带你了解Eigen。
2437 1
|
存储 C语言 C++
|
存储 缓存
[Eigen中文文档] 深入了解 Eigen - 惰性求值与混叠(Aliasing)
Eigen具有智能的编译时机制,可以实现惰性求值并在适当的情况下删除临时变量。它会自动处理大多数情况下的混叠问题,例如矩阵乘积。自动行为可以通过使用MatrixBase::eval()和MatrixBase::noalias()方法手动覆盖。
540 0
|
存储 编译器
|
存储 编译器 调度
|
并行计算 算法 Linux
[Eigen中文文档] 在 BLAS/LAPACK 、英特尔® MKL 和 CUDA 中使用 Eigen
自Eigen 3.3版本以及以后,任何F77兼容的BLAS或LAPACK库都可以用作稠密矩阵乘积和稠密矩阵分解的后端。例如,可以在OSX上使用Intel® MKL,Apple的Accelerate框架,OpenBLAS,Netlib LAPACK等。 请务必查看此页面以进一步讨论关于使用Intel® MKL(也包括VML,PARDISO等)的具体用法。
933 0
[Eigen中文文档] 在 CMake 项目中使用 Eigen
Eigen提供了CMake(CMake 3.0或更高版本)支持,使得该库可以轻松地在CMake项目中使用。
1185 1