OpenMP并行程序设计之常用子句使用介绍(一)

OpenMP并行程序设计之常用子句使用介绍(一)

   在OpenMP并行程序设计中涉及的数据处理子句比较多,比如:private子句,firstprivate子句,lastprivate子句,threadprivate子句,shared子句,default子句,reduction子句,copyin子句以及copyprivate子句等等,在这里我们就详细的介绍一下比较常用的几个子句,个人认为,这些子句在写程序中使用的较为频繁,下面将通过一些代码实例详细介绍。

      1. private子句

   private子句用于将一个或多个变量声明成线程私有的变量,变量声明成私有变量后,指定每个线程都有它自己的变量私有副本,其他线程无法访问私有副本。即使在并行区域外有同名的共享变量,共享变量在并行区域内不起任何作用,并且并行区域内不会操作到外面的共享变量。可能还是有点不理解,我们代码走起。

#include <iostream>
#include<omp.h>
int main(int argc, char *argv[])
{
	int k = 100;//共享变量
#pragma omp parallel for private(k)
	for (k = 0; k < 10; k++)
	{
		printf("k=%d\n", k);
	}

	printf("last k=%d\n", k);

	system("pause");
	return(0);
}

   在上面的示例中,变量k就是共享变量,只不过,在循环外和循环内的是两个不同的变量,在这里循环体就是并行域。需要注意的是,在进入并行域的时候,由于使用private,所以是不继承上面的k=100的值,出并行域的时候也是不接受并行域赋予的值。程序运行结果如下:



      2. firstprivate子句

  在上面,private声明的私有变量不能继承同名变量的值,也就是说,虽然变量同名,但是在并行域内是不接受并行域外的赋值,但实际情况中有时需要继承原有共享变量的值,也就是在进入并行域内之前得接受并行域外的变量赋值。我们代码走起。

#include <iostream>
#include<omp.h>
int main(int argc, char *argv[])
{
	int k = 100;
#pragma omp parallel for firstprivate(k)
	for (int i = 0;i < 10; i++)
	{
		k += i;
		printf("k=%d\n", k);
	}

	printf("last k=%d\n", k);

	system("pause");
	return(0);
}
程序运行结果如下:



   从上面的运行结果可以看出,进入并行域也就是循环体的时候,变量k是继承了k=100的值。细心的可以发现,我继承了k=100的值,但是出并行域之后,我并行域的赋值,可是没有传出去哦。那经过并行域计算过的值该怎样才能传出去呢,下面介绍lastprivate子句。


      3. lastprivate子句

  有时在并行区域内的私有变量的值经过计算后,在退出并行区域时,需要将它的值赋给同名的共享变量,前面的private和firstprivate子句在退出并行区域时都没有将私有变量的最后取值赋给对应的共享变量,lastprivate子句就是用来实现在退出并行区域时将私有变量的值赋给共享变量。说白了,作用就是将上面并行域计算的值传出去。我们看代码吧。

#include <iostream>
#include<omp.h>
int main(int argc, char *argv[])
{
	int k = 100;
#pragma omp parallel for firstprivate(k),lastprivate(k)
	for (int i = 0;i < 10; i++)
	{
		k += i;
		printf("k=%d\n", k);
	}

	printf("last k=%d\n", k);

	system("pause");
	return(0);
}

程序运行结果如下:



   从上面的运行结果可以看出,使用了firstprivate子句,也就继承了k=100的值,同时使用了lastprivate子句,也就将经过并行域计算的值传出去了,可能会有人问,在并行域内是并行计算的,那传出去的值该是哪个线程计算的值呢,OpenMP规范中指出,如果是循环迭代,那么是将最后一次循环迭代中的值赋给对应的共享变量,也就我们正常循环时的最后一次计算的值,上面也就是i=9时的计算值。



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值