目录

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.12166984

2.29655239

2.06245262

4核

4.13682094

4.57633046

4.41327837

8核

4.46109479

5.23876108

4.1624517

2.3 图表

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

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 4double 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;}}
}

openmp矩阵乘法相关推荐

  1. 并行程序设计方法实验(包括openmp、向量化实现pi计算、SPECOMP2012测试、矩阵乘法优化)

    目录 一.实验环境 二.专题一之积分计算圆周率 2.1向量优化 2.2 OpenMP优化 三.专题二之测试SPECOMP2012 3.1初步了解SPECOMP 3.2系统基本配置 3.3实践 3.3. ...

  2. ncnn 框架分析 openmp多核加速 缓存 仿存 cache 快速矩阵乘法 单指令多数据指令SIMD

    ncnn 框架分析 本文github链接 博文末尾支持二维码赞赏哦 _ 在ncnn中建立新层 ncnn 下载编译使用 参考1 参考2 1. param 和 bin 文件分析 param 7767517 ...

  3. 并行处理 mpi矩阵乘法

    基于MPI并行方法实现矩阵乘法 目录 1. 实验目的 3 2. 实验环境 4 3. 实验内容 4 3.1. 实验题目 4 3.2. 实验过程 5 3.2.1. 集群使用 5 3.2.2. 源码及解析 ...

  4. 矩阵乘法(串行与并行)

    矩阵乘法 1. 需求 矩阵乘法AB=C.其中,A,B,C均为20482048双精度浮点方阵,A,B初始值为[-1,1]的随机数. 2.串行和OpenMP并行代码 #include <iostre ...

  5. 如何在CPU上优化GEMM矩阵乘法

    如何在CPU上优化GEMM矩阵乘法 How to optimize GEMM on CPU (TL;DR) TVM 提供抽象接口,允许用户分别描述算法和算法的实现组织(所谓的调度).通常,在高性能调度 ...

  6. CPU的自动调度矩阵乘法

    CPU的自动调度矩阵乘法 这是一个有关如何对CPU使用自动调度程序的文档. 与依靠手动模板定义搜索空间的基于模板的autotvm不同,自动调度程序不需要任何模板.用户只需要编写计算声明,而无需任何调度 ...

  7. 十个利用矩阵乘法解决的经典题目

    出自matrix67.com 好像目前还没有这方面题目的总结.这几天连续看到四个问这类题目的人,今天在这里简单写一下.这里我们不介绍其它有关矩阵的知识,只介绍矩阵乘法和相关性质.     不要以为数学 ...

  8. [学习笔记]矩阵乘法及其优化dp

    1.定义: $c[i][j]=\sum a[i][k]\times b[k][j]$ 所以矩阵乘法有条件,(n*m)*(m*p)=n*p 即第一个矩阵的列数等于第二个矩阵的行数,否则没有意义. 2.结 ...

  9. ICML 2021:矩阵乘法无需相乘,速度提升100倍,MIT开源最新近似算法

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 在不做乘 ...

  10. 大佬是怎么优雅实现矩阵乘法的?

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者丨立交桥跳水冠军 来源丨https://zhuanlan.zhi ...

最新文章

  1. php cli模式下获取参数的方法
  2. android 文件mimetype_【Android】NFC课件
  3. Web ML+ WebAssembly 支持实现 Google Meet 背景模糊功能
  4. [NOIP2014] 寻找道路
  5. git文件gitignore修改后不生效
  6. WSL2扩展虚拟硬件磁盘( VHD大于256GB报错问题)
  7. Python系列之Python-docx生成运行日报Word模板
  8. 基于STM32的红外万能遥控器完整教程
  9. YOLO v4 图片批量测试
  10. 第1关:MapReduce综合应用案例 — 电信数据清洗
  11. wireshark分析无线wifi包
  12. java计算机毕业设计家教平台系统源码+mysql数据库+系统+lw文档+部署
  13. 天涯共此双11——天猫升级港澳台“购物天堂”
  14. 锦上添花之元音音标学习(下)
  15. Unreal 后期处理材质范例
  16. 如何在万网购买一个属于自己的域名
  17. 首批通过!百度智能云曦灵平台获信通院数字人能力评测权威认证
  18. MATLAB判断是不是质数,MATLAB脚本质数的判断
  19. 喜讯科技——桥梁防船撞预警系统
  20. linux巡检脚本生成word,windows、linux应急响应、安全巡检

热门文章

  1. 深度卷积神经网络(AlexNet)
  2. python用函数判断一个数是否为素数_【转载】Python脚本判断一个数是否为素数的几种方法...
  3. 【jzoj5053】【石子游戏】【搜索】
  4. Access2016删除主键列(图文操作)错误提示:若要删除主键,请在“设计”视图中打开该表并删除主键字段
  5. vs2003远程调试总结
  6. SEGGER_RTT、git偏僻问题常用解决方法
  7. 调试神器SEGGER_RTT移植使用
  8. 关于Windows勒索病毒以及445端口防护
  9. Linux 内核md5sum使用,linux命令详解:md5sum命令(示例代码)
  10. 从智能家居的发展看对讲企业的定位