一、first/last private 子句
firstprivate(list)
所有列表中的变量在进入并行区域之前被赋值初始化
lastprivate(list)
线程执行完上一个迭代或section后更新列表中对象的值
例子:
main()
{
A = 10;
#pragma omp parallel
{
#pragma omp for private(i) firstprivate(A) lastprivate(B) ...
for(i=0; i<n; i++)
{
...
B = A + i;
...
}
}
C = B;
}
二、default 子句
default (none|shared)
none 没有默认值,需要明确指出所有变量的值
shared 所有变量共享
private 所有变量都是线程私有的
firstprivate 所有变量都是预先声明的,线程私有的
三、 reduction子句
reduction( operator : list)
reduction变量必须是共享变量
使用reduction可以防止读写冲突
四、schedule子句
schedule( static | dynamic |guided | auto [,chunk])
schedule( runtime)
static[,chunk]
分布式迭代在线程之间,chuck大小的块内
没有chunk时,每一个线程执行的相似。N/P chunk是一个长度为N和P的线程循环
在特定的情况下,在同一个循环区域,在多个循环中线程分配到的迭代相同
dynamic[,chunk]
大小由chunk的值控制
当一个线程完成后,它开始下一部分的工作
guided[,chunk]
与dynamic相同的动态行为,但是工作部分的大小成指数减小
auto
编译器或运行时系统决定用哪一个最好
选择会被独立实现
runtime
循环调度策略是一个通过环境变量OMP_SCHEDULE组成运行时集合
schedule 类型函数
使 schedule(runtime)更易用
可以使用库程序中的 set/get schedule
omp_get_schedule()
omp_set_schedule()
允许实例添加它们自己的调度类型
五、 嵌套并行
嵌套并行支持
环境变量和运行时程序使用 set/get 设置获得 嵌套并行区域的最大数目
OMP_MAX_ACTIVE_LEVELS
omp_get_max_active_levels()
omp_set_max_active_levels()
环境变量和运行时使用set/get 设置获得 程序中OpenMP线程的最大数目
OMP_THREAD_LIMIT
omp_get_thread_limit()
每一个任务的内部控制变量
omp_set_num_threads() 控制下一个并行级的线程数
库函数
嵌套深度
omp_get_level(()
omp_get_active_level()
父线程和祖先线程的ID
omp_get_ancestor_thread_num(level)
父线程和祖先线程的工作线程大小
omp_get_team_size(level)