我有一个C程序,它包含多个.c文件和多个.h文件。我想在main函数中有一个#pragma omp parallel
指令(所有线程只创建一次),然后在其他文件中执行其他OpenMP操作,如#pragma omp for
。
然而,我似乎无法做到这一点。在编译主文件时,它抱怨private()
指令的shared()
和#pragma omp parallel
位中提到的某些变量不存在(它们不存在,在该文件中 - 因为它们在另一个文件中,并且在编译其他文件时,它抱怨我有#pragma omp for
而没有封闭#pragma omp parallel
。
代码在文件之间很好地分开,我不想把它全部放回到一个文件中。有没有办法解决这个问题?
答案 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”以使其他文件中的变量已知?
您是否不能对声明相关变量的所有文件使用通用标头?
它们是局部变量(那么你无论如何都不能这样做)?