1.在编译制导作用域内外都能用的api
omp_get_thread_num(); 获得当前线程id,主线程为0
omp_get_num_threads(); 获得总的线程数目
2 #pragme omp parallel
分配n个线程,每个线程都去执行整个作用域的代码段
#pragma omp parallel
for (int i = 0; i < 2; ++i)
{
int id = omp_get_thread_num();
printf("%d,%s%d\n",id,"hello",i);
}
输出为:
3,hello0
3,hello1
2,hello0
2,hello1
1,hello0
1,hello1
0,hello0
0,hello1
//可以看到分配了四个线程执行,对每个线程都去执行整个for循环,强调这里,要和parallel for区分开
3#pragme omp parallel for和#pragma omp parallel for reduction(+:sum)
#pragme omp parallel for 是把for循环拆开来分配给n个线程执行
reduction归约,实际上的变量对于线程来说是私有的,只不过最后的时候进行归约而已
#include <omp.h>
#define N 1000
#define CHUNKSIZE 100
#include <cstdio>
int main ()
{
int s = 0;
#pragma omp parallel for
for (int i = 0; i < 10; ++i)
{
s+=i;
int id = omp_get_thread_num();
printf("%d,%d\n",id,s);
}
printf("%d\n", s);
int sum = 0;
#pragma omp parallel for reduction(+:sum)
for (int i = 0; i < 10; i++)
{
//printf("%d\n",sum);
int temp = sum;
sum += i;
int id = omp_get_thread_num();
printf("id%d,%d+%d=%d\n",id,temp,i,sum);
}
printf("%d\n",sum);
}
编译:g++ -o openmp_c openmp_c.cpp -fopenmp
输出的结果为:
2,14
2,21
1,3
1,25
3,8
0,14
0,40
0,42
3,39
1,30
42 //为什么这里是42,因为这里已经离开编译制到语句的作用域,剩下主线线程,主线程id为0
id1,0+3=3
id1,3+4=7
id1,7+5=12
id2,0+6=6
id2,6+7=13
id3,0+8=8
id3,8+9=17
id0,0+0=0
id0,0+1=1
id0,1+2=3
45
//45 = 12+13+17+3
//下面这里采用的是reduction归约,可以看到,sum实际上对于线程来说是私有的,只不过最后的时候进行归约而已