#pragma omp



  • Ich kenne mich mit OMP zwar nicht aus, aber muss es um zu parallelisieren nicht auch was parallelisierbares geben, z.B. eine Schleife oder so? Was genau soll OMP denn hier an einer Ausgabe parallelisieren? Ich meine, OMP verändert doch nicht die Logik hinter dem Programmcode, und die besteht aus genau einer Ausgabe.



  • Wenn vier Threads verfügbar sind, wird der Kram auf diese Weise vier mal nebeneinander ausgeführt. Wie oft eine nackte parallel-Direktive sinnvoll ist, ist eine andere Frage.



  • seldon schrieb:

    Wenn vier Threads verfügbar sind, wird der Kram auf diese Weise vier mal nebeneinander ausgeführt. Wie oft eine nackte parallel-Direktive sinnvoll ist, ist eine andere Frage.

    Würde mich arg verwundern. Führt er bei ner for-Schleife auch die komplette Schleife viermal nebeneinander aus? Sollte ja dann eigentlich ja jeder Thread nur Teile der Schleife ausführen, oder?

    Versuch mal sowas:

    #include <stdio.h>
    #include <omp.h>
    
    int main(int argc, char* argv[])
    {
        int i;
        #pragma omp parallel
        for (i = 0; i < 10; ++i)
        {
            printf("%d: I am thread %d of %d.\n", i, omp_get_thread_num()+1, omp_get_num_threads());
        }
        return 0;
    }
    


  • @pumuckl: Mit deinem Code kommt halt 10mal die Ausgabe Thread 1 of 1, es wiederholen sich also keine Anweisungen.
    Für for schleifen wird der Command in der Regel aber auch noch erweitert:
    #pragma omp parallel for

    Bringt nur leider nix wenn es an sich nicht geht. 😕

    @seldon: Es stehen 4 CPU Kerne zur verfügung (CPU: i5 2500k).
    Daher komisch das nur 1 Thread angezeigt wird.


  • Mod

    pumuckl schrieb:

    seldon schrieb:

    Wenn vier Threads verfügbar sind, wird der Kram auf diese Weise vier mal nebeneinander ausgeführt. Wie oft eine nackte parallel-Direktive sinnvoll ist, ist eine andere Frage.

    Würde mich arg verwundern. Führt er bei ner for-Schleife auch die komplette Schleife viermal nebeneinander aus? Sollte ja dann eigentlich ja jeder Thread nur Teile der Schleife ausführen, oder?

    Doch, das ist schon richtig so. Die Ausgabe findet so oft statt, wie Threads verfügbar sind.
    Mögliche Ausgabe bei mir am Rechner mit 8 Threads:

    I am thread 1 of 8.
    I am thread 3 of 8.
    I am thread 7 of 8.
    I am thread 4 of 8.
    I am thread 8 of 8.
    I am thread 2 of 8.
    I am thread 6 of 8.
    I am thread 5 of 8.
    

    pumuckl schrieb:

    [
    Versuch mal sowas:

    #include <stdio.h>
    #include <omp.h>
    
    int main(int argc, char* argv[])
    {
        int i;
        #pragma omp parallel
        for (i = 0; i < 10; ++i)
        {
            printf("%d: I am thread %d of %d.\n", i, omp_get_thread_num()+1, omp_get_num_threads());
        }
        return 0;
    }
    

    Dies hingegen macht ganz was anderes. Gleicher Rechner, mögliche Ausgabe:

    0: I am thread 6 of 8.
    1: I am thread 6 of 8.
    2: I am thread 6 of 8.
    3: I am thread 6 of 8.
    4: I am thread 6 of 8.
    5: I am thread 6 of 8.
    6: I am thread 6 of 8.
    7: I am thread 6 of 8.
    8: I am thread 6 of 8.
    9: I am thread 6 of 8.
    0: I am thread 1 of 8.
    0: I am thread 7 of 8.
    0: I am thread 5 of 8.
    0: I am thread 8 of 8.
    0: I am thread 2 of 8.
    0: I am thread 4 of 8.
    0: I am thread 3 of 8.
    


  • Hm also bei dir geht es also 😕
    Zufällig eine Idee warum es bei mir nicht gehen könnte/sollte? Hardwaretechnisch sollte ja alles gegeben sein.

    Probier mal bei dem Code mit der for Schleife:
    #pragma omp parallel for
    (Wie ichs im Beitrag zuvor schon hatte). So soll man es zumindest laut Doku machen.



  • Womöglich ist bei dieser Implementation OMP_DYNAMIC nicht von Haus aus gesetzt. Schreib mal

    omp_set_dynamic(1);
    

    davor und kuck, ob es dann geht. Ich meine mich zu erinnern, dass das Default-Verhalten in dieser Beziehung iplementationsdefiniert ist.



  • Hilft leider nicht wirklich.
    Hatte es so probiert:

    #include <stdio.h>
    #include <omp.h>
    
    int main(int argc, char* argv[])
    {
    
    	omp_set_dynamic(1);
    //	omp_set_num_threads(4);
        #pragma omp parallel
        {
            printf("I am thread %d of %d.\n", omp_get_thread_num()+1, omp_get_num_threads());
        }
        return 0;
    }
    


  • pumuckl schrieb:

    Würde mich arg verwundern. Führt er bei ner for-Schleife auch die komplette Schleife viermal nebeneinander aus? Sollte ja dann eigentlich ja jeder Thread nur Teile der Schleife ausführen, oder?

    Ich glaube, dafür nutzt man dann for (OpenMP).



  • Du hast OpenMP aber in den Projekteinstellungen angeschaltet, oder? (Konfigurationseigenschaften -> C/C++ -> Sprache -> OpenMP-Unterstützung heißt das bei MSVC 2008, bei 2010 vermutlich ähnlich)



  • seldon schrieb:

    #pragma omp parallel for

    Jap, sorry. Bin da nicht so firm mit den ganzen Dingen...



  • @seldon: Jetzt schon :p
    Nun läufts auch! Wusste nicht das es dort so einen Punkt gibt (war lange mit VS 2005 unterwegs 🙂 )


Anmelden zum Antworten