MPI并行程序编写与调试(奇偶变换排序))

二、实验目的、要求:
1、编写MPI并行计算程序,完成指定功能。
2、编译、运行该程序并考查其功能和性能。
3、编写代码测试该程序的运行时间并作记录。
4、记录实验过程、写出源代码并记录运行结果。
三、实验的重点、难点:
重点:并行程序的编写
难点:程序运行时间的测试
四、器材、设备:
计算机、互联网接入

五、主要任务
1、编写程序
vim mpi_odd_even.c
2、编译、运行OpenMP并行程序(奇偶变换排序)
mpicc -g -Wall -o mpi_odd_even mpi_odd_even.c
mpiexec -n 4 ./mpi_odd_even g 100
3、测试运行性能、记录结果并分析

结果:

结果分析:
数据大小为n时的奇偶排序结果
心得:
本次实验我了解到了共享变量方法的主要特点是利用共享存储器中共享变量来实现处理机间的通信,它主要用在共享存储结构中。其中进程的分配、结果的收集均通过消息传递来完成。
奇偶排序还有很多其他的方法,但是以后的计算机发展是面向并行的。所以并行计算是很有前景。

附录A:编译与运行命令格式示例

附录B:参考程序

/*
 * File:     mpi_odd_even.c
 * Purpose:  Implement parallel odd-even sort of an array of 
 *           nonegative ints
 * Input:
 *    A:     elements of array (optional)
 * Output:
 *    A:     elements of A after sorting
 *
 * Compile:  mpicc -g -Wall -o mpi_odd_even mpi_odd_even.c
 * Run:
 *    mpiexec -n <p> mpi_odd_even <g|i> <global_n> 
 *       - p: the number of processes
 *       - g: generate random, distributed list
 *       - i: user will input list on process 0
 *       - global_n: number of elements in global list
 *
 * Notes:
 * 1.  global_n must be evenly divisible by p
 * 2.  Except for debug output, process 0 does all I/O
 * 3.  Optional -DDEBUG compile flag for verbose output
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mpi.h>

const int RMAX = 100;

/* Local functions */
void Usage(char* program);
void Print_list(int local_A[], int local_n, int rank);
void Merge_low(int local_A[], int temp_B[], int temp_C[], 
         int local_n);
void Merge_high(int local_A[], int temp_B[], int temp_C[], 
        int local_n);
void Generate_list(int local_A[], int local_n, int my_rank);
int  Compare(const void* a_p, const void* b_p);

/* Functions involving communication */
void Get_args(int argc, char* argv[], int* global_n_p, int* local_n_p, 
         char* gi_p, int my_rank, int p, MPI_Comm comm);
void Sort(int local_A[], int local_n, int my_rank, 
         int p, MPI_Comm comm);
void Odd_even_iter(int local_A[], int temp_B[], int temp_C[],
         int local_n, int phase, int even_partner, int odd_partner,
         int my_rank, int p, MPI_Comm comm);
void Print_local_lists(int local_A[], int local_n, 
         int my_rank, int p, MPI_Comm comm);
void Print_global_list(int local_A[], int local_n, int my_rank,
         int p, MPI_Comm comm);
void Read_list(int local_A[], int local_n, int my_rank, int p,
         MPI_Comm comm);


/*-------------------------------------------------------------------*/
int main(int argc, char* argv[]) {
   
   int my_rank, p;
   char g_i;
   int *local_A;
   int global_n;
   int local_n;
   MPI_Comm comm;

   MPI_Init(&argc, &argv);
   comm = MPI_COMM_WORLD;
   MPI_Comm_size(comm, &p);
   MPI_Comm_rank(comm, &my_rank);

   Get_args(argc, argv, &global_n, &local_n, &g_i, my_rank, p, comm);
   local_A = (int*) malloc(local_n*sizeof(int));
   if (g_i == 'g') {
   
      Generate_list(local_A, local_n, my_rank);
      
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MPI是一种并行计算标准,通过使用MPI库函数,可以实现多个计算节点之间的通信和协调,从而实现并行计算。在MPI并行程序编写调试实验中,我们通常使用MPI矩阵-向量乘法作为实验原理。 MPI矩阵-向量乘法是一种常见的并行计算问题。它的目标是将一个n*n的矩阵A乘以一个n*1的向量x,得到一个n*1的向量y。在串行计算中,每个元素在矩阵中都需要乘以向量中的每个元素,然后将它们相加得到结果。在并行计算中,我们可以将矩阵和向量划分为多个部分,每个计算节点负责计算其中一部分,最后将它们相加得到最终结果。 MPI矩阵-向量乘法的实现需要以下步骤: 1. 初始化MPI,获取进程数和进程编号。 2. 在主进程中读入矩阵和向量,并将它们划分为多个部分。 3. 将划分后的矩阵和向量分发给各个计算节点。 4. 在各个计算节点中,对分配到的矩阵和向量进行计算,并将结果发送回主进程。 5. 在主进程中将各个节点的计算结果相加,得到最终结果。 MPI矩阵-向量乘法的调试通常需要使用MPI调试工具,例如MPI调试器和性能分析工具。在调试过程中,需要注意以下问题: 1. 确保矩阵和向量的划分是正确的,每个进程计算的部分不会重叠。 2. 确保进程之间的通信和同步是正确的,避免死锁和竞态条件。 3. 使用MPI调试器和性能分析工具来查找和解决问题,例如MPI调试器gdb和性能分析工具OpenMPI

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yet again

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值