所以我要做的是将输入字符串“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
有人能告诉我哪里出错了吗?
答案 0 :(得分:0)
您无法在此处使用MPI_Gather()
。
由于您使用MPI_CHAR
作为发送和接收数据类型,sendcount
和recvcount
在所有排名上必须相同。
MPI_Gatherv()
正是您要找的。 p>
最后但同样重要的是,在调用b
之前不要忘记NULL终止printf()