2013-10-08 65 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子句中放置了一個指針,那麼每個線程都會得到一個單獨的指針變量副本,但是最初所有的副本都將指向內存中的相同位置。