| 
| Autor | Beitrag |  
| Mathematiker 
          Beiträge: 2622
 Erhaltene Danke: 1448
 
 Win 7, 8.1, 10
 Delphi 5, 7, 10.1
 
 | 
Verfasst: Sa 22.06.13 16:12 
 
Hallo,
 da ich nun einen neuen und ziemlich schnellen Computer habe    , teste ich alte Programme und fast alle laufen viel schöner und schneller. Leider gilt das für mein Mandelbrotmengen-Programm nur bedingt. Der Geschwindigkeitsgewinn ist unbedeutend.
 Woran kann das liegen?
 Der Assembler-Teil der Routine, bei dem ich vermute, dass er "bremst", ist nicht von mir. Diesen habe ich vor vielen Jahren einmal "raub"kopiert, woher weiß ich leider nicht mehr.    Deshalb fehlen auch Kommentare.
 Ich hoffe, dass es keine Zumutung ist, sich da durch zu kämpfen.
 												| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
 18:
 19:
 20:
 21:
 22:
 23:
 24:
 25:
 26:
 27:
 28:
 29:
 30:
 31:
 32:
 33:
 34:
 35:
 
 |        ASMFLD     radius
 FLD     xf
 FLD     yf
 FLD     st
 FMUL    st,st
 FLD     st(2)
 FMUL    st,st
 FLD     st(2)
 FLD     st(4)
 XOR     cx,cx
 @itloop: INC     cx
 CMP     cx,it
 JE      @noloop
 FMUL
 FADD    st,st
 FADD    st,st(3)
 FLD     st(1)
 FSUB    st,st(3)
 FADD    st,st(5)
 FST     st(3)
 FMUL    st,st
 FSTP    st(2)
 FLD     st
 FMUL    st,st
 FADD    st,st(2)
 FCOM    st(6)
 FSTSW   ax
 FSUB    st,st(2)
 FXCH    st(3)
 AND     ah,1
 JNZ     @itloop
 @noloop: MOV     i, cx
 FINIT
 END;
 |  Da dieser Ausschnitt wenig sagt, hänge ich ein Testprogramm an.
 Das Aufrufen von application.processmesages kann ich leider nicht weglassen, da ich auch stark vergrößerte Ausschnitte mit einer hohen Iterationszahl berechnen möchte.
 Danke für Eure Hilfe.
 Beste Grüße
 Mathematiker
 Rev 1: Mit Zeitmessung und 6 verschiedenen Ausschnitten.
 Rev 2: Mit Abbruchmöglichkeit.
Einloggen, um Attachments anzusehen!
 
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
 
 Zuletzt bearbeitet von Mathematiker am So 23.06.13 14:51, insgesamt 2-mal bearbeitet
 |  |  |  
| Horst_H 
          Beiträge: 1654
 Erhaltene Danke: 244
 
 WIN10,PuppyLinux
 FreePascal,Lazarus
 
 | 
Verfasst: So 23.06.13 10:15 
 
Hallo,
 Zumindest sollte die Geschwindigkeit des Assemblerabschnittes linear mit der Prozessorfrequenz zugelegt haben.
 Ich brauche bei 3,2 Ghz AMD 0,387 Sekunden für ein Bild erhöht auf 768x768 = 589824 Bildpunkte
 Das sind 46.161.048 Berechnungen = 78,26 Ber/Bildpunkt , 26,8 CPU-Takte/Ber oder 106 Mio Iter/s  unter Win7-32.
 Soooo lahm ist das ja nicht für  19 innere Asm Befehle und die schleifen drumherum die aber eben um den Faktor 78 reduziert in  der Wirkung sind.
 Ich habe aber auch eine pf32Bit Bitmat genutzt.Damit gint das setzten der Pixel zeitmäßig völlig unter.
 												| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
 18:
 19:
 20:
 21:
 22:
 23:
 24:
 25:
 26:
 27:
 28:
 29:
 30:
 31:
 32:
 33:
 34:
 35:
 36:
 37:
 38:
 39:
 40:
 41:
 42:
 43:
 44:
 45:
 46:
 47:
 48:
 49:
 50:
 51:
 52:
 53:
 54:
 55:
 56:
 57:
 58:
 59:
 60:
 61:
 62:
 63:
 64:
 65:
 66:
 67:
 68:
 69:
 70:
 71:
 72:
 73:
 74:
 75:
 76:
 77:
 78:
 79:
 80:
 81:
 82:
 83:
 84:
 85:
 86:
 87:
 88:
 89:
 90:
 91:
 92:
 93:
 94:
 95:
 96:
 97:
 98:
 99:
 100:
 101:
 102:
 103:
 104:
 105:
 106:
 107:
 108:
 109:
 110:
 111:
 112:
 113:
 114:
 115:
 116:
 117:
 118:
 119:
 120:
 121:
 122:
 123:
 124:
 125:
 126:
 127:
 128:
 129:
 130:
 131:
 132:
 133:
 134:
 135:
 136:
 137:
 138:
 139:
 140:
 141:
 142:
 143:
 144:
 
 | unit umandel;
 interface
 
 uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls, ExtCtrls;
 
 type
 _farbe = record a,b,g,r:byte; end;
 
 TForm1 = class(TForm)
 Panel1: TPanel;
 PaintBox1: TPaintBox;
 Button1: TButton;
 procedure Button1Click(Sender: TObject);
 procedure FormActivate(Sender: TObject);
 private
 pal:array[0..255] of _farbe;
 sum : int64;
 T1,T0: TDatetime;
 
 public
 
 end;
 
 var
 Form1: TForm1;
 
 implementation
 
 {$R *.DFM}
 
 procedure TForm1.Button1Click(Sender: TObject);
 
 VAR radius,a,b,da,db,xf,yf,
 _x1,_y1,_x2,_y2 : double;
 i,it,xs,ys : word;
 rowrgb : pIntegerarray;
 tempbitmap : tbitmap;
 breite, hoehe:integer;
 
 BEGIN
 breite:=paintbox1.width;
 hoehe:=paintbox1.height;
 
 tempbitmap:=tbitmap.create;
 tempbitmap.pixelformat:=pf32bit;
 tempbitmap.width:=breite;
 tempbitmap.height:=hoehe;
 
 it :=500;     _x1:=-2.2;
 _x2:=1.2;
 _y1:=-1.5;
 _y2:=1.5;
 
 da := (_x2-_x1) / breite;
 db := (_y2-_y1) / hoehe;
 radius := 9;
 
 b := _y2;
 sum := 0;
 T0 := time;
 FOR ys:=0 TO hoehe-1 DO
 BEGIN
 rowrgb:=tempbitmap.scanline[ys];
 b := b - db;
 a := _x1;
 FOR xs:=0 TO breite-1 DO
 BEGIN
 a := a + da;
 xf:=a;
 yf:=b;
 ASM
 FLD     radius
 FLD     xf
 FLD     yf
 FLD     st
 FMUL    st,st
 FLD     st(2)
 FMUL    st,st
 FLD     st(2)
 FLD     st(4)
 XOR     cx,cx
 @itloop: INC     cx
 CMP     cx,it
 JE      @noloop
 FMUL
 FADD    st,st
 FADD    st,st(3)
 FLD     st(1)
 FSUB    st,st(3)
 FADD    st,st(5)
 FST     st(3)
 FMUL    st,st
 FSTP    st(2)
 FLD     st
 FMUL    st,st
 FADD    st,st(2)
 FCOM    st(6)
 FSTSW   ax
 AND     ah,1
 FSUB    st,st(2)
 FXCH    st(3)
 JNZ     @itloop
 @noloop: MOV     i, cx
 FINIT
 END;
 inc(sum,i);
 if i>=it then
 i:=0
 else
 i:=i and  255;
 
 rowrgb[xs]:=integer(pal[i]);
 END;
 END;
 T1 := time;
 tempbitmap.Canvas.TextOut(10,10,FormatDateTime('HH:NN:SS.ZZZ',T1-T0));
 tempbitmap.Canvas.TextOut(10,30,IntToStr(Sum));
 Paintbox1.canvas.draw(0,0,tempbitmap);
 tempbitmap.free;
 END;
 
 procedure TForm1.FormActivate(Sender: TObject);
 var i:integer;
 begin
 pal[0].r:=0;
 pal[0].g:=0;
 pal[0].b:=0;
 pal[0].a:=0;
 for i:=1 to 255 do
 with pal[i] do
 begin
 a:=0;
 b:=(64+2*i) AND 255;
 g:=(32+4*i) AND 255;
 r:=i;
 end;
 end;
 
 end.
 |  Wenn die Farben nicht stimmen muß rgb anders angeordnet werden.
 Es gibt im Netz aber auch zahlreiche Verbesserungen.:
 Zum Beispiel SSE2
www.codeproject.com/...actals-with-SSE-SSE2 oder FPU bis SSE4.1 in Assembler.
www.mikusite.de/pages/x86.htm  dort erreiche ich im FPU-Bench 1433 Mio Iter/s ( 4 Kerne benutzt) ist also nur    358% schneller für einen einzelne CPU.
 Gruß Horst Für diesen Beitrag haben gedankt: Mathematiker
 |  |  |  
| Mathematiker  
          Beiträge: 2622
 Erhaltene Danke: 1448
 
 Win 7, 8.1, 10
 Delphi 5, 7, 10.1
 
 | 
Verfasst: So 23.06.13 12:06 
 
Hallo Horst_H,
 	  |  Horst_H hat folgendes geschrieben  : |  	  | Zumindest sollte die Geschwindigkeit des Assemblerabschnittes linear mit der Prozessorfrequenz zugelegt haben. | 
 Leider nicht, ich glaube aber den wahren Übeltäter gefunden zu haben: das application.processmessages.
 Da ich nach einer gewissen Anzahl von berechneten Zeilen processmessages aufrufe, und das wohl viel Zeit benötigt, war der Geschwindigkeitsgewinn kaum zu merken.
 Ich habe jetzt in Rev 1 den Aufruf so gesteuert, dass er nach etwa 1 Sekunde erfolgt und schon wird es schneller. 
 Für eine hohe Anzahl von Iterationen entsteht das Bild nun auch noch schrittweise (und man könnte auch einen Abbruch einbauen), für Bilder mit einem geringen Anteil der eigentlichen Mandelbrotmenge erhält man die Abbildung sofort.
 Ich habe zusätzlich noch 5 weitere Abbildungsbereiche eingebaut.
 Insbesondere bei den letzten merkt man deutlich, dass 250 oder 500 Iterationen für eine korrekte Darstellung zu wenig sind.   
 	  |  Horst_H hat folgendes geschrieben  : |  	  | 
 		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 5:
 
 |     rowrgb : pIntegerarray;...
 tempbitmap.pixelformat:=pf32bit;
 ...
 rowrgb[xs]:=integer(pal[i]);
 |  | 
 pIntegerarray kennt Delphi 5 nicht. Deshalb habe ich es nach docwiki.embarcadero....System.PIntegerArray  durch
 		                       Delphi-Quelltext 
 									| 1:2:
 3:
 
 | typeIntegerArray = array [0..251658239] of Integer;
 PIntegerArray = ^IntegerArray;
 |  ersetzt. Dann erhalte ich aber bei
 		                       Delphi-Quelltext 
 									| 1:
 | rowrgb[xs]:=integer(pal[i]);					 |  einen Übersetzungsfehler.
 Aus diesem Grund bin ich noch bei einem 24bit-Bitmap geblieben.
 Beste Grüße
 Mathematiker_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
 |  |  |  
| Horst_H 
          Beiträge: 1654
 Erhaltene Danke: 244
 
 WIN10,PuppyLinux
 FreePascal,Lazarus
 
 | 
Verfasst: So 23.06.13 13:34 
 
Hallo,
 ich komme auf 511 ms für die Einstellung im Bild (#2 bei 6000 Iterationen ) .
 Aber #1 bei 6000 Iterationen dauert ~3500 ms.Wenn ich mal wieder öfter auf Darstellung klicke, wird die Zeit immer erhöht und dann steht dort 1.4e4 ms -> 14000 ms-> 6 mal gedrückt.
 Es ist prächtig anzusehen.
 Ich hoffe, Du hast diese Miniprogramme (ca. 3 Kb) von mikusite.de/pages/x86.htm auf Deinem neuem Rechner mal testen können.
 
 Gruß Horst
 |  |  |  
| Mathematiker  
          Beiträge: 2622
 Erhaltene Danke: 1448
 
 Win 7, 8.1, 10
 Delphi 5, 7, 10.1
 
 | 
Verfasst: So 23.06.13 13:44 
 
Hallo,
 	  |  Horst_H hat folgendes geschrieben  : |  	  | Ich hoffe, Du hast diese Miniprogramme (ca. 3 Kb) von mikusite.de/pages/x86.htm auf Deinem neuem Rechner mal testen können. | 
 Hätte ich, wenn mein neuer Rechner, besser Win 8, nicht sinngemäß meldet:
 "Die Ausführung des Programms wird verhindert, da es den Computer gefährdet!"    	  |  Horst_H hat folgendes geschrieben  : |  	  | Wenn ich mal wieder öfter auf Darstellung klicke, wird die Zeit immer erhöht und dann steht dort 1.4e4 ms -> 14000 ms-> 6 mal gedrückt. | 
 Ich weiß, das habe ich nicht abgefangen.    Beste Grüße
 Mathematiker_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
 |  |  |  
| FinnO 
          Beiträge: 1331
 Erhaltene Danke: 123
 
 Mac OSX, Arch
 TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
 
 | 
Verfasst: So 23.06.13 14:25 
 
	  |  Mathematiker hat folgendes geschrieben  : |  	  | "Die Ausführung des Programms wird verhindert, da es den Computer gefährdet!"
  | 
 Entspann dich. Das wird bei allen Anwendungen gezeigt, die kein Publisherzertifikat  (sinngemäß) haben. Wenn dir die Quelle der Software also vertrauenswürdig erscheint, kannst du die Software ruhig ausführen (durch Klick auf Details->Trotzdem Ausführen). 
 Gruß Für diesen Beitrag haben gedankt: Mathematiker
 |  |  |  
| Mathematiker  
          Beiträge: 2622
 Erhaltene Danke: 1448
 
 Win 7, 8.1, 10
 Delphi 5, 7, 10.1
 
 | 
Verfasst: So 23.06.13 14:40 
 
Hallo,
 	  |  FinnO hat folgendes geschrieben  : |  	  | Entspann dich. Das wird bei allen Anwendungen gezeigt, die kein Publisherzertifikat (sinngemäß) haben. | 
 Danke, wieder 'was gelernt. Ich komme mir vor, wie der blutigste Anfänger.    Allerdings ergibt sich für mich die Frage:
 Wieso meldet Win8 dann bei meinen eigenen Programmen so etwas nicht. Ein solches Zertifikat habe ich doch auch nicht?
 Beste Grüße
 Mathematiker_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
 |  |  |  
| FinnO 
          Beiträge: 1331
 Erhaltene Danke: 123
 
 Mac OSX, Arch
 TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
 
 | 
Verfasst: So 23.06.13 14:45 
 
Da die Herkunft der Programme dort klar ist, denk' ich mal. Da war ich gerade etwas unpräzise   |  |  |  
| OlafSt 
          Beiträge: 486
 Erhaltene Danke: 99
 
 Win7, Win81, Win10
 Tokyo, VS2017
 
 | 
Verfasst: So 23.06.13 15:30 
 
Soll da womöglich temporär ein Device Treiber installiert werden ? Denn nur dann brauchts ein solches Zertifikat, Standardanwendungen benötigen sowas nicht. _________________ Lies, was da steht. Denk dann drüber nach. Dann erst fragen.
 |  |  |  
| Mathematiker  
          Beiträge: 2622
 Erhaltene Danke: 1448
 
 Win 7, 8.1, 10
 Delphi 5, 7, 10.1
 
 | 
Verfasst: So 23.06.13 15:41 
 
Hallo,
 	  |  OlafSt hat folgendes geschrieben  : |  	  | Soll da womöglich temporär ein Device Treiber installiert werden ? | 
 Keine Ahnung, wahrscheinlich.
 Ich habe eines dieser Programme nun doch ausprobiert. Positiv ist, dass es unglaublich schnell ist, negativ aber, dass es die Auflösung meines Bildschirms umgeschaltet hat. Und gerade bei einem Laptop-Bildschirm macht sich das nicht so gut.     Nebenbei habe ich in Revision 2 einen möglichen Zeichenabbruch eingebaut.
 Beste Grüße
 Mathematiker_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
 |  |  |  
| Fiete 
          Beiträge: 617
 Erhaltene Danke: 364
 
 W7
 Delphi 6 pro
 
 | 
Verfasst: Mo 24.06.13 11:03 
 
Moin Mathematiker,
 habe in meinem Archiv noch eine Assemblerroutine von 1987 gefunden.
 												| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
 18:
 19:
 20:
 21:
 22:
 23:
 24:
 25:
 26:
 27:
 28:
 29:
 30:
 31:
 32:
 33:
 34:
 35:
 36:
 37:
 38:
 39:
 40:
 41:
 42:
 43:
 
 | procedure TMandel.AsmIteration(XC,YC:Extended;Max:Integer;var K:Integer);
 var Vier:Extended;
 BEGIN
 Vier:=4.0;
 ASM
 MOV ECX,Max
 XOR EBX,EBX                    FINIT                          FLD XC                         FLD YC                         FLD VIER                       FLDZ                           FLDZ                           FLDZ                           FLDZ                     @ITER:FMUL ST,ST(3)                  FADD ST,ST(0)                  FADD ST,ST(5)                  FINCSTP                        FSUB ST,ST(1)                  FADD ST,ST(5)                  FST ST(2)                      FMUL ST,ST(0)                  FST ST(6)                      FDECSTP                        FST ST(2)                      FMUL ST(2),ST                  FDECSTP                        FADD ST,ST(3)                  FCOMP ST(5)                    FSTSW AX                       SAHF                           JA @ENDE                       INC EBX                        CMP EBX,ECX                    JB @ITER
 @ENDE:MOV EDI,K
 MOV [EDI],EBX                  FINIT                          END
 END;
 |  Im Anhang das ganze Programm.
 Die Befehle sind für einen 8087(FPU), in zwischen wird es für die aktuellen Prozessoren wohl etwas anderes geben.
 Gruß Fiete
Einloggen, um Attachments anzusehen!
 
_________________ Fietes Gesetz: use your brain (THINK)
 Für diesen Beitrag haben gedankt: glotzer, Mathematiker
 |  |  |  |