AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Tparallel und Bitmap-Bearbeitung

Ein Thema von Harry Stahl · begonnen am 19. Nov 2014 · letzter Beitrag vom 21. Nov 2014
Antwort Antwort
Seite 1 von 3  1 23   
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.207 Beiträge
 
Delphi 10.4 Sydney
 
#1

Tparallel und Bitmap-Bearbeitung

  Alt 19. Nov 2014, 00:17
Ich würde gerne die TParallel-Library einsetzen, um verschiedene Bitmap-Routinen schneller zu machen.

Ich habe hier versucht, das mal für eine 24-Bit-Bitmap zu implementieren (Funktion, welche abhängig von einem Wert eine Bitmap aufhellt bzw. abdunkelt):
Delphi-Quellcode:
procedure Helligkeit(Bitmap: TBitmap; Const Original : TBitmap; Value: integer; IgnoreWhite: Boolean);
var
  x,y : integer;
  Ziel : ^TRGBTriple;
  Quelle : ^TRGBTriple;
  n : byte;
  ar : array[0..255] of byte;
  RGBAQuelle, RGBAZiel: pRGBALine;
  OK: Boolean;
begin
  n := abs(value);

  if value > 0 then
    for x := 0 to 255 do if integer(x + n) > 255 then ar[x] := 255 else ar[x] := x + n
  else
    for x := 0 to 255 do if integer(x - n) < 0 then ar[x] := 0 else ar[x] := x - n;

    for y := 0 to Bitmap.Height-1 do begin
      Ziel := Bitmap.Scanline[y];
      Quelle := Original.Scanline[y];

      TParallel.For(0, Bitmap.Width-1, procedure (L: Integer) // <-- Hier neu eingebaut
      begin
        if IgnoreWhite then begin
          OK := (Quelle^.rgbtBlue <> 255) or (Quelle^.rgbtGreen <> 255) or (Ziel^.rgbtGreen <> 255);
        end else begin
          OK := True;
        end;

        if OK then begin
          Ziel^.rgbtBlue := ar[Quelle^.rgbtBlue];
          Ziel^.rgbtred := ar[Quelle^.rgbtred];
          Ziel^.rgbtGreen := ar[Quelle^.rgbtGreen];
        end;

        inc(Ziel);
        inc(quelle);
      end)
    end;
end;
Leider kriege ich immer Zugriff-Exceptions (Access violations), bzw. Bild ist verzerrt und Programm hängt sich auf.

Jemand eine Idee, wie man das richtig macht? Muss ich den Zugriff auf das Bitmap schützen, wenn ja, wie am besten?

Geändert von Harry Stahl (19. Nov 2014 um 00:23 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Tparallel und Bitmap-Bearbeitung

  Alt 19. Nov 2014, 02:04
Nun überleg doch mal, wofür man das L benutzen könnte, wenn man mal unterstellt, dass Ziel und Quelle ein Array ist (ist es).

Und gleichzeitig frage dich, ob es gut ist, wenn man bei einer parallelen Bearbeitung überall den Bezugspunkt einfach so verschiebt Inc(Ziel); Inc(Quelle); .

Das kann man fast vergleichen mit "Wenn ein Ei 5 Minuten gekocht werden muss, wie lange müssen dann 10 Eier kochen?"
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.731 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Tparallel und Bitmap-Bearbeitung

  Alt 19. Nov 2014, 02:05
Scanline: Ist das auch wirklich ein 32-Bit-Bitmap?

Und man durfte noch nie nicht-threadsichere Befehle in einem Thread ausführen.
  • Inc z.B.

Außerdem sind alle deine lokalen Variablen sowas wie globale Variablen, welche in allen Threads "gleich" sind.
  • B muß lokal in die Thread-Prozedur
  • Quelle/Ziel darf nicht geändert werden, also auch eine lokale Thread-Variable und dann LokalQuelle:=Quelle+L;
  • Pro Thread nur ein einziger Wert macht das nicht schneller, sondern sehr viel langsamer, da viele Threads. -> Anzahl=Breite*Höhe
    Wenn, dann eher pro Line, oder besser für mehrere Lines, ein Thread.


Eier? Oder ...
Wenn ein Kuchen bei 200°C 40 Minuten braucht, wie lange braucht er dann bei 800°C?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (19. Nov 2014 um 02:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Tparallel und Bitmap-Bearbeitung

  Alt 19. Nov 2014, 02:15
@himitsu

Das Argument "viele Threads" stimmt nicht, es sind "viele Aufgaben" die mit einem ThreadPool abgearbeitet werden. Da dürften nach einer gewissen "Warmlaufphase" nur eine Handvoll Threads aktiv sein.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.731 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Tparallel und Bitmap-Bearbeitung

  Alt 19. Nov 2014, 02:17
Ja, aktiv sind gleichzeitig immer nur ein paar, aber insgesammt sind es sehr Viele.
Vermutlich also mehr Verwaltungaufwand, als Zeitersparnis.


Vorher gab es Einen Typen, der holte sich alle Infos und arbeitete das dann nacheinander ab.
Jetzt gibt es vielleicht 8 Leute, die rennen gleichzeitig zu einen Verwalter Hauptthread, holen sich durcheinanderredend irgendeine Arbeitsposition bearbeiten ein Pixel schreiben gleichzeitig in zwei Variablen rein und rennen dann wieder zum Pool-Verwalter, fragen ob noch ein Thread da ist, fragen wieder gleichzeitig den Verwalter Hauptthread und bearbeiten irgendin ein Pixel, bis alle Pixel Threads durch sind.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (19. Nov 2014 um 02:22 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Tparallel und Bitmap-Bearbeitung

  Alt 19. Nov 2014, 02:26
Es sind eben nicht insgesamt viele, es sind und bleiben eine Handvoll Threads, die, wenn einmal erzeugt, bis zum Ende des ThreadPools aktiv/schlafend bleiben. Diese Threads holen sich einfach die nächste Aufgabe, verarbeiten die und es geht wieder von vorne los. Da ist kaum ein Unterschied, ob ich jetzt eine Aufgabe mit 10 Einzelschritten oder 10 Aufgaben mit jeweils 1 Einzelschritt übergebe.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.731 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Tparallel und Bitmap-Bearbeitung

  Alt 19. Nov 2014, 03:24
OK, dann sind es eben massig anonyme Methoden (1), welche in einem Pool warten und von einer Hand voll Threads abgearbeitet werden.

1:
* kurzer Code von nichtmal annähern einer Millisekunde Rechenzeit
* der jeweils nur ein einziges Pixel verarbeitet

Die Verwaltung und Synchronisierung dieses Pools ist garantiert langsamer, als die eingesparte Zeit.
Über die Verarbeitung einer ganzen oder mehrere Zeilen, würde jede Methode länger rechnen und der Tool müsste gleichzeitig weniger verwalten.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#8

AW: Tparallel und Bitmap-Bearbeitung

  Alt 19. Nov 2014, 04:54
Ich würde die Bearbeitung für jede ScanLine in einen separaten Thread verschieben, also vielleicht so:
Delphi-Quellcode:
TParallel.For(0, Bitmap.Height-1, procedure (Y: Integer)
var
  Ziel : ^TRGBTriple;
  Quelle : ^TRGBTriple;
  OK: Boolean;

begin
  Ziel := Bitmap.Scanline[y];
  Quelle := Original.Scanline[y];
,,,
Grund:
1. Größere Abschnitte (vielleicht kann man die noch größer machen, jeder Thread X Scanlines auf einmal)
2. Keiner tritt dem anderen auf die Füße.

Die Vergleiche mit Eiern und Kuchen sind zwar boxkomisch, aber hier ist der Denkfehler ja der, das die Variablen unkontrolliert verwendet werden, und das sehe ich bei dem Eierkochenkuchenbackenvergleich nicht.

Diese TParallel-Library ist kein Hexenwerk und zaubern kann sie auch nicht. Das ist ein ziemlich banaler, aber sehr elegant zu verwendender Threadpool. Alles, was man über Threads weiß, muss man auch hier beherzigen. Wenn man die einzelnen Jobs nicht allzu granular aufteilt (1 Pixel ist SEHR granular) und den Scope/Zugriff der gemeinsam verwendeten Variablen beachtet (Füße, blaue Flecken und so), muss man sich wohl über die Anzahl der CPU-Kerne keine Gedanken mehr machen. Aber über den ganzen Rest schon.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.731 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Tparallel und Bitmap-Bearbeitung

  Alt 19. Nov 2014, 10:14
Ja, Ziel/Quelle in jeden Thread verschieben und zugleich hoffen, daß Scanline threadsafe ist.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#10

AW: Tparallel und Bitmap-Bearbeitung

  Alt 19. Nov 2014, 11:56
Ja, Ziel/Quelle in jeden Thread verschieben und zugleich hoffen, daß Scanline threadsafe ist.
=> Ansonsten vorher in ein Array packen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

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 07:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf