Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. German
  4. Parallele Abarbeitung einer for schleife
QtWS25 Last Chance

Parallele Abarbeitung einer for schleife

Scheduled Pinned Locked Moved Unsolved German
10 Posts 4 Posters 790 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • F Offline
    F Offline
    Freakonaleash
    wrote on last edited by
    #1

    Hallo zusammen,

    Ich arbeite an einer Anwendung in der ich ein dreidimensionales array 7x7x7 an Objekten aus einer selbst gebauten Klasse habe. In der Klasse habe ich eine clear() - Funktion eingebaut, mit der ich sämtliche Werte eines Objekts dieser Klasse zurücksetzen kann (alle strings="", int=0 usw).
    Weiterhin habe ich eine Funktion gebaut, in der ich alle im array befindlichen Objekte zurücksetzen kann. Diese Funktion besteht im wesentlichen aus 3 for-schleifen:

    clearall(){
    
    for(int i=0; i<7; i++){
    for(int j=0; j<7; j++){
    for(int k=0; k<7; k++){
        Arrayname[i][j][k].clear();
    }}}
    
    }
    

    Das Problem ist, dass der gesamte Durchlauf relative lange ist. Ich habe mich gefragt, ob es irgendwie möglich ist, die einzelnen Objekte des Arrays parallel abzuarbeiten. Da sie unabhängig voneinander sind, sollte das gehen. Nach der for-verschachtelung soll es natürlich erst weitergehen, wenn alle "clear()" durchgeführt wurden.
    Ich bin nach längerer Recherche auf die Klassen QThread und QtConcurrent gestoßen. Leider bin ich mit dieser Doku etwas überfordert und einfache Beispiele, die ich auf meinen Fall übertragen kann, finde ich nicht. Ich schätze, QtConcurrrent ist das richtige für mich, allerdings gibt es dort auch gefühlt 1000 verschiedene Funktionen. Kann mir jemand sagen, was das Richtige für mein Problem ist und wie es ie Funktion anwenden kann?

    Vielen Dank!

    1 Reply Last reply
    0
    • JoeCFDJ Online
      JoeCFDJ Online
      JoeCFD
      wrote on last edited by JoeCFD
      #2

      Es is einfacher, OpenMP to benutzen.
      777 Array ist nicht arg viel. I glaube nicht, es lohnt sich, so was an einer GUI Anwendung zu beschleunigen.

      1 Reply Last reply
      1
      • F Offline
        F Offline
        Freakonaleash
        wrote on last edited by
        #3

        Danke, habe mich gerade bzgl. OpenMP informiert. Scheint das zu sein, was ich brauchen könnte.
        Funktioniert das mit jedem Compiler? Auch mit dem mingw? Dazu konnte ich noch nichts finden.

        JoeCFDJ 1 Reply Last reply
        0
        • mrjjM Offline
          mrjjM Offline
          mrjj
          Lifetime Qt Champion
          wrote on last edited by mrjj
          #4

          Hi
          ist Arrayname ein normales c-Array, so dass Sie wie folgt vorgehen könnten

           ArrayDef Arrayname[7][7][7];
           ArrayDef *ptr =  &Arrayname[0][0][0];
          
             for (int cc=0; cc < 7*7*7 ; cc++ ) {
              ptr->clear();
              ptr++;
             }
          
          

          Aber für eine 7x7x7 Schleife scheint es nicht nötig zu sein, da sie sehr schnell sein sollte?

          1 Reply Last reply
          1
          • F Freakonaleash

            Danke, habe mich gerade bzgl. OpenMP informiert. Scheint das zu sein, was ich brauchen könnte.
            Funktioniert das mit jedem Compiler? Auch mit dem mingw? Dazu konnte ich noch nichts finden.

            JoeCFDJ Online
            JoeCFDJ Online
            JoeCFD
            wrote on last edited by JoeCFD
            #5

            @Freakonaleash OpenMP ist verfuegbar and gratis auf WIndows und Linux
            https://www.dartmouth.edu/~rc/classes/intro_openmp/compile_run.html

            F 1 Reply Last reply
            1
            • JoeCFDJ JoeCFD

              @Freakonaleash OpenMP ist verfuegbar and gratis auf WIndows und Linux
              https://www.dartmouth.edu/~rc/classes/intro_openmp/compile_run.html

              F Offline
              F Offline
              Freakonaleash
              wrote on last edited by
              #6

              @JoeCFD danke! Werde ich mal testen.

              @mrjj : interessanter Ansatz. Hätte nicht gedacht, dass es dadurch schneller wird. Bzgl "7x7x7 ist nicht so viel": die clear() - Funktion habe ich selbst implementiert. Dort werden viele strings auf "" gesetzt und sogar nochmal schleifen durchlaufen. Ich denke, es "summiert" sich dadurch....

              mrjjM jsulmJ 2 Replies Last reply
              0
              • F Freakonaleash

                @JoeCFD danke! Werde ich mal testen.

                @mrjj : interessanter Ansatz. Hätte nicht gedacht, dass es dadurch schneller wird. Bzgl "7x7x7 ist nicht so viel": die clear() - Funktion habe ich selbst implementiert. Dort werden viele strings auf "" gesetzt und sogar nochmal schleifen durchlaufen. Ich denke, es "summiert" sich dadurch....

                mrjjM Offline
                mrjjM Offline
                mrjj
                Lifetime Qt Champion
                wrote on last edited by
                #7

                @Freakonaleash
                Hi
                Normalerweise kann das Abrollen von Schleifen die Geschwindigkeit erhöhen, aber
                ich bin mir in diesem Fall nicht sicher.
                Es könnte sein, dass das eigentliche reset() der zeitaufwändigste Teil ist, wie Sie sagen.

                1 Reply Last reply
                0
                • F Freakonaleash

                  @JoeCFD danke! Werde ich mal testen.

                  @mrjj : interessanter Ansatz. Hätte nicht gedacht, dass es dadurch schneller wird. Bzgl "7x7x7 ist nicht so viel": die clear() - Funktion habe ich selbst implementiert. Dort werden viele strings auf "" gesetzt und sogar nochmal schleifen durchlaufen. Ich denke, es "summiert" sich dadurch....

                  jsulmJ Offline
                  jsulmJ Offline
                  jsulm
                  Lifetime Qt Champion
                  wrote on last edited by
                  #8

                  @Freakonaleash said in Parallele Abarbeitung einer for schleife:

                  Dort werden viele strings auf "" gesetzt und sogar nochmal schleifen durchlaufen.

                  Dann bringt es wenig diese 3 Schleifen zu optimieren, da die Anzahl der clear() Aufrufe gleich bleibt und dort die meiste Arbeit stattfindet. Bei sehr großen Arrays könnte man mit dem Ansatz von @mrjj die Arbeit auf mehrere Threads verteilen solange kein UI betroffen ist.

                  https://forum.qt.io/topic/113070/qt-code-of-conduct

                  JoeCFDJ 1 Reply Last reply
                  1
                  • jsulmJ jsulm

                    @Freakonaleash said in Parallele Abarbeitung einer for schleife:

                    Dort werden viele strings auf "" gesetzt und sogar nochmal schleifen durchlaufen.

                    Dann bringt es wenig diese 3 Schleifen zu optimieren, da die Anzahl der clear() Aufrufe gleich bleibt und dort die meiste Arbeit stattfindet. Bei sehr großen Arrays könnte man mit dem Ansatz von @mrjj die Arbeit auf mehrere Threads verteilen solange kein UI betroffen ist.

                    JoeCFDJ Online
                    JoeCFDJ Online
                    JoeCFD
                    wrote on last edited by JoeCFD
                    #9

                    @jsulm Bei sehr großen Arrays könnte man mit dem Ansatz von @mrjj die Arbeit auf mehrere Threads verteilen solange kein UI betroffen ist.
                    nicht moeglich wegen ptr++;

                    jsulmJ 1 Reply Last reply
                    0
                    • JoeCFDJ JoeCFD

                      @jsulm Bei sehr großen Arrays könnte man mit dem Ansatz von @mrjj die Arbeit auf mehrere Threads verteilen solange kein UI betroffen ist.
                      nicht moeglich wegen ptr++;

                      jsulmJ Offline
                      jsulmJ Offline
                      jsulm
                      Lifetime Qt Champion
                      wrote on last edited by
                      #10

                      @JoeCFD Sicher ist es möglich. Warum sollte das nicht möglich sein? Pointer können auch wie Arrays benutzt werden: ptr[index]. Einfach für jeden thread einen bereich des Array definieren: begin/end und dann in diesem Bereich iterieren:

                      void doWork(int begin, int end, ArrayDef *ptr)
                      {
                          for (int cc=begin; cc < end ; cc++ ) {
                              ptr[cc].clear();
                             }
                      }
                      

                      https://forum.qt.io/topic/113070/qt-code-of-conduct

                      1 Reply Last reply
                      3

                      • Login

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • Users
                      • Groups
                      • Search
                      • Get Qt Extensions
                      • Unsolved