openMP的一点使用经验

2023-10-26

最近在看多核编程。简单来说,由于现在电脑CPU一般都有两个核,4核与8核的CPU也逐渐走入了寻常百姓家,传统的单线程编程方式难以发挥多核CPU的强大功能,于是多核编程应运而生。按照我的理解,多核编程可以认为是对多线程编程做了一定程度的抽象,提供一些简单的API,使得用户不必花费太多精力来了解多线程的底层知识,从而提高编程效率。这两天关注的多核编程的工具包括openMP和TBB。按照目前网上的讨论,TBB风头要盖过openMP,比如openCV过去是使用openMP的,但从2.3版本开始抛弃openMP,转向TBB。但我试下来,TBB还是比较复杂的,相比之下,openMP则非常容易上手。因为精力和时间有限,没办法花费太多时间去学习TBB,就在这里分享下这两天学到的openMP的一点知识,和大家共同讨论。

openMP支持的编程语言包括C语言、C++和Fortran,支持OpenMP的编译器包括Sun Studio,Intel Compiler,Microsoft Visual Studio,GCC。我使用的是Microsoft Visual Studio 2008,CPU为Intel i5 四核,首先讲一下在Microsoft Visual Studio 2008上openMP的配置。非常简单,总共分2步:

(1) 新建一个工程。这个不再多讲。

(2) 建立工程后,点击 菜单栏->Project->Properties,弹出菜单里,点击 Configuration Properties->C/C++->Language->OpenMP Support,在下拉菜单里选择Yes。

至此配置结束。下面我们通过一个小例子来说明openMP的易用性。这个例子是 有一个简单的test()函数,然后在main()里,用一个for循环把这个test()函数跑8遍。

 1 #include <iostream>
2 #include <time.h>
3 void test()
4 {
5 int a = 0;
6 for (int i=0;i<100000000;i++)
7 a++;
8 }
9 int main()
10 {
11 clock_t t1 = clock();
12 for (int i=0;i<8;i++)
13 test();
14 clock_t t2 = clock();
15 std::cout<<"time: "<<t2-t1<<std::endl;
16 }

编译运行后,打印出来的耗时为:1.971秒。下面我们用一句话把上面代码变成多核运行。

 1 #include <iostream>
2 #include <time.h>
3 void test()
4 {
5 int a = 0;
6 for (int i=0;i<100000000;i++)
7 a++;
8 }
9 int main()
10 {
11 clock_t t1 = clock();
12 #pragma omp parallel for
13 for (int i=0;i<8;i++)
14 test();
15 clock_t t2 = clock();
16 std::cout<<"time: "<<t2-t1<<std::endl;
17 }

编译运行后,打印出来的耗时为:0.546秒,几乎为上面时间的1/4。

由此我们可以看到openMP的简单易用。在上面的代码里,我们一没有额外include头文件,二没有额外link库文件,只是在for循环前加了一句#pragma omp parallel for。而且这段代码在单核机器上,或者编译器没有将openMP设为Yes的机器上编译也不会报错,将自动忽略#pragma这行代码,然后按照传统单核串行的方式编译运行!我们唯一要多做的一步,是从C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.OPENMP和C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\x86\Microsoft.VC90.DebugOpenMP目录下分别拷贝vcomp90d.dll和vcomp90.dll文件到工程文件当前目录下。

对上面代码按照我的理解做个简单的剖析。

当编译器发现#pragma omp parallel for后,自动将下面的for循环分成N份,(N为电脑CPU核数),然后把每份指派给一个核去执行,而且多核之间为并行执行。下面的代码验证了这种分析。

1 #include <iostream>
2 int main()
3 {
4 #pragma omp parallel for
5 for (int i=0;i<10;i++)
6 std::cout<<i<<std::endl;
7 return 0;
8 }

会发现控制台打印出了0 3 4 5 8 9 6 7 1 2。注意:因为每个核之间是并行执行,所以每次执行时打印出的顺序可能都是不一样的。

下面我们来了谈谈竞态条件(race condition)的问题,这是所有多线程编程最棘手的问题。该问题可表述为,当多个线程并行执行时,有可能多个线程同时对某变量进行了读写操作,从而导致不可预知的结果。比如下面的例子,对于包含10个整型元素的数组a,我们用for循环求它各元素之和,并将结果保存在变量sum里。

 1 #include <iostream>
2 int main()
3 {
4 int sum = 0;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

openMP的一点使用经验 的相关文章

随机推荐

  • 开源Linux面板-1Panel

    开源Linux面板 1Panel 1Panel 是一个现代化 开源的 Linux 服务器运维管理面板 1Panel 的功能和优势包括 快速建站 深度集成 Wordpress 和 Halo 域名绑定 SSL 证书配置等一键搞定 高效管理 通过
  • Windows 10 PC 安装 Docker CE

    系统要求 Docker for Windows 支持 64 位版本的 Windows 10 Pro 且必须开启 Hyper V 安装 点击以下链接下载
  • 四数之和——双指针的实践

    一 四数之和 1 1 题目 给定一个包含 n 个整数的数组 nums 和一个目标值 target 判断 nums 中是否存在四个元素 a b c 和 d 使得 a b c d 的值与 target 相等 找出所有满足条件且不重复的四元组 1
  • frida学习及使用

    文章目录 安装frida 安装python3 7 设置环境变量 安装pycharm和nodejs 使用frida 将frida server push到手机设备中 端口转发 安装apk 使用jadx查看java代码 运行frida serv
  • npm 升级依赖包

    首先安装升级插件 npm check updates npm install g npm check updates 或者 cnpm install g npm check updates ncu 是 npm check updates 的
  • 防抖 / 节流

    防抖 新建debounce js文件 export const debounce function fun delay let timer return function let that this let args arguments i
  • 7月9日王者荣耀服务器维护,《王者荣耀》7月9日体验服停机更新公告

    亲爱的召唤师 为了增加版本的稳定性 我们计划在2021年7月9日16 00 18 00对 王者荣耀 体验服进行停机维护 更新时间 7月9日16 00 18 00 15 30关闭PVP 更新方式 停机更新 更新范围 王者荣耀修炼之地体验服 下
  • 在iPhone/iPad端运行DebianLinux系统【iSH-AOK】

    最后一次更新 2023 4 08 请勿利用文章内的相关技术从事非法测试 由于传播 利用此文所提供的信息而造成的任何直接或者间接的后果及损失 均由使用者本人负责 作者不为此承担任何责任 文章目录 1 前言 2 简介 2 2iSH AOK介绍与
  • es批量修改数组动态增加并去重

    es创建测试的index和type 对应mysql的数据库和表 PUT uniq test idx1 mappings uniq test properties comId type long customerName type keywo
  • Your branch is ahead of 'origin/master' by 2 commits.

    遇到这种问题 表示在你之前已经有2个commit而没有push到远程分支上 所以需要先git push origin 将本地分支提到远程仓库 也可以直接git reset hard HEAD x解决 这里的x表示的就是在这之前已经有多少次的
  • 分享一些你觉得在Linux上顺理成章,换到Windows上就可能令人费解的事

    Linux与Windows都是十分常见的电脑操作系统 相信你对它们二者都有所了解 在你的使用过程中 是否有什么事让你觉得在Linux上顺理成章 换到Windows上就令你费解 亦或者关于这二者你有任何想要分享的 都可以在这里留下你的看法 方
  • PSM倾向得分匹配

    1 简要介绍 我们以 是否上大学 对 收入 的影响为例来说明这个问题 这里 先讲二者的关系设定为如下线性模型 显然 在模型 1 的设定中 我们可能忽略了一些同时影响 解释变量 是否上大学 和 被解释变量 收入 的因素 例如 家庭背景 能力
  • Transformer模型简介

    简介 Transformer 是 Google 团队在 17 年 6 月提出的 NLP 经典之作 由 Ashish Vaswani 等人在 2017 年发表的论文 Attention Is All You Need 中提出 Transfor
  • gitlab分支保护_如何删除gitlab上默认受保护的master主分支

    今天开发在检查代码的时候 发现master分支有问题 现在准备删除此主分支 并且重新提交正确的代码 不过在删除时发现 master分支不能被删除 ps 主分支一般都是线上分支 需要开发确认后并且做好备份才能动 本次是因为master分支已经
  • 使用ngx_log_if模块,对阿里云SLB健康检测产生的大量日志进行过滤处理

    阿里云1000元通用代金券点此领取 最近公司购买了阿里云的SLB服务 健康检测使用的是http和https协议 直接访问web 后端的80端口是nginx 阿里云会按设置的健康检测时间使用get方法 去访问域名下的检查路径 判断web是否存
  • 【ES从入门到实战】十、全文检索-ElasticSearch-进阶-QueryDSL基本使用&match_all

    接第9节 2 Query DSL 在上一节中使用的形如 GET bank search query match all sort account number asc balance desc 的查询语言风格 我们称之为 Query DSL
  • 03-neo4j的命令

    1 查看某个联系格式 MATCH p n 开始Label r 关系名称 m 结束Label RETURN p LIMIT 25 MATCH p n Person r hive m Address RETURN p LIMIT 25 2 连续
  • Jupyterlab离线安装及windows环境多Python内核设置

    一 安装前准备 请浏览 安装多版本python 建立虚拟环境 建立虚拟python环境 假设原python路径为 D Program Files Python310 虚拟环境将建立在d mpy python3108 打开 Windows P
  • Unity今日小结1

    今天在看M Studio老师的视频学了很多东西 这里想要给自己小结一下 首先 在M studio的3DRPG课程中编写敌人追击发现玩家的脚本文件 里面我印象比较深刻的两个函数是Transform LookAt和Physics Overlap
  • openMP的一点使用经验

    最近在看多核编程 简单来说 由于现在电脑CPU一般都有两个核 4核与8核的CPU也逐渐走入了寻常百姓家 传统的单线程编程方式难以发挥多核CPU的强大功能 于是多核编程应运而生 按照我的理解 多核编程可以认为是对多线程编程做了一定程度的抽象