AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Geschwindigkeitsgewinn von Multithreading Berechnungen
Thema durchsuchen
Ansicht
Themen-Optionen

Geschwindigkeitsgewinn von Multithreading Berechnungen

Ein Thema von Neutral General · begonnen am 22. Mai 2010 · letzter Beitrag vom 28. Mai 2010
Antwort Antwort
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Re: Geschwindigkeitsgewinn von Multithreading Berechnungen

  Alt 22. Mai 2010, 13:06
Ok, vom Faktor 2 bin ich weit enffernt. ich poste mal meinen Code:

Der Thread:
Delphi-Quellcode:
type
  TPointF = record
    X,Y: Extended;
  end;

  TComplex = record
    R: Extended;
    I: Extended;
  end;

  TDataArray = Array of Array of Word;

  TWorkDoneEvent = procedure(Sender: TThread; Data: TDataArray) of object;
  
  TMandelbrotThread = class(TThread)
  private
    FSizeX,FSizeY: Integer;
    FData: TDataArray;
    FMatrix: Array of Array of TComplex;
    FIterations: Integer;
    FOnDataAvailable: TWorkDoneEvent;
    procedure DoWorkDone;
  protected
    procedure Execute; override;
  public
    constructor Create(ASizeX, ASizeY: Integer; P1, P2: TPointF); reintroduce;
    destructor Destroy; override;
    procedure Init(P1,P2: TPointF);
    property Iterations: Integer read FIterations write FIterations;
    property OnDataAvailable: TWorkDoneEvent read FOnDataAvailable write FOnDataAvailable;
  end;

implementation

constructor TMandelbrotThread.Create(ASizeX,ASizeY: Integer; P1,P2: TPointF);
var i: Integer;
begin
  inherited Create(true);
  FSizeX := ASizeX;
  FSizeY := ASizeY;

  SetLength(FData,FSizeY);
  SetLength(FMatrix,FSizeY);
  for i := 0 to FSizeY - 1 do
  begin
    SetLength(FData[i],FSizeX);
    FillChar(FData[i][0],FSizeX*SizeOf(Word),0);
    SetLength(FMatrix[i],FSizeX);
  end;

  Init(P1,P2);
end;

procedure TMandelbrotThread.Init(P1,P2: TPointF);
var i,j: Integer;
    stepX,stepY: Extended;
begin
  stepX := abs(P2.X-P1.X)/FSizeX;
  stepY := abs(P2.Y-P1.Y)/FSizeY;
  for i := 0 to FSizeY - 1 do
    for j := 0 to FSizeX - 1 do
    begin
      FMatrix[i,j].R := P1.X+j*stepX;
      FMatrix[i,j].I := P1.Y-i*stepY;
    end;
end;

procedure TMandelbrotThread.Execute;
var i,j,k: Integer;
    tmp, x: TComplex;
begin
  for i := 0 to FSizeY - 1 do
    for j := 0 to FSizeX - 1 do
    begin
      tmp := FMatrix[i,j];
      for k := 1 to FIterations do
      begin
        if CAbs(tmp) > 2 then // CAbs = Betrag der Komplexen Zahl
        begin
          FData[i,j] := k;
          break;
        end;
        x := CSqr(tmp); // CSqr = Komplexe Zahl "tmp" wird quadriert.
        tmp.R := X.R + FMatrix[i,j].R;
        tmp.I := X.I + FMatrix[i,j].I;
      end;
    end;
  Synchronize(DoWorkDone);
end;
MainThread:

Delphi-Quellcode:
procedure TForm2.Button2Click(Sender: TObject);
var tmp: Array[0..1] of TMandelbrotThread;
    i: Integer;
begin
  // Linke hälfte des Bildes
  tmp[0] := TMandelbrotThread.Create(500,1000,PointF(-2,2),PointF(0,-2));
  tmp[0].FreeOnTerminate := true;
  tmp[0].Iterations := 500;
  tmp[0].OnDataAvailable := MandelbrotEvent1;
  // SetThreadAffinityMask(tmp[0].Handle,1 shl 0);

  // Rechte Hälfte
  tmp[1] := TMandelbrotThread.Create(500,1000,PointF(0,2),PointF(2,-2));
  tmp[1].FreeOnTerminate := true;
  tmp[1].Iterations := 500;
  tmp[1].OnDataAvailable := MandelbrotEvent2;
  // SetThreadAffinityMask(tmp[1].Handle,1 shl 1);

  // Start
  tmp[0].Resume;
  tmp[1].Resume;
end;
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Antwort Antwort


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 07:43 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