1. mpi简介
2. hello world
3. 计算矩阵和
4. 参考资料
1. mpi简介
mpi=(Message Passing Interface)目前一种比较著名的应用于并行环境的消息传递标准。mpich为实现mpi接口开源框架。
2. hello world
#include "mpi.h"
#include
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 "<
执行:mpirun -n 2 ./test_mpi
3. 计算矩阵和
#include "mpi.h"
#include
#include
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<
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