あなたは間違いなくすることができます:
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.
ただし、いいえ、あるルーチンの変数の共有属性を別のルーチンから設定することはできません。変数はスコープ内にありません。あなたは彼らの価値を設定することができる以上に彼らの共有を設定することはできません。
(たとえば)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は、関数内かどうかに関係なく、並列ブロック内で定義されているため、これらはすべて必然的にプライベートです。