以下内容为本人并行计算课程的期末作业,有不足的地方,请多多指教!
1 实验目的
本实验的目的主要有以下三点:
1、 实现方阵行列式的计算。
2、 实现方阵行列式的并行计算,分别基于 OpenMP和 MPI。
3、 比较以上三种算法的运行时间,计算加速比。
2 实验设计
2.1 生成方阵
为方便,本实验的方阵不采取手动输入的方式,而是使用随机数来生成矩阵元素。
我定义了一个全局方阵变量——int p[100][100]。在创建方阵时,方阵的阶数N(N<100)由外部输入。然后用两层“for循环”来给方阵 p左上角 N×N个位置赋值。具体实现如下:
/*
* 定义矩阵阶数N
*/
int N;
/*
* 定义一个全局矩阵
*/
int p[100][100];
/*
* 用随机数生成矩阵
*/
void create(){
int i,j;
for(i=0;i
2.2 打印矩阵
将生成的矩阵输出,以便验算其计算行列式的正确性。具体实现如下:
/*
* 输出矩阵
*/
void print()
{
int i,j;
for(i=0;i
2.3 计算矩阵行列式
计算矩阵行列式的方法有很多,本实验选择的方法是:行列式按行展开法。行列式等于它任一行的各元素与其对应的代数余子式乘积之和。代数余子式:A(ij)=(-1)^(i+j)M(ij). (ij)为下标。某个元素的余子式等于原行列式划去该元素所在的行和列。本实验采取按第一行展开的方法。即:将高阶的行列式按第一行展开,一直重复展开行为,直到阶数为 1。上述过程可用递归完成。
2.3.1 递归实现代码
根据上面的理论,我们容易得出如下的实现方法:
/*
* 计算行列式的函数
*/
long long mydet(int p [100][100],int n){
if(n==1) //n=1返回矩阵的唯一数,停止递归
return p[0][0];
else{
long long sum=0;
for(int i=0;i
2.4 实现串行\OpenMP\MPI计算
我这里的并行主要是放在第一次的按行展开那,具体实现看代码吧。
2.4.1 串行代码
/*************************************************************************
> File Name: matrix_det.c
> Author: surecheun
> Mail: [email protected]
> Created Time: 2017年12月06日 星期三 17时28分00秒
************************************************************************/
#include
#include
#include
#include
#include
/*
* 定义矩阵阶数N
*/
int N;
/*
* 定义一个全局矩阵
*/
int p[100][100];
/*
* 用随机数生成矩阵
*/
void create(){
int i,j;
for(i=0;i
2.4.2 OpenMP代码
/*************************************************************************
> File Name: matrix_det_omp.c
> Author: surecheun
> Mail: [email protected]
> Created Time: 2017年12月07日 星期四 17时23分51秒
************************************************************************/
#include
#include
#include
#include
#include
#include
/*
* 定义线程数
*/
#define n_threads 2
/*
*定义矩阵的阶数为全局变量
*/
int N;
/*
* 定义一个全局矩阵
*/
int p[100][100];
/*
* 用随机数生成矩阵
*/
void create(){
int i,j;
for(i=0;i0,则继续计算
create(); //创建矩阵
print(); //打印创建的矩阵
double start1,finish1;
start1=omp_get_wtime(); //开始计算时间
long long sum=0;
omp_set_num_threads(n_threads);//设置线程数
#pragma omp parallel for reduction(+:sum)//并行化
for(int i=0;i
2.4.3 MPI实现代码
/*************************************************************************
> File Name: matrix_det_mpi.c
> Author: surecheun
> Mail: [email protected]
> Created Time: 2017年12月07日 星期四 16时24分03秒
************************************************************************/
#include
#include
#include
#include
#include
/*
*定义矩阵的阶数为全局变量
*/
int N;
/*
* 定义一个全局矩阵
*/
int p[100][100];
/*
* 用随机数生成矩阵
*/
void create(){
int i,j;
for(i=0;i
4 实验结果
4.1 正确性
4.1.1串行
结果分析,以 n=4为例,输出的矩阵为:
13 |
1 |
12 |
10 |
8 |
10 |
1 |
12 |
9 |
1 |
2 |
7 |
5 |
4 |
8 |
1 |
输出结果为:3875
和matlab计算结果一致!
4.1.2 OpenMP
结果分析,以 n=4为例,输出的矩阵为:
5 |
0 |
8 |
1 |
1 |
5 |
11 |
3 |
2 |
5 |
1 |
1 |
0 |
0 |
14 |
12 |
输出结果为:-2710
和matlab计算结果一致!
4.1.3 MPI
结果分析,以n=4为例,输出矩阵为:
9 |
1 |
2 |
7 |
5 |
4 |
8 |
1 |
0 |
6 |
7 |
1 |
11 |
8 |
12 |
9 |
输出结果为:-202
和matlab计算结果一致!
4.2 加速比
通过多次求平均,得到三种计算实现方法的计算时间(保留 3 位有效数字)如下:
N(阶数) |
串行 |
OpenMP |
MPI |
9 |
0.0239s |
0.0117s |
0.0117s |
10 |
0.195s |
0.105s |
0.100s |
柱状图如下: