Python multiprocessing.cpu_count() 在 4 核 Nvidia Jetson TK1 上返回“1”

Posted

技术标签:

【中文标题】Python multiprocessing.cpu_count() 在 4 核 Nvidia Jetson TK1 上返回“1”【英文标题】:Python multiprocessing.cpu_count() returns '1' on 4-core Nvidia Jetson TK1 【发布时间】:2015-09-29 10:16:16 【问题描述】:

谁能告诉我为什么 Python 的 multiprocessing.cpu_count() 函数在具有四个 ARMv7 处理器的 Jetson TK1 上调用时会返回 1

>>> import multiprocessing
>>> multiprocessing.cpu_count()
1

Jetson TK1 板或多或少是开箱即用的,没有人弄乱 cpuset。在同一个 Python shell 中,我可以打印 /proc/self/status 的内容,它告诉我该进程应该可以访问所有四个内核:

>>> print open('/proc/self/status').read()
----- (snip) -----
Cpus_allowed:   f
Cpus_allowed_list:      0-3
----- (snip) -----

还有什么可能导致cpu_count() 的这种行为?

编辑:

为了检验 Klaus 的假设,我使用以下代码运行了一个非常简单的实验:

import multiprocessing

def f(x):
    n = 0
    for i in xrange(10000):
        n = max(n, multiprocessing.cpu_count())
    return n

p = multiprocessing.Pool(5)
for i in range(10):
    print p.map(f, [1,2,3,4,5])

产生以下输出:

[3, 3, 3, 3, 1]
[4, 3, 3, 3, 3]
[4, 3, 3, 3, 3]
[3, 3, 4, 3, 3]
[4, 3, 3, 3, 3]
[3, 3, 4, 3, 3]
[4, 3, 3, 3, 3]
[3, 3, 4, 3, 3]
[3, 3, 3, 4, 3]
[4, 3, 3, 3, 3]

只运行p.map(f, [1,2,3,4,5]) 的一次迭代通常会生成[1, 1, 1, 1, 1],尽管偶尔2 会作为列表元素之一出现。

【问题讨论】:

【参考方案1】:

在 Linux 系统上,multiprocessing.cpu_count() 依赖于sysconf (_SC_NPROCESSORS_ONLN) 调用,它返回在线 CPU 的数量,而sysconf (_SC_NPROCESSORS_CONF) 返回配置的数量CPU。

在具有高级 CPU 电源管理功能(将 CPU 内核设置为离线以节省能源)或具有类似动态 CPU 激活功能的系统中,这些值可能会有所不同。

【讨论】:

有趣。我经常看到的一个习惯用法是使用cpu_count() 的返回值来初始化Pool 中的进程数。 TK1 似乎采用的这种“动态 CPU 激活”策略在静止系统上严重破坏了这种习惯用法。是否有一些直接(且可移植)的方法可以从 Python 中获取 可用 处理器的数量(而不是正在使用的数量)? 创建了一个单独的问题 -- ***.com/q/31346974/1337498 -- 关于从 Python 中检测可用处理器的数量。 这可能不是最好的解决方案,但您可以通过猴子补丁 cpu_count() 从其他来源返回号码。【参考方案2】:

os.cpu_count() 的文档(声明它返回 CPU 的总数,而不是可用 CPU 的数量)提供了一种计算可用 CPU 的方法:

len(os.sched_getaffinity(0))

见https://docs.python.org/3/library/os.html#os.cpu_count

【讨论】:

确实,尽管在 Python 2.x 中,cpu_count() 似乎返回了 online CPU 的数量,根据接受的答案。请参阅***.com/a/31347858/1337498,我在其中提出了可用 CPU 的问题,得到的答案与您的基本相同。 (当时我问,我在使用 Python 2.7 时有点卡住,os.sched_getaffinity() 只能在 Python 3.3 及更高版本中使用。)

以上是关于Python multiprocessing.cpu_count() 在 4 核 Nvidia Jetson TK1 上返回“1”的主要内容,如果未能解决你的问题,请参考以下文章

Python代写,Python作业代写,代写Python,代做Python

Python开发

Python,python,python

Python 介绍

Python学习之认识python

python初识