⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sum.txt

📁 通过MPICH组建并行网络后的并行计算例子
💻 TXT
字号:
#include"mpi.h"
#include<iostream.h>
#include<fstream.h>
void main(int argc,char *argv[])
{
//初始化MPI 环境
int rank,size;
MPI_Status Status;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
//定义与数组有关的数据结构
const int MAXX=8,MAXY=3;
const int MAXPROCESSOR=64;
float Data[MAXX][MAXX];
int ArraySize[2];
int i,j,k;
double startwtime = 0.0, endwtime;
//从文件中读入矩阵信息
if (rank == 0)
{
ifstream in("input.txt");
in>>ArraySize[0]>>ArraySize[1];
for (i=1; i<=ArraySize[0]; i++ )
for (j=1; j<=ArraySize[1]; j++)
in>>Data[i][j];
startwtime = MPI_Wtime();
}
//广播矩阵的尺寸
MPI_Bcast(ArraySize,2,MPI_INT,0,MPI_COMM_WORLD);
//定义与任务分配有关的数据结构
int AverageLineNumber,HeavyProcessorNumber,MyLineNumber;
int CurrentLine,StartLine,SendSize;
float SendArray[MAXX*MAXY];
//计算每个处理其应分得的矩阵行数
AverageLineNumber=ArraySize[0] / size;
HeavyProcessorNumber=ArraySize[0] % size;
if (rank < HeavyProcessorNumber)
MyLineNumber=AverageLineNumber+1;
else
MyLineNumber=AverageLineNumber;
//如果是0 号处理器,进行任务分配
if (rank == 0)
{
CurrentLine=ArraySize[0];
for (i=size-1; i >= 0; i--)
{
SendSize=0;
if (i < HeavyProcessorNumber)
StartLine=CurrentLine-AverageLineNumber;
else
StartLine=CurrentLine-AverageLineNumber+1;
for (j=StartLine; j <= CurrentLine; j++)
for (k=1; k <= ArraySize[1]; k++)
SendArray[SendSize++]=Data[j][k];
if (i != 0)
MPI_Send(SendArray,SendSize,
MPI_FLOAT,i,10,MPI_COMM_WORLD);
CurrentLine=StartLine-1;
}
}
//非0 号处理其接收分配的矩阵
else
MPI_Recv(SendArray,MyLineNumber*ArraySize[1],
MPI_FLOAT,0,10,MPI_COMM_WORLD,&Status);
//定义每个处理器的“部分和”变量
float *Sum=new(float);
//每个处理器,完成自己的计算任务
*Sum=0;
for (i=0; i < MyLineNumber*ArraySize[1]; i++)
*Sum+=SendArray[i];
float AllSum[MAXPROCESSOR];
//将所有计算结果收集到0 号处理器
MPI_Gather(Sum,1,MPI_FLOAT,AllSum,1,MPI_FLOAT,0,MPI_COMM_WORLD);
//如果是0 号处理器,则进行最后的计算,并输出结果
if (rank == 0)
{
*Sum=0;
for (i=0; i < size; i++)
*Sum+=AllSum[i];
cout<<"The Sum of the Array is:"<<*Sum<<endl;
endwtime = MPI_Wtime();
cout<<"结束计算:用时为 "<<endwtime-startwtime <<"毫秒"<<endl;
}
//MPI 终止
MPI_Finalize();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -