首页 > 解决方案 > 多处理未在双处理器 Windows 机器上实现完整的 CPU 使用率

问题描述

我正在使用双处理器 Windows 机器,并尝试使用多处理库运行几个独立的 python 进程。当然,我的目标是最大限度地利用两个 CPU,以加快计算时间。我的机器的详细信息如下:

我使用 Python 3.6 执行一个主脚本,然后使用多处理库生成 72 个独立于内存的工作程序。最初,我机器的所有 72 个内核都以 100% 的速度使用。然而,大约 5-10 分钟后,我的第二个 CPU 上的所有 36 个内核的使用率都降至 0%,而第一个 CPU 上的 36 个内核仍保持在 100%。我无法弄清楚为什么会这样。

关于双处理器 Windows 机器中两个 CPU 的利用率,我有什么遗漏吗?如何确保充分利用机器的潜力?作为旁注,我很好奇如果我使用的是 Linux 操作系统,这是否会有所不同?预先感谢任何愿意为此提供帮助的人。

我的 python 主脚本的表示如下:

import pandas as pd
import netCDF4 as nc
from multiprocessing import Pool

WEATHERDATAPATH = "C:/Users/..../weatherdata/weatherfile_%s.nc4"
OUTPUTPATH = "C:/Users/....outputs/result_%s.nc4"

def calculationFunction(year):
    dataset = nc.Dataset(WEATHERDATAPATH%year)

    # Read the data
    data1 = dataset["windspeed"][:]
    data2 = dataset["pressure"][:]
    data3 = dataset["temperature"][:]

    timeindex = nc.num2date(dataset["time"][:], dataset["time"].units)

    # Do computations with the data, primarily relying on NumPy
    data1Mean = data1.mean(axis=1)
    data2Mean = data2.mean(axis=1)
    data3Mean = data3.mean(axis=1)

    # Write result to a file
    result = pd.DataFrame( {"windspeed":data1Mean,
                            "pressure":data2Mean,
                            "temperature":data3Mean,}, 
                          index=timeindex )
    result.to_csv(OUTPUTPATH%year)

if __name__ == '__main__':
    pool = Pool(72)

    results = []
    for year in range(1900,2016): 
        results.append( pool.apply_async(calculationFunction, (year, )))

    for r in results: r.get()

标签: pythonwindowspandaspython-multiprocessingmultiprocessor

解决方案


事实证明,问题出在 NumPy 上。正如这个解决方案所解释的,NumPy 和其他几个类似的包依赖 BLAS 库进行数值运算。该库使用多线程来提高性能。但是由于多线程受 CPU 限制,这会导致 Numpy 执行的许多操作(在我的原始代码中直到中间才开始,正如我所指出的那样),被强制到第一个 CPU 上。

解决方案是关闭 BLAS 库的多线程功能。我不确定这是否会影响性能,但在这种情况下,我认为没关系。幸运的是,这很容易做到,我只需要设置一个我直接在我的 python 代码中执行的环境变量:

import os
os.environ["OPENBLAS_MAIN_FREE"] = "1"

现在机器在我的整个代码中满负荷运行:)


推荐阅读