
OpenMP
Augusdi
让时间验证一切,让时间验证我。感谢大家的无私帮助,我愿以同样的态度回馈我热情的朋友,用我们的热忱开创美好未来!
展开
-
OpenMP: VS2010配置使用OpenMP
一个简单的OpenMP例子首先启动VisualStudio 2010,新建一个C++的控制台应用程序,如下图所示:然后在项目解决方案资源管理器上选择项目名称,点击右键,选择“属性”,如下图所示: 然后在属性页上左侧选择“配置属性”——“C/C++”——“语言”,然后在右侧“OpenMP支持”后选择“是(/openmp)”,如下图所示: 在cpp文件中添加如下代码:#include "stdafx.原创 2013-04-16 12:42:15 · 28718 阅读 · 9 评论 -
OpenMP: OpenMP简介
(原文:https://computing.llnl.gov/tutorials/openMP/)概念OpenMP是由一群专业的计算机软件及硬件厂商共同制定的应用程序编程接口(API),为开发者提供了一种可移植、伸缩的共享内存式编程模型。支持多种系统下(UNIX & Windows NT)的C/C++和Fortran。这篇文章涉及到OpenMP的大多数重要特性,包括其指定并行区域、工作共享、同步、原创 2013-04-16 10:29:38 · 2719 阅读 · 1 评论 -
OpenMP: 几个容易混淆的函数
说明:这部分内容比较基础,主要是分析几个容易混淆的OpenMP函数,加以理解。(1)并行区域数量的确定:在这里,先回顾一下OpenMP的parallel并行区域线程数量的确定,对于一个并行区域,有一个team的线程去执行,那么该分配多少个线程去执行呢?OpenMP的遇到parallel指令后创建的线程team的数量由如下过程决定:1. if子句的结果2. num_threads的设置3. omp_原创 2013-04-16 10:24:46 · 3153 阅读 · 0 评论 -
OpenMP: 多核编程文章汇总
多核编程文章汇总以下为截止2009年3月21日前发布在本人博客中的多核相关的文章汇总,这些文章大部分摘自于我写的《多核计算与程序设计》一书。现将这些文章分类汇总,方便大家阅读。后续如果博客中继续发布了多核相关的文章,那么本文章将会被更新。如果对多核编程技术非常感兴趣的话,可以考虑将这篇文章加入您的浏览器收藏夹中,也欢迎您将这篇文章推荐给您的朋友。一、基础篇1、多核编程的几个难题及其应对策略 主要讲转载 2013-04-16 10:06:14 · 2361 阅读 · 1 评论 -
OpenMP: OpenMP并行程序设计
OpenMP并行程序设计(一)OpenMP是一个支持共享存储并行设计的库,特别适宜多核CPU上的并行程序设计。今天在双核CPU机器上试了一下OpenMP并行程序设计,发现效率方面超出想象,因此写出来分享给大家。在VC8.0中项目的属性对话框中,左边框里的“配置属性”下的“C/C++”下的“语言”页里,将OpenMP支持改为“是/(OpenMP)”就可以支持OpenMP了。先看一个简单的使用了Ope原创 2013-04-16 09:27:50 · 8084 阅读 · 1 评论 -
OpenMP: OpenMP编程指南
进入多核时代后,必须使用多线程编写程序才能让各个CPU核得到利用。在单核时代,通常使用操作系统提供的API来创建线程,然而,在多核系统中,情况发生了很大的变化, 如果仍然使用操作系统API来创建线程会遇到一些问题。具体来说,有以下三个问题:1)CPU核数扩展性问题多核编程需要考虑程序性能随CPU核数的扩展性,即硬件升级到更多核后,能够不修改程序就让程序性能增长,这要求程序中创建的线程数量需要随CP原创 2013-04-16 09:25:13 · 2798 阅读 · 0 评论 -
OpenMP: OpenMP嵌套并行操作
本章讨论 OpenMP 嵌套并行操作的特性1 执行模型OpenMP 采用 fork-join(分叉-合并)并行执行模式。线程遇到并行构造时,就会创建由其自身及其他一些额外(可能为零个)线程组成的线程组。遇到并行构造的线程成为新组中的主线程。组中的其他线程称为组的从属线程。所有组成员都执行并行构造内的代码。如果某个线程完成了其在并行构造内的工作,它就会在并行构造末尾的隐式屏障处等待。当所有组成员都到转载 2013-04-16 10:44:33 · 2530 阅读 · 0 评论 -
OpenMP: OpenMP并行嵌套实例
//#include #include "stdafx.h" void report_num_threads(int level) { //#pragma omp parallel { printf("level %d:number of threads in the team - %d\n",level,omp_get_num_threads(原创 2013-04-16 10:43:57 · 2436 阅读 · 0 评论 -
OpenMP: OpenMP 环境变量
OpenMP 规范定义了四个用于控制 OpenMP 程序执行的环境变量。下表对它们进行了概括。表 2–1 OpenMP 环境变量 环境变量 功能 OMP_SCHEDULE为指定了 RUNTIME 调度类型的 DO、PARALLEL DO、for、parallel for 指令/pragma 设置调度类型。如果未定义,则使用缺省值 STATIC。值为 "type[,chunk]"示例:setenv原创 2013-10-10 15:36:04 · 3081 阅读 · 0 评论 -
OpenMP: OpenMP测试程序
#include #include int main(int argc, char * argv[]){ int nthreads, tid, x; int nthrds = 4; x = 0; omp_set_num_threads(nthrds); #pragma omp parallel private(tid) { tid = omp_get_th原创 2013-04-15 20:27:02 · 3123 阅读 · 0 评论 -
OpenMP: 数据处理子句
OpenMP中的数据处理子句相关文档连接:多核编程中的任务随机竞争模式的概率分析多核编程中的任务分组竞争模式 多核编程中的负载平衡难题 多核编程中的锁竞争难题 多核编程的几个难题及其应对策略(难题一)OpenMP并行程序设计(二) OpenMP并行程序设计(一) 双核CPU上的快速排序效率 OpenMP创建线程中的锁及原子操作性能比较10.1.1 private子句private子句用于将一个或原创 2013-04-16 09:24:24 · 1899 阅读 · 0 评论 -
OpenMP: WinAPI多线程和OpenMP多线程
WIN32线程控制主要实现线程的创建、终止、挂起和恢复等操作,这些操作都依赖于WIN32提供的一组API和具体编译器的C运行时库函数。在启动一个线程之前,必须为线程编写一个全局的线程函数,一般来说,C++的类成员函数不能作为线程函数。这是因为在类中定义的成员函数,编译器会给其加上this指针。如果一定要以类成员函数作为线程函数,通常有如下解决方案:(1)将该成员函数声明为static类型,去掉th原创 2013-04-15 22:03:24 · 1947 阅读 · 0 评论 -
OpenMP: OpenMP任务划分与调度
这一片介绍OpenMP的任务划分与调度,还是以代码说明。关于任务划分和调度的介绍这里也省略了。// distribute tasks.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "omp.h"int _tmain(int argc, _TCHAR* argv[]){ const int N = 20; in原创 2013-04-16 10:34:44 · 4279 阅读 · 0 评论 -
OpenMP: OpenMP数据环境
这是里把OpenMP常用的数据环境construct用代码示例的方法写出来了,主要包括private,firstprivate,lastprivate和copyin。注释部分对这几种construct作用和区别描述已经很详细了,这里就补多说,相信演示代码会有更好的效果。// Data Environment.cpp : 定义控制台应用程序的入口点。//#include "stdafx.原创 2013-04-16 10:31:19 · 2081 阅读 · 0 评论 -
OpenMP: OpenMP多线程编程技术
2.1 循环并行化1、循环并行化编译指导语句的格式循环并行化是使用OpenMP来并行化程序的最重要的部分,它是并行区域编程的一个特例。在C/C++语言中,循环并行化语句的编译指导语句格式如下:#pragma omp parallel for [clause[clause…]]for( index = first ; test_expression ; increment_expr){body of原创 2013-04-16 10:36:41 · 9267 阅读 · 1 评论 -
OpenMP: OpenMP嵌套并行
本章讨论 OpenMP 嵌套并行操作的特性1 执行模型OpenMP 采用 fork-join(分叉-合并)并行执行模式。线程遇到并行构造时,就会创建由其自身及其他一些额外(可能为零个)线程组成的线程组。遇到并行构造的线程成为新组中的主线程。组中的其他线程称为组的从属线程。所有组成员都执行并行构造内的代码。如果某个线程完成了其在并行构造内的工作,它就会在并行构造末尾的隐式屏障处等待。当所有组成员都到转载 2013-10-10 15:38:18 · 2385 阅读 · 0 评论 -
OpenMP: VC配置OpenMP并行程序设计
转自:http://zuohuawei.blog.sohu.com/84249110.html最近有不少陌生人问我关于在VC上使用OpenMP进行并行程序设计的配置问题,这个问题对于那些想在VC上使用OpenMP的人来说,是首先就要解决的问题,我开始时也碰到过,花了不少时间解决,现在把当时写的笔记发出来,供那些需要的人参考。OpenMP是一个支持共享存储并行设计的库,特别适宜多核CPU上的并行程序原创 2013-04-16 11:17:36 · 5770 阅读 · 2 评论 -
OpenMP: OpenMP嵌套并行
OpenMP中不建议使用并行嵌套,如果一个并行计算中的某个线程遇到了另外一个并行分支,程序运行将会变得不稳定。将一个完整的工作任务通过一组并行线程分成若干小任务,每个线程只执行指定给它的那段代码,并没用多余的线程去做其他的工作,即使并行计算中正在运行的某个线程遇到了一个新的并行分支,通过分割这个任务形成更多的线程,这并没有任何实际意义。因此,嵌套并行在OpenMP中将不考虑。OpenMP在处理多级原创 2013-04-16 11:49:57 · 13496 阅读 · 2 评论 -
OpenMP循环并行化for的约束条件
OpenMP可以方便地对for循环进行并行化,然而不是所有的for循环都可以进行并行化。下面几种情况是不能进行并行化的:1. for循环中的循环变量必须是有符号整形。例如,for (unsigned int i = 0; i 2. for循环中比较操作符必须是, >=。例如for (int i = 0; i != 10; ++i){}会编译不通过;3. for循环中的第三个表达式,必须是整数的加减原创 2013-10-10 15:27:07 · 3111 阅读 · 0 评论 -
OpenMP: OpenMP多核编程配置与测试
现在的集成开发环境很好的支持了市面上的多数多核CPU,比如在intel双核CPU的系统上安装好vs2008后,第一,在项目属性-c++-语言中选择支持openmp第二,在环境变量中加入OMP_NUM_THREADS变量赋值2可以了,打开vs2008敲入下面的例子,相信我们都能看懂的:/*********************************************************原创 2013-10-11 17:09:05 · 3134 阅读 · 0 评论 -
OpenMP: OpenMP常用函数
在OpenMP的Runtime Library中有一些常用的函数,有些函数已经在前面的例子中使用过,现在集中说明这些常用的函数以及用法。1、设置线程数目其定义如下:void omp_set_num_threads(int num_threads);通过该函数来指定其后用于并行计算的线程数目,其中参数num_threads就是指定的线程数目。2、获取线程数目其定义如下:int omp_get_num原创 2013-04-16 11:26:20 · 2816 阅读 · 0 评论 -
OpenMP: OpenMP概述
根据计算平台和规模的不同,并行计算可以分为两种:第一种是基于单一计算机系统的多核处理器或多处理器进行多线程并行计算,采用共享存储的方式,主要的标准有OpenMP,如下左图所示;第二种就是基于多台计算机组件的集群(Cluster)计算系统进行并行计算,采用消息传递方式,主要的标准有MPI,如下右图所示。本文将主要介绍多线程方式的并行计算。首先来了解一下单核处理器上程序运行方式,系统中包括操作系统和应原创 2013-04-16 11:30:09 · 2863 阅读 · 0 评论 -
OpenMP: OpenMP并行数目与并行体对运行效率的影响
接下来再做一个测试,将并行和串行的循环次数设置为100,即将上例的main函数中:for(int i = 0; i 更改为:for(int i = 0; i 然后分别运行10次,其结果如下表所示:次数串行并行10.002850030.00735008720.002880310.0038547830.00286030.0023184140.002754070.009276250.002809490.原创 2013-04-16 12:40:58 · 4100 阅读 · 0 评论 -
OpenMP: 循环结构的并行
在科学和工程应用中,许多程序都要在循环执行上花大量的时间,如Fortran中的do循环和C语言中的for循环,通过并行中的loop-level可以减少这些循环的运行时间。OpenMP提供了parallel for或parallel do指令来对循环结构进行并行处理,这个指令可以用于大部分的循环结构,它也是OpenMP中使用最多和最频繁的指令。当然,程序员必须清楚哪些循环是可以进行并行的。OpenM原创 2013-04-16 12:36:58 · 6985 阅读 · 0 评论 -
OpenMP: sections分段并行
除了循环结构可以进行并行之外,还可以进行分段并行(parallel section)。迄今为止,每谈到如何去并行一个程序时,我们主要关心的是在同一时间将一个任务划分成多个然后用多线程去完成。然而,如果这个程序的一系列操作中后面的计算并不依赖于前面的计算,意思就是说它们之间相互并不依赖,这将有利于分配不同的任务给不同的线程去执行。当然,这对于那些执行过程非常短(总体计算量非常小)或程序本身具有很强的原创 2013-04-16 12:30:21 · 11101 阅读 · 1 评论 -
OpenMP: 创建线程中的锁及原子操作性能比较
相关文档连接:多核编程中的任务随机竞争模式的概率分析多核编程中的任务分组竞争模式 多核编程中的负载平衡难题多核编程中的锁竞争难题多核编程的几个难题及其应对策略(难题一)OpenMP并行程序设计(二)OpenMP并行程序设计(一)双核CPU上的快速排序效率 在多核CPU中锁竞争到底会造成性能怎样的下降呢?相信这是许多人想了解的,因此特地写了一个测试程序来测试原创 2013-04-15 21:58:21 · 2622 阅读 · 0 评论 -
OpenMP: OpenMP和MPI比较
OpenMP和MPI是并行编程的两个手段,对比如下:OpenMP:线程级(并行粒度);共享存储;隐式(数据分配方式);可扩展性差; MPI:进程级;分布式存储;显式;可扩展性好。 OpenMP采用共享存储,意味着它只适应于SMP,DSM机器,不适合于集群。MPI虽适合于各种机器,但它的编程模型复杂:需要分析及划分应用程序问题,并将问题映射到分布式进程集合; 需要解决通信延迟大和负载不平衡两个主要问原创 2013-04-15 19:41:52 · 4324 阅读 · 0 评论 -
OpenMP: 多线程文件操作
项目背景: 为了提升项目的运行效率,考虑多线程技术。最近OpenMP技术很热,咱也凑凑热闹,也为了充分发挥电脑硬件的能力。 硬件: 酷睿2双核 2.2GHz 3G 内存 软件: Visual Studio 2010 旗舰版 Windows 7 旗舰版 32bit 难点: 由于多个线程操作同一个文件,很有可能存在线程冲突。 OpenMP:原创 2013-04-15 22:29:23 · 4660 阅读 · 2 评论 -
线程化的性能障碍:它们将给 OpenMP 代码带来什么影响?
为何要线程化,线程化对性能有何影响?您可能出于以下三个原因而线程化应用程序。每个对性能评测的要求都不同。能更快的执行同一工作:如果应用程序负载固定(如,对静态照片应用某种效果),我们可以通过线程化更快地完成工作。评测此代码时,我们将记录执行时间和通过线程化实现的加速比。 执行更多的工作:如果将应用程序扩展到执行更多个负载相同的工作(例如,更新较大的像素缓冲区),或将不同的工作添加到负载中(例如,对转载 2013-04-16 11:10:11 · 2043 阅读 · 0 评论 -
OpenMP中几个容易混淆的函数(线程数量/线程ID/线程最大数)以及并行区域线程数量的确定
说明:这部分内容比较基础,主要是分析几个容易混淆的OpenMP函数,加以理解。(1)并行区域数量的确定:在这里,先回顾一下OpenMP的parallel并行区域线程数量的确定,对于一个并行区域,有一个team的线程去执行,那么该分配多少个线程去执行呢?OpenMP的遇到parallel指令后创建的线程team的数量由如下过程决定:1. if子句的结果2. num_threads的设置3. omp_转载 2013-04-16 10:58:45 · 2189 阅读 · 0 评论 -
OpenMP3.0的新特性Task指令基础
从OpenMP3.0开始,OpenMP增加了task指令,这是OpenMP3.0中最激动人心的一个新特性。本文的”术语“大多数是根据个人理解用词,不保证用词准确性。(1)task基础OpenMP Tutorials: 任务构造https://computing.llnl.gov/tutorials/openMP/#Task从功能上说:1. The TASK construct defines an转载 2013-04-16 10:52:54 · 9369 阅读 · 2 评论 -
OpenMP与C++:事半功倍地获得多线程的好处(上)
声明:本文并未获得翻译授权,本人翻译这篇文章仅用于学习和研究之用,任何人不得在未经授权之前将原文和译文用以商业用途.因版权原因,暂不建议转载本文.本文发表于http://blog.youkuaiyun.com/lanphaday请保留本文完整本文发表于2005年第10期的,英文版本地址:http://msdn.microsoft.com/msdnmag/issues/05/10/OpenMP/default.转载 2013-04-16 11:08:32 · 1990 阅读 · 0 评论 -
OpenMP中数据属性相关子句详解(2):shared/default/copyin/copyprivate子句的使用
(1) sharedshared子句可以用于声明一个或多个变量为共享变量。所谓的共享变量,是值在一个并行区域的team内的所有线程只拥有变量的一个内存地址,所有线程访问同一地址。所以,对于并行区域内的共享变量,需要考虑数据竞争条件,要防止竞争,需要增加对应的保护,这是程序员需要自行考虑的。下面的例子是一个求和的并行实现,使用共享变量,由于没有采取保护,会有数据竞争:#define COUNT 10转载 2013-04-16 11:02:14 · 9322 阅读 · 1 评论 -
OpenMP与C++:事半功倍地获得多线程的好处(下)
声明:本文并未获得翻译授权,本人翻译这篇文章仅用于学习和研究之用,任何人不得在未经授权之前将原文和译文用以商业用途.因版权原因,暂不建议转载本文.本文发表于http://blog.youkuaiyun.com/lanphaday请保留本文完整本文发表于2005年第10期的,英文版本地址:http://msdn.microsoft.com/msdnmag/issues/05/10/OpenMP/default.转载 2013-04-16 11:09:04 · 2309 阅读 · 0 评论 -
OpenMP并行构造的schedule子句详解
schedule子句是专门为循环并行构造的时候使用的子句,只能用于循环并行构造(parallel for)中。根据OpenMP Spec(http://openmp.org/mp-documents/OpenMP3.1-CCard.pdf)可以知道:schedule的语法为:schedule(kind[, chunk_size])kind:• static: Iterations are divi转载 2013-04-16 10:59:52 · 2437 阅读 · 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。根据MSDN的说明:http:转载 2013-04-16 10:58:24 · 5397 阅读 · 0 评论 -
OpenMP中数据属性相关子句详解(1):private/firstprivate/lastprivate/threadprivate之间的比较
private/firstprivate/lastprivate/threadprivate,首先要知道的是,它们分为两大类,一类是private/firstprivate/lastprivate子句,另一类是threadprivate,为指令。(PS:有些地方把threadprivate说成是子句,但是实际来讲,它是一个指令。)可以参考http://blog.youkuaiyun.com/gengsheng转载 2013-04-16 11:03:50 · 6442 阅读 · 2 评论 -
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 fina转载 2013-04-16 11:00:57 · 16153 阅读 · 4 评论 -
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进行嵌套并行,默认的设置为false。转载 2013-04-16 10:55:37 · 8572 阅读 · 0 评论 -
并行计算知识
1、单核指令级并行(ILP) 让单个处理器的执行单元可以同时执行多条指令。现代CPU的每个核心都采用了超标量、超级流水线、超长指令字、SIMD、超线程、分支预测等手段发掘程序内的指令级并行。2、多核并行(multi-core) 在一个芯片上集成多个处理器核心,实现线程级并行(TLP)。CPU上多线程的编程语言OpenMP和Intel的TBB3、多处理器(mu原创 2013-10-09 15:24:46 · 2501 阅读 · 0 评论