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