我有的
我有一个使用 MPI 的 C 程序,它使用 4 个进程:1 个车辆(taskid=0)和 3 个乘客。车辆一次可容纳 2 名乘客。3 位顾客不断回来搭车。
对于车辆,我有:
int passengers[C] = {0};
while(1)
MPI_Recv(&pid, 1, MPI_INT, MPI_ANY_SOURCE, 1, MPI_COMM_WORLD, &status);
//put pid in passengers[totalNumberArrived]
if(totalNumberArrived == 2)
printf("vehicle left...");
sleep(5);
printf("vehicle came back...");
for (i=0; i<2; i++)
MPI_Send(&passengers[i], 1, MPI_INT, passengers[i], 1, MPI_COMM_WORLD);
totalNumberArrived = 0;
if(done)//omitting the details here
break;
而且,对于每位乘客,我都有:
for (i to NumOfRound)
sleep(X);
printf("%d is sending a msg", tasked)
MPI_Send(&taskid, 1, MPI_INT, 0, 1, MPI_COMM_WORLD);
MPI_Recv(&pid, 1, MPI_INT, 0, 1, MPI_COMM_WORLD, &pstatus);
printf("%d received from %d\n", tasked, pid, pstatus.MPI_SOURCE);
问题
如果车辆使用 taskid 1 和 3 去兜风,我希望看到这种输出:
vehicle left...
vehicle came back...
1 is sending a msg
3 is sending a msg (this could be before 1's msg though)
但我有时会得到
vehicle left...
1 is sending a msg
3 is sending a msg
vehicle came back...
看起来乘客在车辆返回之前不会被阻挡。
我认为 MPI_Recv 会阻止任务,直到它从车辆获得消息,所以我研究并阅读 MPI_Recv 确实会阻止,但是会出现这种问题,因为 printf 不一定按顺序打印。我还读到一些建议使用冲洗,但在某些情况下冲洗不起作用。
我不确定我应该怎么做。真的只是 printf 顺序的问题吗?
我也读过这个:在 MPI 中排序输出
想知道我是否应该添加一个主线程并让它成为车辆和乘客的中央控制器?