web-dev-qa-db-ja.com

Python multiprocessing.cpu_count()は、4コアのNvidia Jetson TK1で「1」を返します

4つのARMv7プロセッサを搭載したJetson TK1で呼び出されたときにPythonのmultiprocessing.cpu_count()関数が_1_を返す理由を誰かに教えてもらえますか?

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

Jetson TK1ボードは、箱から出してほぼまっすぐで、誰もcpusetsをいじっていません。同じPython Shell内から、_/proc/self/status_の内容を出力できます。これにより、プロセスは4つのコアすべてにアクセスできるはずです。

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

他に何がcpu_count()からこの動作を引き起こしているのでしょうか?

編集:

クラウスの仮説をテストするために、次のコードを使用して非常に単純な実験を実行しました。

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

_[1, 1, 1, 1, 1]_がリスト要素の1つとして表示されることもありますが、p.map(f, [1,2,3,4,5])の単一の反復を実行すると、通常_2_が生成されます。

11
Hephaestus

Linuxシステムでは、multiprocessing.cpu_count()sysconf (_SC_NPROCESSORS_ONLN)呼び出しに依存します。これはonline CPUの数を返します。これに対して、sysconf (_SC_NPROCESSORS_CONF)は数を返しますconfigured CPUの。

これらの値は、CPUコアをオフラインに設定してエネルギーを節約する高度なCPU電源管理機能を備えたシステム、または同様の動的CPUアクティベーション機能を備えたシステムでは異なる場合があります。

21
Klaus D.

Os.cpu_count()のドキュメント(使用可能なCPUの数ではなく、CPUの総数を返すことを宣言しています)は、使用可能なCPUをカウントする手段を提供します。

len(os.sched_getaffinity(0))

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

0
Rizzer