Delphi-PRAXiS
Seite 1 von 3  1 23   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   THreads in ein Array schreiben (https://www.delphipraxis.net/167303-threads-ein-array-schreiben.html)

bernhard_LA 22. Mär 2012 22:36

THreads in ein Array schreiben
 
ich benötige für meine Anwendung ein Array of integer of integer . Dieses Array möchte ich gleichzeitig durch mehrere Threads beschreiben, ich bin auf der Suche nach DEMO Code zu diesem Problem.
Kann jemand weitzerhelfen ?

Bummi 22. Mär 2012 22:55

AW: THreads in ein Array schreiben
 
Wenn das Array sich in den Dimensionen nicht ändert und die Threads beim schreiben nicht kollidieren können (z.B.)jeder Thread eine andere Zeile bearbeitet muss man gar nichts beachten.
Ansonsten würde ich über die Werte über eine Prozedur setzen bzw. Funktion lesen lassen die mit CriticalSections verriegelt ist ala
http://www.delphipraxis.net/167197-a...onisieren.html
http://www.delphipraxis.net/128266-t...erstellen.html

Furtbichler 23. Mär 2012 06:07

AW: THreads in ein Array schreiben
 
Wobei das Problem an sich ziemlich interessant ist, denn auch wenn eine Critical Section wenig Overhead erzeugt, kann man da vielleicht noch etwas drehen, aber eine Demo kann man nur erstellen, wenn man weiß, wie die Matrix genau beschrieben wird.

Kann man die Operation vielleicht so aufteilen, das keine CS benötigt wird? Mehr Threads als CPUs bringen bezüglich Performancegewinn nichts, also könnte man die Matrix in N (N=Anzahl Core) Abschnitte aufteilen, die gleichzeitig befüllt werden.

Sind die Berechnungen einer Zelle X,Y von dem Ergebnis anderer Zelle abhängig? Dann müsste zusätzlich ein Synchronisationsmechanismus her.

himitsu 23. Mär 2012 08:38

AW: THreads in ein Array schreiben
 
Man könnte auch mehrere CriticalSections verwenden, z.B. je Eine für die erste Array-Ebene,
falls die Threads nicht nur je auf ein Unterarray zugreifen.

SirThornberry 23. Mär 2012 16:34

AW: THreads in ein Array schreiben
 
Zitat:

Zitat von Bummi (Beitrag 1158057)
Wenn das Array sich in den Dimensionen nicht ändert und die Threads beim schreiben nicht kollidieren können (z.B.)jeder Thread eine andere Zeile bearbeitet muss man gar nichts beachten.

Doch, zumindest war das früher so. Wenn man ein Integer schreibt, dieser aber nicht genau am Speicher ausgerichtet ist wird der Speicher davor und/oder dahinter auch gelesen und geschrieben. Und wenn ein anderer Thread gerade im selben Bereich unterwegs ist kann das schon kollidieren

bernhard_LA 26. Mär 2012 17:21

AW: THreads in ein Array schreiben
 
im Ereignis Thread.Create(....) übergebe ich ein Array ancc vom Typ array or array of Real
Bei dem Aufruf von Thread.Execute; schreibt die letzte Anweisung in ein bestimmtetes Segment von ancc. Jeder Thread soll in ein bestimmtest Segment schreiben, die Segmente haben keine Überlappung.

Leider schreibt nur der erste THread seine Daten richtig in mein Array ancc , die anderen Threads scheinen überhaupt nichts am Feld zu verändern



Delphi-Quellcode:

  TFASTNCCThread = class(TThread)
  private
  FSearchArea : TRect;
  Ftemplatefct : T2Dfct;
  Ffeaturefct : T2Dfct;
  FnccGlobal : T2Dfct;
  FNCCLocal : T2Dfct;
  protected
  procedure Execute; override;
  public
  constructor create(atemplatefct, afeaturefct : T2Dfct; var ancc : T2Dfct ; aSearchArea: TRect );
  end;


constructor TFASTNCCThread.create( atemplatefct, afeaturefct : T2Dfct; var ancc : T2Dfct ; aSearchArea: TRect );
begin
     inherited Create(True);

     FSearchArea := aSearchArea;

     ftemplatefct := atemplatefct;

     ffeaturefct := afeaturefct;

     FnccGlobal:= ancc;

end;

procedure TFASTNCCThread.Execute;
begin
    NameThreadForDebugging('FASTNCCThread');
  { Thread-Code hier einfügen }
  try
       fastcrosscorrelation( ...... );
  except
   // on e : exception do
   //  begin
   //   do something in case of an error
   //  end;
   end;

   NCCCopyLocalArraytoGlobalArray(FnccLocal, FnccGlobal, fsearchArea ); //  write back results to ancc array

end;

Bummi 26. Mär 2012 17:32

AW: THreads in ein Array schreiben
 
was da : write back results to ancc array
passiert dürfte der interessante Teil sein ....
wenn Du direkt auf dem per var übergebenen Array arbeitest und die Offsetparameter passen sollte es laufen ...

bernhard_LA 27. Mär 2012 08:13

AW: THreads in ein Array schreiben
 
Stimmt, das schreiben in das Array ist nicht das Problem, allerdings die Rechenzeit, welche unverändert bleibt :(

Delphi-Quellcode:

     for i:= 0 to MaxThreads-1 do
       begin

       aFASTNCCThread:= TFASTNCCThread.Create ( ..... );

       aFastNCCThread.Execute;

       end;
egal wieviele Threads ich starte die Rechenzeit bleibt immer konstant

Bummi 27. Mär 2012 08:28

AW: THreads in ein Array schreiben
 
wieso rufst Du Execute auf? Start wäre im Threadkontext, oder create ohne suspended

bernhard_LA 27. Mär 2012 08:54

AW: THreads in ein Array schreiben
 
ich habe die Berechnung der jeweiligen Teilmatrix in die Routine Thread.execute gepackt.

Vom Verständnis müsste er doch Thread.Execute starten, aber nicht auf die Beendigung dieser Anweisung warten sondern
gleich den nächsten THREAD erzeugen und starten.... sehe ich etwa falsch ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:31 Uhr.
Seite 1 von 3  1 23   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz