最近用到openMp,于是查了些资料,了解了一下,一些笔记如下,分享出来,如有不当之处,还望给出指正。
openMP是一种操作级并行的框架,它可以利用多线程来增强程序的性能。
可以对 For循环,或者几个语句Sections块进行并行。
openMP是一个跨平台的框架,已经被内置到很多IDE种,如VS2017。
函数级别的并行,可能还是得用Thread来进行。
(使用前提: 是计算机具有多个核心)
目录
Parallel指令的用法:
parallel指令是用来为一段代码创建多个线程来执行它的。parallel块中的每行代码都被多个线程重复执行。
Fork/Join的方式,创建的线程之间是相互并行的,但是被创建的线程和主线程之间是“串行”的关系。
For指令的用法:
for指令要和parallel指令结合起来才有效果,要么是连着的parallel for指令,要么就是for指令包含在parallel代码块中、
Sections/Section指令的用法:
section语句是用在sections语句里用来将sections语句里的代码划分成几个不同的段,每段都并行执行。
#pragma omp [parallel] sections [子句]
{
#pragma omp section
{
代码块
}
}
使用section语句时,需要注意保证各个section里的代码执行时间相差不大,否则就达不到并行的效果了。
private 子句:
private子句用于将一个或多个变量声明成线程私有的变量,变量声明成私有变量后,指定每个线程都有它自己的变量私有副本,其他线程无法访问私有副本。即使在并行区域外有同名的共享变量,共享变量在并行区域内不起任何作用,并且并行区域内不会操作到外面的共享变量。
default 子句:
用法:
default(shared | none)
使用shared时,默认被传入并行区域的同名变量被当做共享变量处理,不会产生线程私有副本,除非使用private显式指定。
如果使用none作为参数,则线程中用到的变量必须显式指定其是共享的还是私有的。
任务调度:
OpenMP中,任务调度主要用于并行的for循环中,当循环中每次迭代的计算量不相等时,如果简单的给各个线程分配同样次数的迭代的话,会造成各个线程的计算负载不均衡,这会使得有些线程先执行完,有些后执行完,造成某些CPU核空闲,影响程序性能。
在OpenMP中,对for循环并行化的任务调度使用schedule子句来实现
Schedule子句功能——for循环并行化的任务调度