2017-04-07 24 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的“本地”值将导致疯狂代码

相关问题