OpenMP学习(五)

一、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)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值