openmp矩阵乘法

openmp矩阵乘法目录 1 实验内容与方法 2 实验过程 2 1 运行时间 2 2 加速比 2 3 图表 3 实验分析 4 源代码 1 实验内容与方法初始化数组 初始化三个 double 矩阵 matrix a matrix b 和 result 矩阵的行和列可以根据数据量大小自行调整 数组中的值使用 c 11 中的 random 类随机生成 0 到 1 之间的 double 值 程序计时 使用 c 11 中的

目录

1. 实验内容与方法

2. 实验过程

2.1 运行时间

2.2 加速比

2.3 图表

3. 实验分析

4. 源代码


1. 实验内容与方法

  1. 初始化数组。初始化三个double矩阵matrix_a,matrix_b和result,矩阵的行和列可以根据数据量大小自行调整。数组中的值使用c++11中的random类随机生成0到1之间的double值。
  2. 程序计时。使用c++11中的std::chrono库,使用system_clock表示当前的系统时钟,系统中运行的所有进程使用now()得到的时间是一致的。
  3. 串行执行数组相乘。遍历两个矩阵,使用矩阵乘法,将存储的结果放到
  4. 并行执行数组相乘。使用openmp将for循环设置为多线程,线程数根据实验内容进行调整。
  5. 线程数不变,修改矩阵大小。从6000 * 6000修改为8000 * 6000和8000 * 8000,统计运行时间。
  6. 矩阵大小不变,修改线程数。分别设置线程数为2、4、8个,统计运行时间。

2. 实验过程

       实验设备CPU(i7-7700  3.6GHz, 8核),内存16G,操作系统Ubuntu 18.04,IDE CLion。

2.1 运行时间

分别控制矩阵大小和并行线程数进行实验。经过长时间的代码运行计时,得到以下的实验结果表格。

运行时间/秒

6000 * 6000

8000 * 6000

8000 * 8000

串行执行

1222.05

2603.9

3835.77

2

575.985

1133.83

1859.81

4

295.408

568.993

869.143

8

273.935

497.045

921.517

 

2.2 加速比

加速比

6000 * 6000

8000 * 6000

8000 * 8000

串行执行

1

1

1

2

2.

2.

2.0

4

4.

4.

4.

8

4.

5.

4.

2.3 图表

绘制成图表,如下图所示。

openmp矩阵乘法

openmp矩阵乘法

openmp矩阵乘法

 

3. 实验分析

       从实验结果和加速比可以看出:

  1. 随着矩阵的增大,串行和并行算法运行时间也在增大;
  2. Openmp并行程序可有效提高矩阵运行的速度;
  3. 在4核并行内,矩阵运行的加速比与核心数近似成正比;当并行线程数大于4后,矩阵运行的时间较4线程提升不大,实验中存在8个线程运行时间多于4线程的情况。

4. 源代码

#include <iostream> #include "cstdlib" #include "random" #include "ctime" #include "chrono" #include "omp.h" using namespace std; using namespace std::chrono; #define M 6000 #define N 6000 #define ThreadNumber 4 double matrix_a[M][N], matrix_b[N][M], result[M][M]; void init_matrix(); void serial_multiplication(); void parallel_multiplication(); int main() { init_matrix(); auto start = system_clock::now(); serial_multiplication(); auto end = system_clock::now(); auto duration = duration_cast<microseconds>(end - start); cout << "serial multiplication takes " << double(duration.count()) * microseconds::period::num / microseconds::period::den << " seconds" << endl; start = system_clock::now(); parallel_multiplication(); end = system_clock::now(); duration = duration_cast<microseconds>(end - start); cout << "parallel multiplication takes " << double(duration.count()) * microseconds::period::num / microseconds::period::den << " seconds" << endl; return 0; } //generate the same matrix everytime void init_matrix() { default_random_engine engine; uniform_real_distribution<double> u(0.0, 1.0); for (int i = 0; i < M; ++i) { for (int j = 0; j < N; ++j) { matrix_a[i][j] = u(engine); } } for (int i = 0; i < N; ++i) { for (int j = 0; j < M; ++j) { matrix_b[i][j] = u(engine); } } } void serial_multiplication() { for (int i = 0; i < M; ++i) { for (int j = 0; j < M; ++j) { double temp = 0; for (int k = 0; k < N; ++k) { temp += matrix_a[i][k] * matrix_b[k][j]; } result[i][j] = temp; } } } void parallel_multiplication() { #pragma omp parallel for num_threads(ThreadNumber) for (int i = 0; i < M; ++i) { for (int j = 0; j < M; ++j) { double temp = 0; for (int k = 0; k < N; ++k) { temp += matrix_a[i][k] * matrix_b[k][j]; } result[i][j] = temp; } } }

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233013.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • matlab求解微分方程组(matlab解微分方程的数值解)

    如何用matlab来求解简单的微分方程?举例来说明吧。求解三阶常微分方程。我们知道,求解高阶常微分方程可以化为求解一阶常微分方程组。编写函数eq3.m:%解常微分方程3*y”’+5*y”+6*sin(t)*y=costfunctionydot=eq3(t,y)ydot=[y(2);y(3);(cos(t)-5*y(3)-6*sin(t)*y(1))/3];其中,ydot为一个

    2022年4月18日
    345
  • 解决uploadify插件不同浏览器下的兼容性问题

    解决uploadify插件不同浏览器下的兼容性问题

    2021年10月26日
    45
  • setScale,preScale 和 postScale 的区别

    setScale,preScale 和 postScale 的区别setScale,preScale和postScale的区别上面讲到,Matrix由3*3矩阵中9个值来决定。而我们对Matrix的所有设置,也是对这9个值的各种不同的改变,来达到我们想要的效果。下面是Matrix3*3的矩阵结构{MSCALE_X,MSKEW_X,MTRANS_X,MSKEW_Y,MSCALE_Y,MTRANS_Y,MPERSP_0,MPERSP_1,MPERSP_2}一、首先介绍Scale缩放的控制scale就是缩放,我们调用Matrix的setScale、preSc

    2022年10月20日
    4
  • html网页设计作业成品(用css和div制作网站)

    话不多说,直接上效果图:历史介绍行政区划:地理环境著名景点:美食小吃工艺品联系我们部分项目结构老师要求的十几个页面20几张图片以及一些跳转,使用div+css布局也基本上都有了。然后代码也有注释。也能够容易看得懂部分代码偷个懒,就用notepad打开。不用H-build打开了。哈哈哈另外有同学要是需要源码的话可以联系我呀。大家加油!奥利给!…

    2022年4月11日
    92
  • Java动态拼接SQL–02–Jpa「建议收藏」

    Java动态拼接SQL–02–Jpa「建议收藏」本篇进行Spring-data-jpa的介绍,几乎涵盖该框架的所有方面,在日常的开发当中,基本上能满足所有需求。这里不讲解JPA和Spring-data-jpa单独使用,所有的内容都是在和Spring整合的环境中实现。如果需要了解该框架的入门,百度一下,很多入门的介绍。在这篇文章的接下来一篇,会有一个系列来讲解mybatis,这个系列从mybatis的入门开始,到基本使用,和spring整合,和第

    2022年6月10日
    257
  • python和java的区别-python与java区别[通俗易懂]

    python和java的区别-python与java区别[通俗易懂]Python和Java都是很火的编程语言,对于想学习编程的人员来说,常常被这个问题所困扰:我是该学Python还是Java呢?想要解决这个问题,还需结合自身实际情况和两种语言的特点进行分析。以下是Python和Java的区别:(推荐学习:java课程)1.Python比Java简单,学习成本低,开发效率高;2.Java运行效率高于Python,尤其是纯Pytho…

    2022年7月9日
    25

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号