Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Softwaretechnik » C-Programm effizienter machen mit OpenMP » Antwort erstellen » Hallo Gast [Anmelden|Registrieren]

Antwort erstellen
Benutzername: (du bist nicht eingeloggt!)
Thema:
Nachricht:

HTML ist nicht erlaubt
BBCode ist erlaubt
Smilies sind erlaubt
Bilder sind erlaubt

Smilies: 21 von 33
smileWinkDaumen hoch
verwirrtAugenzwinkerngeschockt
Mit ZungeGottunglücklich
Forum Kloppebösegroßes Grinsen
TanzentraurigProst
TeufelSpamWillkommen
LehrerLOL HammerZunge raus
Hilfe 
aktuellen Tag schließen
alle Tags schließen
fettgedruckter Textkursiver Textunterstrichener Text zentrierter Text Hyperlink einfügenE-Mail-Adresse einfügenBild einfügen Zitat einfügenListe erstellen CODE einfügenPHP CODE farbig hervorheben
Spamschutz:
Text aus Bild eingeben
Spamschutz

Der letzte Beitrag
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!