gpt4 book ai didi

python - numpy "lock"跨进程是什么资源?

转载 作者:行者123 更新时间:2023-11-28 22:16:06 25 4
gpt4 key购买 nike

所以一个 friend 注意到了一些关于 numpy 的事情.这是一个最小的示例,它首先串行运行相同的脚本,然后两个实例在各自的进程中并行运行:

#!/bin/bash
# This is runner.sh

fl=/tmp/$(mktemp test_XXXXX.py)
trap "rm -fv '$fl'" EXIT
cat - > "$fl" <<-'EndOfHereDoc'
#!/usr/bin/env python
import numpy as np
import sys

if __name__ == '__main__':
if len(sys.argv)>1: print(sys.argv[1] +' start: '+ str(datetime.datetime.now()))
cube_size=100
cube=np.zeros((cube_size,cube_size,cube_size))
cube_ones=np.ones((cube_size,cube_size,cube_size))

for x in range(10000):
np.add(cube_ones,cube,out=cube)
if len(sys.argv)>1: print(sys.argv[1] +' start: '+ str(datetime.datetime.now()))
EndOfHereDoc

echo "Serial"
time python "$fl" 0
echo

echo "Parallel"
time python "$fl" 1&
time python3 "$fl" 2&
wait

rm -fv "$fl"
trap '' EXIT

其输出为:

$ runner.sh 
Serial
0 start: 2018-09-19 15:46:52.540881
0 end: 2018-09-19 15:47:04.592280

real 0m12,105s
user 0m12,084s
sys 0m0,020s

Parallel
1 start: 2018-09-19 15:47:04.665260
2 start: 2018-09-19 15:47:04.780635
2 end: 2018-09-19 15:47:27.053261

real 0m22,480s
user 0m22,448s
sys 0m0,128s
1 end: 2018-09-19 15:47:27.097312

real 0m22,505s
user 0m22,409s
sys 0m0,040s
removed '/tmp/test_zWN0V.py'

没有加速。就好像进程一个接一个地运行。我假设 numpy 正在独占使用资源,而另一个进程等待该资源被释放。 但这里到底发生了什么? GIL 应该只是多线程的问题,而不是多进程的问题,对吧?我觉得特别奇怪,p2 不仅仅是在等待 p1 完成。相反,这两个过程都需要大约 22 秒才能完成。我希望有人能获得资源并在一半时间内完成。而另一个等待直到第一个释放它并额外花费 ~12s。

请注意,在 Pool 中使用 python 自己的 multiprocessing 模块运行 python 代码时也会发生这种情况。但是,如果您执行的操作不涉及某些特定的 numpy 函数,例如:

cube_size=25
cube=[0 for i in range(cube_size**3)]

for x in range(10000):
cube = [ value + 1 for value in cube]

编辑:

我有一个真正的 4 核 CPU。我一直牢记超线程,这不是这里的问题。单进程部分,一个CPU 100%,其余闲置。在两个进程部分,两个处于 100%,其余处于空闲状态(根据 htop)。我知道 numpy 在后台运行 ATLAS、LAPACK 和 BLAS 库,它们不是 Python(实际上是纯 C 或 Fortran)。这些可能会利用并行技术。我的问题是,为什么它没有显示在 CPU 利用率中?

最佳答案

Numpy 不像核心 Python 那样受到 GIL 的限制。这是因为 numpy 仅将数组存储为 Python 对象。实际数据本身存储为 C 中定义的“原始”类型。这也是迭代 numpy 数组比迭代 Python 列表慢得多的原因。 numpy 数组必须为它产生的每个值构建一个 Python 对象,而 Python 列表已经有 Python 对象。

由于 numpy 不受 GIL 的阻碍,它能够在可用的情况下使用线程数学库。也就是说,您的并行进程需要更长的时间才能运行,因为每个进程都已经使您的机器达到极限,因此两个进程都在争夺相同的资源。

查看输出并查看您的机器中可用的内容(请注意它非常冗长)。

import numpy.distutils.system_info as sysinfo
sysinfo.show_all()

关于python - numpy "lock"跨进程是什么资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52406563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com