是否可以在程序中的多个文件中使用OpenMP指令?

时间:2011-04-13 09:54:50

标签: c openmp parallel-processing hpc

我有一个C程序,它包含多个.c文件和多个.h文件。我想在main函数中有一个#pragma omp parallel指令(所有线程只创建一次),然后在其他文件中执行其他OpenMP操作,如#pragma omp for

然而,我似乎无法做到这一点。在编译主文件时,它抱怨private()指令的shared()#pragma omp parallel位中提到的某些变量不存在(它们不存在,在该文件中 - 因为它们在另一个文件中,并且在编译其他文件时,它抱怨我有#pragma omp for而没有封闭#pragma omp parallel

代码在文件之间很好地分开,我不想把它全部放回到一个文件中。有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:3)

你绝对可以:

outer.c:

#include <stdio.h>
#include <stdlib.h>
#include <omp.h>

void inner(int n);

int main(int argc, char **argv) {
    int n=15;

    #pragma omp parallel shared(n) num_threads(4)
    {
        inner(n);
    }

    return 0;
}

inner.c:

#include <omp.h>
#include <stdio.h>

void inner(int n) {
    int thread = omp_get_thread_num();
    printf("%3d: got %d\n", thread, n);

    #pragma omp for
    for  (int i=0;i<n;i++) {
        int newthread=omp_get_thread_num();
        printf("%3d: doing iter %d.\n",newthread,i);
    }
}

并且正在运行:

$ make
gcc -fopenmp -std=c99   -c -o outer.o outer.c
gcc -fopenmp -std=c99   -c -o inner.o inner.c
gcc -o nested outer.o inner.o -fopenmp -std=c99 -lgomp    
$ ./nested 
  3: got 15
  3: doing iter 12.
  3: doing iter 13.
  3: doing iter 14.
  0: got 15
  0: doing iter 0.
  0: doing iter 1.
  0: doing iter 2.
  0: doing iter 3.
  1: got 15
  1: doing iter 4.
  1: doing iter 5.
  1: doing iter 6.
  1: doing iter 7.
  2: got 15
  2: doing iter 8.
  2: doing iter 9.
  2: doing iter 10.
  2: doing iter 11.

但不,你不能在一个例程中设置变量的共享属性 - 它们只是不在范围内。您无法设置共享,只能设置其值。

一旦你启动(说)内在,一切都是私人的;你必须以共享方式传递任何共享内容。

只是为了肯定“一切都是私人的”:上述与

没有任何不同
    int n=15;

    #pragma omp parallel shared(n) num_threads(4)
    {
        int thread = omp_get_thread_num();
        printf("%3d: got %d\n", thread, n);

        #pragma omp for
        for  (int i=0;i<n;i++) {
            int newthread=omp_get_thread_num();
            printf("%3d: doing iter %d.\n",newthread,i);
        }
    }

因为thread,i和newthread是在并行块内部定义的 - 无论是否在函数内部 - 它们都必须是私有的。

答案 1 :(得分:1)

您是否尝试过“extern XY”以使其他文件中的变量已知?

您是否不能对声明相关变量的所有文件使用通用标头?

它们是局部变量(那么你无论如何都不能这样做)?