41
Das Wiki / Re: PHP Warnungen
« am: 06. April 2017, 00:14 »
Kann bestätigen, Wiki ist derzeit kaputt.
30. May 2023, 20:56
Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.
Also es geht um das erkennen von komplexen Datenkorrelationen in einem KI-System.Bleibt die Frage, ob du den Definitionsbereich irgendwie eingrenzen kannst, bzw. wo die Genauigkeitsanforderungen am höchsten sind. Deine Erklärung hilft mir da nicht weiter.
Die geteilte LUT - Funktion wäre die schneller als 50 Takte? Sie müsste ja auch bedingte Sprünge enthalten und Zugriffe auf den Arbeitsspeicher.Keine Ahnung, ob das schneller ist. Mit x86 habe ich nicht so viel zu tun. Mit Sprungvorhersage und einer kleinen, dauerhaft im Cache liegenden LUT sollte das aber nicht weh tun.
Die Interpolation benötigt auch ein paar Rechenoperation auch mul und div, was nicht gerade schnell ist.Nö, das sind nur wenige Befehle (in Pseudo-Assembler, ungetestet):
; Ein-/Ausgabe in R1; clobbers R2, R3, R4
LOOKUP:
MOV R4, #LUT ; Pointer zur LUT
SHR R1, R1, #24 ; obere 8 Bit der Eingabe als Tabellenindex (abgerundet)
LD R2, [R4 + R1] ; lade a
INC R1 ; nächster Index
LD R3, [R4 + R1] ; lade b
ADD R1, R2, R3 ; linerare Interpolation ist "(a+b) / 2"
SHR R1, #1 ; kein DIV nötig
Exponential /Wurzelfunktionen sind aber stark unter/über-Linear, und wenn man einen Eingangswertebereich von 32-Bit hat was mehr als 4 MRD. sind, wird es schwerDarum schrieb ich, dass du nach Möglichkeit den Definitionsbereich besser eingrenzen solltest.
Nehmen wir mal an, wir nehmen nur jeden tausendsten Wert (immer noch 4 Mio-Werte) in die LUT auf und interpolieren dazwischen, bekommt man rein gar nix mehr Vernünftiges.Du musst die Stützpunkte ja nicht gleichmäßig über den gesamten Definitionsbereich verteilen. Oder du nimmst zwei Tabellen fixer Größe, eine für Zahlen bis 10000 und eine für Zahlen darüber (wo die Nichtlinearität nicht mehr so weh tut).
Ich brauche etwas, dass mir im Schnitt die Wurzel in 10 Takten berechnet, d.h. auf einem 3GHz Rechner 300 Mio. mal pro Sekunde.Das ist reichlich sportlich. Ich rate dir einfach mal, dein Design grundsätzlich darauf abzuklopfen, ob du das Problem nicht anderweitig lösen kannst.
Man könnte den Sequentiellen Decoder stark parallelisieren.Automaten (und der Dekoder ist nichts anderes) sind äußerst schlecht parallelisierbar. Theoretisch könntest du den auch vollständig ausrollen, weil ein Befehl nach maximal 15 Bytes dekodiert ist, aber dann kannst du kein Blockram mehr benutzen. Im Ergebnis wird das nur ein extremer Gatterverhau, für den viel dupliziert werden muss und der durch seine Tiefe gleichzeitig relativ langsam ist.
Also zunächst alle möglichen Prefix-Bytes decodieren und mit einem Shifter das erste Opcodebyte an erster Stelle schieben.Der Hauptvorteil eines byteweise durch den Datenstrom laufenden Dekoders ist, dass ihm das Alignment egal ist. Wenn du damit jetzt nur die Präfixe verarbeiten lässt, verlierst du pro Byte einen Takt und musst den Befehl danach trotzdem neu ausrichten.
Naja, das Problem ist der erste Schritt in dem die Befehlslängen dekodiert werden müssen.Du kannst auch einfach 16 dieser freilaufenden Decoder einfach parallel schalten (mit jeweils einem Byte Versatz) und immer den passenden auswählen.
Die DICache die du beschreibst, ist ja sowas ähnliches wie ne Trace- oder Micro-op Cache.Genau das meinte ich: Du dekodierst auf Teufel komm raus, tust die Ergebnisse in einen Cache und entkoppelst damit den Dekoder vom Prozessor. Außerdem kannst du so relativ einfach mehrere Befehlssätze unterstützen (vgl. ARM/Thumb), solange sie einigermaßen kompatibel sind.
486kb für Cache sollte man nicht unterschätzen.Ich glaube, du unterschätzt den Nutzen von Blockram. Der von mir ursprünglich skizzierte Decoder braucht schonmal mindestens einen Block (bei Xilinx ein RAM36 == 36 KBit, weil dualported). Auch die eine oder andere Pipelinestufe kannst du mit Blockram sparsam und schnell implementieren, statt das in diskrete Logik zu gießen. Gleiches gilt für die Tabellen, die du für trigonometrische Funktionen brauchst, um float/double in hinreichender Genauigkeit zu implementieren. Im Prinzip kannst du auch alles in Logik (Distributed RAM) lösen, aber damit überrennst du das Routingnetz im FPGA und riskierst, dass dein Design nicht mehr synthetisiert (oder nur nach mehreren Tagen).
naja das iterationsverfahren muss schon 3 bis 4 mal durchgeführt werdenNaja, das Quake3-Verfahren (berechnet allerdings die Inverse und als Float) nutzt einen geschickten Anfangswert und kommt daher mit nur einer Iteration aus.
Das sind einige Maschinenbefehle die da durchgejagt werden müssen. Blöderweise auch Divisionen die relativ langsam sind. Das wird dann langsamer als gleich die FPU zu bemühen.Auf modernen Maschinen ist die Anzahl der Instruktionen nicht unbedingt ein guter Indikator für die Gesamtgeschwindigkeit.
Und da habe ich als Maximalwert mit einer MSI_PCIe Grafikkarte eben diese 130 Millionen Pixel Schreibgeschwindigkeit gemessen.Mit einem VESA-Treiber? Da bin ich jetzt aber erstaunt (bei angenommenen 32 Bit-Pixeln sind das stolze 520 MB/s).
Es würde aber Sinn machen, wenn man Speicherbereiche innerhalb des Grafikkarten-RAMS verschieben könnte. [...] Aber leider weiß ich nicht wie das gehen könnte...Wie ich bereits schrieb, ist der Blitter ein Grundbestandteil jeder Grafikkarte mit eingebautem 2D-Beschleuniger (und im Gegensatz zur CPU bezahlt der Blitter auch keine Zinsen, um das VRAM zu lesen). Um ihn zu nutzen, brauchst du aber einen nativen Treiber.
Geschwindigkeit ist da, je nach Grafikkarte, von 8 Mio-Pixel bis 130 Mio-Pixel in der Sekunde.Ich weiß jetzt nicht, wo du deine Zahlen her hast (Megapixel pro Sekunde klingt für mich eher nach einer 3D-Rendereinheit oder so), aber mit 8 MB/s Bandbreite kommst du bei 1024x768x32 auf 3 fps, bei höherer Auflösung entsprechend weniger. Damit macht selbst zweidimensionales Fenster-mit-Inhalt-Verschieben keinen Spaß.
Die einzige sinnvolle Grafikbeschleunigung wäre ein Pixelblitter der mir komplette Speicherbereiche vom RAM in den Grafikspeicher verschiebt, aber so was scheints nicht zu geben, oder?Ein Blitter kopiert normalerweise nur zweidimensionale Strukturen innerhalb des Grafikspeichers und ist in jedem 2D-Beschleuniger drin. Du meinst eine DMA-Engine, die in jeder 3D-fähigen Grafikkarte drin sein sollte. Beides braucht aber native Treiber.
Das letzte Update habe ich gerade eben hochgeladen und eine Dokumentation sowie Beispielcode ist auch verfügbar.Das ist aber lieb. Magst du uns auch verraten, wohin und wo?