我想使用MPI开发一个任务调度器,其中只有一个主处理器,并且有工作/客户端处理器。每个worker都有计算所需的所有数据,但是从master获取要处理的索引。计算完成后,worker将一些数据返回给master。问题是有些过程会很快,有些会很慢。如果我运行一个循环,使得主节点在每次迭代中发送和接收(阻塞/非阻塞)数据,那么它不能继续下一步,直到它从分配给它的前一个索引中接收到来自当前worker的数据。底线是,如果一个worker花了太长的时间来计算,那么它就成为了限制因素,即使使用了非阻塞技术,master也不能继续为下一个worker分配索引。是否可以跳过对工作人员的分配而转到下一步。
我开始认为MPI可能不是这样做的范例。python是做任务调度的好平台吗?
发布于 2012-06-25 04:34:01
使用MPI_Irecv()和MPI_Test()绝对可以做到这一点。所有主进程需要做的就是为每个工作进程发送一个非阻塞接收,然后在一个循环中测试每个工作进程的传入数据。如果一个进程已经完成,向它发送一个新的索引,为它发布一个新的非阻塞接收,然后继续。
发布于 2012-06-26 06:32:35
每个进程对应一个MPI_IRecv就是一个解决方案。这样做的缺点是,当工作完成时,需要取消不匹配的MPI_IRecv。
MPI_ANY_SOURCE是另一种路径。这将允许管理器进程在任何给定时间拥有一个未完成的MPI_IRecv,并且MPI_Send的“下一个”进程将与MPI_ANY_SOURCE匹配。当没有额外的工作要做时,这在MPI_Send中有几个等级阻塞的缺点。需要制定出某种“无事可做”的信号,这样才能让员工干净利落地退出。
https://stackoverflow.com/questions/11180624
复制相似问题