收到字符串

时间:2015-05-18 06:29:48

标签: c string mpi

好的,所以这里游戏的目的是为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的方式有问题我猜...

非常感谢。

1 个答案:

答案 0 :(得分:4)

您将count的{​​{1}}参数作为MPI_Recv传递,但strlen(inputList)+1从未初始化。你可能想要inputList