Python multiprocessing.cpu_count() returns '1' 是 4 核 Nvidia Jetson TK1
Python multiprocessing.cpu_count() returns '1' on 4-core Nvidia Jetson TK1
谁能告诉我为什么 Python 的 multiprocessing.cpu_count()
函数在具有四个 ARMv7 处理器的 Jetson TK1 上调用时会 return 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
会作为列表元素之一出现。
在 Linux 系统上 multiprocessing.cpu_count()
依赖于 sysconf (_SC_NPROCESSORS_ONLN)
调用,returns 在线 [=21] =]s 与 sysconf (_SC_NPROCESSORS_CONF)
相反,后者 returns 配置了 CPU 的数量。
在具有高级 CPU 电源管理功能(将 CPU 内核设置为离线以节省能源)或具有类似动态 CPU 激活功能的系统中,这些值可能会有所不同。
os.cpu_count() 的文档(声明它 returns CPU 总数,而不是可用 CPU 的数量)提供了一种计算可用 CPU 的方法:
len(os.sched_getaffinity(0))
谁能告诉我为什么 Python 的 multiprocessing.cpu_count()
函数在具有四个 ARMv7 处理器的 Jetson TK1 上调用时会 return 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
会作为列表元素之一出现。
在 Linux 系统上 multiprocessing.cpu_count()
依赖于 sysconf (_SC_NPROCESSORS_ONLN)
调用,returns 在线 [=21] =]s 与 sysconf (_SC_NPROCESSORS_CONF)
相反,后者 returns 配置了 CPU 的数量。
在具有高级 CPU 电源管理功能(将 CPU 内核设置为离线以节省能源)或具有类似动态 CPU 激活功能的系统中,这些值可能会有所不同。
os.cpu_count() 的文档(声明它 returns CPU 总数,而不是可用 CPU 的数量)提供了一种计算可用 CPU 的方法:
len(os.sched_getaffinity(0))