web-dev-qa-db-fra.com

Python multiprocessing.cpu_count () renvoie '1' sur Nvidia Jetson TK1 à 4 cœurs

Quelqu'un peut-il me dire pourquoi la fonction multiprocessing.cpu_count() de Python retournerait 1 Lorsqu'elle est appelée sur un Jetson TK1 avec quatre processeurs ARMv7?

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

La carte Jetson TK1 est plus ou moins directement sortie de la boîte, et personne n'a dérangé avec les cpusets. Depuis le même Python Shell je peux imprimer le contenu de /proc/self/status Et il me dit que le processus devrait avoir accès aux quatre cœurs:

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

Quoi d'autre pourrait être à l'origine de ce comportement à partir de cpu_count()?

Éditer:

Pour tester l'hypothèse de Klaus, j'ai utilisé le code suivant pour exécuter une expérience très simple:

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])

Qui a produit la sortie suivante:

[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]

L'exécution d'une seule itération de p.map(f, [1,2,3,4,5]) produit généralement [1, 1, 1, 1, 1], Bien qu'à l'occasion un 2 Apparaisse comme l'un des éléments de la liste.

11
Hephaestus

Sur les systèmes Linux, multiprocessing.cpu_count() s'appuie sur un appel sysconf (_SC_NPROCESSORS_ONLN), qui renvoie le nombre de en ligne CPU contrairement à sysconf (_SC_NPROCESSORS_CONF) qui renvoie le nombre de configuré CPU.

Les valeurs peuvent différer dans les systèmes dotés d'une fonctionnalité avancée de gestion de l'alimentation du processeur qui met les cœurs du processeur hors ligne pour économiser de l'énergie ou avec une fonctionnalité d'activation dynamique du processeur similaire.

21
Klaus D.

La documentation d'os.cpu_count () (qui déclare qu'elle renvoie le nombre total de CPUS, pas le nombre de CPU utilisables) fournit un moyen de compter les CPU utilisables:

len(os.sched_getaffinity(0))

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

0
Rizzer