5

次のようなチュートリアルの簡単なコードがあります。

from multiprocessing import Process, Lock
import os

def f(i):
    print 'hello world', i
    print 'parent process:', os.getppid()
    print 'process id:', os.getpid(), "\n\n"

if __name__ == '__main__':
    lock = Lock()

    for num in range(10):
        p = Process(target=f, args=(num,))
        p.start()
    p.join()

これが両方のコアを使用しているかどうかを確認するにはどうすればよいですか? 現在、3 GB RAM と Intel Core 2 Duo @ 2.2 GHz を搭載した Ubuntu 11.04 を実行しています。

私がこれを学んでいるプロジェクトは、誰かのオフィスの巨大なマシンに移され、現在私が自由に使えるよりもはるかに多くの馬力を備えています。具体的には、プロセッサには少なくとも 4 つのコアがあり、アルゴリズムが利用可能なすべてのコアを自動的に検出して利用できるようにしたいと考えています。また、そのシステムは Linux 以外のものになる可能性があるため、マルチプロセッシング モジュールを OS 間で移動するときに注意しなければならない共通の落とし穴はありますか?

そうそう、また、スクリプトの出力は次のようになります。

hello world 0
parent process: 29362
process id: 29363 


hello world 1
parent process: 29362
process id: 29364 


hello world 2
parent process: 29362
process id: 29365 

and so on...

これまでのところ、PPID はすべて同じです。実行時の上記のスクリプトは、それぞれ異なるプロセスである子プロセスを呼び出す親プロセスであるためです。マルチプロセッシングは複数のコアを自動的に検出して処理しますか? それとも、どこを調べるかを伝える必要がありますか? また、この質問のコピーを検索しているときに読んだことから、そうでなければ計算に使用されるシステムリソースを消費するため、コアよりも多くのプロセスを生成するべきではありません。

あなたの助けを前もってありがとう、私の論文はあなたを愛しています。

4

3 に答える 3

3

コマンドラインからコアを監視するために使用する便利な小さなコマンドを次に示します。

watch -d "mpstat -P ALL 1 1 | head -n 12"

このmpstatコマンドは、システムで使用できる必要があることに注意してください。これは、sysstatパッケージをインストールすることで Ubuntu に取得できます。

sudo apt-get install sysstat

Python から使用可能なコアの数を検出する場合は、関数を使用して検出できますmultiprocessing.cpu_count()。ハイパースレッディングを備えた Intel CPU では、この数は実際のコア数の 2 倍になります。使用可能なコアと同じ数のプロセスを起動すると、プロセスが実行するのに十分な作業があり、通信で行き詰まらない限り、通常、マシン上のすべてのコアを完全に占有するようにスケーリングされます。Linux のプロセス スケジューラはそこから取得します。

于 2012-04-05T23:33:55.190 に答える
1

コードサンプルに関するいくつかのこと。ロックを作成しても、現在はロックを使用していません。そして、開始した最後のプロセスに参加しているだけです。今のところ、問題が発生しないほど迅速に終了する可能性がありますが、以前のプロセスのいずれかが最後のプロセスよりも長くかかった場合は、完了する前に終了する可能性があると思います.

各プロセスが異なるコアで終了することを確認することについて。残念ながらできません。これは、オペレーティング システムのスケジューラが行う決定です。システムが複数のプロセスを並行してスケジュールできるようにするために、複数のプロセスを使用するコードを記述しているだけです。一部は同じコア上にある場合があります。

落とし穴 (落とし穴?) は、実際のコードが実際には複数のプロセスを必要とせず、代わりにスレッド化の恩恵を受ける可能性があることです。また、マルチプロセッシングでメモリを共有する方法にも細心の注意を払う必要があります。プロセス間通信とスレッド間通信には、より多くのオーバーヘッドが伴います。したがって、通常、スレッド化では必要なものが得られない場合のために予約されています。

于 2012-04-05T23:29:06.203 に答える
0

UNIX システムを使用している場合は、「top」コマンドを実行して、同時に表示されるプロセスの数を確認してみてください。やや経験則ではありますが、プロセス一覧を見るだけで倍数が見える場合が多いです。

スクリプトを見ても、複数のプロセスを呼び出している場所がわかりません。multiprocessing.pool をインポートしてから、関数を別のプロセッサにマップできます。
http://docs.python.org/library/multiprocessing.html

于 2012-04-05T23:18:18.150 に答える