OpenMP编程总结表
本文对OpenMP 2.0的全部语法——Macro(宏定义)、Environment Variables(环境变量)、Data Types(数据类型)、Compiler Directives(编译指导语句)、Run-time Library Functions(库函数)的含义用表格进行总结,以便于快速使用OpenMP。如果想详细了解表格中项的含义,或者想要看一些实例,请参阅我的另一篇博文:OpenMP共享内存并行编程详解。
1. Macro
_OPENMP
2. Environment Variables
|
Environment Variables |
Description |
|
OMP_SCHEDULE |
“#pragma omp [parallel] for schedule(runtime)”时 C++ for多次迭代划分到多个线程的方式,取值:"static[,chunk_size]", "dynamic [,chunk_size]", "guided[,chunk_size]" |
|
OMP_NUM_THREADS |
默认线程数,取值:number |
|
OMP_DYNAMIC |
默认是否使能动态调整线程数,取值:"TURE", "FALSE" |
|
OMP_NESTED |
默认是否使能并行嵌套(使能后需要实现支持),取值:"TURE", "FALSE" |
3. Data Types
|
Data Types |
Description |
|
omp_lock_t |
记录lock的状态 |
|
omp_nest_lock_t |
记录lock的状态,还有嵌套层数 |
4. Compiler Directives
|
Directive/syntax |
|
|
Description |
Clauses(optional) |
|
#pragma omp parallel [clause[ [, ]clause] ...] new-line |
|
|
定义一个parallel region,该parallel region将被多个线程并行执行 |
if(scalar-expression):条件并行化 num_threads(integer-expression):设置线程数 private, firstprivate, shared, default, reduction, copyin见表末 |
|
#pragma omp for [clause[[,] clause] ... ] new-line |
|
|
将C++ for循环的多次迭代划分给多个线程(C++ for需符合一定限制),块末尾隐含一个barrier |
ordered:配合ordered directive使用 schedule(kind[,chunk_size]):C++ for多次迭代的划分方式,参数:static[,chunk_size], dynamic[,chunk_size], guided[,chunk_size], runtime nowait:禁止隐含的barrier private, firstprivate, lastprivate, reduction见表末 |
|
#pragma omp sections [clause[[,] clause] ...] new-line |
|
|
定义包含多个section块的代码区,这些section块将被多个线程并行执行,section块用section定义,块末尾隐含一个barrier |
nowait:禁止隐含的barrier private, firstprivate, lastprivate, reduction见表末 |
|
#pragma omp single [clause[[,] clause] ...] new-line |
|
|
代码将仅被一个线程执行,具体是哪个线程不确定,块末尾隐含一个barrier |
nowait:禁止隐含的barrier private, firstprivate, copyprivate见表末 |
|
#pragma omp parallel for [clause[[,] clause] ...] new-line |
|
|
同只含一个for directive 的parallel region |
Parallel和for的clauses,除nowait外 |
|
#pragma omp parallel sections [clause[[,] clause] ...] new-line |
|
|
同只含一个sections directive 的parallel region |
Parallel和sections的clauses,除nowait外 |
|
#pragma omp master new-line |
|
|
代码将仅被主线程执行,块末尾没有隐含的barrier |
|
|
#pragma omp critical [(name)] new-line |
|
|
定义一个临界区,保证同一时刻只有一个线程访问临界区 |
|
|
#pragma omp barrier new-line |
|
|
定义一个同步,所有线程都执行到该行后,所有线程才继续执行后面的代码 |
|
|
#pragma omp atomic new-line |
|
|
变量将被原子的更新,expression-stmt需是 a++, a--, ++a, --a, a?=expr 之一,其中 ? 可以为 +, *, -, /, &, ^, |, <<, >> |
|
|
#pragma omp flush [(variable-list)] new-line |
|
|
所有线程对所有共享对象具有相同的内存视图(view of memory),例如,确保将变量的新值写回内存或从内存读取,而不是使用以前读到寄存器或缓存中的值 |
|
|
#pragma omp ordered new-line |
|
|
使用在有ordered clause的for directive(或parallel for)中,代码将被按迭代次序执行(像串行程序一样) |
|
|
#pragma omp threadprivate(variable-list) new-line |
|
|
将全局或静态变量声明为线程私有的。 |
|
|
Data-Sharing Attribute Clauses |
|
|
private(variable-list):每个线程有一个变量的私有副本,调用默认构造函数初始化 firstprivate(variable-list):private基础上,拷贝共享变量值初始化线程私有副本 lastprivate(variable-list):private基础上,将执行最后一次迭代(for)或最后一个section块(sections)的线程的私有副本拷贝到共享变量 shared(variable-list):声明变量为线程间共享,相对于private default(shared|none):参数shared同于将所有变量用share clause定义,参数none指示对没有用private, shared, reduction, firstprivate, lastprivate clause定义的变量报错 reduction(op:variable-list):定义对变量进行归约操作 copyin(variable-list):让threadprivate声明的变量的值和主线程的值相同 copyprivate(variable-list):不同线程中的私有变量的值在所有线程中共享 |
|
5. Run-time Library Functions
要使用这些函数,需要 #include<omp.h> 。
|
Function |
Description |
|
|
Execution Environment Functions |
||
|
void omp_set_num_threads(int); |
设置默认parallel region的线程数 |
|
|
int omp_get_num_threads(); |
返回该函数所在parallel region的线程数 |
|
|
int omp_get_max_threads(); |
返回值等于或大于该函数所在处的未使用num_threads clause的parallel region的线程数,通常这个最大数量由omp_set_num_threads()或OMP_NUM_THREADS环境变量决定 |
|
|
int omp_get_thread_num(); |
返回线程编号,主线程编号为0 |
|
|
int omp_get_num_procs(); |
返回可用处理器数(一般等于CPU物理核心数) |
|
|
int omp_in_parallel(); |
如果在parallel region内,则返回非0(一般为1),否则返回0 |
|
|
void omp_set_dynamic(int); |
设置是否使能运行时动态调整parallel region的线程数,非0使能,0不使能 |
|
|
int omp_get_dynamic(); |
当前使能运行时动态调整parallel region的线程数,返回非0(一般为1),否则返回0 |
|
|
void omp_set_nested(int); |
设置是否使能并行嵌套,非0使能,0不使能(若使能需要实现支持) |
|
|
int omp_get_nested(); |
当前使能并行嵌套,返回非0(一般为1),否则返回0 |
|
|
Lock Functions |
||
|
void omp_init_lock(omp_lock_t*); |
初始化一个简单Lock |
|
|
void omp_destroy_lock(omp_lock_t*); |
删除一个简单Lock |
|
|
void omp_set_lock(omp_lock_t*); |
等待直到Lock可用,然后锁上该Lock |
|
|
void omp_unset_lock(omp_lock_t*); |
释放该Lock使其可用 |
|
|
void omp_test_lock(omp_lock_t*); |
测试当前Lock,若可用返回非0,否则返回0 |
|
|
void omp_init_nest_lock(omp_nest_lock_t*); |
初始化一个可嵌套Lock |
|
|
void omp_destroy_nest _lock(omp_nest_lock_t*); |
删除一个可嵌套Lock |
|
|
void omp_set_nest _lock(omp_nest_lock_t*); |
等待直到可嵌套Lock可用,然后锁上该可嵌套Lock |
|
|
void omp_unset_nest _lock(omp_nest_lock_t*); |
释放该可嵌套Lock使其可用 |
|
|
void omp_test_nest _lock(omp_nest_lock_t*); |
测试当前可嵌套Lock,若可用返回非0,否则返回0 |
|
|
Timing Routines |
||
|
double omp_get_wtick(); |
返回CPU时钟周期,以秒为单位 |
|
|
double omp_get_wtime(); |
返回从起始计时点开始逝去的时间,以秒为单位 |
|
6. 参考文献
《MPI与OpenMP并行程序设计(C语言版)》第17章,Michael J. Quinn著,陈文光等译,清华大学出版社,2004
OpenMP编程总结表的更多相关文章
- openMP编程(上篇)之指令和锁
openMP简介 openMP是一个编译器指令和库函数的集合,主要是为共享式存储计算机上的并行程序设计使用的. 当计算机升级到多核时,程序中创建的线程数量需要随CPU核数变化,如在CPU核数超过线程数 ...
- openMP编程(上篇)之并行程序设计
openMP简介 openMP是一个编译器指令和库函数的集合,主要是为共享式存储计算机上的并行程序设计使用的. 当计算机升级到多核时,程序中创建的线程数量需要随CPU核数变化,如在CPU核数超过线程数 ...
- 一个openMP编程处理图像的示例
一个openMP编程处理图像的示例: 从硬盘读入两幅图像,对这两幅图像分别提取特征点,特征点匹配,最后将图像与匹配特征点画出来.理解该例子需要一些图像处理的基本知识,我不在此详细介绍.另外,编译该例需 ...
- openMP编程(下篇)之数据私有与任务调度
title: openMP编程(下篇)之数据处理子句与任务调度 tags: ["openMP"] notebook: 分布式程序_Linux --- openMP并行编程中数据的共 ...
- OpenMP编程的任务调度控制
在OpenMP的for任务分担中,各个线程的任务划分是可以由程序员控制调整的.考虑这样一种情况,当在一个循环中每次迭代的计算量不相等时,如果根据系统默认简单的给每个线程分配相同次数的迭代量的话,会导致 ...
- Go-Web编程_表单_0x02_验证表单的输入
开发Web的一个原则就是,不能信任用户输入的任何信息,所以验证和过滤用户的输入信息就变得非常重要,我们经常会在微博.新闻中听到某某网站被入侵了,存在什么漏洞,这些大多是因为网站对于用户输入的信息没有做 ...
- Python -- Windows编程 -- 注册表
1.查询开机自启项 startUp.py import re import win32api, win32con def GetValues(fullname): #分割出基本项name[0] nam ...
- Openmp编程练习
火车卖票 // OpenMP2.cpp : 定义控制台应用程序的入口点. // #include "stdio.h" #include "omp.h" #inc ...
- OpenMP共享内存并行编程详解
实验平台:win7, VS2010 1. 介绍 平行计算机可以简单分为共享内存和分布式内存,共享内存就是多个核心共享一个内存,目前的PC就是这类(不管是只有一个多核CPU还是可以插多个CPU,它们都有 ...
随机推荐
- MongoDB aggregate 运用篇 个人总结
最近一直在用mongodb,有时候会需要用到统计,在网上查了一些资料,最适合用的就是用aggregate,以下介绍一下自己运用的心得.. 别人写过的我就不过多描述了,大家一搜能搜索到N多一样的,我写一 ...
- [高斯消元] POJ 2345 Central heating
Central heating Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 614 Accepted: 286 Des ...
- 转: JAVA递归算法实例小结
一.递归算法设计的基本思想是: 对于一个复杂的问题,把原问题分解为若干个相对简单类同的子问题,继续下去直到子问题简单到能够直接求解,也就是说到了递推的出口,这样原问题就有递推得解. 在做递归算法的时候 ...
- C#之事件
事件,是C#编程模型中重要的一个概念,通过对事件的理解,可以更好的了解C#程序运行机制.C#中的事件,可以简单的理解为类或者对象发生了一件事,并且把这件事通知给了其他的类或者对象,其他的类或者对象可以 ...
- petset翻译
Terminology 通过这个文档,你将会看到一些术语,有时候他们在别的地方交叉使用,这可能会引起一些困惑.这一节的 是帮助你理清楚他们. Node: 一个简单的虚拟或物理机在你的一个k ...
- DeepLearning之路 (五) CNN
自今年七月份以来,一直在实验室负责卷积神经网络(Convolutional Neural Network,CNN),期间配置和使用过theano和cuda-convnet.cuda-convnet2. ...
- 聊聊css hack
什么是CSS hack CSS hack由于不同厂商的浏览器,比如Internet Explorer,Safari,Mozilla Firefox,Chrome等,或者是同一厂商的浏览器的不同版本,如 ...
- D1.1.利用npm(webpack)构建基本reactJS项目
前提: 已经安装nodejs和npm #全局安装webpack 自动构建化工具,职能管理项目:webpack-dev-server是开发工具,提供 Hot Module Replacement 功能# ...
- sasasa
/***************************************************************************************** 文件:app_to ...
- range()和xrange()
range(): range([start,] stop[, step]) 如: range(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] range()默认起始点为0 且ra ...