ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:236.89KB ,
资源ID:8203723      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8203723.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(并行实验.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

并行实验.docx

1、并行实验并行程序设计试验1进程间相互问候#include mpi.h#include #include void Hello( void );int main(int argc, char *argv) int me,option,namelen,size; char processor_nameMPI_MAX_PROCESSOR_NAME; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD,&me); MPI_Comm_size(MPI_COMM_WORLD,&size); /*得到当前进程标识和总的进程数*/ if (size 2)

2、/*若总进程数小于2 则出错退出*/ fprintf(stderr, systest requires at least 2 processes ); MPI_Abort(MPI_COMM_WORLD,1); MPI_Get_processor_name(processor_name,&namelen); /*得到当前机器名字*/ fprintf(stderr,Process %d is alive on %sn, me, processor_name); MPI_Barrier(MPI_COMM_WORLD); /*同步*/ Hello(); /*调用问候过程*/ MPI_Finalize(

3、);void Hello( void )/*任意两个进程间交换问候信息问候信息由发送进程标识和接收进程标识组成*/ int nproc, me; int type = 1; int buffer2, node; MPI_Status status; MPI_Comm_rank(MPI_COMM_WORLD, &me); MPI_Comm_size(MPI_COMM_WORLD, &nproc); /*得到当前进程标识和总的进程数*/ if (me = 0) /* 进程0负责打印提示信息*/ printf(nHello test from all to alln); fflush(stdout)

4、; for (node = 0; nodenproc; node+) /*循环对每一个进程进行问候*/ if (node != me) /* 得到一个和自身不同的进程标识*/ buffer0 = me; /*将自身标识放入消息中*/ buffer1 = node; /*将被问候的进程标识也放入消息中*/ MPI_Send(buffer, 2, MPI_INT, node, type, MPI_COMM_WORLD); /*首先将问候消息发出*/ MPI_Recv(buffer, 2, MPI_INT, node, type, MPI_COMM_WORLD, &status); /*然后接收被问

5、候进程对自己发送的问候消息*/ if ( (buffer0 != node) | (buffer1 != me) ) /*若接收到的消息的内容不是问候自己的或不是以被问候方的身份问候自己则出错*/ (void) fprintf(stderr, Hello: %d!=%d or %d!=%dn, buffer0, node, buffer1, me); printf(Mismatch on hello process ids; node = %dn, node); printf(Hello from %d to %dn, me, node); /*打印出问候对方成功的信息*/ fflush(st

6、dout); 2数据接力传送#include mpi.h#include int main(int argc,char * argv ) int rank, value, size; MPI_Status status; MPI_Init( &argc, &argv ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); MPI_Comm_size( MPI_COMM_WORLD, &size ); /* 得到当前进程标识和总的进程个数*/ /* 循环执行 直到输入的数据为负时才退出*/ if (rank = 0) fprintf(stderr, nPlease

7、give new value=n); /*进程0读入要传递的数据*/ scanf( %d, &value ); fprintf(stderr,%d read -1) MPI_Send( &value, 1, MPI_INT, rank + 1, 0, MPI_COMM_WORLD ); fprintf(stderr,%d send (%d)- %dn, rank,value,rank+1); /* 若不少于一个进程则向下一个进程传递该数据*/ else MPI_Recv( &value, 1, MPI_INT, rank - 1, 0, MPI_COMM_WORLD, &status ); /

8、* 其它进程从前一个进程接收传递过来的数据*/ fprintf(stderr,%d receive (%d)- %dn, rank,value,0); /*若当前进程不是最后一个进程则将该数据继续向后传递*/ if (rank - %dn, rank,value,rank+1); /*若当前进程不是最后一个进程则将该数据继续向后传递*/ MPI_Barrier(MPI_COMM_WORLD); /* 执行一下同步 加入它主要是为了将前后两次数据传递分开*/ MPI_Finalize( );3任意源和任意标识#include mpi.h#include #include /* 使用了随机函数sr

9、and和rand */#include /* 使用了时间函数time */int main(int argc,char *argv) int rank,size,i,buf1; MPI_Status status; MPI_Init(&argc,&argv); /* 得到当前进程标识和总的进程个数 */ MPI_Comm_rank(MPI_COMM_WORLD,&rank); MPI_Comm_size(MPI_COMM_WORLD,&size); if(rank=0) /* 进程0接收来自其他所有进程的消息,将各消息的内容、消息来源和消息标识打印出来。 */ for(i=0;i10*(siz

10、e-1);i+) MPI_Recv(buf,1,MPI_INT,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&status); fprintf(stderr,Msg=%dtfrom %d with tag %d.n, buf0,status.MPI_SOURCE,status.MPI_TAG); else /* 其他每个进程向进程0发送10个随机数 */ srand(unsigned)time(NULL); /* 以当前时间作为生成随机数的种子 */ for(i=0;i10;i+) buf0=rand()%100; /* 生成一个随机整数 */ MPI_

11、Send(buf,1,MPI_INT,0,i,MPI_COMM_WORLD); MPI_Finalize();4.2#include mpi.h#include int main(int argc,char * argv ) int rank, value, size; MPI_Request rreq,sreq; MPI_Status status; MPI_Init( &argc, &argv ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); MPI_Comm_size( MPI_COMM_WORLD, &size ); /* 得到当前进程标识和总的进程

12、个数*/ /* 循环执行 直到输入的数据为负时才退出*/ if (rank = 0) fprintf(stderr, nPlease give new value=n); /*进程0读入要传递的数据*/ scanf( %d, &value ); fprintf(stderr,%d read -1) MPI_Issend( &value, 1, MPI_INT, rank + 1, 0, MPI_COMM_WORLD,&sreq); fprintf(stderr,%d send (%d)- %dn,rank,value,rank+1); /* 若不少于一个进程则向下一个进程传递该数据*/ els

13、e MPI_Irecv( &value, 1, MPI_INT, rank - 1, 0, MPI_COMM_WORLD,&rreq); /* 其它进程从前一个进程接收传递过来的数据*/ fprintf(stderr,%d receive (%d)- %dn,rank,value,0); /*若当前进程不是最后一个进程则将该数据继续向后传递*/ if (rank - %dn,rank,value,rank+1); /*若当前进程不是最后一个进程则将该数据继续向后传递*/ MPI_Barrier(MPI_COMM_WORLD); /* 执行一下同步 加入它主要是为了将前后两次数据传递分开*/ M

14、PI_Finalize( );4.3#include mpi.h#include #include /* 使用了随机函数srand和rand */#include /* 使用了时间函数time */int main(int argc,char *argv) int rank,size,i,buf1; MPI_Status status; MPI_Request rreq; MPI_Init(&argc,&argv); /* 得到当前进程标识和总的进程个数 */ MPI_Comm_rank(MPI_COMM_WORLD,&rank); MPI_Comm_size(MPI_COMM_WORLD,&

15、size); if(rank=0) /* 进程0接收来自其他所有进程的消息,将各消息的内容、消息来源和消息标识打印出来。 */ for(i=0;i10*(size-1);i+) MPI_Irecv(buf,1,MPI_INT,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&rreq);fprintf(stderr,Msg=%dtfrom%dwithtag%d.n,buf0,status.MPI_SOURCE,status.MPI_TAG); MPI_Wait(&rreq,&status); else /* 其他每个进程向进程0发送10个随机数 */ sra

16、nd(unsigned)time(NULL); /* 以当前时间作为生成随机数的种子 */ for(i=0;i10;i+) buf0=rand()%100; /* 生成一个随机整数 */ MPI_Rsend(buf,1,MPI_INT,0,i,MPI_COMM_WORLD); MPI_Finalize(); return 0;5点积计算#include #include mpi.h#define MAX_LOCAL_ORDER 100main(int argc, char* argv) float local_xMAX_LOCAL_ORDER; float local_yMAX_LOCAL_O

17、RDER; int n; int n_bar; float dot; int p; int my_rank; void Read_vector(char* prompt, float local_v, int n_bar, int p,int my_rank); float Parallel_dot(float local_x, float local_y, int n_bar); MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &p); MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);if (my_r

18、ank = 0) printf(Enter the order of the vectorsn); scanf(%d, &n); MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD); n_bar = n/p; Read_vector(the first vector, local_x, n_bar, p, my_rank); Read_vector(the second vector, local_y, n_bar, p, my_rank); dot = Parallel_dot(local_x, local_y, n_bar); if (my_rank

19、= 0) printf(The dot product is %fn, dot); MPI_Finalize(); void Read_vector(char*prompt,float local_v,int n_bar,int p, int my_rank) int i, q;float tempMAX_LOCAL_ORDER; MPI_Status status;if (my_rank = 0) printf(Enter %sn, prompt); for (i = 0; i n_bar; i+) scanf(%f, &local_vi); for (q = 1; q p; q+) for

20、 (i = 0; i n_bar; i+) scanf(%f, &tempi); 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,&status); float Serial_dot(float x,float y,int n) int i; float sum = 0.0; for (i = 0; i n; i+) sum = sum + xi*yi; return sum; float Parallel_

21、dot(float local_x,float local_y,int n_bar) float local_dot;float dot = 0.0; float Serial_dot(float x, float y, int m);local_dot = Serial_dot(local_x, local_y, n_bar);MPI_Reduce(&local_dot, &dot, 1, MPI_FLOAT,MPI_SUM, 0, MPI_COMM_WORLD); return dot; 6矩阵向量乘#include #include mpi.h#define MAX_ORDER 100t

22、ypedef float LOCAL_MATRIX_TMAX_ORDERMAX_ORDER;main(int argc, char* argv) int my_rank; int p; LOCAL_MATRIX_T local_A; float global_xMAX_ORDER; float local_xMAX_ORDER; float local_yMAX_ORDER; int m, n; int local_m, local_n; void Read_matrix(char* prompt, LOCAL_MATRIX_T local_A, int local_m, int n, int

23、 my_rank, int p); void Read_vector(char* prompt, float local_x, int local_n, int my_rank, int p); void Parallel_matrix_vector_prod( LOCAL_MATRIX_T local_A, int m, int n, float local_x, float global_x, float local_y, int local_m, int local_n); void Print_matrix(char* title, LOCAL_MATRIX_T local_A, in

24、t local_m, int n, int my_rank, int p); void Print_vector(char* title, float local_y, int local_m, int my_rank, int p); MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &p); MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);if (my_rank = 0) printf(Enter the order of the matrix (m x n)n); scanf(%d %d, &m,

25、&n); MPI_Bcast(&m, 1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);local_m = m/p; local_n = n/p; Read_matrix(Enter the matrix, local_A, local_m, n, my_rank, p); Print_matrix(We read, local_A, local_m, n, my_rank, p); Read_vector(Enter the vector, local_x, local_n, my_ran

26、k, p); Print_vector(We read, local_x, local_n, my_rank, p); Parallel_matrix_vector_prod(local_A, m, n, local_x, global_x, local_y, local_m, local_n); Print_vector(The product is, local_y, local_m, my_rank, p); MPI_Finalize();void Read_matrix(char*prompt,LOCAL_MATRIX_T local_A,int local_m,int n,int my_rank,int p) int i, j;LOCAL_MATRIX_T temp; for (i = 0; i p*local_m; i+) for (j = n; j MAX_ORDER; j+) tempij = 0.0;if (my_rank = 0) printf(%sn, prompt); for (i = 0; i p*local_m; i+) for (j = 0; j n; j+) scanf(%f,&tempij);

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1