版权声明: https://blog.csdn.net/qq_26386707/article/details/78516592
Using OpenMP (三) 同步
2017/10/22
by
CHENJING DING
CHAPTER 2 – 共享变量和私有变量
# pragma omp barrier:
必须等所有线程都执行完barrier之前的代码,才能执行barrier之后的代码
# pragma omp critical:
critical域内的代码当前只能有一个线程执行
#pragma omp critical (name )
- critical name 域内的代码当前只能由拥有同样该name的critical域其中的一个线程来执行
- 没有显示指明name的域全部属于同一个域
# pragma omp atomic:
- atomic域内的代码当前只能有一个线程执行
- 其后只能执行一句命令;
- 执行时间比critical 快;
- 不要混合使用critical 和 atomic;
练习:
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
#include<math.h>
# include <malloc.h>
int main( int argc, char *argv[] )
{
int N = 0 ;
N = atoi(argv[1]);
int new_num_threads = atoi(argv[2]);
float *a = (float *)malloc( N*sizeof(float));
float *b = (float *)malloc( N*sizeof(float));
int i = 0;
for ( i = 0;i<N;i++){
a[i] = (float)rand()/ RAND_MAX ;
}
float sum = 0,sqrtsum = 0;
#pragma omp parallel num_threads(new_num_threads)
{
float localsum = 0;
int i = 0;
#pragma omp for
for( i = 0;i<N;i++){
a[i] = a[i] * a[i];
localsum = localsum + a[i]*a[i];
}
#pragma omp atomic
sum += localsum;
printf("here is a barrier \n");
#pragma omp barrier
sqrtsum = sqrt(sum);
#pragma omp for
for( i = 0;i<N;i++){
int id = omp_get_thread_num();
a[i] = a[i] / sqrtsum ;
printf("id : %d a [%2d] = %5.3f \n",id ,i,a[i]);
}
}
return 0;
}