这是《高性能运算之CUDA》实例中MPICH文档中的一个关于MPI 的简单实例,为什么在2台机子上运行出错呢?
在VC2005里面运行通过,但是用mpiexec wrapper运行时出现以下错误。因为在下是初学菜菜,请各位大虾们指明下;
job aborted:
rank: node:exit code[:error message]
0:192.168.1.11:-1073741819 process 0 exited without calling finalize
1:192.168.1.12:-1073741819 process 1 exited without calling finalize
#include"mpi.h"
#include
#include
using namespace std;
void main(int argc,char *argv)
{
/*初始化MPI 环境/
int rank,size;
int namelen;
char processor_name[MPI_MAX_PROCESSOR_NAME];
MPI_Status Status;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Get_processor_name(processor_name,&namelen);
printf(“进程:%d on %s 进程总数 :%d\n”,rank,processor_name,size);
/定义与数组有关的数据结构***********************/
const int MAXX=20,MAXY=3;
const int MAXPROCESSOR=5;
float Data[MAXX][MAXX];
int ArraySize[2];
int i,j,k;
if(rank==0)
{
float *cpu_sum=new(float);
*cpu_sum=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];
// cout<<Data[i][j]<<endl;
(*cpu_sum)+=Data[i][j];
}
cout<<“single_cpusum:”<<*cpu_sum<<endl;
}
//广播矩阵的尺寸
MPI_Bcast(ArraySize,2,MPI_INT,0,MPI_COMM_WORLD);
//定义与任务分配有关的数据结构
int AverageLineNumber,HeavyProcessorNumber,MyLineNumber;
int CurrentLine,StartLine,SendSize;
float SendArray[MAXXMAXY];
//计算每个处理其应分得的矩阵行数
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,MyLineNumberArraySize[1],
MPI_FLOAT,0,10,MPI_COMM_WORLD,&Status);
//定义每个处理器的“部分和”变量
float *Sum=new(float);
//每个处理器,完成自己的计算任务
Sum=0;
for (i=0; i < MyLineNumberArraySize[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;
}
//MPI 终止
MPI_Finalize();
}[attach]663210[/attach]
[ 本帖最后由 我带刺 于 2010-5-6 09:14 编辑 ]