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


相关推荐

  • 惠普电脑一直刷新_我的电脑设备管理器在哪

    惠普电脑一直刷新_我的电脑设备管理器在哪公司的Hp电脑,设备管理一直刷新,鼠标时断时续,很搞心态,得有一个月了,一直找不到原因,后来禁用了设备管理的生物识别设备就可以了,反正也用不到指纹.

    2022年8月12日
    4
  • OpenSSL密码库算法笔记——第5.1.1章 椭圆曲线点群的定义

    OpenSSL密码库算法笔记——第5.1.1章 椭圆曲线点群的定义下面定义的椭圆曲线点群不仅包含了域的信息和曲线的信息,甚至还包括了很多别的有利于实现的信息。椭圆曲线点群的定义如下。typedefstructec_group_stEC_GROUP;structec_group_st{constEC_METHOD*meth;EC_POINT*generator;BIGNUM…

    2022年7月20日
    21
  • CentOS7 安装 kafka「建议收藏」

    CentOS7 安装 kafka「建议收藏」文章目录一、安装JDK二、安装zookeeper三、安装kafka一、安装JDKrpm-qa|grepjavarpm-qa|grepjdkrpm-qa|grepgcjrpm-qa|grepjava|xargsrpm-e–nodeps #卸载老版本yumlistjava-1.8*yuminstalljava-1.8.0-openjdk*-yjava-version二、安装zookeeper官方地址:https://ar

    2022年6月6日
    27
  • 电子书 android高薪之路-android程序员面试宝典.pdf

    电子书 android高薪之路-android程序员面试宝典.pdf《Android高薪之路:Android程序员面试宝典》取材于各大IT公司面试真题,所给出的试题尽可能地覆盖了Android应用开发的各个方面,而且大多数试题都有解析部分,读者可以通过这部分更深入地理解试题中所包含的技术内容,希望真正做到由点成线,举一反三。 书中还将Android中涉及的各个常用技术问题进行筛选、分类。这样读者可以有的放矢,对自己还没有掌握的Android技术进行重点攻…

    2022年4月28日
    119
  • cocos2d-x3.x屏蔽遮罩层屏蔽触摸button

    cocos2d-x3.x屏蔽遮罩层屏蔽触摸button

    2022年1月10日
    46
  • 读书 Android应用开发揭秘[通俗易懂]

    读书 Android应用开发揭秘[通俗易懂]一、Android基于Linux平台,由操作系统、中间件、用户界面和应用软件组成。二、特点:1、开放性2、应用程序无界限3、应用程序在平等的条件下创建4、应用程序可以轻松的嵌入网络5、应用程序可以并行运行。三、Android系统架构分为四层:应用层:java编写运行在虚拟机上的程序。应用框架层:编写应用时使用的API框架。系统运行库层:C/C++库Lin…

    2022年5月29日
    33

发表回复

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

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