急救!!! MPI一个简单的并行程序为何在MPICH下运行没有反应!!!

hjwang006 2008-05-28 08:49:28
是个并行背包算法

试了好久都不行


MPICH2测试过简单程序 环境配置没有问题

#include "math.h"
#include "mpi.h"

main ( argc, argv )
int argc;
char * argv[];
{
MPI_Status status; //MPI_Status自定义的struts类型

int i, j, m, tmp, ww, group_size, my_rank, pnumber, c, wb,
pb; /* to store number of used slave processors */
int group_size1; /* number of rank 进程数*/
int p[100] , w[100], z[100], f[100][100];

MPI_Init ( &argc , &argv ); /* 初始化 MPI. */
MPI_Comm_size ( MPI_COMM_WORLD , &group_size1 );/* Get the number of rank.进程数 */
MPI_Comm_rank ( MPI_COMM_WORLD , &my_rank ); /* get id of rank当前进程标识,标识号从0到1..n*/


if ( group_size1 < 3 ) /*进程数必须大于2个 否而退出*/
{
printf ( "not enough processor!\n" );
MPI_Abort ( MPI_COMM_WORLD,99 );
}

pnumber=group_size1-1;

/*主进程:输入数组,输出结果*/
if(my_rank == 0)
{
printf ( "my_rank %d\n" , my_rank );

printf ( "knapscack of capacity = %d\n", pnumber);

printf ( "Enter number of values:\n");
scanf( "%d",&m);
for(i=1;i<=pnumber;i++)
{
MPI_Send(&m,1,MPI_INT,i,i,MPI_COMM_WORLD);
}

printf("please input p:\n");
for(i = 1;i <= m ; i++ )
{
scanf( "%d" , &p[i] );
}
for(i=1;i<=pnumber;i++)
{
MPI_Send(&p[1],m,MPI_INT,i,i,MPI_COMM_WORLD);
}

printf("please input w:\n");
for(i =1; i<=m;i++)
{
scanf("%d",&w[i]);
}
for(i=1;i<=pnumber;i++)
{
MPI_Send(&w[1],m,MPI_INT,i,i,MPI_COMM_WORLD);
}

}

/* 根据主进程传来的数据,计算,得出结果*/
else
{
printf(" my rank is %d\n",my_rank);

MPI_Recv(&m,1,MPI_INT,0,my_rank,MPI_COMM_WORLD,&status);
MPI_Recv(&p[1],m,MPI_INT,0,my_rank,MPI_COMM_WORLD,&status);
MPI_Recv(&w[1],m,MPI_INT,0,my_rank,MPI_COMM_WORLD,&status);

c=pnumber;
for(i=0;i<=c;i++)
{
f[0][i]=0;
}
for(i=1;i<=m;i++)
{
f[i][0]=0;
}
for(i=1;i<=m;i++)
{
if(i>1)
{
for(j=1;j<=pnumber;j++)
{
MPI_Recv(&f[i-1][j],1,MPI_INT,j,(i-1)*10+j,MPI_COMM_WORLD,&status);
}
}
if(my_rank<w[i])
f[i][my_rank]=f[i-1][my_rank];
if(my_rank>=w[i] && my_rank<=c)
{
ww=w[i];
tmp=f[i-1][my_rank-ww]+p[i];
if(f[i-1][my_rank]>tmp)
f[i][my_rank]=f[i-1][my_rank];
else f[i][my_rank]=tmp;
}

if(i<m)
{
for(j=1;j<=pnumber;j++)
{
MPI_Send(&f[i][my_rank],1,MPI_INT,j,i*10+my_rank,MPI_COMM_WORLD);
}
}
}

/* tracing backward to find the solution*/
wb=c;
pb=f[m][c];
for(i=m;i>=1;i--)
{
if(f[i-1][wb]==pb)
{
z[i]=0;
}
else
{
z[i]=1;
pb=pb-p[i];
wb=wb-w[i];
}
}
if(my_rank==c)
{
printf(" the result:\n");
for(i=1;i<=m;i++)
{
printf("z %d:%d\n",i,z[i]);
}
}
}
MPI_Finalize();
}
...全文
570 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
51365133 2008-05-28
  • 打赏
  • 举报
回复
跟踪下哦.这么长,我们也没有环境.
K行天下 2008-05-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 iu_81 的回复:]
mpi在很久以前写过,你参考一下 并行计算的书,上面好像有一些源码
[/Quote]
是啊,太笼统的问题,楼主先参考一下书籍
iu_81 2008-05-28
  • 打赏
  • 举报
回复
mpi在很久以前写过,你参考一下 并行计算的书,上面好像有一些源码
星羽 2008-05-28
  • 打赏
  • 举报
回复

main ( argc, argv )
int argc;
char * argv[];
{

------------


好古老的写法:)

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧