openmp 的使用
http://blog.csdn.net/gengshenghong/article/details/7003110
说明:这部分内容比较基础,主要是分析几个容易混淆的OpenMP函数,加以理解。
(1)并行区域数量的确定:
在这里,先回顾一下OpenMP的parallel并行区域线程数量的确定,对于一个并行区域,有一个team的线程去执行,那么该分配多少个线程去执行呢?
OpenMP的遇到parallel指令后创建的线程team的数量由如下过程决定:
1. if子句的结果
2. num_threads的设置
3. omp_set_num_threads()库函数的设置
4. OMP_NUM_THREADS环境变量的设置
5. 编译器默认实现(一般而言,默认实现的是总线程数等于处理器的核心数)
(http://blog.csdn.net/gengshenghong/article/details/6956878查看更多信息)
2、3、4优先级依次降低的,也就是前面的设置可以覆盖后面的设置,当然也是相对而言,num_threads子句只会影响当前的并行区域,而omp_set_num_threads对OMP_NUM_THREADS环境变量的覆盖是在整个程序运行期间全局的。
(2)几个容易混淆的OpenMP函数
1. omp_get_thread_num
获取线程的num,即ID。这里的ID是OpenMP的team内的ID,在OpenMP中,一个team内的线程的ID是俺顺序排列的,0、1、2...
说明:此函数在并行区域外或者并行区域内都可以调用。在并行区域外,获取的是master线程的ID,即为0。在并行区域内,每次执行到此函数,获取的是当前执行线程的ID。
此函数比较容易理解,主要是不要和下面的omp_get_num_threads记混淆了。
2. omp_get_num_threads/omp_set_num_threads
设置/获取线程数量,此set函数是上面确定遇到parallel指令后创建team的线程的决定方式之一,用于覆盖OMP_NUM_THREADS环境变量的设置。
说明:尽管从函数名上看,它们是一对set/get函数,但是要区分它们的含义,set之后马上get,其值不一定等于set的结果,而且大部分情况都是不相等的!
首先来理解omp_set_num_threads():
作用上来说,我们知道它是用于覆盖环境变量OMP_NUM_THREDS的设置的,使用上来说,要注意的 是,omp_set_num_threads只能用于并行区域之外,如果用于并行区域之内,在Debug下运行时会输出“User Error 1001: omp_set_num_threads should only be called in serial regions”到控制台,如果是Release模式不会输出,理论上应该是被忽略了。总之,在串行代码区调用omp_set_num_threads来设置线程数量。
然后分析omp_get_num_threads():
用于获取当前线程组(team)的线程数量,如果不在并行区调用,返回1.
这句话就清楚了描述了get的作用了,获取的是当前线程组的线程数量,所以一般会在并行区域调用,其返回的是实际的parallel区域内由上面几 大因素决定之后的实际的运行的线程数量,并不是set的值,所以也很容易理解,在串行区调用它会返回1(所以一般也不会在串行区去调用)。
总结:omp_set_num_threads在串行区域调用才会有效,omp_get_num_threads获取当前线程组的线程数量,一般在并行区域调用,在串行区域调用返回为1。两个函数没有本质上的数量关系!
3. omp_get_max_threads:
从函数名看,貌似是“获取最大的线程数量”,是的,那么这个“最大的线程数量"的具体含义呢?下面是OpenMP文档上的一段话:
The omp_get_max_threads routine returns an upper bound on the number of threads that could be used to form a new team if a parallel region without a num_threads clause were encountered after execution returns from this routine。
很清楚的说明了,这个”最大数量“是指在不使用num_threads的情况下,OpenMP形成一个新的team能创建的最大线程数量。从这里要理解到:这个最大数量,是能确定的,与其在并行区域调用,还是在串行区域调用是无关的,因为它是返回OpenMP当前环境下去创建一个”新的“team能创建的可能的最大数量。简单的理解,其实,这个值就是由以下三者确定:omp_set_num_threads、OMP_NUM_THREADS、编译器默认实现。
注 意:omp_get_max_threads可以在串行或并行区域内调用,而且其结果是一样的(在其间不调用omp_set_num_threads的情 况下),如果有效调用(串行区调用)了omp_set_num_threads,会改变接下来调用omp_get_max_threads的值。另外,omp_get_max_threads的返回值可能会小于omp_set_num_threads。
例子
*怎么在Linux上运行OpenMP程序?
> 只需要安装支持OpenMP的编译器即可,比如GCC 4.2以上版本(好像Fedora Core带的部分4.1版本也支持),或者ICC(我用的version 9.1是支持的,其他没试过)。
*怎么缺点编译器是不是支持OpenMP?
> 看编译器安装路径下/include目录里有没有omp.h。(建议使用命令#locate omp.h 这样你就会知道的)
#include <omp.h>
#include<stdio.h> int main(int argc, _TCHAR* argv[])
{
printf("ID: %d, Max threads: %d, Num threads: %d \n",omp_get_thread_num(), omp_get_max_threads(), omp_get_num_threads());
omp_set_num_threads();
printf("ID: %d, Max threads: %d, Num threads: %d \n",omp_get_thread_num(), omp_get_max_threads(), omp_get_num_threads()); #pragma omp parallel num_threads(5)
{
// omp_set_num_threads(6); // Do not call it in parallel region
printf("ID: %d, Max threads: %d, Num threads: %d \n",omp_get_thread_num(), omp_get_max_threads(), omp_get_num_threads());
} printf("ID: %d, Max threads: %d, Num threads: %d \n",omp_get_thread_num(), omp_get_max_threads(), omp_get_num_threads()); omp_set_num_threads();
printf("ID: %d, Max threads: %d, Num threads: %d \n",omp_get_thread_num(), omp_get_max_threads(), omp_get_num_threads()); return ;
}
ubuntu下运行命令:
> gcc -fopenmp [srcfile] -o [dstfile]
http://hiderce.blog.163.com/blog/static/322720612010319486423/
openmp 的使用的更多相关文章
- 应用OpenMP的一个简单的设计模式
小喵的唠叨话:最近很久没写博客了,一是因为之前写的LSoftmax后馈一直没有成功,所以在等作者的源码.二是最近没什么想写的东西.前两天,在预处理图片的时候,发现处理200w张图片,跑了一晚上也才处理 ...
- OpenMP编程总结表
本文对OpenMP 2.0的全部语法——Macro(宏定义).Environment Variables(环境变量).Data Types(数据类型).Compiler Directives(编译指导 ...
- OpenMP共享内存并行编程详解
实验平台:win7, VS2010 1. 介绍 平行计算机可以简单分为共享内存和分布式内存,共享内存就是多个核心共享一个内存,目前的PC就是这类(不管是只有一个多核CPU还是可以插多个CPU,它们都有 ...
- OpenMP并行构造的schedule子句详解 (转载)
原文:http://blog.csdn.net/gengshenghong/article/details/7000979 schedule的语法为: schedule(kind, [chunk_si ...
- 利用OpenMP实现埃拉托斯特尼(Eratosthenes)素数筛法并行化 分类: 算法与数据结构 2015-05-09 12:24 157人阅读 评论(0) 收藏
1.算法简介 1.1筛法起源 筛法是一种简单检定素数的算法.据说是古希腊的埃拉托斯特尼(Eratosthenes,约公元前274-194年)发明的,又称埃拉托斯特尼筛法(sieve of Eratos ...
- 大数据并行计算利器之MPI/OpenMP
大数据集群计算利器之MPI/OpenMP ---以连通域标记算法并行化为例 1 背景 图像连通域标记算法是从一幅栅格图像(通常为二值图像)中,将互相邻接(4邻接或8邻接)的具有非背景值的像素集合提取出 ...
- android studio ndk使用openMP
好久没碰ndk了,之前都是在eclipse下写makefile配置c++程序的,现在发现主流都是用android studio,eclipse俨然已经被遗弃了,正好最近项目需要用openMP做算法加速 ...
- opencv 3.0 DPM Cascade 检测 (附带TBB和openMP加速)
opencv 3.0 DPM cascade contrib模块 转载请注明出处,楼燚(yì)航的blog,http://www.cnblogs.com/louyihang-loves-baiyan/ ...
- openMP的一点使用经验【非原创】
按照百科上说的,针对于openmp的编程,最简单的就是在开头加个#include<omp.h>,然后在后面的for上加一行#pragma omp parallel for即可,下面的是较为 ...
随机推荐
- 顶级域名和二级域名cookie共享删除和修改
原文地址: https://segmentfault.com/a/1190000006932934
- Echarts 饼图标题文字换行问题
var option = { title : { text: '数据来源', x:'center' }, tooltip : { trigger: 'item', formatter: "{ ...
- 【01-05】hibernate BaseDao
BaseDao接口定义 package org.alohaworld.util.dao; import java.io.Serializable; import java.util.List; imp ...
- [HttpPost]和[AcceptVerbs(HttpVerbs.Post)]区别
1.共同点:[HttpPost]和[AcceptVerbs(HttpVerbs.Post)]都是只接受POST请求过来的数据. 2.不同点:在MVC中如果想一个action既可以回应POST请求也可以 ...
- AD域组策略-只显示指定的控制面板选项配置方法
操作方法: 1.打开组策略管理器,新建一个组策略并右击编辑. 2,找到隐藏指定的“控制面板”项并双击打开:并参照设置: 填入要显示的控制面板项目,比如: joystick.cpl 表示将显示“游戏控制 ...
- yield生成器及字符串的格式化
一.生成器 def ran(): print('Hello world') yield 'F1' print('Hey there!') yield 'F2' print('goodbye') yie ...
- [Machine Learning] Active Learning
1. 写在前面 在机器学习(Machine learning)领域,监督学习(Supervised learning).非监督学习(Unsupervised learning)以及半监督学习(Semi ...
- 【Android Studio】android Internal HTTP server disabled 解决
报错:Cannot start internal HTTP server. Git integration, JavaScript debugger and LiveEdit may operate ...
- Yii rbac原理和实践
Yii框架中集成分层的 RBAC,代码位于vendor\yiisoft\yii2\rbac中,rbac工作原理分为两部分,建立授权数据和进行权限检查. 如上,一个角色拥有某个权限,如果希望用户拥有这个 ...
- JS判断是不是手机浏览器浏览网站的网页,并自动跳转
现在智能手机上网越来越普遍了,为了获得用户体验增加网站流量,你有必要为你的网站增加一个访问端设备的判断功能,若发现是手机用户访问,则直接跳转到手机站,通过百度的APP site,很容易就可实现这功能. ...