二、实验目的、要求:
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);