これで、マルチスレッドの深さ優先検索をツリーのような構造にしたいと思っています。私はこのためにクラスタ内の複数のコンピュータからスレッドを使用しています(この例ではlocalhost quad-coreとraspberry pi 2)。マスタースレッドはプロセスを開始し、ツリー内の最初の分割で、分割する各ノードごとに新しいスレッドを生成する必要があります。これらのスレッドは、結果をマスターに報告することができます。MPI Pythonで動的なスポーンを使った深さ優先検索
mpiexecにスレッドをいくつか提供するのではなく、動的にこれを実行しようとしています。ツリーがあらかじめどのように見えるのかわからないからです(例えば2または9の分割があるかもしれません)。
私はこの質問のために取り組んでいるプロジェクトからサンプルを作成しました。次のように作業しています。それは、数字の文字列から1桁を取り、各数字のためにスレッドを生成し、そのスレッドにその数字を送信します。マスターのために
:
#!/usr/bin/python
from mpi4py import MPI
import datetime, sys, numpy, time
################ Set up MPI variables ################
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()
name = MPI.Get_processor_name()
status = MPI.Status()
################ Master code ################
script = 'cpi.py'
for d in '34':
try:
print 'Trying to spawn child process...'
icomm = MPI.COMM_SELF.Spawn(sys.executable, args=[script], maxprocs=1, root=0)
spawnrank = icomm.Get_rank()
icomm.send(d, dest=spawnrank, tag=11)
print 'Spawned rank %d.' % spawnrank
except: ValueError('Spawn failed to start.')
solved = False
while solved == False:
#while not comm.Iprobe(source=MPI.ANY_SOURCE, tag=MPI.ANY_TAG):
# print 'spawns doing some work...'
# time.sleep(1)
solved = comm.recv(source=MPI.ANY_SOURCE, tag=22)
print 'received solution: %d' % solved
それは正しく労働者を生成します、彼らは数字を受けるが、マスタに戻ってそれを送信しません。これは、マスタコードの最後の行に到達したことがない
労働者
#!/usr/bin/python
from mpi4py import MPI
import datetime, sys, numpy
################ Set up MPI variables ################
icomm = MPI.Comm.Get_parent()
comm = MPI.COMM_WORLD
irank = comm.Get_rank()
rank = comm.Get_rank()
running = True
while running:
data = None
data = icomm.recv(source=0, tag=11)
if data:
print 'Trying to send %s from worker rank %d to %d' % (data, rank, irank)
icomm.send(data, dest=0, tag=22)
break
print 'Worker on rank %d done.' % rank
icomm.Disconnect()
:労働者のためのコードは次のようです。また、マスターコードにプローブを追加して(コメントアウトして)、タグ22のメッセージがどこかでぶら下がっているかどうかを確認し、recv関数でエラーを除外していますが、プローブがメッセージを見つけることはありません。だから私はそれが送信されないと仮定します。
両方のプロセスのランクを印刷して計算したところ、これらは両方ともランク0を使用しています。これは同じコンピュータ上で生成されるため意味があります。私はホストファイルとrankfileを追加する場合しかし、その後、奴隷のために別のコンピュータを使用するように強制しようとしている、それは私に次のエラーを与える:
[hch-K55A:06917] *** Process received signal ***
[hch-K55A:06917] Signal: Segmentation fault (11)
[hch-K55A:06917] Signal code: Address not mapped (1)
[hch-K55A:06917] Failing at address: 0x3c
[hch-K55A:06917] [ 0] /lib/x86_64-linux-gnu/libpthread.so.0(+0x10340) [0x7f2c0d864340]
[hch-K55A:06917] [ 1] /usr/lib/openmpi/lib/openmpi/mca_rmaps_rank_file.so(orte_rmaps_rank_file_lex+0x4a0) [0x7f2c0abdcb70]
[hch-K55A:06917] [ 2] /usr/lib/openmpi/lib/openmpi/mca_rmaps_rank_file.so(+0x23ac) [0x7f2c0abda3ac]
[hch-K55A:06917] [ 3] /usr/lib/libopen-rte.so.4(orte_rmaps_base_map_job+0x2e) [0x7f2c0dacd05e]
[hch-K55A:06917] [ 4] /usr/lib/libopen-rte.so.4(orte_plm_base_setup_job+0x5a) [0x7f2c0dac580a]
[hch-K55A:06917] [ 5] /usr/lib/openmpi/lib/openmpi/mca_plm_rsh.so(orte_plm_rsh_launch+0x338) [0x7f2c0b80a8c8]
[hch-K55A:06917] [ 6] /usr/lib/libopen-rte.so.4(+0x51ff4) [0x7f2c0dac3ff4]
[hch-K55A:06917] [ 7] /usr/lib/libopen-rte.so.4(opal_event_base_loop+0x31e) [0x7f2c0dae9cfe]
[hch-K55A:06917] [ 8] mpiexec() [0x4047d3]
[hch-K55A:06917] [ 9] mpiexec() [0x40347d]
[hch-K55A:06917] [10] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5) [0x7f2c0d4b0ec5]
[hch-K55A:06917] [11] mpiexec() [0x403399]
[hch-K55A:06917] *** End of error message ***
Segmentation fault (core dumped)
使用するコマンド:mpiexecの-np 1 --hostfileホストファイル - -rankfile rankfileパイソンspawntest.py
HOSTFILE:ローカルホスト ローカルホストスロット= 1 MAX-スロット= 4 PI2する@ raspi2スロット= 4
Rankfile: ランク0 = localhostのスロット= 1 ランク1 = pi2 @ raspi2 slot = 1-4
私の質問は次のとおりです。データを前後に送信できる間に、マスター以外のコンピューターにこれらのスレッドをスポーンするにはどうすればよいですか?
詳細な回答をいただきありがとうございます。 – Enzime