Wie funktioniert die Parallel.For-Schleife intern?

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Haudruferzappeltnoch.

    Wie funktioniert die Parallel.For-Schleife intern?

    Mit Parallel.For kann man Rechenaufgaben beschleunigen. Aber wie läuft das intern ab?

    Beispiel:

    VB.NET-Quellcode

    1. For i=1 to 1000
    2. TuWas()
    3. Next


    Nehmen wir an die CPU hat vier Kerne. Rechnet dann Kern 1 von 1-25, der zweite von 26-50, der dritte von 51-75 und der vierte von 76-100?

    Oder bekommt Kern 1 i=1, Kern 2 i=2 usw.?
    Aktuelles Projekt: Z80 Disassembler für Schneider/Amstrad CPC :love:
    Der Thread, der zuerst fertig ist, nimmt die nächste "Aufgabe" und arbeitet die ab.

    Beispiel:
    Thread 1: "i=1"
    Thread 3: "i=2"
    Thread 2: "i=3"
    Thread 4: "i=4"
    Thread 3: "i=5"
    Thread 1: "i=6"
    Thread 4: "i=7"
    ...

    PS:
    Du darfst dich aber nicht darauf verlassen, das wenn du zb. Console.WriteLine(i) benutzt, die Ausgabe 1 2 3 4 ... ist.
    Bilder
    • snip_2024-08-20_16-22-46.png

      65,34 kB, 267×227, 9 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „slice“ ()

    Mach Dir eine Schleife und übergib eine Laufvariable und gib diese in der Prozedur mit Debug.WriteLine(i) aus.
    Das resultat steht im Studio im Ausgabe-Fenster unter dem Code-Fenster.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo oobdoo

    Das arbeiten mit Parallel-Programmierung wie auch mit der Multi-Core-Option bedarf meiner Meinung nach eine gute Analyse, was den nun genau gemacht werden soll, und wie die Ziele genau definiert sind. Schliesslich soll die Nutzung der Systemressourcen effizient und gleichzeitig skalierbar sein.

    In beiden Fällen kann falsches Vorgehen zu enormen Performance-Einbussen wie auch Ressourcen-Kosten entstehen. Es ist daher wichtig, das man genau weiss, was den nun parallelisiert werden will, und warum das der Wunsch besteht die auf z.B. 2 Kerne zu verteilen. Gründe könnten sein, dass die Berechnung sehr lange geht, und daher die anderen Kerne für andere Hintergrunddienste zur Verfügung stehen sollen.

    Visual Studio wie auch .Net Managen die entsprechenden Kernelauslastungen sogar teils selber. Ich finde da darf man auch ein bisschen Vertrauen haben, und der TPL-Bibliothek ihre Arbeit machen lassen.

    Hier noch wie man die kernelanzahl definiert.

    C#-Quellcode

    1. ​var options = new ParallelOptions();
    2. options.MaxDegreeOfParallelism = 2;
    3. Parallel.For(0, 100, options, (idx) =>
    4. {
    5. //Stuff
    6. });


    Etwas älterer Threads, aber immer noch ganz interessant
    codeproject.com/Articles/36299…ing-Task-Parallel-Library
    learn.microsoft.com/de-de/dotn…ard/parallel-programming/
    learn.microsoft.com/de-de/dotn…task-parallel-library-tpl

    Freundliche Grüsse

    exc-jdbi
    Beim parallelen Rechnen o.ä. kommts drauf an, ob jede "Aufgabe" ihr eigenes Ergebnis produziert oder ob mehrere Aufgaben ein gemeinsames Ergebnis produzieren.
    Im letzteren Fall sollte man genau aufpassen, was passiert.
    Hier ist ein Nebeneffekt zu sehen, und anschließend auch wie er verhindert werden kann.