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

| 我有一个C程序,其中包含多个.c文件和多个.h文件。我想在主函数中使用一个“ 0”指令(以便所有线程仅创建一次),然后在其他文件中执行其他OpenMP操作,例如“ 1”。 但是,我似乎无法做到这一点。编译主文件时,它抱怨
#pragma omp parallel
指令的
private()
shared()
位中提到的某些变量不存在(它们在该文件中不存在-因为它们在另一个文件中) ,并且在编译另一个文件时,它抱怨我有一个
#pragma omp for
而没有附带
#pragma omp parallel
。 代码在文件之间很好地分割了,我不希望将它们全部放回到一个文件中。有没有办法解决?     
已邀请:
您绝对可以: external.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);
        }
    }
因为线程,i和newthread是在并行块内部定义的(无论是否在函数内部),所以它们都必须是私有的。     
您是否尝试过“外部XY \”使变量在另一个文件中已知? 您不能为所有声明有问题的变量的文件使用通用标头吗? 它们是局部变量吗(那么您还是不能这样做)?     

要回复问题请先登录注册