AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

schnelstmöglich dividieren?

Ein Thema von Memnarch · begonnen am 26. Mai 2011 · letzter Beitrag vom 1. Jun 2011
Antwort Antwort
Seite 4 von 6   « Erste     234 56      
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#31

AW: schnelstmöglich dividieren?

  Alt 27. Mai 2011, 20:37
Irgendwann ist eben auch Schluss mit Optimierbarkeit auf unterster Ebene - irgendwo MUSS ja auch was berechnet werden . Daher eben auch unsere Vorschläge, an höhergelegenen Logiken noch was rauszuholen. Wenn es Z sein muss, und zwar per Pixel, wird man um was auch immer für eine Interpolation für jeden Pixel nicht herum kommen, und Interpolation sind Verhältnisrechnungen, und da steckt ja schon fast Sprachlich drin "duuu mussssst dividiiiieren". Oft auch Floatlastig, da gern Ranges von 0..1 genommen sind (wobei man da, wenn es nur linear bleibt, mittels Skalierung auch noch drum rum kommt meistens).
Es bleibt also nur zu gucken, wie man möglichst geschickt interpoliert, oder wie man im Vorfeld noch besser, noch mehr Notwendigkeit zur Interpolation gleich eliminiert. Oder man taucht in Parallelisierung ab (was aber so generell sicherlich sinnvoll ist, egal wie das hier ausgehen wird.)
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#32

AW: schnelstmöglich dividieren?

  Alt 28. Mai 2011, 11:42
@Amateurprofi: Hast Du denn auch die ganzen Constraints bzgl. Alignment usw. beachtet und die Daten optimal arrangiert? Wundert mich etwas, dass es "mit den neueren Opcodes" langsamer sein soll als mit dem "Oldschool" Delphi-Compiler
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.062 Beiträge
 
Delphi XE2 Professional
 
#33

AW: schnelstmöglich dividieren?

  Alt 28. Mai 2011, 12:34
@OldGrumpy:

Das unten stehende war mein Versuch.

Ausschließlich mit der FPU zu arbeiten hat außer deutlicher Verschlechterung nichts gebracht.
Vielleicht bringt eine gemische Lösung etwas, z.B. alle Multiplikationen und Additionen in den
'normalen' Registern machen und nur die Divisionen mit der FPU.
Ich glaube aber nicht, daß das was bringt. Der, wie du sagst, "Oldschool" Delphi-Compiler schafft es im 31 CPU-Ticks, und das ist für mein Verständnis verdammt flink.

Kannst es ja mal versuchen, ob eine andere Anordnung der Variablen, oder ein anderer Ablauf eine bessere Zeit bringt.

Delphi-Quellcode:
var
   wert,a,b,c,x,y,z,ergebnis,x2,y2,z2,ergebnis2,x3,y3,z3,ergebnis3:integer;

FUNCTION TimeStamp:int64;
asm
   rdtsc
end;

PROCEDURE Test1;
begin
   Ergebnis := (A*x + B*Y + C*Z) div Wert;
   Ergebnis2 := (A*x2 + B*Y2 + C*Z2) div Wert;
   Ergebnis3 := (A*x3 + B*Y3 + C*Z3) div Wert;
end;

PROCEDURE Test2;
asm
   fild wert
   fild a
   fild b
   fild c
   fild x
   fmul st,st(3)
   fild y
   fmul st,st(3)
   faddp
   fild z
   fmul st,st(2)
   faddp
   fdiv st,st(4)
   fistp ergebnis
   fild x2
   fmul st,st(3)
   fild y2
   fmul st,st(3)
   faddp
   fild z2
   fmul st,st(2)
   faddp
   fdiv st,st(4)
   fistp ergebnis2
   fild x3
   fmulp st(3),st
   fild y3
   fmulp st(2),st
   fild z3
   fmulp
   faddp
   faddp
   fdivrp
   fistp ergebnis3
end;

PROCEDURE TestPerformance;
const count=100;
var priorityclass,priority:integer; samask,pamask,tamask:cardinal;
    t0,t1,t2,tts:Int64; i:integer;
begin
   GetProcessAffinityMask(GetCurrentProcess,pamask,samask);
   if pamask=0 then exit;
   tamask:=1;
   while tamask and pamask=0 do tamask:=tamask shl 1;
   SetThreadAffinityMask(GetCurrentThread,tamask);
   priorityclass:=GetPriorityClass(GetCurrentProcess);
   priority:=GetThreadPriority(GetCurrentThread);
   SetPriorityClass(GetCurrentProcess,REALTIME_PRIORITY_CLASS);
   SetThreadPriority(GetCurrentThread,THREAD_PRIORITY_TIME_CRITICAL);
   // Etwas einheizen
   for i:=1 to 100000000 do;
   // Feststellen wieviel Ticks TimeStamp braucht
   tts:=High(int64);
   for i:=1 to count do begin
      t0:=TimeStamp;
      t0:=TimeStamp-t0;
      if t0<tts then tts:=t0;
   end;
   // Ticks für Routine 1
   t1:=High(int64);
   for i:=1 to count do begin
      t0:=TimeStamp;
      Test1;
      t0:=TimeStamp-t0;
      if t0<t1 then t1:=t0;
   end;
   dec(t1,tts); // Zeit für TimeStamp abziehen
   // Ticks für Routine 2
   t2:=High(int64);
   for i:=1 to count do begin
      t0:=TimeStamp;
      Test2;
      t0:=TimeStamp-t0;
      if t0<t2 then t2:=t0;
   end;
   dec(t2,tts); // Zeit für TimeStamp abziehen
   SetThreadPriority(GetCurrentThread,priority);
   SetPriorityClass(GetCurrentProcess,priorityclass);
   SetThreadAffinityMask(GetCurrentThread,pamask);
   ShowMessage(IntToStr(t1)+' '+IntToStr(t2)+' '+IntToStr(t1-t2));
end;

PROCEDURE TMain.Test;
begin
   a:=12345;
   b:=23456;
   c:=34567;
   x:=12;
   y:=13;
   z:=14;
   x2:=123;
   y2:=123;
   z2:=125;
   x3:=234;
   y3:=235;
   z3:=236;
   wert:=37;
   testperformance;
end;
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#34

AW: schnelstmöglich dividieren?

  Alt 28. Mai 2011, 18:47
@Bjoerk: Dir ist schon klar, dass ich mein momentanes Programm auf nem P4 3GHZ im MT Modus ausführe?(Somit nur 1.5GHz wegen virtuellem kern).

@Amateurprofi:
Habe schonmal nen Mix versucht, das Resultat war auch ernüchtenrd. Da die CPU immerwieder in die FPU wechseln muss, nimtm schonalleine diese umstellung in meinder anwendung mehr weg als wenn ich einfach nur stumpf dividieren würde.
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#35

AW: schnelstmöglich dividieren?

  Alt 28. Mai 2011, 18:59
Auch wenn ich nicht nicht mehr wirklich mitreden kann, will ich dir mal meinen Respekt zollen
Einen Software-Renderer / Rasterizer zu schreiben ist einfach...geil!
Gib nicht auf!
....
..
..
(vielleicht hilft das ja auch etwas zur Motivation im ganzen Performance-Frust )
  Mit Zitat antworten Zitat
bit4bit

Registriert seit: 14. Jun 2006
Ort: Köln
25 Beiträge
 
#36

AW: schnelstmöglich dividieren?

  Alt 30. Mai 2011, 00:02
@Memnarch

Versuch doch mal folgende Idee (nicht getestet) :

Delphi-Quellcode:
PROCEDURE Test1;
var Wert2 : Integer;
begin
   Wert2 := Integer((2 shl 32) div Wert);
   Ergebnis := Integer(((A*x + B*Y + C*Z) * Wert2) shr 32);
   Ergebnis2 := Integer(((A*x2 + B*Y2 + C*Z2) * Wert2) shr 32);
   Ergebnis3 := Integer(((A*x3 + B*Y3 + C*Z3) * Wert2) shr 32);
end;
Normalerweise müsste der Compiler das gut optimieren können.

Wenn nicht, hilft Assembler. Da das Ergebnis in 2 Bytes passt,
kannst Du nach der Multiplikation einfach den Inhalt von DX benutzen.

MfG

bit4bit
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.062 Beiträge
 
Delphi XE2 Professional
 
#37

AW: schnelstmöglich dividieren?

  Alt 30. Mai 2011, 03:07
@bit4bit;

Delphi-Quellcode:
PROCEDURE Test1;
var Wert2 : Integer;
begin
   Wert2 := Integer((2 shl 32) div Wert);
   Ergebnis := Integer(((A*x + B*Y + C*Z) * Wert2) shr 32);
   Ergebnis2 := Integer(((A*x2 + B*Y2 + C*Z2) * Wert2) shr 32);
   Ergebnis3 := Integer(((A*x3 + B*Y3 + C*Z3) * Wert2) shr 32);
end;
Und welche Ergebnisse erwartest du ?
Zur ersten Zeile "Wert2 := Integer((2 shl 32) div Wert);" :
2 shl 32 ergibt 2, weil um 32 mod 32 (=0) Bits verschoben wird.
Also wird Wert2 in der Regel 0 sein und damit werden auch die Ergebnisse alle = 0 sein.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#38

AW: schnelstmöglich dividieren?

  Alt 30. Mai 2011, 09:17
@Blackfin: Danke^^.
Allerdings weniger zeit im Moment dran weiterzuarbeiten. Sourcecode auf der Arbeit geschrieben, und wenn ich dran weitermachen will muss ichs im moment zuhause machen...dafür muss ich dan nochmal alles schreiben XD.(da hab ich dan aber auch nen Dualcore mit 2.66GHZ pro REALEM Kern )

Wenn es mal interressiert:

http://www.devmaster.net/forums/showthread.php?t=1884

Dieser Artikel hat mir sehr geholfen. Konnte am anfang vllt 4 Bilder pro sekunde anzeigen. Obiger Artikel hat mir gut verdeutlicht wie man soetwas optimieren kann. Bein aktueller Softwarerasterizer basiert auch auf obigem + Einigen anderen sachen wie z.B. depthbuffer etc.(texturemapping geht übrigens auch schon...wenn auch etwas...meh im aussehen^^)

@Amateurprofi: hat das beispiel überhaupt nen sinn? ansonsten hätt ichs mit nem shift wert um einiges kleiner als 32 probiert...o.O

EDIT: bin auch im Moment zuhause sehr beschäftigt...mit ner Art PreCompiler Thread auf 3DGamestudio.de

MFG
Memnarch

Geändert von Memnarch (30. Mai 2011 um 09:24 Uhr)
  Mit Zitat antworten Zitat
Delphianer

Registriert seit: 19. Feb 2003
Ort: Rossau
149 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#39

AW: schnelstmöglich dividieren?

  Alt 30. Mai 2011, 10:11
Hallo,

wenn Du Geschwindigkeit auf Kosten der Genauigkeit steigern kannst/willst, hätte ich auch noch einen Vorschlag.
Du könntest die Ergebnisse der Division in einem Array abspeichern, z.B. 4096 x 4096. Das hieße aber, dass Du Deine Werte für Divisor und Dividend auf 4096 Werte eindampfen müsstest. Das Array ließe sich sicher auch noch in Maßen vergrößern. Wenn die Genauigkeit ausreicht, bist Du mit einem Array-Zugriff rasend schnell.

Viele Grüße,

Lutz
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#40

AW: schnelstmöglich dividieren?

  Alt 30. Mai 2011, 10:26
Ah, sone art lookup table? Sowas nutz ich schon für die COS/SIN funktionen^^.

Nur wie soll ich die einrichten?
Wenn die formel X/Y ist dan sowas wie:


Ergebnis := Tabelle[x][y];

oder wie?
Von der genauigkeit könnte es reichen weil der finale schritt der division immer für die Pixelkoordinaten also Integer ist. Aber wie soll ich die aufbauen?

EDIT: vergiss es, das haut sich automatisch in die Fritten, den die Fläche eines Dreiecks kann auch width*Height des bildschirms sein, dann ist sowieso schluss >.<

Geändert von Memnarch (30. Mai 2011 um 10:41 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 6   « Erste     234 56      


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:

(?)

LinkBack to this Thread

Erstellt von For Type Datum
Untitled document Post #0 Refback 30. Mai 2011 17:36

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:28 Uhr.
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