并行实验Word文档格式.docx
- 文档编号:21340033
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:18
- 大小:236.89KB
并行实验Word文档格式.docx
《并行实验Word文档格式.docx》由会员分享,可在线阅读,更多相关《并行实验Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
namelen);
/*得到当前机器名字*/
fprintf(stderr,"
Process%disaliveon%s\n"
me,processor_name);
MPI_Barrier(MPI_COMM_WORLD);
/*同步*/
Hello();
/*调用问候过程*/
MPI_Finalize();
}
voidHello(void)
/*任意两个进程间交换问候信息问候信息由发送进程标识和接收进程标识组成*/
intnproc,me;
inttype=1;
intbuffer[2],node;
MPI_Statusstatus;
MPI_Comm_rank(MPI_COMM_WORLD,&
MPI_Comm_size(MPI_COMM_WORLD,&
nproc);
if(me==0)
/*进程0负责打印提示信息*/
printf("
\nHellotestfromalltoall\n"
);
fflush(stdout);
for(node=0;
node<
nproc;
node++)
/*循环对每一个进程进行问候*/
if(node!
=me)
{
/*得到一个和自身不同的进程标识*/
buffer[0]=me;
/*将自身标识放入消息中*/
buffer[1]=node;
/*将被问候的进程标识也放入消息中*/
MPI_Send(buffer,2,MPI_INT,node,type,MPI_COMM_WORLD);
/*首先将问候消息发出*/
MPI_Recv(buffer,2,MPI_INT,node,type,MPI_COMM_WORLD,&
status);
/*然后接收被问候进程对自己发送的问候消息*/
if((buffer[0]!
=node)||(buffer[1]!
=me))
{
/*若接收到的消息的内容不是问候自己的或不是以被问候方的身份问候自己则出错*/
(void)fprintf(stderr,"
Hello:
%d!
=%dor%d!
=%d\n"
buffer[0],node,buffer[1],me);
printf("
Mismatchonhelloprocessids;
node=%d\n"
node);
}
printf("
Hellofrom%dto%d\n"
me,node);
/*打印出问候对方成功的信息*/
fflush(stdout);
2数据接力传送
intmain(intargc,char**argv)
{
intrank,value,size;
MPI_Init(&
argv);
MPI_Comm_rank(MPI_COMM_WORLD,&
rank);
MPI_Comm_size(MPI_COMM_WORLD,&
size);
/*得到当前进程标识和总的进程个数*/
/*循环执行直到输入的数据为负时才退出*/
if(rank==0)
fprintf(stderr,"
\nPleasegivenewvalue=\n"
/*进程0读入要传递的数据*/
scanf("
%d"
&
value);
%dread<
-<
-(%d)\n"
rank,value);
if(size>
1)
MPI_Send(&
value,1,MPI_INT,rank+1,0,MPI_COMM_WORLD);
%dsend(%d)->
->
%d\n"
rank,value,rank+1);
/*若不少于一个进程则向下一个进程传递该数据*/
}
else
MPI_Recv(&
value,1,MPI_INT,rank-1,0,MPI_COMM_WORLD,
&
status);
/*其它进程从前一个进程接收传递过来的数据*/
%dreceive(%d)<
-%d\n"
rank,value,rank-1);
if(rank==size-1)
value,1,MPI_INT,0,0,MPI_COMM_WORLD);
rank,value,0);
/*若当前进程不是最后一个进程则将该数据继续向后传递*/
if(rank<
size-1)
/*执行一下同步加入它主要是为了将前后两次数据传递分开*/
MPI_Finalize();
3任意源和任意标识
/*使用了随机函数srand和rand*/
time.h>
/*使用了时间函数time*/
intmain(intargc,char*argv[])
intrank,size,i,buf[1];
argc,&
/*得到当前进程标识和总的进程个数*/
rank);
if(rank==0)
/*进程0接收来自其他所有进程的消息,将各消息的内容、消息来源和消息标识打印出来。
*/
for(i=0;
i<
10*(size-1);
i++)
MPI_Recv(buf,1,MPI_INT,MPI_ANY_SOURCE,MPI_ANY_TAG,
MPI_COMM_WORLD,&
fprintf(stderr,"
Msg=%d\tfrom%dwithtag%d.\n"
buf[0],status.MPI_SOURCE,status.MPI_TAG);
}
else
{/*其他每个进程向进程0发送10个随机数*/
srand((unsigned)time(NULL));
/*以当前时间作为生成随机数的种子*/
10;
{
buf[0]=rand()%100;
/*生成一个随机整数*/
MPI_Send(buf,1,MPI_INT,0,i,MPI_COMM_WORLD);
4.2
MPI_Requestrreq,sreq;
MPI_Issend(&
value,1,MPI_INT,rank+1,0,MPI_COMM_WORLD,&
sreq);
rank,value,rank+1);
MPI_Irecv(&
value,1,MPI_INT,rank-1,0,MPI_COMM_WORLD,&
rreq);
value,1,MPI_INT,0,0,MPI_COMM_WORLD,&
rank,value,0);
4.3
MPI_Requestrreq;
{MPI_Irecv(buf,1,MPI_INT,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&
fprintf(stderr,"
Msg=%d\tfrom%dwithtag%d.\n"
buf[0],status.MPI_SOURCE,status.MPI_TAG);
MPI_Wait(&
rreq,&
MPI_Rsend(buf,1,MPI_INT,0,i,MPI_COMM_WORLD);
return0;
5点积计算
#defineMAX_LOCAL_ORDER100
main(intargc,char*argv[])
floatlocal_x[MAX_LOCAL_ORDER];
floatlocal_y[MAX_LOCAL_ORDER];
intn;
intn_bar;
floatdot;
intp;
intmy_rank;
voidRead_vector(char*prompt,floatlocal_v[],intn_bar,intp,intmy_rank);
floatParallel_dot(floatlocal_x[],floatlocal_y[],intn_bar);
p);
my_rank);
if(my_rank==0)
printf("
Entertheorderofthevectors\n"
scanf("
n);
MPI_Bcast(&
n,1,MPI_INT,0,MPI_COMM_WORLD);
n_bar=n/p;
Read_vector("
thefirstvector"
local_x,n_bar,p,my_rank);
thesecondvector"
local_y,n_bar,p,my_rank);
dot=Parallel_dot(local_x,local_y,n_bar);
if(my_rank==0)
Thedotproductis%f\n"
dot);
}
voidRead_vector(char*prompt,floatlocal_v[],intn_bar,intp,intmy_rank)
inti,q;
floattemp[MAX_LOCAL_ORDER];
if(my_rank==0)
Enter%s\n"
prompt);
for(i=0;
i<
n_bar;
i++)
%f"
local_v[i]);
for(q=1;
q<
p;
q++)
temp[i]);
MPI_Send(temp,n_bar,MPI_FLOAT,q,0,MPI_COMM_WORLD);
else
MPI_Recv(local_v,n_bar,MPI_FLOAT,0,0,MPI_COMM_WORLD,&
floatSerial_dot(floatx[],floaty[],intn)
inti;
floatsum=0.0;
n;
sum=sum+x[i]*y[i];
returnsum;
floatParallel_dot(floatlocal_x[],floatlocal_y[],intn_bar)
floatlocal_dot;
floatdot=0.0;
floatSerial_dot(floatx[],floaty[],intm);
local_dot=Serial_dot(local_x,local_y,n_bar);
MPI_Reduce(&
local_dot,&
dot,1,MPI_FLOAT,MPI_SUM,0,MPI_COMM_WORLD);
returndot;
6矩阵向量乘
#defineMAX_ORDER100
typedeffloatLOCAL_MATRIX_T[MAX_ORDER][MAX_ORDER];
main(intargc,char*argv[])
LOCAL_MATRIX_Tlocal_A;
floatglobal_x[MAX_ORDER];
floatlocal_x[MAX_ORDER];
floatlocal_y[MAX_ORDER];
intm,n;
intlocal_m,local_n;
voidRead_matrix(char*prompt,LOCAL_MATRIX_Tlocal_A,intlocal_m,
intn,intmy_rank,intp);
voidRead_vector(char*prompt,floatlocal_x[],intlocal_n,intmy_rank,
intp);
voidParallel_matrix_vector_prod(LOCAL_MATRIX_Tlocal_A,intm,
intn,floatlocal_x[],floatglobal_x[],floatlocal_y[],
intlocal_m,intlocal_n);
voidPrint_matrix(char*title,LOCAL_MATRIX_Tlocal_A,intlocal_m,
voidPrint_vector(char*title,floatlocal_y[],intlocal_m,intmy_rank,
Entertheorderofthematrix(mxn)\n"
%d%d"
m,&
m,1,MPI_INT,0,MPI_COMM_WORLD);
local_m=m/p;
local_n=n/p;
Read_matrix("
Enterthematrix"
local_A,local_m,n,my_rank,p);
Print_matrix("
Weread"
Enterthevector"
local_x,local_n,my_rank,p);
Print_vector("
Parallel_matrix_vector_prod(local_A,m,n,local_x,global_x,local_y,local_m,local_n);
Theproductis"
local_y,local_m,my_rank,p);
voidRead_matrix(char*prompt,LOCAL_MATRIX_Tlocal_A,intlocal_m,intn,intmy_rank,intp)
inti,j;
LOCAL_MATRIX_Ttemp;
p*local_m;
for(j=n;
j<
MAX_ORDER;
j++)
temp[i][j]=0.0;
%s\n"
i++)
for(j=0;
&
temp[i][j]);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 并行 实验