在这个回答Multiprocessing.Pool makes Numpy matrix multiplication slower
作者的回答中,在第二段中建议使用启用的 OpenMP 指令重新编译 Numpy。所以我的问题是:
- 你是怎样做的?
- 什么可能是负面影响?
- 你会推荐吗?
搜索所以我发现以下帖子OpenMP 和 Python,其中的答案解释了为什么由于 GIL 而在一般 Python 中没有使用 OpenMP。但我认为 Numpy 是一个不同的问题。
在这个回答Multiprocessing.Pool makes Numpy matrix multiplication slower
作者的回答中,在第二段中建议使用启用的 OpenMP 指令重新编译 Numpy。所以我的问题是:
搜索所以我发现以下帖子OpenMP 和 Python,其中的答案解释了为什么由于 GIL 而在一般 Python 中没有使用 OpenMP。但我认为 Numpy 是一个不同的问题。
虽然 Python 代码本身很难从并行运行中受益,但 NumPy 并不是用 Python 编写的。实际上,它是一些非常成熟的数值计算库和其他数值算法的 Python 包装器,它们都用 Fortran 和 C 等编译语言实现。其中一些库已经有并行多线程版本(如英特尔 MKL 和 ATLAS,当用于在 NumPy 中提供 BLAS 和 LAPACK 实现)。
这个想法是,在 NumPy 程序中,Python 代码应该只用于驱动计算,而所有繁重的工作都应该在 C 或 Fortran 后端完成。如果您的程序没有将大部分运行时间花在 NumPy 例程中,那么阿姆达尔定律将阻止您通过并行 NumPy 获得合理的加速。
为了让 NumPy 支持 OpenMP,您必须拥有支持 OpenMP 的 C 编译器。现在大多数 C 编译器都支持 OpenMP,这包括 GCC、Intel C Compiler、Oracle C Compiler,甚至 Microsoft Visual C Compiler(尽管它停留在一个古老的 OpenMP 版本)。阅读安装手册了解详细说明。