Parallelisierung mit omp



  • Hallo zusammen,

    ich wollte folgende Methode mittels omp parallelisieren. Leider ist es schon etwas länger her, dass ich das letzte mal mit omp gearbeitet habe und ich habe ein paar Probleme bei der wieder Einarbeitung.

    void calc(int *iterations, int width, int height, int myid, int numprocs,
             double xmin, double xmax, double ymin, double ymax, int maxiter ) {
      double dx,dy,x,y;
      int    ix,iy;
    
      dx = (xmax - xmin) / width;
      dy = (ymax - ymin) / height;
    
      y = ymin;
    
      #pragma omp for private(iy,ix) //reduction(+:iterations) 
      for (iy=0; iy<height; ++iy) {
        x = xmin;
        for (ix=0; ix<width; ix++) {
          double zx=0.0,zy=0.0,zxnew;
          int count = 0;
          while ( zx*zx+zy*zy < 16*16 && count < maxiter ) {
            /* z = z*z + (x + i y) */
            zxnew = zx*zx-zy*zy + x;
            zy    = 2*zx*zy     + y;
            zx    = zxnew;
            ++count;
          }
          iterations[iy*width+ix] = count;
          x += dx;
        }
        y += dy;
      }
    }
    

    Ich habe mir gedacht, dass ich ein omp for verwende, da es sich ja auch um eine for Schleife handelt. Das mit dem reduction(+: ) habe ich erst mal auskommentiert, weil es mit einem int* nicht funktioniert.
    Ich brauche einen Denkanstoss wie man es besser lösen kann. Eigentlich ist omp ja nicht so schwer, aber stehe gerade auf dem Schlauch.

    Danke und viele Grüße


  • Mod

    Könntest du genauer erklären, was du überhaupt wissen möchtest?



  • Ja... Sorry das es etwas unverständlich ist 😉
    Ich möchte wissen, wie ich die Methode mit omp parallelisieren kann.



  • #pragma omp parallel for private(x) reduction(+:y)
    

    denke ich. Hab das jetzt nicht getestet, weil kein kompletter Testcase vorliegt.



  • seldon schrieb:

    #pragma omp parallel for private(x) reduction(+:y)
    

    denke ich. Hab das jetzt nicht getestet, weil kein kompletter Testcase vorliegt.

    Ne, ist es leider nicht. So wird es zwar Compiliert und kann ausgeführt werden, aber die Ergebnisse sind falsch.
    Verzweifel gerade an dem Programm 😞



  • Mal von dem omp abgesehen, was genau soll parallelisiert werden? Könntest du das mal genauer beschreiben?

    mfg



  • Nochmal genauer hingekuckt. Versuch mal

    #pragma omp parallel for private(x,ix) reduction(+:y)
    

    ...oder deklarier die Variablen x und ix innerhalb der Schleife anstatt im Funktionskopf, das wär wahrscheinlich die sinnvollste Variante.


Log in to reply