Comment s’assurer qu’un tableau alloué dynamicment est privé dans openmp

Je travaille en C avec openMP en utilisant gcc sur une machine linux. Dans une boucle openmp parallèle pour boucle, je peux déclarer un tableau alloué statiquement comme étant privé. Considérons le fragment de code:

int a[10]; #pragma omp parallel for shared(none) firstprivate(a) for(i=0;i<4;i++){ 

Et tout fonctionne comme prévu. Mais si au lieu d’allouer un dynamicment,

 int * a = (int *) malloc(10*sizeof(int)); #pragma omp parallel for shared(none) firstprivate(a) 

les valeurs de a (au moins a [1 … 9]) ne sont pas protégées mais agissent comme si elles étaient partagées. Cela est compréhensible car rien dans la commande pragma ne semble indiquer à Oomp quelle est la taille du tableau qui doit être privé. Comment puis-je transmettre cette information à openmp? Comment déclarer tout le tableau alloué dynamicment comme privé?

Je ne pense pas que vous le fassiez – ce que j’ai fait pour résoudre ce problème a été utilisé dans une région parallèle #pragma omp parallel shared(...) private(...) et a alloué le tableau de manière dynamic à l’intérieur de la région parallèle. Essaye ça:

 #include  #include  #include  /* comstack with gcc -o test2 -fopenmp test2.c */ int main(int argc, char** argv) { int i = 0; int size = 20; int* a = (int*) calloc(size, sizeof(int)); int* b = (int*) calloc(size, sizeof(int)); int* c; for ( i = 0; i < size; i++ ) { a[i] = i; b[i] = size-i; printf("[BEFORE] At %d: a=%d, b=%d\n", i, a[i], b[i]); } #pragma omp parallel shared(a,b) private(c,i) { c = (int*) calloc(3, sizeof(int)); #pragma omp for for ( i = 0; i < size; i++ ) { c[0] = 5*a[i]; c[1] = 2*b[i]; c[2] = -2*i; a[i] = c[0]+c[1]+c[2]; c[0] = 4*a[i]; c[1] = -1*b[i]; c[2] = i; b[i] = c[0]+c[1]+c[2]; } free(c); } for ( i = 0; i < size; i++ ) { printf("[AFTER] At %d: a=%d, b=%d\n", i, a[i], b[i]); } } 

Cela m’a donné les mêmes résultats que mon programme d’expérimentation précédent:

 #include  #include  #include  /* comstack with gcc -o test1 -fopenmp test1.c */ int main(int argc, char** argv) { int i = 0; int size = 20; int* a = (int*) calloc(size, sizeof(int)); int* b = (int*) calloc(size, sizeof(int)); for ( i = 0; i < size; i++ ) { a[i] = i; b[i] = size-i; printf("[BEFORE] At %d: a=%d, b=%d\n", i, a[i], b[i]); } #pragma omp parallel for shared(a,b) private(i) for ( i = 0; i < size; i++ ) { a[i] = 5*a[i]+2*b[i]-2*i; b[i] = 4*a[i]-b[i]+i; } for ( i = 0; i < size; i++ ) { printf("[AFTER] At %d: a=%d, b=%d\n", i, a[i], b[i]); } } 

En un mot, je dirais qu'OpenMP ne pouvant pas déduire la taille du tableau, il ne peut être privé - seuls les tableaux au moment de la compilation peuvent être créés de cette façon. J'obtiens des segfaults lorsque j'essaie de privatiser un tableau alloué dynamicment, probablement à cause de violations d'access. Allouer le tableau sur chaque thread comme si vous l'aviez écrit à l'aide de pthreads est logique et résout le problème.

Vous avez dit à OpenMP que le pointeur a est privé, c’est-à-dire répliqué dans chaque thread. Votre tableau est simplement constitué de données arbitraires vers lesquelles pointe, et OpenMP ne le répliquera pas (peut-être parce que cela obligerait à allouer et à désallouer les tableaux répliqués).