OpenMP: Objekt nicht nach jeder Schleifeniteration neu erstellen [solved]



  • Ich hab eine Frage zu OpenMP:

    #pragma omp parallel for schedule(dynamic, 1)
    for (size_t i = 0; i < size; i += chunkSize) {
        Aligner aligner(0,0);
        //...
    

    Bei jedem Schleifendurchlauf wir ein neuer Aligner erstellt. Ich würde aber gerne den Aligner wiederverwenden, wenn ein Thread eine neue Schleifeniteration berechnet. Den Aligner außerhalb der Schleife zu platzieren geht nicht, da jeder Thread seinen eigenen Aligner benötigt. Jeder Thread soll also genau einen Aligner besitzen, dieser soll aber nicht nach jeder Iteration zerstört und dann wieder neu erstellt werden, da dies sehr aufwändig ist.

    Wie muss ich den Code dafür anpassen?



  • Wenn die Variable nur gelesen wird kannst du sie einfach vor die Schleife ziehen. Wenn du die Variable/Objekt auch verändern möchtest braucht jeder Thread eine Kopie. Das geht z.B. mit firstprivate (es gibt auch noch private aber da wird der ursprüngliche Wert nicht übernommen, näheres im OpenMP Standard):

    Aligner aligner(0,0);
    #pragma omp parallel for schedule(dynamic, 1) firstprivate(aligner)
    for (size_t i = 0; i < size; i += chunkSize) {
        //...
    


  • danke, das ist genau das, was ich gesucht hab.


Anmelden zum Antworten