2

我有一个由多个 .c 文件和多个 .h 文件组成的 C 程序。我想#pragma omp parallel在 main 函数中有一个指令(以便所有线程只创建一次),然后像#pragma omp for在其他文件中一样执行其他 OpenMP 操作。

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

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

4

2 回答 2

3

你绝对可以:

外部.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;
}

内部.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.

但是不,你不能在一个例程中设置变量的共享属性——它们只是不在范围内。你不能设置他们的分享,就像你不能设置他们的价值一样。

一旦你启动了(比如说)inner,里面的一切都是私有的;您必须将任何共享的东西作为共享传递。

只是为了澄清“那里的一切都是私人的”:上面的内容与

    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 是在并行块内定义的——无论是否在函数内——它们都必须是私有的。

于 2011-04-13T11:32:44.560 回答
1

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

你不能为所有声明相关变量的文件使用一个公共头文件吗?

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

于 2011-04-13T09:57:27.867 回答