我想運行以下代碼來了解OpenMP lastprivate構造的功能。根據lastprivate的定義,如果我聲明變量lastprivate,則它對每個線程都是私有的,並且按順序執行並行循環的最後一次迭代的線程的值被複制到該區域之外的變量。 下面是代碼:爲什麼OpenMP lastprivate產生錯誤的結果?
int main(void)
{
omp_set_num_threads(5);
int i;
int k =3;
#pragma omp parallel private(i)
{
#pragma omp for lastprivate(k)
for(i=0; i< 5; i++)
{
int iam = omp_get_thread_num();
k = iam;
printf("k=%d, iam=%d\t",k, iam);
}
}
printf("\n k = %d", k);
}
它產生的輸出是這樣的:
k=0, iam=0 k=4, iam=4 k=3, iam=3 k=2, iam=2 k=1, iam=1
k = 4
當我們有一個團隊在「for」的工作線程,我們確實不能保證哪個線程執行最後一次。所以,相應地,最後一個線程的值應該反映在全局'k'中。然而,無論我運行多少次代碼,全局值(即並行段結束之後)'k'的值仍然爲4.
從打印值中也可以看出最後執行的線程1。即使我們認爲印刷品不可靠以獲得線程的確切運行順序,但看起來很不明顯,線程4總是最後運行,從而將其值'k'反映出來。
我將不勝感激關於這個問題的幫助。謝謝。
謝謝,這特別回答我的疑問。 – Shrik