Openmp (new)

概述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

制导指令

在这里插入图片描述

库函数

在这里插入图片描述

子句

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

栗子: 计算pi

#include <stdio.h>
#include <omp.h>
#define NUM_THREADS 4
int main(int argc, char* argv[])
{
    int a[1000]={0};
  /*  
    omp_set_num_threads(4);
 
	#pragma omp parallel  
	{
		printf("%d of %d threads\n", omp_get_thread_num(), omp_get_num_threads());
	}
  */  
    
    int sum1=0;
    int sum2=0;
    int i;
    for(i=0;i<10;i++)
    	sum1 += i;
    printf("sum1 = %d\n",sum1);
    
    omp_set_num_threads(NUM_THREADS);
    #pragma omp parallel
    {
        int id = omp_get_thread_num();
        printf("id = %d\n",id);
        for(i=id,a[id]=0;i<10;i+=NUM_THREADS)
            a[id]+=i;
    }
    for(i=0;i<=NUM_THREADS;i++){
        printf("a[%d] = %d\n",i,a[i]);
        sum2 += a[i];
    }
    printf("sum2 = %d\n",sum2);
	return 0;
}

在这里插入图片描述

在这里插入图片描述

循环并行制导

在这里插入图片描述

在这里插入图片描述

#include <stdio.h>
#include <omp.h>
#define NUM_THREADS 4
int main(int argc, char* argv[])
{
    int a[1000]={0};
  /*  
    omp_set_num_threads(4);
 
	#pragma omp parallel  
	{
		printf("%d of %d threads\n", omp_get_thread_num(), omp_get_num_threads());
	}
  */  
    
    int sum1=0;
    int sum2=0;
    int i;
    #pragma omp parallel for
    for(i=0;i<10;i++)
    	sum1 += i;
    printf("sum1 = %d\n",sum1);
    
    double st,ed;
    int id;
    st = omp_get_wtime();
    omp_set_num_threads(NUM_THREADS);
    #pragma omp parallel
    {
        id = omp_get_thread_num();
        printf("id = %d\n",id);
        for(i=id,a[id]=0;i<10;i+=NUM_THREADS)
            a[id]+=i;
    }
    ed = omp_get_wtime();
    printf("wtime = %f\n",ed-st);
    for(i=0;i<=NUM_THREADS;i++){
        printf("a[%d] = %d\n",i,a[i]);
        sum2 += a[i];
    }
    printf("sum2 = %d\n",sum2);
	return 0;
}

在这里插入图片描述

数据竞争

在这里插入图片描述

限定制导

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<omp.h>
#define NUM_THREADS 4
int main(){
	omp_set_num_threads(NUM_THREADS);
	
	#pragma omp parallel private(x,id)
	{
		int id = omp_get_thread_num();
		#pragma omp for private(x) reduction(+:sum)
		for(i=0;i<N;i++){
			x = (i+1);
			sum += 4.0/x;
		}
	}
}

barrier问题

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值