2013-10-08 113 views
0

我刚开始玩OpenMp,对这个问题感到非常困惑。说如果我声明一个数组int a[10]并在某个循环内使用它。 #pragma omp parallel for private(a)#pragma omp parallel for shared(a)之间的区别是什么?对我来说a只是一个指向数组的第一个元素的指针,并且根据我读的private构造会为每个线程创建一个变量的副本,而且非常奇怪如果我做了初始化它的随机值不使用firstprivate构造。所以我的问题是如果我使用private构造,会发生什么语义?它是否会创建一组指针并将它们分配给每个创建的线程,或者是否会创建整个数组的一组副本,并让每个线程分别使用它们?OpenMP如何处理C中的数组?

非常感谢。

回答

2

C和C++中的数组和指针之间存在细微的语义差异。像int a[10]这样的数组定义为编译器提供了有关数组类型和大小的信息,并且它(编译器)可以使用该信息来正确分配相同大小的私有副本并可能将其初始化(在这种情况下的firstprivate)。

int *a只告诉编译器的类型,但不是大小,因此在OpenMP中,这样的变量被当作一个指针来处理,指针本身被设置为私有的,而不是它指向的数据。如果你在firstprivate子句中放置了一个指针,那么每个线程都会得到一个单独的指针变量副本,但是最初所有的副本都将指向内存中的相同位置。