你绝对可以:
外部.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 是在并行块内定义的——无论是否在函数内——它们都必须是私有的。