【并行计算5】OpenMP

1、基本知识

OpenMPCompiler Directives(编译指导语句)Run-time Library Functions(库函数) 组成,另外还有一些和OpenMP有关的 Environment Variables(环境变量)Data Types(数据类型)以及_OPENMP宏定义

共享内存计算机上并行程序的基本思路就是使用多线程,从而将可并行负载分配到多个物理计算核心,从而缩短执行时间(同时提高CPU利用率)。在共享内存的并行程序中,标准的并行模式为fork/join式并行
在这里插入图片描述
OpenMP下程序员只需要设计高层并行结构创建调度线程均由编译器自动生成代码完成。
而且最大的一个特点是,GPU也可以将其进行应用编写对应的程序。

2、具体语句结构

compiler directive 可以生成若干的thread,最后其实会变成low-level的pthread进行运作
在这里插入图片描述

  • directive-namedofor不能同时使用,directive-name通常只有一个,但parallel可以和dofor同时存在
  • clause条件option中,有default的参数,有private的参数,这些参数定义了对应data scope的使用范围,要通过看data的描述才能知道最后产生的data类型。且clause是可以定义若干个的。
注意:
  • 区分大小写;
  • 跟在directives下的通常是一个block;
  • #pragma omp parallel”表示其后语句将被多个线程并行执行

3、OpenMP详细语句说明

PARALLEL REGION CONSTRUCT:Parallel

目的: create a teams of threads,这些thread执行的function call是完全相同的
最后其实是隐含着一个barrier,只有把线程全部做完之后才能继续执行
所以如果有一个thread结束,所有的thread就全结束了,是一起管理具体线程的
parallel区域是不能使用jump、goto语句

parallel region就是被struct block的区域
【1】IF clause 只会被master thread执行,判断是否满足条件进行执行

int a = 7;
#pragma omp parallel if(a) num_threads(6)
{
   
    std::cout << omp_get_thread_num();
}

【2】num_threads(10),代表全部执行10个thread
【3】omp_set_num_threads(),在没写num_threads的clause时,就可以在层次码一开始进行书写即可,预先设定(有时候满足重复使用的需求)
【4】OMP_NUM_THREADS系统环境变量设定,在parallel region前运作
【5】默认情况默认的情况下去询问CPU进行对应执行,线程个数由系统预设(一般等于逻辑处理器个数,例如i5 4核8线程CPU有8个逻辑处理器)

常用的是omp_set_num_threads()OMP_NUM_THREADS环境变量设定
而且可以嵌套使用parallel region
在这里插入图片描述
omp_get_nested()检查是否嵌套
omp_set_nexted(bool)设置嵌套,其实也就是设置OMP_NESTED环境变量为enable状态
如果说就不支持嵌套,那么在每个嵌套的并行区域中就只有一个线程被创建

WORK-SHAREING-STRUCTURE:do/for,section.single
1、 综述

想去规范thread去做load的分配,但是不管怎样,他们不会去lauch new thread
会与parallel在一起使用,甚至可以用for loop阿什么分配任务使用
其实也存在一个隐形的barrier去在整个结构的末尾
(除非用close去overwrite这个东西)
do/for->要共享loop去做
section->在core的level去做平行,每段thread可以做不同的任务,要把每个section一一写出来
section是不会重复做的。
single->section的特例:被包在其中的层次码,只有一个thread执行,因为有thread barrier所以其他线程不做但也等等这个thread去做,最好的适用状态就是IO。

2、 Do/for directive

去handle一个for loop,这里的关键是,每个线程执行的计算互不相同(操作的数据不同者计算任务本身不同),多个线程协作完成所有计算。将C++ for循环的多次迭代划分给多个线程(划分指,每个线程执行的迭代互不重复,所有线程的迭代并起来正好是C++ for循环的所有迭代)
注意: 使用for directive的两个条件:
1、C++ for复合特定限制

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值