gpt4 book ai didi

c - 主从非阻塞监听器

转载 作者:行者123 更新时间:2023-11-30 17:38:50 25 4
gpt4 key购买 nike

目前,我正在尝试创建一个带有“监听器”循环的主从程序,其中主设备等待来自从设备的消息,然后从那里做出决定。但是,尽管使用非阻塞 MPI 例程,我还是遇到了错误。我需要使用一些阻塞例程吗?

#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char** argv)
{
// Variable Declarations
int rank, size;
MPI_Request *requestList,requestNull;
MPI_Status status;
// Start MPI
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);

if( rank == 0 )
{
// Process Zero
int dataOut=13, pr;
float dataIn = -1;
requestList =(MPI_Request*)malloc((size-1)*sizeof(MPI_Request));

while(1){
dataIn = -1;
// We do NOT need to wait for the MPI_ Isend(s), it is the job of the receiver processes.
for(pr=1;pr<size;pr++)
{
MPI_Irecv(&dataIn,1,MPI_FLOAT,pr,1,MPI_COMM_WORLD,&(requestList[pr-1]));
}
if((dataIn > 1.5)){
printf("From the process: %f\n", dataIn);
break;
}
}
}
else
{
// Receiver Process
float message;
int index;
//MPI_Request request;
MPI_Status status;

while(1){
message = random()/(double)1147483648;
// Send the message back to the process zero
MPI_Isend(&message,1,MPI_FLOAT,0,1,MPI_COMM_WORLD, &requestNull);

if(message > 1.5)
break;
}
}
MPI_Finalize();
return 0;
}

最佳答案

问题似乎是您永远不会等待 MPI 调用完成。

非阻塞调用在 MPI 中的工作方式是,当您发出非阻塞调用(例如 MPI_IRECV)时,最后一个输入参数是一个 MPI_REQUEST 对象。当初始化调用 (MPI_IRECV) 完成时,该请求对象包含非阻塞调用的信息。但是,该调用尚未完成,并且在您对请求使用完成调用(MPI_WAIT/MPI_TEST/等)之前,您无法保证调用已完成.

就您而言,您可能不必要地使用非阻塞调用,因为您依赖于下一行中的 MPI_IRECV 调用期间收到的信息。您可能应该将非阻塞调用替换为阻塞 MPI_RECV 调用,并使用 MPI_ANY_SOURCE,这样您就不必为通信器中的每个等级发布单独的接收调用。或者,您可以使用 MPI_WAITANY 来完成非阻塞调用,但完成后您需要担心清理所有额外的操作。

关于c - 主从非阻塞监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22023730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com