OpenMP 入门记录1

本文深入探讨OpenMP并行编程技巧,详细解析omp_get_thread_num()与omp_get_num_threads()函数的应用,对比parallel与parallel for的区别,通过实例演示reduction归约操作,帮助读者掌握多线程并行计算的核心概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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实际上对于线程来说是私有的,只不过最后的时候进行归约而已

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值