并行队列系统,是否存在非阻塞等效聚集? mpi4py

时间:2016-03-25 16:34:02

标签: python python-2.7 loops mpi mpi4py

我想在参数列表上创建一个循环(比如说50)。 循环应由几个处理器(比如4个)并行共享。 我希望每个处理器从列表中选择下一个参数 并使用此参数调用函数。 功能评估预计会花费不等的时间。 这是我希望如何安排工作的草图:

pr0 ===job0=== | ========job5======= | 
pr1 =====job1======= | ==job7== |
pr2 ===job2=== | ===job6=== | 
pr3 =job3= | =========job4======== | 

我希望每个进程都能够了解当前正在运行的作业的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

然而,这会产生一个障碍,即进程正在等待彼此完成各自的工作。当然这个 效率非常低,最好从一开始就在处理器之间拆分数组。我的工作就像这样:

pr0 ===job0===       | ========job4=======   | 
pr1 =====job1======= | ==job5==              |
pr2 ===job2===       | ===job6===            | 
pr3 =job3=           | =========job7======== | 

换句话说,我希望一个进程能够始终从所有其他进程访问counter变量。我可以在开始作业之前从进程发出非阻塞发送,并使其counter可用于其他进程。也许为这个变量共享内存是另一种方法。

有没有办法实现这一点而不需要专门的程序来进行计数?

0 个答案:

没有答案