基于OpenMP的并行计算

本人所有博客仅用于个人的知识积累,禁止商业与非商业用途的剽窃和抄袭,如有错误,欢迎各位大佬批评指正,我们一起交流讨论、共同成长。

序言:本学期选修了《GPU并行计算》这门课程,借此来学习一下并行计算的硬件基础、并行程序设计思想与方法、并行算法设计与分析等内容,提高个人的编码能力和底层硬件与上层软件的联系能力。闲话不多说,我们开始吧!

基于OpenMP(Open Multi-Processing)的并行程序主要是在原来的串行程序基础上,添加编译指导指令(类似于C/C++中带“#”的语句)。因此,编程任务量小,上手比较容易。而实现并行行为主要是依靠底层运行支持库,程序员不需要关注这些,只需要考虑并行区域的划分与并行算法的设计。

首先,使用OpenMP(以下简称“omp”)时,需要包含的头文件如下代码块所示,第一个头文件包含了omp的编译指导语句,第二个头文件主要是为了测试并行计算的时间,使用其中的数据类型clock_t

#include<omp.h>
#include<time.h>

基于omp的并行语句都是以如下关键词组开始的:

#pragma omp

若出现如下语句,则表明代码段进入了并行模式:

#pragma omp parallel

利用下方的主函数可以测试在未指定线程个数的时候,CPU一共创建了多少线程来执行并行代码段。parallel块中的每行代码都被多个线程重复执行了。

int main()
{#pragma omp parallelcout << "hello world" << endl;return 0;
}

下面给出几组简单且常见的并行测试程序来体会基于omp的并行编程方法。

循环语句中开启多个线程需要用到下述语句,且两组语句等价

#pragma omp parallel for
#pragma omp parallel {#pragma omp forfor(...){...}...}

值得注意的是,
1、第二组代码段中,若没有#pragma omp parallel,则无法实现并行,只有二者结合起来使用才会有效;
2、#pragma omp for语句的作用域仅在当前循环,对于并行区域的其他循环不起作用,若并行块中的所有for循环都需要并行计算的话,则每组循环开始前都应添加#pragma omp for语句;
3、参与并行计算的线程必须保证具有独立性,即各个循环之间互不相关,后一个循环不依赖于前面若干个循环的结果;
4、此类并行模式属于数据级并行

若指定线程数为n,则

#pragma omp parallel num_threads(n) {#pragma omp forfor(...){...}...}

测试程序1:并行输出测试

#include<iostream>
#include<Windows.h>
#include<omp.h>
using namespace std;
int main()
{#pragma omp parallel{#pragma omp forfor (int j = 0; j < 1000; j++){Sleep(5000);cout << "j=" << j << ", Thread_id = " << omp_get_thread_num() << endl;} }return 0;
}

测试程序2:串行累加与并行累加的用时比较

#include<iostream>
#include<time.h>
#include<omp.h>
using namespace std;
void SumNumber()
{int sum = 0;for(int i = 0; i < 10000000; i++)sum ++;
}
void SerialTest()
{clock_t t1 = clock();for (int i = 0; i < 100; i++)SumNumber();clock_t t2 = clock();cout << "Serial Time: " << t2 - t1 << endl;
}
void ParallelTest()
{clock_t t1 = clock();
#pragma omp parallel forfor (int i = 0; i < 100; i++)SumNumber();clock_t t2 = clock();cout << "Parallel Time: " << t2 - t1 << endl;
}
int main()
{SerialTest();ParallelTest();return 0;
}

void ParallelTest()
{clock_t t1 = clock();
#pragma omp parallel num_threads(5){#pragma omp forfor (int i = 0; i < 100; i++)SumNumber();}clock_t t2 = clock();cout << "Parallel Time: " << t2 - t1 << endl;
}

sections结构是omp中常用的任务划分语句,将并行区域的代码结构划分为离散的代码块(section),每个代码块(section)都由一个线程执行,属于任务级并行

#pragma omp parallel sections
{#pragma omp section{...}#pragma omp section{...}...
}

测试程序3:向量的加法


基于OpenMP的并行计算相关推荐

  1. 基于HBASE的并行计算架构之rowkey设计篇

    1.大数据在HBASE存储.计算以及查询的应用场景 海量数据都是事务数据,事务数据都是在时间的基础上产生的.数据的业务时间可能会顺序产生,也可能不会顺序产生,比如某些事务发生在早上10点,但是在下午5 ...

  2. 五种基于 MapReduce 的并行计算框架介绍及性能测试

    并行计算模型和框架 目前开源社区有许多并行计算模型和框架可供选择,按照实现方式.运行机制.依附的产品生态圈等可以被划分为几个类型,每个类型各有优缺点,如果能够对各类型的并行计算框架都进行深入研究及适当 ...

  3. OpenMP之双重for循环并行计算改进

    这篇文章是基于OpenMP对Github项目schneider_et_al_2016_animaldiversity进行计算速度改进,关于该项目请参考博客: Windows10+VS2017下GSL1 ...

  4. [并行计算] 2. OpenMP简介

    OpenMP简介 (这篇翻译只涉及与C/C++相关的代码和示例,忽略了与Fortran相关的代码和示例,感兴趣的读者可以参考原文) 1 摘要 OpenMP是由一组计算机硬件和软件供应商联合定义的应用程 ...

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

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

  6. make后gcc出现不全_基于gcc的安卓手机、树莓派4B、Surface Go性能测试

    GeekBench发布了各类PC和手机的性能,但是有其自身的考量,对各类测试加权后给出一个分值,这些权值意义不明,因此性能只能得个大概.具体数据可见如下网站: Home - Geekbench Bro ...

  7. CPU-MIC异构并行架构下基于大规模频繁子图挖掘的药物发现算法

    CPU-MIC异构并行架构下基于大规模频繁子图挖掘的药物发现算法 彭绍亮1,牛琦1,李肯立1,邹权2 1 湖南大学信息科学与工程学院,湖南 长沙 410082 2 电子科技大学基础与前沿研究院,四川 ...

  8. 现今市场对异构并行计算领域人员的需求

    异构计算需求如何?对于异构并行计算领域的人员高付出高要求却是普遍低薪资的矛盾是怎么形成的?让我们来听听行业著名人士风辰怎么说. 风辰:市场对异构并行计算领域人员的需求很大 作者/来源: GPU Wor ...

  9. Python 并行计算

    Python 并行计算 一.实验说明 本实验介绍 Python 并行计算能够用到的工具. 1. 环境登录 无需密码自动登录,系统用户名shiyanlou 2. 环境介绍 本课程实验环境使用Spyder ...

最新文章

  1. next用法C语言,C语言可变参数的使用
  2. Vue学习小札——2.6 组件参数校验与非props特性
  3. 虚拟机用户配置root权限
  4. [翻译]为什么你不要收缩数据库文件
  5. php基础语法(文件加载和错误)
  6. 祖龙娱乐王远明:如何用UE4做出3A级材质和天气系统?
  7. 安装使用大key工具rdb_bigkeys
  8. WinForm Paenl里面添加Form
  9. Linux监控命令之 top
  10. vuex express mysql_基于Vue2.0+Vuex+Axios+NodeJs+Express+MySQL实现京东移动web商城
  11. 双对数坐标系matlab绘图,EXCEL自动计算液塑限并绘制图表至双对数坐标系.doc
  12. “华为”和“荣耀”手机有什么区别?
  13. http://www.cnblogs.com/ITtangtang/archive/2012/05/21/2511749.html
  14. 买二手苹果macbook被骗真实经历
  15. C#学习笔记 正则表达式
  16. 联盟CPS聚合联盟聚推客推广项目赚钱吗?揭秘有人月入10万+
  17. 解决 wmware windows虚拟机无法使用U盘,提示“跟这台电脑连接的一个usb设备运行不正常 windows无法识别它”的问题!
  18. Python 动态加载并下载梨视频短视频
  19. 三类医疗器械经营许可证
  20. 三步搞定 vscode 代码格式化

热门文章

  1. matlab中fig文件编辑后再次打开出现import wizard无法显示fig图像
  2. Python:生成手机号码数
  3. MUP EXEcryptor v2.2.6 with target_PowerArchiver 2007
  4. 5个最好的免费压缩解压缩软件下载
  5. 老白智慧药房显示服务器异常,老白智慧药房
  6. 【STM32F429】第22章 ThreadX GUIX按钮回调事件处理
  7. 30分钟内使用手机控制四轴飞行器(ESP8266 + A7105 + Blynk App for iOS/Android)
  8. imx8qxp_android11去除M4相关的编译
  9. 计算机技术考长沙理工大学难不难,长沙理工大学难考吗?长沙理工大学值得上吗?...
  10. 两种禁止USB autosuspend的方法