OpenMP 2018 程序啪啪啪
OpenMP
基本原理
- Fork/Join多线程模型
- 在线程级别采用共享内存并行计算模型
- 程序员需要自我处理好并行逻辑问题
基础API
- Construct构建语句(和编程语句一样,引导编译器做处理)
- Parallel声明下面的代码块将进行并行处理
#pragma omp parallel
[
clause[``[
,]
clause]
...]
structured block- clauses
- if(scalar-expression)
- num_threads(integer-expression)
- private(list)
- firstprivate(list)
- shared(list)
- default(none|shared)
- copyin(list)
- reduction(operator:list)
- Work-Sharing以下代码将进行多线程改写
- iterations over the threads 不依赖迭代
#pragma omp for
[
clause[``[
,]
clause]
...]
for-loop- clauses
- private(list)
- firstprivate(list)
- lastprivate(list)
- reduction(operator:list)
- ordered
- schedule(kind
[
,chunk_size]
) - nowait
- independent work units相互独立的代码单元
#pragma omp sections
[
clause[``[
,]
clause]
...]
{[
#pragma omp section]
structured block[
#pragma omp section]
structured block ...... }- clauses
- private(list)
- firstprivate(list)
- lastprivate(list)
- reduction(operator:list)
- nowait
- Only one thread executes the code block只有一个线程运行的代码单元
#pragma omp single
[
clause[``[
,]
clause]
...]
structured block- clauses
- private(list)
- firstprivate(list)
- copyprivate(list)
- nowait
- Combined Parallel
- iterations over the threads 不依赖迭代
- Synchronization用于线程同步
- barrier
pragma omp barrier
- 这此处所有线程全部执行完,同步后继续执行
- Ordered
#pragma omp ordered structured block
- 指定接下來被程式,在被平行化的 for 迴圈將依序的執行。 Specifies that code under a parallelized for loop should be executed like a sequential loop.
- critical
#pragma omp critical
[
(name)]
structured block- block中的语句将通过锁机制来维护执行的单一性
- 通过名字name来实现不同地方的锁机制
- atomic
#pragma omp atomic statement
- 语句原子化执行
- master
#pragma omp master structured block
- 只有主线程执行
- barrier
- Parallel声明下面的代码块将进行并行处理
- Clauses附加修饰和条款
- shared(list)
- 利用这个有效区域的变量
- 利用指针来达到效果
- private(list)
- 在各自线程内部创建一个副本
- 利用传值的效果
- lastprivate(list)
- 按逻辑先后将最后一个被赋值的数据作为本数据域的结果
- firstprivate(list)
- 用于初始化
- 在各个线程中可能需要用到外面的初始数据
- default(none|shared)
- 给下面所有的数据指定默认区间
- none:不指定,需要程序员逐个设置
- shared:默认都为shared(....)
- nowait
- 忽略 barrier(等待)。 Overrides the barrier implicit in a directive.
- schedule(kind
[
,chunk_size]
)- kind
- 有 dynamic、guided、runtime、static 四種方法。
- 各个线程的for迭代范围
- 設定 for 迴圈的平行化方法;
- kind
- if(scalar-logical-expression)
- num_threads(scalar-integer-expression)
- reduction(operator:list)
- operator:initial ization value
*
:0*
:1-
:0&
:~
0|
:0^
:0&&
:1||
:0
- 对于特殊类型还是得借助critical
- operator:initial ization value
- shared(list)
</blockquote>
学习资源
tags: MultiCPU
创建@
2011-07-21
最后修改@
2013-05-04