Ich bin gerade mit OpenMP gestartet und ich brauche Hilfe.C Pragma omp parallel
Ich habe ein Programm und ich muss es parallelisieren. Das ist, was ich habe:
#include <stdio.h>
#include <sys/time.h>
#include <omp.h>
#define N1 3000000
#define it 5
struct timeval t0, t1;
int i, itera_kop;
int A[N1], B[N1];
void Exe_Denbora(char * pTestu, struct timeval *pt0, struct timeval *pt1)
{
double tej;
tej = (pt1->tv_sec - pt0->tv_sec) + (pt1->tv_usec - pt0->tv_usec)/1e6;
printf("%s = %10.3f ms (%d hari)\n",pTestu, tej*1000, omp_get_max_threads());
}
void sum(char * pTestu, int *b, int n)
{
double bat=0;
int i;
for (i=0; i<n; i++) bat+=b[i];
printf ("sum: %.1f\n",bat);
}
main()
{
for (itera_kop=1;itera_kop<it;itera_kop++)
{
for(i=0; i<N1; i++)
{
A[i] = 1;
B[i] = 3;
}
gettimeofday(&t0, 0);
#pragma omp parallel for private(i)
for(i=2; i<N1; i++)
{
A[i] = 35/(7/B[i-1] + 2/A[i]);
B[i] = B[i]/(A[i-1]+2) + 3/B[i];
}
gettimeofday(&t1, 0);
Exe_Denbora("T1",&t0,&t1);
printf ("\n");
}
printf("\n\n");
sum("A",A,N1);
sum("B",B,N1);
}
Wenn ich den Code ohne Verwendung von #pragma omp parallel ausführen für die ich erhalten:
A sum: 9000005.5
B sum: 3000005.5
Aber wenn ich versuche, den Code parallelisieren ich:
A sum: 9000284.0
B sum: 3000036.0
mit 32 Threads.
Ich weiß möchte, warum ich nicht den Code parallelisieren können, die Art und Weise
'A [i]' hängt von 'B [i-1]' und 'B [i]' hängt von 'A [i-1]' ab, so dass Sie eine Abhängigkeit von Ihrer 'i'-Iteration haben i-1-Iteration Daher können Sie die Schleife nicht so wie sie ist parallelisieren. Teilen Sie die Schleife einfach mit der A- und B-Taste. Dann parallelisieren Sie beide, und das sollte funktionieren. – Gilles
Warum würden Sie Iteratoren auf globaler Ebene haben? – mainactual
@Gilles, warum gibst du nicht eine Antwort, die Sie Leute Ihnen Kredit geben können – dreamcrash