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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • unity自学入门_unity 教程

    unity自学入门_unity 教程六本书Unity5权威讲解Unity3DNGUI实战教程Unity5实战使用C和Unity开发多平台游戏Unity3D人工智能编程Unity官方案例精讲UnityShader入门精要1.Unity5权威讲解#目录第1章 Unity5简介 11.1 Unity3D游戏引擎的诞生 21.2 Unity5的优势 21.2.1 支持多平台 21.2.2 集

    2022年8月30日
    7
  • debounce实现 js_javascript防抖函数debounce详解「建议收藏」

    debounce实现 js_javascript防抖函数debounce详解「建议收藏」定义及解读防抖函数debounce指的是某个函数在某段时间内,无论触发了多少次回调,都只执行最后一次。假如我们设置了一个等待时间3秒的函数,在这3秒内如果遇到函数调用请求就重新计时3秒,直至新的3秒内没有函数调用请求,此时执行函数,不然就以此类推重新计时。举一个小例子:假定在做公交车时,司机需等待最后一个人进入后再关门,每次新进一个人,司机就会把计时器清零并重新开始计时,重新等…

    2022年6月20日
    54
  • 原生小程序使用 flyio,以及拦截器

    原生小程序使用 flyio,以及拦截器原生小程序的request请求都是异步请求,在实际项目中使用起来很麻烦,自己封装的方法又不够用,所以想到了flyio,不仅可以实现Promise,而且还可以对所有的页面请求进行拦截,使用起来非常的方便。第一件事首先也是先引用flyio.js了。下载地址:flyio.js在utils目录新建http.jsvarFly=require("flyio.js")//引入路径根据自…

    2025年9月5日
    9
  • RT-thread finsh移植到linux平台

    RT-thread finsh移植到linux平台目录FinSH介绍传统命令行模式C语言解释器模式FinSH移植移植要点效果验证代码下载参考在一次项目中,需要进行嵌入式操作系统选型,需求就是选择一款OS,既能满足当下项目的需要,又要考虑公司未来对物联网应用的扩展能力,对比了目前市面上流行的开源操作系统,诸如FreeRTOS,RTX,UCOS,RT-Thread,contiki等,最终确定了一款Io…

    2022年5月21日
    35
  • 固态硬盘损坏 数据恢复_固态硬盘如何恢复数据

    固态硬盘损坏 数据恢复_固态硬盘如何恢复数据先在没有专业技术和维修经验的前提下,切勿自己动手去修复硬盘,操作不当极易对硬盘固件造成二次损坏,带来数据丢失的严重后果!有送修硬盘的客户,由于在小电脑店或者小作坊修过硬盘,失败后才拿到正规渠道做数据恢复,结果还是失败,正是因为一些不正确的操作对受损硬盘进行了二次或者多次损坏,导致数据恢复提取失败!所以,遇到硬盘故障问题,一定要送修专业机构进行数据恢复。专业级我们把常见的固态硬盘损坏概括为硬件损坏(电路板和主控)和固件损坏。1.硬件损坏如果是硬件损坏,可以通过更换电路板和主控来恢复硬盘

    2026年1月31日
    3
  • 使用matplotlib绘制折线图,柱状图,柱线混合图「建议收藏」

    使用matplotlib绘制折线图,柱状图,柱线混合图「建议收藏」matplotlib介绍Matplotlib是Python的绘图库。它可与NumPy一起使用,提供了一种有效的MatLab开源替代方案。它也可以和图形工具包一起使用,如PyQt和wxPython。安装Matplotlib库命令:在cmd命令窗口输入pipinstallmatplotlib。matplotlib绘制折线图绘制一条折线的折线图#-*-c…

    2022年5月31日
    64

发表回复

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

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