您的位置:首页 > 编程语言

mpi编程入门之helloworld

2013-01-31 15:18 197 查看
1. mpi简介

2. hello world

3. 计算矩阵和

4. 参考资料

1. mpi简介

mpi=(Message Passing Interface)目前一种比较著名的应用于并行环境的消息传递标准。mpich为实现mpi接口开源框架。

2. hello world

#include "mpi.h"
#include <iostream>

int main(int argc,  char* argv[])
{
	int rank;
	int size;
	MPI_Init(0,0);
	MPI_Comm_rank(MPI_COMM_WORLD, &rank);
	MPI_Comm_size(MPI_COMM_WORLD, &size);
	
	std::cout<<"Hello world from process "<<rank<<" of "<<size<<std::endl;

	MPI_Finalize();

	return 0;
}


编译: mpicxx -o test_mpi test_mpi.cpp

执行:mpirun -n 2 ./test_mpi

3. 计算矩阵和

#include "mpi.h"

#include <iostream>
#include <fstream>

int main(int argc, char* argv[])
{
	using namespace std;
	int rank;
	int 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;
	const int MAXY=3; 
	const int MAXPROCESSOR=64;
	float Data[MAXX][MAXX]; 
	int ArraySize[2];
	int i,j,k;

	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]; 
			}
		}
	}

	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;
	}

	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;
		}
	}
	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];
	std::cout << "rank:" << rank << " cal sum is " << *Sum << std::endl;
	MPI_Gather(Sum,1,MPI_FLOAT,AllSum,1,MPI_FLOAT,0,MPI_COMM_WORLD); 

	if (rank == 0)
	{
		*Sum=0; 
		for (i=0; i < size; i++) 
			*Sum+=AllSum[i];
		cout<<"The Sum of the Array is:"<<*Sum<<endl; 
	}
	
	MPI_Finalize(); 
	return 0;
}
4. 参考资料
http://pan.baidu.com/share/link?shareid=257262&uk=908463093 http://hi.baidu.com/motioo/item/9bbc649efbed64de1f427122
代码http://pan.baidu.com/share/link?shareid=257270&uk=908463093
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: