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