【问题标题】:How to limit the CPU-cores used by scipy.integrate.quad如何限制 scipy.integrate.quad 使用的 CPU 内核
【发布时间】:2022-09-18 04:54:00
【问题描述】:

我有一个使用 scipy.integrate.quad() 的程序。当我使用它时,我注意到它使用了我 PC 上的所有内核,这是我不想要的,因为我想在多个内核上并行运行这个脚本。有没有办法限制功能?

在导入 scipy 和 numpy 之前,我已经尝试使用此命令对其进行限制:

import os
import sys

os.environ.update(
    OMP_NUM_THREADS=\'1\',
    OPENBLAS_NUM_THREADS=\'1\',
    NUMEXPR_NUM_THREADS=\'1\',
    MKL_NUM_THREADS=\'1\',
)

不幸的是,这也无济于事。还有其他我可以尝试的吗?我的 scipy 使用 openblas 以防万一。

    标签: python scipy cpu-cores


    【解决方案1】:

    您的计算机使用的内核由操作系统的较低层处理。无法修改用于一个进程的核心数量。如果你想并行运行程序多次,你应该使用多线程,让计算机自己处理工作量

    【讨论】:

    • 问题是 scipy 在某处集成了多线程,我想将其关闭。当我用我自己的积分函数替换integrate.quad 时,只有一个核心按预期使用(当然,这非常慢,因为它是用python 编写的)。我知道在上面的代码示例中将线程数设置为 1 适用于许多 numpy 函数,但似乎不适用于Integrate.quad。
    • 为什么你只想使用一个核心呢?
    • 我想并行运行其中的多个。目前并行运行它们比简单地一个接一个地运行它们要慢,因此每个作业只希望使用一个内核。
    • 老实说,我仍然不明白您如何确定进程使用的核心数量。你在什么操作系统上?
    • 在 Linux Fedora 上。但是python通常只允许每个进程使用一个核心,scipy可以规避这一点的唯一原因是因为代码不是python代码而是Fortran(我相信)
    【解决方案2】:

    Quad 本身不应该使用并行性。您要集成的功能是什么? (如果它有线性代数,它可能是默认使用所有内核的 openblas 等)

    【讨论】:

    • 起初我也认为是这种情况,但我不仅已经将 openblas 的线程设置为 1,而且当我用自己的 python 积分函数替换 quad 时,程序恢复为仅使用 1 个核心。您确定quad不会在引擎盖下的某处使用并行性吗?
    • 一个最小的复制示例以及您的操作系统、python、numpy 和 scipy 版本会很有帮助。
    猜你喜欢
    • 2017-01-25
    • 2017-08-30
    • 2022-08-15
    • 2019-01-04
    • 2016-08-19
    • 1970-01-01
    • 2020-05-21
    • 2016-04-17
    • 2015-04-10
    相关资源
    最近更新 更多