异常行为字符串MPI_Send()和MPI_Recv()

时间:2019-01-14 13:32:34

标签: c mpi

我的程序正在编译并显示异常行为。

使用以下命令进行编译

  

mpicc one.c -o one

     

mpiexec -n 2 ./一个

我尝试调试它,但未显示任何编译错误。 我不明白为什么我的程序行为异常

#include<mpi.h>
#include<stdio.h>
#include<string.h>
int main(int argc,char * argv[])
{

    char str[434];
    int n;
    int rank,size; MPI_Status status;

    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    MPI_Comm_size(MPI_COMM_WORLD,&size);
    if(rank == 0)
    {//Sender process
        scanf("%s",&str);

        MPI_Ssend(&n,1,MPI_INT,1,0,MPI_COMM_WORLD);
        MPI_Ssend(&str,n,MPI_CHAR,1,0,MPI_COMM_WORLD);
        printf("Sending word %s in process 0\n",str);
    }
    else
    {//Receiver process
        MPI_Recv(&n,1,MPI_INT,0,0,MPI_COMM_WORLD,&status);
        MPI_Recv(&str,n,MPI_CHAR,0,0,MPI_COMM_WORLD,&status);
        printf("Receiving word %s in process 1\n",str);
    }
    MPI_Finalize();


    return 0;
}

输入:

  

哈哈

实际结果

  

在进程0中发送单词haha

     

在过程1中收到单词haha

交换结果

  

在进程0中发送单词haha

     

在过程1中接收单词��������

1 个答案:

答案 0 :(得分:0)

正如人们在对您的帖子的评论中所指出的那样,您不能像以前那样使用str,因为scanf()在传递char *时会期望char (*)[434] "-Werror -Wformat",不一样。

如果使用#include<mpi/mpi.h> #include<stdio.h> #include<string.h> #include <malloc.h> int main(int argc, char * argv[]) { const int size = 434; char* str_send = (char*) malloc(size * sizeof(char)); // = "haha"; char* str_recv = (char*) malloc(size * sizeof(char)); int n = size; int rank; MPI_Status status; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&rank); MPI_Comm_size(MPI_COMM_WORLD,&size); if(rank == 0) {//Sender process scanf("%s", str_send); MPI_Ssend(&n,1,MPI_INT,1,0,MPI_COMM_WORLD); MPI_Ssend(str_send,n,MPI_CHAR,1,0,MPI_COMM_WORLD); printf("Sending word %s in process 0\n",str_send); } else {//Receiver process MPI_Recv(&n,1,MPI_INT,0,0,MPI_COMM_WORLD,&status); MPI_Recv(str_recv,n,MPI_CHAR,0,0,MPI_COMM_WORLD,&status); printf("Receiving word %s in process 1\n",str_recv); } MPI_Finalize(); return 0; } 标志进行编译,则会看到此错误(或警告)。

修改代码以使用指针而不是char数组后,其外观如下:

scanf

哪个给出输出:

  

junglefox @ ubuntu:〜/ test_programs $ mpicc main.c

     

junglefox @ ubuntu:〜/ test_programs $ mpiexec -n 2 ./a.out

     

哈哈

     

在进程0中发送单词haha

     

在过程1中收到单词haha

既然如此,我觉得您想测试 MPI 库,而不是陷入其他麻烦,我建议您使用固定输入并寻找固定输出,而不要使用{{1 }}。例如,

const char* str_send = "haha";

然后删除或注释掉scanf行。

// scanf("%s", str_send);