OpenMP数据处理子句
navOpenMP private子句OpenMP firstprivate子句OpenMP lastprivate子句OpenMP threadprivate子句OpenMP private子句有点局部变量的感觉,但是不会改变并行区域外共享变量的值#include"stdio.h"#include"omp.h"#define NUM_THREADS 4int main(){int i ,k=10
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;
}
这个输出就很完美:

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)