1、基本知识
OpenMP由Compiler Directives(编译指导语句)、Run-time Library Functions(库函数) 组成,另外还有一些和OpenMP有关的 Environment Variables(环境变量)、Data Types(数据类型)以及_OPENMP宏定义。
共享内存计算机上并行程序的基本思路就是使用多线程,从而将可并行负载分配到多个物理计算核心,从而缩短执行时间(同时提高CPU利用率)。在共享内存的并行程序中,标准的并行模式为fork/join式并行。
OpenMP下程序员只需要设计高层并行结构,创建及调度线程均由编译器自动生成代码完成。
而且最大的一个特点是,GPU也可以将其进行应用编写对应的程序。
2、具体语句结构
compiler directive 可以生成若干的thread,最后其实会变成low-level的pthread进行运作
- directive-name中do和for不能同时使用,directive-name通常只有一个,但parallel可以和do、for同时存在
- 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、