我是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)
答案 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, ...);
}
这将检查是否有任何请求(用于跟踪非阻塞操作状态的句柄)已完成,然后将新工作发送给已完成的工作。
显然,所有这些代码都没有准备好复制/粘贴。您必须弄清楚它是如何/是否适用于您的工作并相应地进行调整。