Using OpenMP (三) 同步

版权声明: 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 ) 
  1. critical name 域内的代码当前只能由拥有同样该name的critical域其中的一个线程来执行
  2. 没有显示指明name的域全部属于同一个域


# pragma omp atomic:
  1. atomic域内的代码当前只能有一个线程执行
  2. 其后只能执行一句命令;
  3. 执行时间比critical 快;
  4. 不要混合使用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;
}







猜你喜欢

转载自blog.csdn.net/qq_26386707/article/details/78516592