C-Programm effizienter machen mit OpenMP

Neue Frage »

Auf diesen Beitrag antworten »
deppensido C-Programm effizienter machen mit OpenMP

Hallo,

ich habe ein Programm, welches mittels Buffon's needle Pi approximieren soll.
Das funktioniert soweit auch. Nun sol das Programm mittels Pragma-Anweisungen effizienter gemacht werden.
Die Pragma-Anweisungen habe ich zwar eingefügt, es ist aber genauso langsam, wie ohne. Ich glaube sogar noch langsamer wie ohne.

Die erste pragma soll die Variablendeklarationen paralleliseren. Die zweite die For-Schleife. Die critical ist, da sonst das Ergebnis ungenau (bzw. p) falsch wird. Bei barrier sollen die Threads aufeinander warten, damit das Ergebnis nicht verfälscht wird.

Könntet ihr bitte schauen, warum die Anweisungen das Programm nicht schneller machen?

Anbei der Code:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
#include <omp.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>

int main() {
#pragma omp parallel 
    srand(time(NULL));
    double l = 0.9;
    double n = 1000000;
    double d = 1;
    double angle;
    double pi;
    double p = 0;
    double distanceToLine;
    double y;
    
    #pragma omp parallel for
    for(int i=0; i < n; i++) {
        #pragma omp critical
        angle = (double)rand()/(RAND_MAX)*3.1415; 
        distanceToLine = (double)rand()/(RAND_MAX) * d/2; 
        y = (l/2) * sin(angle);
        if(distanceToLine <= y)
            p++;
    }
    #pragma omp barrier
    printf("%lf Nadeln kreuzen eine Linie\n", p);
    pi = (2*n*l) / (p * d);
    printf("geschätztes Pi ist: %lf\n", pi);
    
    return 0;
}


vielen Dank im voraus!
 
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »