//Description: openmp
//Create Date: 2021-05-15 12:31:38
//Author: channy
OpenMP
Visual C++ supports the OpenMP 2.0 standard.
Qt:
1 | |
parallel
用在一个代码段之前,表示这段代码将被多个线程并行执行
1 | |
for
用于for循环之前,将循环分配到多个线程中并行执行,必须保证每次循环之间无相关性
1 | |
parallel for
也是用在一个for循环之前,表示当前层for循环的代码将被多个线程并行执行。
1 | |
parallel for collapse(2)
多层for循环
1 | |
reduction / reduction (operator: var1, val2, …)
其中sum是共享的,采用reduction之后,每个线程根据reduction(+: sum)的声明算出自己的sum,然后再将每个线程的sum加起来。
1 | |
critical
用在一段代码临界区之前。表示同一时间内该段代码只被单个线程执行
single
只被单个线程执行一次
1 | |
atomic
原子操作,多用于++,–,etc,仅对一句有效
1 | |
master
用于指定一段代码块由主线程执行
sections / section
用在可能会被并行执行的代码段之前
parallel sections
parallel和sections两个语句的结合
flush
同步
barrier
用于并行区内代码的线程同步,所有线程执行到barrier时要停止,直到所有线程都执行到barrier时才继续往下执行。
1 | |
ordered
用于指定并行区域的循环按顺序执行
private / lastprivate / fristprivate
用于指定一个变量是线程私有的。
1 | |
lock
1 | |
barrier / nowait
for循环结束后默认带barrier
1 | |
task
for和sections指令的”缺陷“:无法根据运行时的环境动态的进行任务划分,必须是预先能知道的任务划分的情况。
task主要适用于不规则的循环迭代(如下面的循环)和递归的函数调用
1 | |
schedule
simd
向量化