例程文档下载地址:
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我还没弄懂是什么意思!之后再请教