好的,所以这里游戏的目的是为64个处理器中的每一个(代表一个8x8网格)生成一个随机数(在0和1之间),并给进程零一个表示完整情况的字符串。例如网格:
[0,1,0,1]
[1,1,1,1]
[0,0,0,0]
最终会得到字符串' 0101111000'为4x3。
每个流程只能与上面和左边的流程进行通信。
为此,我让每个进程在其右侧接收所有数字的字符串(如果它不在最右边),将其数字添加到字符串的前面并将其发送到左侧。
如果进程位于最左侧,它还会从它下面的进程接收一个字符串(不包括左下角,等级56),该等级以下所有节点的状态描述。它加入自己的值,左侧和底部字符串,并将其发送。
所有最左边的节点都开始它们的行的字符串。
我的尝试代码如下:
#include <stdio.h>
#include "mpi.h"
#include <string.h>
#include <stdlib.h>
int farLeft(int rank){// edit
if (rank%8==0){
return 1;
}
return 0;
}
int farRight(int rank){// edit
if (rank%8==7){
return 1;
}
return 0;
}
int main(argc, argv)
int argc;
char **argv;
{
char inputList[100],myWhisp[100],snum[256];
int rank,value;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
srand(rank);
value = rand() % 2;
sprintf(snum, "%d", value);
strcpy(myWhisp,snum);
if (farLeft(rank)){
MPI_Recv(inputList, strlen(inputList)+1, MPI_CHAR, rank+1, 0, MPI_COMM_WORLD, &status);
strcat(snum,inputList);
strcpy(myWhisp,snum);
if (rank !=56){
MPI_Recv(inputList, strlen(inputList)+1, MPI_CHAR, rank+8, 0, MPI_COMM_WORLD, &status);//rank48 crashes here
strcat(myWhisp,inputList);
}
strcpy(inputList,myWhisp);
if(rank==0){
printf("%s\n",inputList);
}
else{
MPI_Send(inputList, strlen(inputList)+1, MPI_CHAR, rank-8, 0, MPI_COMM_WORLD);
}
}
else if (farRight(rank)){
strcpy(inputList,myWhisp);
MPI_Send(inputList, strlen(inputList)+1, MPI_CHAR, rank-1, 0, MPI_COMM_WORLD);
}
else{
MPI_Recv(inputList, strlen(inputList)+1, MPI_CHAR, rank+1, 0, MPI_COMM_WORLD, &status);
strcat(snum,inputList);
strcpy(inputList,snum);
MPI_Send(inputList, strlen(inputList)+1, MPI_CHAR, rank-1, 0, MPI_COMM_WORLD);
}
MPI_Finalize();
return 0;
}
我得到了排名错误,排名为48,是最左边的倒数第二。这发生在下面的接收函数if(rank!= 56)。所以我发送/接收inputString的方式有问题我猜...
非常感谢。
答案 0 :(得分:4)
您将count
的{{1}}参数作为MPI_Recv
传递,但strlen(inputList)+1
从未初始化。你可能想要inputList
。