2017-04-07 23 views
0

我讀這個OpenMP tutorial,並遇到下面的程序:是否需要在OpenMP中將循環索引設置爲私有變量?

#include <omp.h> 
#include <stdio.h> 
#include <stdlib.h> 
#define N  100 

int main (int argc, char *argv[]) { 

int nthreads, tid, i; 
float a[N], b[N], c[N]; 

/* Some initializations */ 
for (i=0; i < N; i++) 
    a[i] = b[i] = i; 


#pragma omp parallel shared(a,b,c,nthreads) private(i,tid) 
    { 
    tid = omp_get_thread_num(); 
    if (tid == 0) 
    { 
    nthreads = omp_get_num_threads(); 
    printf("Number of threads = %d\n", nthreads); 
    } 

    printf("Thread %d starting...\n",tid); 

    #pragma omp for 
    for (i=0; i<N; i++) 
    { 
    c[i] = a[i] + b[i]; 
    printf("Thread %d: c[%d]= %f\n",tid,i,c[i]); 
    } 

    } /* end of parallel section */ 

} 

我有點糊塗了循環索引i是否必須是private變量或沒有。由於來自同一教程:

所有線程都可以修改和訪問所有變量(除循環索引)

如此看來線程無法控制i,是不是?順便說一句,我試圖從private變量刪除i,結果似乎確定。

回答

0

不,不需要指定循環索引變量爲private。 OpenMP強制執行該標準,並且在許多頁面的某個地方標準狀態如此。

此外,OpenMP標準的要求禁止對循環內的循環索引變量進行任何調整。實際上,OpenMP在C(和C++)程序上強制Fortran內建的約束之一。這使得運行時能夠在第一次遇到循環時正確調度線程間的多次迭代,而不用擔心分配在執行期間可能會失效。

請記住,在循環初始化時,將根據指定的調度(由程序員或某種實現定義的缺省值)分配單個循環迭代的值集i。允許線程更新i的「本地」值將導致瘋狂代碼

相關問題