我有一个具有以下结构的 MPI 计算:每个处理器都有一个大的只读内存区域,分为多个块。在计算时期,每个处理器执行以下形式的(不同)数量的步骤:
- 收集不同处理器的几块数据。
- 进行一些计算并存储结果。
尽管总负载平衡良好,但不同的步骤在不同的处理器之间可能会花费非常不同的时间。
对于使用 MPI_Get 进行单向通信,这种结构看起来几乎是完美的。但是,我看不到如何将此结构适合任何可用的同步模型,至少使用单个窗口。以下是选项:
MPI_Win_fence:不起作用,因为不同的处理器执行不同数量的步骤。
MPI_Win_start/complete/post/wait:不起作用,因为它需要原始进程上的访问时期和目标进程上的曝光时期之间的 1-1 匹配。换句话说,起源需要在进程之间进行多次不连贯的同步,因此目标无法选择单一一致的曝光时期集。
MPI_Win_lock/unlock:不起作用,因为您一次不能只针对一个等级。
我也没有看到任何使用多个窗口的解决方案,因为我相信窗口不允许重叠,并且这里多个来源经常访问相同的内存块。
请注意,使用 MPI_Isend、MPI_Irecv 和 MPI_Wait_all 很容易处理这种情况,只要目标进程轮询或具有响应请求的通信线程即可。当一个进程想要收集数据时,它会发出一堆 MPI_Isend 请求,发布相应数量的 MPI_Irecv 以接受数据,并执行 MPI_Wait_all 直到收集到数据集。
有没有办法让片面的沟通在这里发挥作用?
更新:这似乎相关:http ://www.cs.berkeley.edu/~bonachea/upc/mpi2.html