OpenMP中几个容易混淆的函数(线程数量/线程ID/线程最大数)以及并行区域线程数量的确定_openmp怎么获取线程id-程序员宅基地

技术标签: 15 网络编程晋升  

说明:这部分内容比较基础,主要是分析几个容易混淆的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

4. 实例:

下面的例子是使用上面几个函数的例子,根据结果可以分析出上面提到的一些内容:

  1. #include <omp.h>  
  2.   
  3. int main(int argc, _TCHAR* argv[])    
  4. {  
  5.     printf("ID: %d, Max threads: %d, Num threads: %d \n",omp_get_thread_num(), omp_get_max_threads(), omp_get_num_threads());  
  6.     omp_set_num_threads(5);  
  7.     printf("ID: %d, Max threads: %d, Num threads: %d \n",omp_get_thread_num(), omp_get_max_threads(), omp_get_num_threads());  
  8.   
  9. #pragma omp parallel num_threads(5)  
  10.     {  
  11.         // omp_set_num_threads(6);  // Do not call it in parallel region  
  12.         printf("ID: %d, Max threads: %d, Num threads: %d \n",omp_get_thread_num(), omp_get_max_threads(), omp_get_num_threads());  
  13.     }  
  14.   
  15.     printf("ID: %d, Max threads: %d, Num threads: %d \n",omp_get_thread_num(), omp_get_max_threads(), omp_get_num_threads());  
  16.       
  17.     omp_set_num_threads(6);  
  18.     printf("ID: %d, Max threads: %d, Num threads: %d \n",omp_get_thread_num(), omp_get_max_threads(), omp_get_num_threads());  
  19.   
  20.     return 0;    
  21. }  
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Windgs_YF/article/details/80676146

智能推荐

使用xlsx、xlsx-style导出表格添加背景色;合并单元格部分样式缺失问题解决_xlsx.utils 添加背景色-程序员宅基地

文章浏览阅读754次,点赞10次,收藏4次。我这个是直接通过传入dom生产的sheet页,也可以通过数据生成sheet页,xlsx都有对应的方法,其实不影响我们修改样式。主要关注addRangeBorder(给合并行列赋值样式)、setExcelStyle(设置导出Excel样式)这两个方法。由于上次写的修改样式只关注了单元格的宽度,并没有设置颜色以及没关注到合并的单元格部分样式没设置上等问题,所以这篇来说下。我们通过xlsx可以通过dom元素、或者数据来生产sheet页,然后我们修改样式就操作对应的sheet页就可以了。_xlsx.utils 添加背景色

python 自动化数据提取之正则表达式_python 正则 取token(1)-程序员宅基地

文章浏览阅读434次,点赞14次,收藏15次。如下案例:有一个字符串s,我们需要在字符串中匹配3个以上的数字,字符串中数字有8个,贪婪模式会尽可能匹配更多字符,3个以上,8个也是3个以上,那么这里匹配的结果就是8个数字。re.match尝试从字符串的起始位置匹配一个模式,匹配成功 返回的是一个匹配对象(这个对象包含了我们匹配的信息),如果不是起始位置匹配成功的话,match()返回的就是空。而re.search匹配整个字符串,直到找到一个匹配成功的则进行返回,如果整个字符串中都没有找到匹配成功的,则返回空。repl:匹配之后替换的新内容;

Windows10系统.NET Framework 3.5离线安装方法_framework 3.5 离线安装-程序员宅基地

文章浏览阅读2.3w次。Win10技术预览版给用户们带来很多新功能的同时,也给用户们带来了不害臊的麻烦与问题。其中.NET Framework 4.5是系统预装的,但是在Win10技术预览版中的部分应用需要.NET Framework 3.5才能正常运行。当我们双击打开类似应用时,Windows10预览版就会提醒我们需要联网下载安装.NET Framework 3.5,这样就给我们造成了一些麻烦。      不过,我们有_framework 3.5 离线安装

Server2016操作系统配置主从AD和DNS_ad域控怎么做主从-程序员宅基地

文章浏览阅读2.8k次,点赞4次,收藏24次。准备两台Server2016操作系统服务器1、修改AD0和AD1服务器IP地址2、主从AD0和AD1添加角色和功能3、开始角色和功能向导4、添加服务器角色5、确认信息并点击安装,安装完成点击关闭6、配置AD部署服务,添加新林,设置域名7、设置目录服务还原DSRM密码-下一步-下一步-下一步8、先决条件检查都成功通过后,点击“开始安装”,安装完成后会自动重启9、从AD配置向导10、配置从AD的DSRM密码11、制定其他复制选项-选择域12、一路下一步-_ad域控怎么做主从

Android Studio调用 符合JNI标准和非JNI标准的so库总结_so库类型,符合jni语法-程序员宅基地

文章浏览阅读1.5k次。已了解解决方案:一、既有jar包又有so库 这种最简单,jar包和so库一起使用的,(比如:百度地图)只需要将jar包放在 libs目录下,然后选中右键add as library 。so 文件也放在libs目录下即可。二、Android Studio 调用符合JNI标准的 so库 (这类so必须要知道,包含本地方法的包名和类名,否则无法调用)_so库类型,符合jni语法

emacs 安装 auto-complete 自动补全功能_emacs auto complete english dictionary-程序员宅基地

文章浏览阅读1.1k次。1,下载auto-complete的压缩包,然后解压;2,在emacs 输入 M_x load-file 然后输入 刚刚解压的auto-complete路径/auto-complete/etc/install.el 然后就可以默认的安装了。3, 安装成功会提示要把下面代码放到.emas文件中(add-to-list 'load-path "~/.emacs.d/")(require_emacs auto complete english dictionary

随便推点

Maven搭建私有仓库(私服)_maven私有仓库搭建-程序员宅基地

文章浏览阅读1.2w次,点赞2次,收藏40次。作为一个非常优秀且我找不到合适的替代品的二进制包储存库,功能也是非常强大,不单纯只能设置Maven私有仓库。包括我们常见的Yum、Docker、npm、NuGel等等。专业版需要付费,个人用免费版就可以,专业版更加强大。_maven私有仓库搭建

Mac安装Git_mac git-程序员宅基地

文章浏览阅读9.6w次,点赞48次,收藏297次。文章目录一、简介二、下载指引三、配置信息一、简介在Mac上安装Git之前,可以先使用git --version来查看一下是否安装了Git,因为Mac系统可能自带了Git,或者在你安装XCode(或者XCode的命令行工具)时,可能已经安装了 Git。如果Mac还没有安装Git的话,则会跳出弹窗提示您安装Git。上述是因为在安装Homebrew时,自动下载安装了XCode的命令行工具,所以已经安装了Git。二、下载指引如果尚未安装Git,或者已安装的Git版本过低,这里我们可以去Git官网ht_mac git

NISP二级考试安排(2023年7月-12月)_nisp二级考试时间-程序员宅基地

文章浏览阅读1.3k次。颁发,只有考取NISP一级证书才能考取NISP二级。NISP与CISP无缝对接。CISP需要工作经验所以在校生无法报考,NISP填补了在校大学生无法考取CISP证书的空白,被称为。国家信息安全水平考试(NISP)认证分为一级和二级,证书由。获取NISP考试题库及进备考交流裙可以私信,或者下方佳号有。_nisp二级考试时间

Linux和uClinux比较分析 _uclinux tinylinux-程序员宅基地

文章浏览阅读1.2k次。Linux和uClinux比较分析   标准Linux是针对有MMU的处理器设计的。在这种处理器上,虚拟地址被送到MMU,把虚拟地址映射为物理地址。通过赋予每个任务不同的虚拟-物理地址转换映射,支持不同任务之间的保护。    uClinux是针对控制领域的嵌入式linux操作系统,它从Linux 2.0/2.4内核派生而来,沿袭了主流Linux的绝大部分特性。适合不具备内存管理单元(MMU)的微处理器/微控制器。没有MMU支持是uClinux与主流Linux的基本差异。   _uclinux tinylinux

支持C++,python,java等语言的跨平台的农历库(天文历算法)_c++年月日时天干地支算法-程序员宅基地

文章浏览阅读1k次。sxtwl_cpp是一个寿星天文历的C++实现日历库。因为其依据天文历法算法实现,故其可查询范围广(BC722年以后与实历相符)。支持Android、IOS、Windows、MacOS、Linux等平台。使用swig暴露接口给python,lua,java等语言使用。本项目 GitHub / Gitee(码云)。功能介绍 获取农历、公历以及天干地支数据 农历和阴历互转 回历的支..._c++年月日时天干地支算法

geotools实现坐标系转换_geotools 坐标系转换-程序员宅基地

文章浏览阅读719次。【代码】WGS84转上海坐标系(geotools实现坐标系转换)_geotools 坐标系转换

推荐文章

热门文章

相关标签