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中的std::chrono库,使用system_clock表示当前的系统时钟,系统中运行的所有进程使用now()得到的时间是一致的。
- 串行执行数组相乘。遍历两个矩阵,使用矩阵乘法,将存储的结果放到
- 并行执行数组相乘。使用openmp将for循环设置为多线程,线程数根据实验内容进行调整。
- 线程数不变,修改矩阵大小。从6000 * 6000修改为8000 * 6000和8000 * 8000,统计运行时间。
- 矩阵大小不变,修改线程数。分别设置线程数为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. 实验分析
从实验结果和加速比可以看出:
- 随着矩阵的增大,串行和并行算法运行时间也在增大;
- Openmp并行程序可有效提高矩阵运行的速度;
- 在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矩阵乘法相关推荐
- 并行程序设计方法实验(包括openmp、向量化实现pi计算、SPECOMP2012测试、矩阵乘法优化)
目录 一.实验环境 二.专题一之积分计算圆周率 2.1向量优化 2.2 OpenMP优化 三.专题二之测试SPECOMP2012 3.1初步了解SPECOMP 3.2系统基本配置 3.3实践 3.3. ...
- ncnn 框架分析 openmp多核加速 缓存 仿存 cache 快速矩阵乘法 单指令多数据指令SIMD
ncnn 框架分析 本文github链接 博文末尾支持二维码赞赏哦 _ 在ncnn中建立新层 ncnn 下载编译使用 参考1 参考2 1. param 和 bin 文件分析 param 7767517 ...
- 并行处理 mpi矩阵乘法
基于MPI并行方法实现矩阵乘法 目录 1. 实验目的 3 2. 实验环境 4 3. 实验内容 4 3.1. 实验题目 4 3.2. 实验过程 5 3.2.1. 集群使用 5 3.2.2. 源码及解析 ...
- 矩阵乘法(串行与并行)
矩阵乘法 1. 需求 矩阵乘法AB=C.其中,A,B,C均为20482048双精度浮点方阵,A,B初始值为[-1,1]的随机数. 2.串行和OpenMP并行代码 #include <iostre ...
- 如何在CPU上优化GEMM矩阵乘法
如何在CPU上优化GEMM矩阵乘法 How to optimize GEMM on CPU (TL;DR) TVM 提供抽象接口,允许用户分别描述算法和算法的实现组织(所谓的调度).通常,在高性能调度 ...
- CPU的自动调度矩阵乘法
CPU的自动调度矩阵乘法 这是一个有关如何对CPU使用自动调度程序的文档. 与依靠手动模板定义搜索空间的基于模板的autotvm不同,自动调度程序不需要任何模板.用户只需要编写计算声明,而无需任何调度 ...
- 十个利用矩阵乘法解决的经典题目
出自matrix67.com 好像目前还没有这方面题目的总结.这几天连续看到四个问这类题目的人,今天在这里简单写一下.这里我们不介绍其它有关矩阵的知识,只介绍矩阵乘法和相关性质. 不要以为数学 ...
- [学习笔记]矩阵乘法及其优化dp
1.定义: $c[i][j]=\sum a[i][k]\times b[k][j]$ 所以矩阵乘法有条件,(n*m)*(m*p)=n*p 即第一个矩阵的列数等于第二个矩阵的行数,否则没有意义. 2.结 ...
- ICML 2021:矩阵乘法无需相乘,速度提升100倍,MIT开源最新近似算法
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 在不做乘 ...
- 大佬是怎么优雅实现矩阵乘法的?
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者丨立交桥跳水冠军 来源丨https://zhuanlan.zhi ...
最新文章
- php cli模式下获取参数的方法
- android 文件mimetype_【Android】NFC课件
- Web ML+ WebAssembly 支持实现 Google Meet 背景模糊功能
- [NOIP2014] 寻找道路
- git文件gitignore修改后不生效
- WSL2扩展虚拟硬件磁盘( VHD大于256GB报错问题)
- Python系列之Python-docx生成运行日报Word模板
- 基于STM32的红外万能遥控器完整教程
- YOLO v4 图片批量测试
- 第1关:MapReduce综合应用案例 — 电信数据清洗
- wireshark分析无线wifi包
- java计算机毕业设计家教平台系统源码+mysql数据库+系统+lw文档+部署
- 天涯共此双11——天猫升级港澳台“购物天堂”
- 锦上添花之元音音标学习(下)
- Unreal 后期处理材质范例
- 如何在万网购买一个属于自己的域名
- 首批通过!百度智能云曦灵平台获信通院数字人能力评测权威认证
- MATLAB判断是不是质数,MATLAB脚本质数的判断
- 喜讯科技——桥梁防船撞预警系统
- linux巡检脚本生成word,windows、linux应急响应、安全巡检
热门文章
- 深度卷积神经网络(AlexNet)
- python用函数判断一个数是否为素数_【转载】Python脚本判断一个数是否为素数的几种方法...
- 【jzoj5053】【石子游戏】【搜索】
- Access2016删除主键列(图文操作)错误提示:若要删除主键,请在“设计”视图中打开该表并删除主键字段
- vs2003远程调试总结
- SEGGER_RTT、git偏僻问题常用解决方法
- 调试神器SEGGER_RTT移植使用
- 关于Windows勒索病毒以及445端口防护
- Linux 内核md5sum使用,linux命令详解:md5sum命令(示例代码)
- 从智能家居的发展看对讲企业的定位