使用MPI_BCAST和MPI_Reduce(以MPI为单位)对数字求和

使用MPI_BCAST和MPI_Reduce(以MPI为单位)对数字求和,mpi,Mpi,我正在将一个名为number.txt的txt文件中的数字读入数组num[64]。进程0应该读取txt文件并向所有进程广播num[]。然后,我必须使用reduce操作来计算所有部分和的总和,进程0应该最终打印总数。我无法使用进程0打印最终值(变量“total”)。我在结尾使用了if循环,但没有打印任何内容。部分和打印正确且正确。如何使用进程0打印总计 #include <stdio.h> #include <stdlib.h> #include <string.h&g

我正在将一个名为number.txt的txt文件中的数字读入数组num[64]。进程0应该读取txt文件并向所有进程广播num[]。然后,我必须使用reduce操作来计算所有部分和的总和,进程0应该最终打印总数。我无法使用进程0打印最终值(变量“total”)。我在结尾使用了if循环,但没有打印任何内容。部分和打印正确且正确。如何使用进程0打印总计

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

int main(int argc, char** argv){
    int size, rank,i,j,count=0;
    int sum=0,total=0;
    int num[64];
    MPI_Init(&argc,&argv);
    MPI_Comm_size(MPI_COMM_WORLD,&size);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    
    if(rank==0)
    {
        
        //Read File:
        FILE *fp;
        fp = fopen("number.txt" , "r");
        if(fp == NULL) 
        {
        perror("Error opening file");
        return(-1);
        }
   
        while (!feof (fp))
            {  
            fscanf (fp, "%d", &i);  
            num[count]=i;
            count+=1;
            }
        fclose (fp);
        
    }

    MPI_Bcast(num, 64, MPI_INT, 0, MPI_COMM_WORLD);
    
        for(i=(rank*16);i<((rank*16)+16);i++)
        {
            sum+=num[i];
        }
        printf("sum_%d: %d\n",rank,sum);

    MPI_Reduce(&sum,&total,4,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);
    if(rank==0)
    {
        printf("final total: %d\n",total);
    }
    MPI_Finalize();
    return 0;
}




#包括
#包括
#包括
#包括
int main(int argc,字符**argv){
整数大小,秩,i,j,计数=0;
整数和=0,总数=0;
int num[64];
MPI_Init(&argc,&argv);
MPI_通信大小(MPI_通信世界和大小);
MPI通信等级(MPI通信世界和等级);
如果(秩==0)
{
//读取文件:
文件*fp;
fp=fopen(“number.txt”,“r”);
如果(fp==NULL)
{
perror(“打开文件时出错”);
返回(-1);
}
而(!feof(fp))
{  
fscanf(fp、%d、&i);
num[count]=i;
计数+=1;
}
fclose(fp);
}
MPI_Bcast(num,64,MPI_INT,0,MPI_COMM_WORLD);

对于(i=(rank*16);i可能是内存损坏。在
MPI\u Reduce(…)
中,
count
参数(以元素为单位,而不是以字节为单位)应该是
1
。计数只是为了读取文件,而且由于部分和计算正确,我认为文件读取正确。您的意思是说我应该将计数初始化为1吗?
MPI\u Reduce(…,1…)
是的,现在可以工作了。谢谢!