多处理未在双处理器 Windows 计算机上实现完全 CPU 使用率



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

  • 操作系统:适用于工作站的 Windows 10 专业版
  • 内存: 524 GB
  • 硬盘: 三星固态硬盘 PRO 960 (NVMe(
  • 中央处理器:至强金6154(乘以2(

我使用 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()

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

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

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

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

最新更新