MPI irecv,是任务之间的沟通

时间:2016-01-11 18:31:21

标签: mpi nonblocking

我是MPI的新手,很抱歉,如果这听起来很愚蠢。我希望进程有MPI_Irecv。如果已为某个任务调用它,那么它会找到一个结果并将结果发送回调用它的进程。如何检查它是否已实际分配给任务?因此,我可以使用if{}执行该任务,而其他过程继续执行其他任务。

代码示例:

for (i=0;i<size_of_Q;i++) {
    MPI_Irecv( &shmeio, 1, mpi_point_C, root, 77, MPI_COMM_WORLD, &req );
    //I want to put an if right here.
    //If it's true process does task.
    //Finds a number. then
    MPI_Isend( &Bestcandidate, 1, mpi_point_C, root, 66, MPI_COMM_WORLD, &req );
    //so that it can return the result.
    //if it wasn't assigned a task it carries on with its other tasks. 
} //(here is where for loop  ends)

1 个答案:

答案 0 :(得分:1)

你可能会混淆MPI应该做的事情。与其他一些模型相比,MPI并不是一个真正的基于任务的模型(map reduce,OpenMP的某些部分等)。 MPI历来专注于SPMD(单程序多数据)类型的应用程序。这并不是说MPI无法处理MPMD(关于动态流程的标准中有一整章,大多数发射器可以在不同的级别上运行不同的可执行文件。

考虑到这一点,当您开始工作时,您通常会拥有您曾经拥有的所有流程(除非您使用MPI_COMM_SPAWN之类的动态处理) 。你可能使用了类似的东西:

mpiexec -n 8 ./my_program arg1 arg2 arg3

很多时候,如果人们试图模仿任务(或主人/工人)模型,他们会将0级视为特殊的&#34;主人&#34;:

MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);

if (0 == rank) {
    while (/* work not done */) {
        /* Check if parts of work are done */
        /* Send work to ranks without work */
    }
} else {
    while (/* work not done */ {
        /* Get work from master */
        /* Compute */
        /* Send results to master */
    }
}

通常,在等待工作时,您会执行以下操作:

for (i = 1; i < num_process; i++) {
    MPI_Irecv(&result[i], ..., &requests[i]);
}

这将设置将为您发送工作的每个等级的接收。然后,您可以执行以下操作:

MPI_Testany(num_processes - 1, requests, &index, &flag, statuses);
if (flag) {
     /* Process work */
     MPI_Send(work_data, ..., index, ...);
}

这将检查是否有任何请求(用于跟踪非阻塞操作状态的句柄)已完成,然后将新工作发送给已完成的工作。

显然,所有这些代码都没有准备好复制/粘贴。您必须弄清楚它是如何/是否适用于您的工作并相应地进行调整。