为什么MPI_Gather会出现缓冲区错误?

时间:2018-02-06 13:03:18

标签: c mpi

所以我要做的是将输入字符串“HELO”打印为“HEELLLOOOO” 到目前为止,我已经提出了这个代码

#include <mpi.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
    int i=0,rank,size;
    MPI_Init(&argc,&argv);
    MPI_Comm_size(MPI_COMM_WORLD,&size);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    char buf[20]="HELO",a[50],b[50];
    //int len = strlen(buf);
    MPI_Scatter(buf,1,MPI_CHAR,a,1,MPI_CHAR,0,MPI_COMM_WORLD);

    while(i<rank)
    {   
        a[i+1]=a[i];
        i++;
    }

    MPI_Gather(a,rank+1,MPI_CHAR,b,rank+1,MPI_CHAR,0,MPI_COMM_WORLD);

    if(rank==0)
    {
        printf("%s\n",b );
    }

    MPI_Finalize();
    return 0;
}

当我尝试使用4个进程运行时,我收到错误:

  

PMPI_Gather中的致命错误:消息被截断,错误堆栈:   PMPI_Gather(904)........................:   MPI_Gather(sbuf = 0x7fffa92bac30,scount = 3,MPI_CHAR,   rbuf = 0x7fffa92bac10,rcount = 3,MPI_CHAR,root = 0,MPI_COMM_WORLD)   MPIR_Gather_impl失败(726)...................:   MPIR_Gather(686)........................:   MPIR_Gather_intra(294)..................:   MPIDI_CH3_PktHandler_EagerShortSend(363):来自等级3和标签的消息   3截断;收到4个字节但缓冲区大小为3个致命错误   PMPI_Gather:消息被截断,错误堆栈:   PMPI_Gather(904)........................:   MPI_Gather(sbuf = 0x7ffd15c31980,scount = 1,MPI_CHAR,   rbuf = 0x7ffd15c31960,rcount = 1,MPI_CHAR,root = 0,MPI_COMM_WORLD)   MPIR_Gather_impl失败(726)...................:   MPIR_Gather(686)........................:   MPIR_Gather_intra(230)..................:   MPIDI_CH3_PktHandler_EagerShortSend(363):来自等级1和标签的消息   3截断;收到2个字节但缓冲区大小为1   MPIR_Gather_intra(230)..................:   MPIDI_CH3_PktHandler_EagerShortSend(363):来自等级2和标签的消息   1073741827截断;收到6个字节但缓冲区大小为2

有人能告诉我哪里出错了吗?

1 个答案:

答案 0 :(得分:0)

您无法在此处使用MPI_Gather()。 由于您使用MPI_CHAR作为发送和接收数据类型,sendcountrecvcount所有排名上必须相同。

MPI_Gatherv()正是您要找的。

最后但同样重要的是,在调用b之前不要忘记NULL终止printf()