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

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

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

      1. private子句

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

#include 
#include
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的值,出并行域的时候也是不接受并行域赋予的值。程序运行结果如下:

OpenMP并行程序设计之常用子句使用介绍(一)_第1张图片


      2. firstprivate子句

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

#include 
#include
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);
}
程序运行结果如下:

OpenMP并行程序设计之常用子句使用介绍(一)_第2张图片

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


      3. lastprivate子句

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

#include 
#include
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);
}

程序运行结果如下:

OpenMP并行程序设计之常用子句使用介绍(一)_第3张图片


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



你可能感兴趣的:(OpenMP并行程序设计)