Вы определенно можете:
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.
Но нет, вы не можете установить атрибуты совместного использования переменных в одной подпрограмме из другой - они просто не находятся в области видимости. Вы не можете установить их общий доступ больше, чем можете установить их значение.
Как только вы запустили (скажем) 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 определены внутри параллельного блока - будь то внутри функции или нет - все они обязательно являются частными.