sna*_*mer 5 python loops mpi python-2.7 mpi4py
我想在参数列表(比如 50)上创建一个循环。循环应该由多个处理器(比如 4 个)并行共享。我希望每个处理器从列表中选择下一个参数并使用此参数调用函数。函数评估预计花费的时间不等。这是我希望如何安排作业的草图:
pr0 ===job0=== | ========job5======= |
pr1 =====job1======= | ==job7== |
pr2 ===job2=== | ===job6=== |
pr3 =job3= | =========job4======== |
Run Code Online (Sandbox Code Playgroud)
我希望每个进程都知道当前正在运行的作业的 ID,以便它可以选择列表中的下一个元素并开始使用它。到目前为止我尝试过的是使用comm.allgather()
:
from mpi4py import MPI
from random import random
from time import sleep
##### function that just wastes 0-10sec of our time
def run_test(counter, param ):
time_to_waste = random() * 10
sleep( time_to_waste )
print " run job nr: ", counter, "with parameters: ", param, "in :", time_to_waste, "s"
return
############# MAIN
if __name__ == "__main__":
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()
parameters = [random()] * 50
counter = rank
while counter <= 50:
param = parameters[counter]
run_test( counter, param )
print rank, comm.allgather(counter)
counter = max( comm.allgather(counter) ) + size
counter += size
Run Code Online (Sandbox Code Playgroud)
然而,这会产生一个障碍,其中进程正在等待彼此完成各自的工作。当然这完全是低效的,最好从一开始就在处理器之间拆分阵列。我的工作是这样运行的:
pr0 ===job0=== | ========job4======= |
pr1 =====job1======= | ==job5== |
pr2 ===job2=== | ===job6=== |
pr3 =job3= | =========job7======== |
Run Code Online (Sandbox Code Playgroud)
换句话说,我希望一个进程能够始终counter
从所有其他进程访问变量。我可以在进程开始工作之前从进程中进行非阻塞发送,并使它们的counter
s 可用于其他进程。也许共享这个变量的内存是另一种方法。
有没有办法在不专门进行计数的情况下实现这一目标?