方阵行列式并行化计算(OpenMP,MPI),并计算加速比

以下内容为本人并行计算课程的期末作业,有不足的地方,请多多指教!

实验目的

本实验的目的主要有以下三点:

1 实现方阵行列式的计算。

2 实现方阵行列式的并行计算,分别基于 OpenMP MPI

3 比较以上三种算法的运行时间,算加速比。

实验设计

2.生成方阵

为方便,本实验的方阵不采取手动输入的方式,而是使用随机数来生成矩阵元素。

定义了一个全局方阵变——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.打印矩阵

将生成的矩阵输出,以便验算其计算行列式的正确性。具体实现如下:

/*
 * 输出矩阵
 */

void print()
{
	int i,j;
	for(i=0;i

2.计算矩阵行列式

计算矩阵行列式的方法有很多,本实验选择的方法是:行列式按行展开法。行列式等于它任一行的各元素与其对应的代数余子式乘积之和。代数余子式:A(ij)=-1)^(i+j)M(ij).  (ij)为下标。某个元素的余子式等于原行列式划去该元素所在的行和列。本实验采取按第一行展开的方法。即:将高阶的行列式按第一行展开,一直重复展开行为,直到阶数为 1。上述过程可用递归完成。

2.3.递归实现代码

根据上面的理论,我们容易得出如下的实现方法:

/*
 * 计算行列式的函数
 */

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







柱状图如下:

方阵行列式并行化计算(OpenMP,MPI),并计算加速比_第1张图片

转载于:https://www.cnblogs.com/surecheun/p/9648981.html

你可能感兴趣的:(方阵行列式并行化计算(OpenMP,MPI),并计算加速比)