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

Informatiker Board » Themengebiete » Praktische Informatik » Softwaretechnik » C-Programm effizienter machen mit OpenMP » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen C-Programm effizienter machen mit OpenMP
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
deppensido
Doppel-As


Dabei seit: 23.12.2012
Beiträge: 144

C-Programm effizienter machen mit OpenMP Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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!
31.05.2018 19:31 deppensido ist offline Beiträge von deppensido suchen Nehmen Sie deppensido in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Praktische Informatik » Softwaretechnik » C-Programm effizienter machen mit OpenMP