
OpenMP
scudz
这个作者很懒,什么都没留下…
展开
-
OpenMP 嵌套并行操作的特性
1 执行模型 OpenMP 采用 fork-join(分叉-合并)并行执行模式。线程遇到并行构造时,就会创建由其自身及其他一些额外(可能为零个)线程组成的线程组。遇到并行构造的线程成为新组中的主线程。组中的其他线程称为组的从属线程。所有组成员都执行并行构造内的代码。如果某个线程完成了其在并行构造内的工作,它就会在并行构造末尾的隐式屏障处等待。当所有组成员都到达该屏障时,这些线程转载 2015-01-24 22:26:50 · 596 阅读 · 0 评论 -
OpenMP中几个容易混淆的函数(线程数量/线程ID/线程最大数)以及并行区域线程数量的确定
说明:这部分内容比较基础,主要是分析几个容易混淆的OpenMP函数,加以理解。(1)并行区域数量的确定:在这里,先回顾一下OpenMP的parallel并行区域线程数量的确定,对于一个并行区域,有一个team的线程去执行,那么该分配多少个线程去执行呢?OpenMP的遇到parallel指令后创建的线程team的数量由如下过程决定:1. if子句的结果转载 2015-01-25 21:23:04 · 1245 阅读 · 0 评论 -
OpenMP循环并行化for的约束条件
OpenMP可以方便地对for循环进行并行化,然而不是所有的for循环都可以进行并行化。下面几种情况是不能进行并行化的:1. for循环中的循环变量必须是有符号整形。例如,for (unsigned int i = 0; i 2. for循环中比较操作符必须是, >=。例如for (int i = 0; i != 10; ++i){}会编译不通过;转载 2015-01-25 10:14:59 · 1361 阅读 · 0 评论 -
OpenMP与C++:事半功倍地获得多线程的好处
OpenMP与C++:事半功倍地获得多线程的好处(上)KangSu Gatlin & Pete Isensee 著赖勇浩 译在并行计算领域有一个广为流传的笑话——并行计算是未来之事并且永远都是。这个小笑话几十年来一直都是对的。一种类似的观点在计算机架构社区中流传,处理器时钟速度的极限似乎近在眼前,但时钟速度却一直在加快。多核革命是并行社区的乐观和架构社区的悲观的冲突。转载 2015-01-25 13:49:47 · 2209 阅读 · 0 评论 -
OpenMP并行构造的schedule子句详解
schedule子句是专门为循环并行构造的时候使用的子句,只能用于循环并行构造(parallel for)中。根据OpenMP Spec(http://openmp.org/mp-documents/OpenMP3.1-CCard.pdf)可以知道:schedule的语法为:schedule(kind[, chunk_size])kind:• static:转载 2015-01-25 21:12:51 · 2962 阅读 · 0 评论 -
OpenMP并行数目与并行体对运行效率的影响
接下来再做一个测试,将并行和串行的循环次数设置为100,即将上例的main函数中:for(int i = 0; i 更改为:for(int i = 0; i 然后分别运行10次,其结果如下表所示:次数串行并行10.002850030.0073500872转载 2015-01-25 10:54:41 · 7748 阅读 · 3 评论 -
OpenMP指令之THREADPRIVATE指令
OpenMP Tutorial:https://computing.llnl.gov/tutorials/openMP/#THREADPRIVATE(1)指令作用:threadprivate指令用于指定文件范围的全局变量成为线程在多个并行块之间执行的本地变量或持久变量。简单的理解,对于一些全局变量,可以用此指令指定全局变量,使得每一个线程都能有此全局变量的独立的拷贝,并且互转载 2015-01-25 20:46:33 · 1865 阅读 · 0 评论 -
OpenMP: OpenMP概述
根据计算平台和规模的不同,并行计算可以分为两种:第一种是基于单一计算机系统的多核处理器或多处理器进行多线程并行计算,采用共享存储的方式,主要的标准有OpenMP,如下左图所示;第二种就是基于多台计算机组件的集群(Cluster)计算系统进行并行计算,采用消息传递方式,主要的标准有MPI,如下右图所示。本文将主要介绍多线程方式的并行计算。 首先来了解一下单核处理器转载 2015-01-25 12:19:00 · 797 阅读 · 0 评论 -
线程化的性能障碍:它们将给 OpenMP 代码带来什么影响?
为何要线程化,线程化对性能有何影响?您可能出于以下三个原因而线程化应用程序。每个对性能评测的要求都不同。能更快的执行同一工作:如果应用程序负载固定(如,对静态照片应用某种效果),我们可以通过线程化更快地完成工作。评测此代码时,我们将记录执行时间和通过线程化实现的加速比。执行更多的工作:如果将应用程序扩展到执行更多个负载相同的工作(例如,更新较大的像素缓冲区),或将不同的工作添加转载 2015-01-25 19:26:15 · 1796 阅读 · 1 评论 -
OpenMP中omp_set_nested()和OMP_NESTED环境变量详解
(1)类似于omp_set_dynamic(http://blog.youkuaiyun.com/gengshenghong/article/details/7003688),omp_set_nested()的参数实际是一个表示布尔的变量,可以覆盖OMP_NESTED的设置。(2)OpenMP的嵌套并行和默认设置omp_set_nested()用于设置是否允许OpenMP进行嵌套并行,默认的设转载 2015-01-25 21:44:59 · 1747 阅读 · 0 评论 -
OpenMP: sections分段并行
除了循环结构可以进行并行之外,还可以进行分段并行(parallel section)。迄今为止,每谈到如何去并行一个程序时,我们主要关心的是在同一时间将一个任务划分成多个然后用多线程去完成。然而,如果这个程序的一系列操作中后面的计算并不依赖于前面的计算,意思就是说它们之间相互并不依赖,这将有利于分配不同的任务给不同的线程去执行。当然,这对于那些执行过程非常短(总体计算量非常小)或程序本身具有很强的转载 2015-01-25 11:54:46 · 3702 阅读 · 1 评论 -
OpenMP中数据属性相关子句详解(2):shared/default/copyin/copyprivate子句的使用
(1) sharedshared子句可以用于声明一个或多个变量为共享变量。所谓的共享变量,是值在一个并行区域的team内的所有线程只拥有变量的一个内存地址,所有线程访问同一地址。所以,对于并行区域内的共享变量,需要考虑数据竞争条件,要防止竞争,需要增加对应的保护,这是程序员需要自行考虑的。下面的例子是一个求和的并行实现,使用共享变量,由于没有采取保护,会有数据竞争:转载 2015-01-25 21:06:45 · 1036 阅读 · 0 评论 -
OpenMP中的常用函数
1、设置线程数目其定义如下:void omp_set_num_threads(int num_threads);通过该函数来指定其后用于并行计算的线程数目,其中参数num_threads就是指定的线程数目。2、获取线程数目其定义如下:int omp_get_num_threads();通过该函数可以获取当前运行组中的线程数目,如果是在并行结构转载 2015-01-25 09:11:43 · 3423 阅读 · 0 评论 -
OpenMP嵌套并行
OpenMP中不建议使用并行嵌套,如果一个并行计算中的某个线程遇到了另外一个并行分支,程序运行将会变得不稳定。将一个完整的工作任务通过一组并行线程分成若干小任务,每个线程只执行指定给它的那段代码,并没用多余的线程去做其他的工作,即使并行计算中正在运行的某个线程遇到了一个新的并行分支,通过分割这个任务形成更多的线程,这并没有任何实际意义。因此,嵌套并行在OpenMP中将不考虑。OpenMP在处理多级转载 2015-01-25 12:16:54 · 2423 阅读 · 0 评论 -
OpenMP中omp_set_dynamic()和OMP_DYNAMIC环境变量详解
理解这部分内容之前,先要理解omp_get_num_threads()和omp_get_max_threads()的含义和区别,参考:http://blog.youkuaiyun.com/gengshenghong/article/details/7003110(1)OMP_DYNAMIC环境变量:取值为TRUE和FALSE,定义是否动态设定并行区域执行的线程,默认为false。根据M转载 2015-01-25 21:38:57 · 787 阅读 · 0 评论 -
Openmp补遗之同步
一、 atomic编译指导语句指定特殊的存储单元将被原子地更新,不允许多个线程同时执行更新操作。如果不写,其结果将不可预料。谨之慎之二、critical编译指导语句临界区声明方法#pragma omp critical [(name)] //[]表示名字可选{//并行程序块,同时只能有一个线程能访问该并行程序块}转载 2015-01-27 21:16:12 · 659 阅读 · 0 评论 -
OpenMP多线程编程技术
循环并行化1、循环并行化编译指导语句的格式 循环并行化是使用OpenMP来并行化程序的最重要的部分,它是并行区域编程的一个特例。在C/C++语言中,循环并行化语句的编译指导语句格式如下:#pragma omp parallel for [clause[clause…]]for( index = first ; test_expression ; inc转载 2015-01-27 21:46:09 · 1598 阅读 · 0 评论 -
OpenMP 环境变量
OpenMP 规范定义了四个用于控制 OpenMP 程序执行的环境变量。下表对它们进行了概括。表 2–1 OpenMP 环境变量环境变量 功能 OMP_SCHEDULE为指定了 RUNTIME 调度类型的 DO、PARALLEL DO、for、parallel for 指令/pragma 设置调转载 2015-01-24 22:52:16 · 801 阅读 · 0 评论 -
OpenMP: OpenMP多核编程配置与测试
现在的集成开发环境很好的支持了市面上的多数多核CPU,比如在intel双核CPU的系统上安装好vs2008后,第一,在项目属性-c++-语言中选择支持openmp第二,在环境变量中加入OMP_NUM_THREADS变量赋值2 可以了,打开vs2008,新建一个console程序。 敲入下面的例子,相信我们都能看懂的:转载 2015-01-24 22:20:08 · 907 阅读 · 0 评论 -
VS2010配置使用OpenMP
一个简单的OpenMP例子 首先启动VisualStudio 2010,新建一个C++的控制台应用程序,如下图所示: 然后在项目解决方案资源管理器上选择项目名称,点击右键,选择“属性”,如下图所示: 然后在属性页上左侧选择“配置属性”——“C/C++”——“语言”,然后在右侧“OpenMP支持”后选转载 2015-01-25 10:20:54 · 1114 阅读 · 1 评论 -
OpenMP: 循环结构的并行
在科学和工程应用中,许多程序都要在循环执行上花大量的时间,如Fortran中的do循环和C语言中的for循环,通过并行中的loop-level可以减少这些循环的运行时间。OpenMP提供了parallel for或parallel do指令来对循环结构进行并行处理,这个指令可以用于大部分的循环结构,它也是OpenMP中使用最多和最频繁的指令。当然,程序员必须清楚哪些循环是可以进行并行的。转载 2015-01-25 11:42:13 · 2762 阅读 · 0 评论 -
OpenMP中数据属性相关子句详解(1):private/firstprivate/lastprivate/threadprivate之间的比较
private/firstprivate/lastprivate/threadprivate,首先要知道的是,它们分为两大类,一类是private/firstprivate/lastprivate子句,另一类是threadprivate,为指令。(PS:有些地方把threadprivate说成是子句,但是实际来讲,它是一个指令。)可以参考http://blog.youkuaiyun.com/gengshe转载 2015-01-25 19:28:53 · 799 阅读 · 0 评论 -
OpenMP中数据属性相关子句详解(3): reduction子句
reduction的作用:A private copy for each list variable is created for each thread. At the end of the reduction, the reduction variable is applied to all private copies of the shared variable, and the fi转载 2015-01-25 21:12:00 · 1283 阅读 · 1 评论 -
OpenMP3.0的新特性Task指令基础
从OpenMP3.0开始,OpenMP增加了task指令,这是OpenMP3.0中最激动人心的一个新特性。本文的”术语“大多数是根据个人理解用词,不保证用词准确性。(1)task基础OpenMP Tutorials: 任务构造https://computing.llnl.gov/tutorials/openMP/#Task从功能上说:1. The TAS转载 2015-01-25 21:49:46 · 1232 阅读 · 0 评论