OpenMP编程(4)—sections、single指令

    技术2022-07-11  128

    1. sections指令
    1.1 sections指令用途

    SECTIONS指令用于非迭代的多线程共享区。它指定各个section代码段分配给一组线程中部分线程。 多个独立的section指令嵌套在sections指令中,每个section由于其中一个线程执行一次。不同的section可以由不同的线程执行。当然对于一个线程来说,如果它运行足够快,是有可能执行多个section。

    1.2 sections语法格式

    当sections指令在并行区域内部时,其语法为

    #pragma omp sections [clause ...] newline private (list) firstprivate (list) lastprivate (list) reduction (operator: list) nowait { #pragma omp section newline structured_block #pragma omp section newline structured_block }

    也可以将sections指令与并行区域合并为一条指令

    #pragma omp parallel sections ......
    1.3 示例

    代码示例如下

    int nLoopNum = 10; int i; #pragma omp parallel shared(nLoopNum) private(i) { printf("thread %d start\n", omp_get_thread_num()); #pragma omp sections nowait { #pragma omp section for (i=0; i < nLoopNum/2; i++) { printf("section1 thread %d excute i = %d\n", omp_get_thread_num(), i); } #pragma omp section for (i=nLoopNum/2; i < nLoopNum; i++) { printf("section2 thread %d excute i = %d\n", omp_get_thread_num(), i); } } }

    运行结果如下。可以看出,虽然并行区域有4个线程,但只有两个section,所以只有两个随机分配的线程运行section代码。

    2. single指令
    2.1 single指令用途

    single指令指定区域的代码只能由一组线程中的一个执行。 在处理非线程安全的代码段(如I/O)时可能该指令非常有用

    2.2 single语法格式
    #pragma omp single [clause ...] newline private (list) firstprivate (list) nowait structured_block
    2.3 代码示例

    代码示例如下

    int i; #pragma omp parallel private(i) { printf("thread %d start\n", omp_get_thread_num()); #pragma omp single { for (i=0; i < 5; i++) { printf("section1 thread %d excute i = %d\n", omp_get_thread_num(), i); } } }

    运行结果如下。可以看出,虽然并行区域有4个线程,但只有随机分配的一个线程运行single区域代码。

    Processed: 0.012, SQL: 9