OpenMP数据处理子句

Posted 各可

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenMP数据处理子句相关的知识,希望对你有一定的参考价值。

OpenMP private子句

有点局部变量的感觉,但是不会改变并行区域外共享变量的值

#include"stdio.h"
#include"omp.h"
#define NUM_THREADS 4
int main()
{
    int i ,k=100;
    omp_set_num_threads(NUM_THREADS);
    #pragma omp parallel for firstprivate(k)
    for (i = 0; i < 5;i++)
    {
        k++;
        printf("In for-loop k=%d\\n", k);
    }
    printf("k=%d\\n",k);
    return 0;
}

在这里插入图片描述

OpenMP firstprivate子句

会继承主线程同名共享变量的值,但是不会改变共享变量的值

#include "stdio.h"
#include "omp.h"
#define NUM_THREADS 4
int main()
{
    int i, k = 100;
    omp_set_num_threads(NUM_THREADS);
#pragma omp parallel for firstprivate(k)
    for (i = 0; i < 5; i++)
    {
        //下面有书写的是k++,注意修改为k+=i才正确
        k+=i;
        printf("In for-loop k=%d\\n", k);
    }
    printf("k=%d\\n", k);
    return 0;
}

正确输出应该是:
In for-loop k=100
In for-loop k=101
In for-loop k=102
In for-loop k=103
In for-loop k=104
k=100
实际vscode输出(k值顺序可以有所不同):
在这里插入图片描述

OpenMP lastprivate子句

会继承主线程同名共享变量的值,同时也会改变共享变量的值(即将最后退出并行区域的值赋给共享变量)

#include"stdio.h"
#include"omp.h"
#define NUM_THREADS 4
int main()
{
    int i ,k=100;
    omp_set_num_threads(NUM_THREADS);
    #pragma omp parallel for firstprivate(k),lastprivate(k)
    for (i = 0; i < 5;i++)
    {
        //下面有书写的是k++,注意修改为k+=i才正确
        k+=i;
        printf("In for-loop k=%d\\n", k);
    }
    printf("k=%d\\n",k);
    return 0;
}

ps.
正确输出应该是:
In for-loop k=100
In for-loop k=101
In for-loop k=102
In for-loop k=103
In for-loop k=104
k=104
实际实验vscode如下(k的值顺序可以有所不同):
在这里插入图片描述

OpenMP threadprivate子句

会继承主线程同名共享变量的值,同时也会改变共享变量的值(即将最后退出并行区域的值赋给共享变量)

#include"stdio.h"
#include"omp.h"
#define NUM_THREADS 4
int main()
{
    int i ,k=100;
    omp_set_num_threads(NUM_THREADS);
    #pragma omp parallel for firstprivate(k),lastprivate(k)
    for (i = 0; i < 5;i++)
    {
        k++;
        printf("In for-loop k=%d\\n", k);
    }
    printf("k=%d\\n",k);
    return 0;
}

这个输出就很完美:
在这里插入图片描述

以上是关于OpenMP数据处理子句的主要内容,如果未能解决你的问题,请参考以下文章

理解openmp中的collapse子句

OpenMP 5.1 规范是不是允许使用非矩形循环的折叠子句?

OpenMP 子句共享与关键

OpenMP:同一个编译指示上的 nowait 和 reduction 子句

在 OpenMP 中,firstprivate 和 lastprivate 与 private 子句有何不同?

如何让 OpenMP 在程序每次运行时只创建一次线程?