OpenMP例程1.2.3

例程文档下载地址:
https://www.openmp.org/specifications/
以下代码我都编辑出来打包起来了,需要的可以自己去取

例程1:

void simple(int n, float * a, float * b)
 {
 int i;
 #pragma omp parallel for
 for (i=1; i<n; i++) / * i is private by default * /
 b[i] = (a[i] + a[i-1]) / 2.0;
 }

这段代码就是为了告诉你循环体内的i 是默认私有的,不需要显示的声明##pragma omp parallel for private(i)

例程2:

#include <omp.h>
#include <stdio.h>

void subdomain(float *x,int istart, int ipoints)
{
        int i;
        for (i=0;i<ipoints;i++) { //it is private by default
                x[istart+i] = 123.456;
        }
}

void sub(float *x, int npoints)
{
        int iam, nt, ipoints, istart;
#pragma omp parallel default(shared) private(iam,nt,ipoints,istart)
        {
                iam = omp_get_thread_num();
                nt = omp_get_num_threads();
                ipoints = npoints / nt; /* size of partition*/
                istart = iam * ipoints; /* starting array index*/
                if (iam == nt-1) /* last thread may do more */
                        ipoints = npoints -istart;
                printf("iam = %d,nt = %d, ipoints = %d, istart = %d\n",iam,nt,ipoints,istart);
                subdomain(x, istart, ipoints);
        }
}

int main()
{
        float array[10000];
        sub(array, 10000);
        return 0;
}

这段代码的目的是告诉你,并行后将10000拆分成几个线程来做(比如我的平台上跑这段代码的时候是12个线程),那么每个线程做10000/nt(线程数)个循环。做完后再继续串行执行程序。
这里PS以下:去掉#pragma之后,程序运行的更快,哈哈哈哈

例程3.

#include <stdio.h>
#include <omp.h>

int main()
{
        omp_set_nested(1);
        omp_set_dynamic(0);
        #pragma omp parallel
        {
                #pragma omp parallel
                {
                        #pragma omp single
                        {

                                printf("Inner1: num_thds=%d\n", omp_get_num_threads());
                        }
                }

                #pragma omp barrier
                omp_set_nested(0);
                #pragma omp parallel
                {
                        #pragma omp single
                        {
                                printf("Inner3: num_thds=%d\n",omp_get_num_threads());
                        }
                }
                #pragma omp barrier
                #pragma omp single
                {
                        printf("Outer: num_thds =%d\n",omp_get_num_threads());
                }
        }
}

这个例程太复杂,涉及到几个API
omp_set_nested(num);
omp_set_dynamic(num);
和几个omp选项
barrier single
我们来分别介绍:

#include <stdio.h>
#include <omp.h>

int main()
{
        int i = 0;
                omp_set_num_threads(2);
        #pragma omp parallel
        {
                omp_set_num_threads(3);
                #pragma omp parallel
                {
                        printf("Inner%d: num_thds=%d\n",i++,omp_get_num_threads());
                }
        }
}

这段代码的运行结果
在这里插入图片描述
可以看到并行只运行了最外侧的,里面的并行没有用
这是因为并行嵌套需要加上omp_set_nested(num);
在int i = 0这句话前面或者后面加上omp_set_nested(1);,就可以实现并行的一层嵌套
在这里插入图片描述
omp_set_nested(2) 如果是2的话就是允许2层的并行嵌套

#include <stdio.h>
#include <omp.h>

int main()
{
        int i = 0;
//      omp_set_dynamic(12);
        printf("%d\n",omp_get_num_procs());
        #pragma omp parallel num_threads(12)
        {
                                printf("Inner%d: num_thds=%d\n",i++,omp_get_num_threads());
        }
}

这段代码的运行结果是12,当把 omp_set_dynamic(12)注释去掉后,线程数会小于12; omp_set_dynamic这个函数的参数是0和非0两个情况,0的时候按照设置的thread的值设置并行数量,非0的时候按照情况(我也不知道怎么确定的,有知道的大神可以评论区见哦)设置thread的数量。

#include <stdio.h>
#include <omp.h>

int main()
{
        int i = 0;
        #pragma omp parallel num_threads(12)
        {
                #pragma omp single
                {
                                printf("Inner%d: num_thds=%d\n",i++,omp_get_num_threads());
                }
        }
}

代码运行结果:
在这里插入图片描述
#pragma omp single指的是以下{}内的代码只由并行线程中的一个执行

barrier我还没弄懂是什么意思!之后再请教

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值