• OpenMP编程总结表


        本文对OpenMP 2.0的全部语法——Macro(宏定义)、Environment Variables(环境变量)、Data Types(数据类型)、Compiler Directives(编译指导语句)、Run-time Library Functions(库函数)的含义用表格进行总结,以便于快速使用OpenMP。如果想详细了解表格中项的含义,或者想要看一些实例,请参阅我的另一篇博文:OpenMP共享内存并行编程详解

    1. Macro

    _OPENMP

    2. Environment Variables

    Environment Variables

    Description

    OMP_SCHEDULE

    “#pragma omp [parallel] for schedule(runtime)”时 C++ for多次迭代划分到多个线程的方式,取值:"static[,chunk_size]", "dynamic [,chunk_size]", "guided[,chunk_size]"

    OMP_NUM_THREADS

    默认线程数,取值:number

    OMP_DYNAMIC

    默认是否使能动态调整线程数,取值:"TURE", "FALSE"

    OMP_NESTED

    默认是否使能并行嵌套(使能后需要实现支持),取值:"TURE", "FALSE"

    3. Data Types

    Data Types

    Description

    omp_lock_t

    记录lock的状态

    omp_nest_lock_t

    记录lock的状态,还有嵌套层数

    4. Compiler Directives

    Directive/syntax

    Description

    Clauses(optional)

    #pragma omp parallel [clause[ [, ]clause] ...] new-line
        structured-block

    定义一个parallel region,该parallel region将被多个线程并行执行

    if(scalar-expression):条件并行化

    num_threads(integer-expression):设置线程数

    private, firstprivate, shared, default, reduction, copyin见表末

    #pragma omp for [clause[[,] clause] ... ] new-line
        for-loop

    将C++ for循环的多次迭代划分给多个线程(C++ for需符合一定限制),块末尾隐含一个barrier

    ordered:配合ordered directive使用

    schedule(kind[,chunk_size]):C++ for多次迭代的划分方式,参数:static[,chunk_size], dynamic[,chunk_size], guided[,chunk_size], runtime

    nowait:禁止隐含的barrier

    private, firstprivate, lastprivate, reduction见表末

    #pragma omp sections [clause[[,] clause] ...] new-line
    {
        [#pragma omp section new-line]
            structured-block
        [#pragma omp section new-line
            structured-block ]
        ...
    }

    定义包含多个section块的代码区,这些section块将被多个线程并行执行,section块用section定义,块末尾隐含一个barrier

    nowait:禁止隐含的barrier

    private, firstprivate, lastprivate, reduction见表末

    #pragma omp single [clause[[,] clause] ...] new-line
        structured-block

    代码将仅被一个线程执行,具体是哪个线程不确定,块末尾隐含一个barrier

    nowait:禁止隐含的barrier

    private, firstprivate, copyprivate见表末

    #pragma omp parallel for [clause[[,] clause] ...] new-line
        for-loop

    同只含一个for directive 的parallel region

    Parallel和for的clauses,除nowait外

    #pragma omp parallel sections [clause[[,] clause] ...] new-line
    {
        [#pragma omp section new-line]
            structured-block
        [#pragma omp section new-line
            structured-block ]
        ...
    }

    同只含一个sections directive 的parallel region

    Parallel和sections的clauses,除nowait外

    #pragma omp master new-line
        structured-block

    代码将仅被主线程执行,块末尾没有隐含的barrier

    #pragma omp critical [(name)] new-line
        structured-block

    定义一个临界区,保证同一时刻只有一个线程访问临界区

    #pragma omp barrier new-line

    定义一个同步,所有线程都执行到该行后,所有线程才继续执行后面的代码

    #pragma omp atomic new-line
        expression-stmt

    变量将被原子的更新,expression-stmt需是 a++, a--, ++a, --a, a?=expr 之一,其中 ? 可以为 +, *, -, /, &, ^, |, <<, >>

    #pragma omp flush [(variable-list)] new-line

    所有线程对所有共享对象具有相同的内存视图(view of memory),例如,确保将变量的新值写回内存或从内存读取,而不是使用以前读到寄存器或缓存中的值

    #pragma omp ordered new-line
        structured-block

    使用在有ordered clause的for directive(或parallel for)中,代码将被按迭代次序执行(像串行程序一样)

    #pragma omp threadprivate(variable-list) new-line

    将全局或静态变量声明为线程私有的。

    Data-Sharing Attribute Clauses

    private(variable-list):每个线程有一个变量的私有副本,调用默认构造函数初始化
    可用于的directivesparallel, for, sections, single

    firstprivate(variable-list):private基础上,拷贝共享变量值初始化线程私有副本
    可用于的directivesparallel, for, sections, single

    lastprivate(variable-list):private基础上,将执行最后一次迭代(for)或最后一个section块(sections)的线程的私有副本拷贝到共享变量
    可用于的directivesfor, sections

    shared(variable-list):声明变量为线程间共享,相对于private
    可用于的directivesparallel

    default(shared|none):参数shared同于将所有变量用share clause定义,参数none指示对没有用private, shared, reduction, firstprivate, lastprivate clause定义的变量报错
    可用于的directivesparallel

    reduction(op:variable-list):定义对变量进行归约操作
    可用于的directivesparallel, for, sections

    copyin(variable-list):让threadprivate声明的变量的值和主线程的值相同
    可用于的directivesparallel

    copyprivate(variable-list):不同线程中的私有变量的值在所有线程中共享
    可用于的directivessingle

    5. Run-time Library Functions

        要使用这些函数,需要 #include<omp.h> 。

    Function

    Description

    Execution Environment Functions

    void omp_set_num_threads(int);

    设置默认parallel region的线程数

    int omp_get_num_threads();

    返回该函数所在parallel region的线程数

    int omp_get_max_threads();

    返回值等于或大于该函数所在处的未使用num_threads clause的parallel region的线程数,通常这个最大数量由omp_set_num_threads()或OMP_NUM_THREADS环境变量决定

    int omp_get_thread_num();

    返回线程编号,主线程编号为0

    int omp_get_num_procs();

    返回可用处理器数(一般等于CPU物理核心数)

    int omp_in_parallel();

    如果在parallel region内,则返回非0(一般为1),否则返回0

    void omp_set_dynamic(int);

    设置是否使能运行时动态调整parallel region的线程数,非0使能,0不使能

    int omp_get_dynamic();

    当前使能运行时动态调整parallel region的线程数,返回非0(一般为1),否则返回0

    void omp_set_nested(int);

    设置是否使能并行嵌套,非0使能,0不使能(若使能需要实现支持)

    int omp_get_nested();

    当前使能并行嵌套,返回非0(一般为1),否则返回0

    Lock Functions

    void omp_init_lock(omp_lock_t*);

    初始化一个简单Lock

    void omp_destroy_lock(omp_lock_t*);

    删除一个简单Lock

    void omp_set_lock(omp_lock_t*);

    等待直到Lock可用,然后锁上该Lock

    void omp_unset_lock(omp_lock_t*);

    释放该Lock使其可用

    void omp_test_lock(omp_lock_t*);

    测试当前Lock,若可用返回非0,否则返回0

    void omp_init_nest_lock(omp_nest_lock_t*);

    初始化一个可嵌套Lock

    void omp_destroy_nest _lock(omp_nest_lock_t*);

    删除一个可嵌套Lock

    void omp_set_nest _lock(omp_nest_lock_t*);

    等待直到可嵌套Lock可用,然后锁上该可嵌套Lock

    void omp_unset_nest _lock(omp_nest_lock_t*);

    释放该可嵌套Lock使其可用

    void omp_test_nest _lock(omp_nest_lock_t*);

    测试当前可嵌套Lock,若可用返回非0,否则返回0

    Timing Routines

    double omp_get_wtick();

    返回CPU时钟周期,以秒为单位

    double omp_get_wtime();

    返回从起始计时点开始逝去的时间,以秒为单位

    6. 参考文献

    wikipedia关于OpenMP条目

    OpenMP 2.0 Specification

    MSDM上关于OpenMP条目

    《MPI与OpenMP并行程序设计(C语言版)》第17章,Michael J. Quinn著,陈文光等译,清华大学出版社,2004

      

  • 相关阅读:
    GNOME3启动时出错:Oh no! Something has gone wrong.Logout!
    设计模式之迭代器模式
    C#中多线程 委托的使用
    python的memcache使用如果对key设置了一个int型
    Linux select TCP并发服务器与客户端编程
    G++ 教程(转)
    汉语-词语:卓识
    汉语-词语:决断
    汉语-词语:远见
    汉语-词语:胆识
  • 原文地址:https://www.cnblogs.com/liangliangh/p/3565136.html
Copyright © 2020-2023  润新知