Ich glaube nicht, dass Sie tun - was ich getan habe, um dieses Problem zu lösen, wurde eine parallele Region #pragma omp parallel shared(...) private(...)
verwendet und das Array dynamisch innerhalb der parallelen Region zugewiesen. Versuchen Sie folgendes:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
/* compile 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]);
}
}
mir, dass die gleichen Ergebnisse wie meine früheren Versuchsprogramm erzeugt:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
/* compile 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]);
}
}
Bei einer Vermutung würde ich sagen, weil OpenMP nicht die Größe des Arrays ableiten kann es kann Sei nicht privat - nur Arrays zur Kompilierungszeit können auf diese Weise erstellt werden. Ich erhalte Segfaults, wenn ich versuche, ein dynamisch zugewiesenes Array zu sperren, vermutlich wegen Zugriffsverletzungen. Das Array auf jedem Thread zuzuweisen, als ob Sie dies mit Pthreads geschrieben hätten, macht Sinn und löst das Problem.
Danke, die Openmp-Deklaration und die Parallele zur Deklaration zu trennen scheint perfekt zu funktionieren. – cboettig
@Ninefingers: Ich weiß, dass dieser Beitrag alt ist, aber ich hatte eine kurze Frage. Benötigen Sie überhaupt die Anweisung '#pragma omp for'? Würde es diese Schleife nicht parallel ausführen? – Amit
@Amit nein, Sie müssen dem Compiler sagen, dass er Threads ausbrechen soll, sonst nicht. –