2016-11-22 8 views
2

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

+2

'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

+1

Warum würden Sie Iteratoren auf globaler Ebene haben? – mainactual

+1

@Gilles, warum gibst du nicht eine Antwort, die Sie Leute Ihnen Kredit geben können – dreamcrash

Antwort

0

Wie Sie wahrscheinlich wissen, in das Ihr Problem für Schleife ist. Sie haben eine Abhängigkeit zwischen den beiden Zeilen in der Schleife.

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]; 
} 

Wir können nicht wissen, in welcher Reihenfolge ein bestimmter Thread eine dieser beiden Zeilen erreicht. Wenn zum Beispiel die zweite Zeile ausgeführt wird, ist der Wert in B [i] unterschiedlich, abhängig davon, ob A [i-1] bereits von einem anderen Thread geändert wurde oder nicht. Dasselbe gilt für die Abhängigkeit von A [i] vom Wert von B [i-1]. Eine kurze und übersichtliche Erklärung der Abhängigkeiten finden Sie unter folgendem Link. Ich würde dir empfehlen, einen Blick darauf zu werfen, ob das noch nicht klar ist. https://scs.senecac.on.ca/~gpu621/pages/content/omp_2.html

Verwandte Themen