1、用MPI进行分布式内存编程 课堂练习1n1.根据课本程序3-2和3-3,写出并行梯形积分的完整可执行的代码,其中f(x)=x*x。n2.改变题1中的梯形积分法,使其在能够在comm_sz无法被n整除的情况下,正确估算积分值(假设n=comm_sz)。课堂练习2n2.改变题1中的梯形积分法,使其在能够在comm_sz无法被n整除的情况下,正确估算积分值(假设n=comm_sz)。nint quotient=n/comm_sz;nint remainder=n%comm_sz;nif(my_rank remainder)nlocal_n=quotient+1;nlocal_a=a+my_rank*
2、local_n*h;nlocal_b=local_a+local_n*h;n else nlocal_n=quotient;nlocal_a=a+my_rank*local_n*h+remainder*h;nlocal_b=local_a+local_n*h;n课堂练习3n在输出例子的程序3-4中,每个进程只打印一行输出,修改程序,使程序能够按进程号的顺序打印,即,进程0的消息先输出,然后进程1的消息,以此类推。课堂练习4n修改梯形积分程序,使程序可以读入积分区间a b的端点值a、b和所用梯形的个数n。课堂练习5n修改梯形积分法程序,使用集合函数:MPI_Reduce和MPI_Bcast课堂练
3、习6n根据课本程序3-8、3-9和3-10,写出完整的并行向量加法程序(z=x+y)n要求:1.由0进程读取向量的维度n并广播给其他进程;2.由0进程读取向量x和y,并以块划分的方式分发给其他进程;3.由0进程以块划分的方式将结果z打印出来课堂练习7n根据课本程序3-12、3-9和3-10,写出完整的并行矩阵-向量乘法程序(y=Ax)n要求:1.由0进程读取矩阵A的维度并广播给其他进程;2.由0进程读取矩阵A和向量,并以块划分的方式分发给其他进程;3.由0进程以块划分的方式将结果y打印出来课堂练习8n编写一个程序,来比较发送一条包含n个double型数据的消息,和发送n条消息且每条消息只包含一
4、个double型数据,所用的时间n提示:参考课本77页和81页的相关代码课堂练习9n参考课本88(131)、90(134)和91(135)页,写出完整的并行奇偶排序算法。n提示:0进程读取列表,并散射到其他进程;0进程打印最终排好序的列表nint main(void)n int*local_A;n int global_n;n int local_n;n MPI_Init(NULL,NULL);n comm=MPI_COMM_WORLD;n MPI_Comm_size(comm,&p);n MPI_Comm_rank(comm,&my_rank)n int my_rank,p;nRead_li
5、st(local_A,local_n,my_rank,p,comm);nSort(local_A,local_n,my_rank,p,comm);nPrint_global_list(local_A,local_n,my_rank,p,comm);n free(local_A);n MPI_Finalize();n return 0;n /*main*/nint main(void)n int my_rank,p;n int*local_A;n int global_n;n int local_n;n MPI_Comm comm;n MPI_Init(NULL,NULL);n comm=MPI_COMM_WORLD;n MPI_Comm_size(comm,&p);n MPI_Comm_rank(comm,&my_rank);nRead_list(local_A,local_n,my_rank,p,comm);nSort(local_A,local_n,my_rank,p,comm);nPrint_global_list(local_A,local_n,my_rank,p,comm);n free(local_A);n MPI_Finalize();n return 0;n /*main*/