AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

TParallels For-Schleife abbrechen

Ein Thema von günni0 · begonnen am 21. Apr 2018 · letzter Beitrag vom 23. Apr 2018
Antwort Antwort
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.785 Beiträge
 
Delphi 12 Athens
 
#1

AW: TParallels For-Schleife abbrechen

  Alt 21. Apr 2018, 11:15
Ich belasse es bei beim Standard. Das sind je nachdem 5 bis 15 die da erzeugt werden.
Sollte aber durch mein Exit der Code nach meiner Bedingung gar nicht erst ausgeführt werden wenn meine Bedingung zutrifft?
TParallel.For teilt den von-bis Bereich in mehrere Happen auf und startet dann separate Tasks für jeden. In der Standardeinstellung sind das zweimal die Anzahl verfügbarer CPU-Kerne. Die Tasks starten dann mehr oder weniger gleichzeitig und es ist durchaus möglich, daß schon eine entsprechende Anzahl die Abfrage bereits negativ durchlaufen hat. Diese werden dann natürlich noch bis zum Ende ausgeführt. Im Worst Case wird die Abbruchbedingung erst dann gesetzt, wenn schon alle Iterationen darüber hinweg sind, und dann bringt das gar nichts.

Du kannst ja mal ausprobieren, die Bedingung schon vor dem Aufruf der For-Schleife zu setzen. Braucht es dann auch noch genauso lang? In dem Fall ist der Overhead für die Parallelisierung vermutlich höher als der Aufwand für die eigentliche Aufgabe. Dann wäre eine normale For-Schleife vielleicht die bessere Wahl.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
günni0
(Gast)

n/a Beiträge
 
#2

AW: TParallels For-Schleife abbrechen

  Alt 21. Apr 2018, 11:28
Ohne diese parallele For-Schleife wird quasi sofort abgebrochen.
Das werden wohl einfach zu viele parallele For-Schleifen sein die da erstellt werden.

Setze ich eine eigene boolsche Variable noch vor die For-Schleife, setze diese im Block der Abbruchbedingung auf True und frage die danach ab nach dem Motto...
Delphi-Quellcode:
weiter := true
schleife von a bis 2

 wenn abbrechen dann
  begin
   weiter := false
   parallel.stop
   exit
  end

 if weiter dann
  ....
Klappt es auch relativ gut mit dem Abbrechen.
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#3

AW: TParallels For-Schleife abbrechen

  Alt 21. Apr 2018, 12:33
Lass mal diesen Code laufen:
Delphi-Quellcode:
program ParallelForBreak;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.Diagnostics,
  System.SysUtils,
  System.SyncObjs,
  System.Threading;

var
  s: string;
  sw: TStopwatch;
  ccount, wcount: Integer;
  r: TParallel.TLoopResult;

begin
  try
    ccount := 0;
    wcount := 0;

    sw := TStopwatch.StartNew( );

    r := TParallel.for( 1, 5000,
      procedure( idx: Integer; loopstate: TParallel.TLoopState )
      begin
        TInterlocked.Increment( ccount );

        if loopstate.ShouldExit then
          Exit;

        // Workload
        TInterlocked.Increment( wcount );
        Sleep( 1 );

        // Abbruchbedingung
        if idx = 3800 then
        begin
          loopstate.Break;
        end;
      end );

    sw.Stop( );

    WriteLn( 'LoopResult:' );
    WriteLn( ' Completed: ', r.Completed );
    Writeln( ' LowestBreakIteration: ', r.LowestBreakIteration );

    WriteLn( 'Statistics:' );
    WriteLn( ' IteratorEvent called: ', ccount );
    WriteLn( ' IteratorEvent processed: ', wcount );
    WriteLn( ' Execution time: : ', sw.ElapsedMilliseconds, ' ms' );

    ReadLn( s );
  except
    on E: Exception do
      Writeln( E.ClassName, ': ', E.Message );
  end;
end.
Das Ergebnis hier:
Code:
LoopResult:
  Completed: FALSE
  LowestBreakIteration: 3800
Statistics:
  IteratorEvent called: 3984
  IteratorEvent processed: 3820
  Execution time: : 12799 ms
Soll bedeuten:
- Der IteratorEvent wurde 3984 mal aufgerufen
- Im IteratorEvent wurden 3820 Berechnungen ausgeführt
- Im IteratorEvent wurden somit 164 Berechnungen nicht ausgeführt (vorzeitig abgebrochen)
  Mit Zitat antworten Zitat
günni0
(Gast)

n/a Beiträge
 
#4

AW: TParallels For-Schleife abbrechen

  Alt 21. Apr 2018, 12:36
Abbruchbedingung ist 3800. Es wurde aber 3820 berechnet. Heißt das, dass es nicht wirklich zuverlässig ist eine TParallel zu verwenden?

Ich denke jedoch LoopState.ShouldExit hat mir geholfen.

Geändert von günni0 (21. Apr 2018 um 12:45 Uhr)
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#5

AW: TParallels For-Schleife abbrechen

  Alt 21. Apr 2018, 12:48
Was ist daran nicht zuverlässig?

Willst du zuverlässig nur 3800 Aufrufe? Dann rufe es nur 3800 mal auf.

Oder sollen die Aufrufe solange erfolgen, bis man das passende Ergebnis gefunden hat? Dann ist es wurscht, ob es 3800 oder 3820 Aufrufe sind.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: TParallels For-Schleife abbrechen

  Alt 21. Apr 2018, 20:21
Ich vermute es sind mehr als in Bedingung steht weil da der von Uwe genannte "Kernel werden erstmal ausgenutzt" effekt aktiv ist, könnte das sein?
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.826 Beiträge
 
Delphi 12 Athens
 
#7

AW: TParallels For-Schleife abbrechen

  Alt 23. Apr 2018, 07:57
Ist es nicht ein grundsätzliches Problem? Eine For-Schleife benutzt man, wenn man genau weiß, wie oft eine Schleife ausgeführt werden soll, für alles andere nimmt man repeat oder while. Ein Abbrechen von For-Schleifen ist zwar möglich, aber IMHO schlechter Stil, und scheint sich im TParallel-Fall zu rächen.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.785 Beiträge
 
Delphi 12 Athens
 
#8

AW: TParallels For-Schleife abbrechen

  Alt 23. Apr 2018, 08:28
Ist es nicht ein grundsätzliches Problem? Eine For-Schleife benutzt man, wenn man genau weiß, wie oft eine Schleife ausgeführt werden soll, für alles andere nimmt man repeat oder while. Ein Abbrechen von For-Schleifen ist zwar möglich, aber IMHO schlechter Stil, und scheint sich im TParallel-Fall zu rächen.
So krass würde ich das nicht formulieren. Ich finde es z.B. kein schlechtes Design, wenn beim Durchsuchen eines Arrays eine For-Schleife verwendet wird und bei dem gesuchten Element ein Break stattfindet. Die Elemente werden über einen Index angesprochen und die Bereichsgrenzen sind im Voraus bekannt. Die Abbruchbedingung beschränkt sich auf das eigentliche Suchkriterium und muss sich nicht noch um die Bereichsgrenzen kümmern. Das reduziert den Code, ist klar strukturiert und jeder sieht sofort, was mit dieser Schleife bezweckt wird. Bei while- und repeat-Schleifen sehe ich auch oft eine Duplizierung der Abbruchbedingung (manchmal gecached in einer lokalen Variable), weil beim Abbruch bestimmte Code-Teile innerhalb der Schleife nicht mehr durchlaufen werden müssen. In solchen Fällen ziehe ich ein Break (selbiges gilt auch für Continue) vor - auch innerhalb while- und repeat-Schleifen.

Allerdings eignet sich so eine Schleife dann halt nicht für die Parallelisierung (aber auch keine mit while oder repeat).

Bei einem Parallel-For geht man eigentlich davon aus, daß alle Elemente vollkommen autark bearbeitet werden und keine gegenseitigen Wechselwirkungen haben. Ich weiß allerdings nichts über den angesprochenen Fall.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz