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
_が生成されます。
Linuxシステムでは、multiprocessing.cpu_count()
はsysconf (_SC_NPROCESSORS_ONLN)
呼び出しに依存します。これはonline CPUの数を返します。これに対して、sysconf (_SC_NPROCESSORS_CONF)
は数を返しますconfigured CPUの。
これらの値は、CPUコアをオフラインに設定してエネルギーを節約する高度なCPU電源管理機能を備えたシステム、または同様の動的CPUアクティベーション機能を備えたシステムでは異なる場合があります。
Os.cpu_count()のドキュメント(使用可能なCPUの数ではなく、CPUの総数を返すことを宣言しています)は、使用可能なCPUをカウントする手段を提供します。
len(os.sched_getaffinity(0))