在不阻塞的情况下“通知”处理器的正确方法是什么?

Naf*_*aly 5 mpi

假设我有很多东西,我必须对所有这些东西做一些操作。如果一个元素的操作失败,我想停止所有阵列的工作[这项工作分布在多个处理器上]。

我想实现这一点,同时将发送/接收的消息数量保持在最低限度。另外,如果没有必要,我不想阻塞处理器。

我怎样才能使用 MPI 做到这一点?

jbb*_*ard 1

以非阻塞方式导出此全局停止条件的可能策略是依赖MPI_Test.

设想

考虑每个进程使用给定标记将 MPI_INT 类型的异步接收发送到其左侧队列以构建环。然后开始计算。如果一个等级遇到停止条件,它会将自己的等级发送到其正确的等级。同时,每个等级在计算期间MPI_Test检查是否完成,MPI_Irecv如果完成,则进入一个分支,首先等待消息,然后将接收到的等级传递到右侧,除非右侧等级等于该消息的有效负载。消息(不循环)。

完成此操作后,您应该拥有分支中的所有进程,准备好触发任意恢复操作。

复杂

保留的拓扑是一个环,因为它最大限度地减少了消息数量 (n-1),但它增加了传播时间。其他拓扑可以保留更多消息但空间复杂度较低,例如复杂度为 n.ln(n) 的树。

执行

像这样的东西。

int rank, size;
MPI_Init(&argc,&argv);
MPI_Comm_rank( MPI_COMM_WORLD, &rank);
MPI_Comm_size( MPI_COMM_WORLD, &size);

int left_rank = (rank==0)?(size-1):(rank-1);
int right_rank = (rank==(size-1))?0:(rank+1)%size;

int stop_cond_rank;
MPI_Request stop_cond_request;
int stop_cond= 0;

while( 1 )
{
         MPI_Irecv( &stop_cond_rank, 1, MPI_INT, left_rank, 123, MPI_COMM_WORLD, &stop_cond_request);

         /* Compute Here and set stop condition accordingly */

         if( stop_cond )
         {
                 /* Cancel the left recv */
                 MPI_Cancel( &stop_cond_request );
                 if( rank != right_rank )
                            MPI_Send( &rank, 1, MPI_INT, right_rank, 123, MPI_COMM_WORLD ); 

                   break;
         }

         int did_recv = 0;
         MPI_Test( &stop_cond_request, &did_recv, MPI_STATUS_IGNORE );
         if( did_recv )
         {
                  stop_cond = 1;
                  MPI_Wait( &stop_cond_request, MPI_STATUS_IGNORE );
                  if( right_rank != stop_cond_rank )
                            MPI_Send( &stop_cond_rank, 1, MPI_INT, right_rank, 123, MPI_COMM_WORLD );

                   break;
          }
}

if( stop_cond )
{
      /* Handle the stop condition */
}
else
{
      /* Cleanup */
     MPI_Cancel( &stop_cond_request );
}
Run Code Online (Sandbox Code Playgroud)