AGB  ·  Datenschutz  ·  Impressum  







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

Bit Reverse Algorithmus

Ein Thema von derMischka · begonnen am 21. Jun 2017 · letzter Beitrag vom 22. Jun 2017
Antwort Antwort
derMischka

Registriert seit: 21. Jun 2007
Ort: Dresden
32 Beiträge
 
Delphi 7 Professional
 
#1

Bit Reverse Algorithmus

  Alt 21. Jun 2017, 14:37
Da ich gerade mit FFT arbeite brauche ich eine Funktion, die schnell die Bitumkehrung eines Wertes variabler Bitbreite zurückgibt.

von MSB->LSB zu LSB->MSB

zur Zeit habe ich folgende Umsetzungen:

Variante 1:
Delphi-Quellcode:
function BitRev(inBit{eax}: Cardinal; BitCount{edx}: integer): Cardinal;
asm
  xor ecx, ecx // ecx := 0
  test edx, edx // ist edx = 0?
  jz @Ende // wenn ja springe zu Ende
  @Loop:
    shr eax, 1 // eax nach rechts schieben -> unterstes Bit ins Carry-Flag
    rcl ecx, 1 // ecx nach links über Carry rotieren
    dec edx // dec(edx)
   jnz @Loop // wenn edx <> 0 --> springe zu Loop
  @Ende:
end;
Variante 2:
Delphi-Quellcode:
function BitRev(inBit{eax}: Cardinal; BitCount{edx}: integer): Cardinal;
asm
  mov ecx, edx
  lea edx, [eax * 2]
  shr eax, 1
  and edx, $AAAAAAAA
  and eax, $55555555
  or eax, edx
  lea edx, [eax * 4]
  shr eax, 2
  and edx, $CCCCCCCC
  and eax, $33333333
  or eax, edx
  lea edx, [eax * 8]
  shl edx, 1
  shr eax, 4
  and edx, $F0F0F0F0
  and eax, $0F0F0F0F
  or eax, edx
  bswap eax
  rol eax, cl
end;
habt ihr vielleicht einen noch schnelleren Ansatz ohne LookUpTable?

der Mischka
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.763 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Bit Reverse Algorithmus

  Alt 21. Jun 2017, 14:55
Warum nicht Lookup? Das scheint eigentlich der Stand der Technik zu sein, wenn es schnell sei muss. Zumal es ohne (für manche Menschen) unverständlichen Assemblercode auskommt.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
derMischka

Registriert seit: 21. Jun 2007
Ort: Dresden
32 Beiträge
 
Delphi 7 Professional
 
#3

AW: Bit Reverse Algorithmus

  Alt 21. Jun 2017, 15:00
Zitat:
Warum nicht Lookup?
Da ich bei meiner Aufgabe viel Speicherdurchsatz auf verschiedenen Adressen habe, wäre es toll, wenn für so ein "triviales" Problem alles auf Register-Ebene passiert.

Bei großen Datenmengen wird immer mehr die Speicherbandbreite der limitierende Faktor.

der Mischka
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

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

AW: Bit Reverse Algorithmus

  Alt 21. Jun 2017, 15:08
Da ich bei meiner Aufgabe viel Speicherdurchsatz auf verschiedenen Adressen habe, wäre es toll, wenn für so ein "triviales" Problem alles auf Register-Ebene passiert.
Bei großen Datenmengen wird immer mehr die Speicherbandbreite der limitierende Faktor.
Hast du das mal ausprobiert?
Ein Lookup ist quasi nur ein mov-Befehl.
Gefühlt (ich habs nicht getestet) sollte das unabhängig vom Speicher am schnellsten sein.
Allein weil es deutlich weniger Taktzyklen benötigt als eine Umrechnung.
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
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.763 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Bit Reverse Algorithmus

  Alt 21. Jun 2017, 15:12
Eine wie auch immer geartete Assemblerlösung (mit einer Ausnahme) ist immer langsamer als eine simple LUT. Welche Ausnahme? Eine Assemblerimplementierung einer LUT.

Zu Deinem Problem der variablen Länge: Ich gehe davon aus, daß sich die Bitfolge immer glatt in Nibbles aufteilen läßt, dann brauchst Du eine kleine Tabelle mit 16 Einträgen, gegen Die Du die Nibbles laufen läßt, und vertauscht dann deren Reihenfolge. Das sollte zwei bis drei Kernkriterien der Softwareentwicklung erfüllen: Einfach, Lesbar, Wartbar.

Wenn Du immer glatt in Bytes aufteilen kannst, dann machst Du eine größere Tabelle (256 Einträge) und mußt weniger Folgenteile vertauschen.

Diskussion dazu zB hier: https://stackoverflow.com/questions/...byte-in-delphi insbesondere in der akzeptierten Lösung von seiner Delphihaftigkeit David Heffernan.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
derMischka

Registriert seit: 21. Jun 2007
Ort: Dresden
32 Beiträge
 
Delphi 7 Professional
 
#6

AW: Bit Reverse Algorithmus

  Alt 21. Jun 2017, 16:27
Zitat:
Zu Deinem Problem der variablen Länge: Ich gehe davon aus, daß sich die Bitfolge immer glatt in Nibbles aufteilen läßt
Nein, z.B. 9 Bit sind auch möglich.

selbst eine Assembler LUT version wäre nicht so klein ...

Pseudo-Asm-Code

Code:
  // eax = Value
  // edx = BitCount
  movzx ecx, al
  mov  cl, [LUT + ebx]
  movzx ebx, ah
  mov  ch, [LUT + ebx]
  shr  eax, 16
  movzx ebx, al
  mov  bl, [LUT + ebx]
  shr  eax, 8
  mov  bh, [LUT + eax]
  or   ebx, ecx
  bswap ebx
  mov  ecx, edx
  rol  ebx, cl
  mov  eax, ebx

Geändert von derMischka (21. Jun 2017 um 16:32 Uhr)
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.380 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Bit Reverse Algorithmus

  Alt 21. Jun 2017, 17:03
Ich fand da interesasnt:
Zitat:
Note: LUT (lookup table) timings are probably rather optimistic here. Due to running in tight loop the whole table was sucked into L1 CPU cache. In real computations this function most probably would be called much less frequently and L1 cache would not keep the table entirely.
D.h. selbst wenn der Code mit LUT schneller ist, kann es passieren dass dadurch anderer Code langsamer wird weil die LUT andere Daten in im Cache verdrängt.
  Mit Zitat antworten Zitat
derMischka

Registriert seit: 21. Jun 2007
Ort: Dresden
32 Beiträge
 
Delphi 7 Professional
 
#8

AW: Bit Reverse Algorithmus

  Alt 22. Jun 2017, 07:25
Zitat:
D.h. selbst wenn der Code mit LUT schneller ist, kann es passieren dass dadurch anderer Code langsamer wird weil die LUT andere Daten in im Cache verdrängt.
Genau das meine ich!!!
Deshalb suche ich Anregungen für eine schnelle Umsetzung ohne LUT.

der Mischka
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.908 Beiträge
 
Delphi 12 Athens
 
#9

AW: Bit Reverse Algorithmus

  Alt 22. Jun 2017, 09:53
Ich vermute mal deine Lösung entspricht dem:
https://stackoverflow.com/questions/...o-lsb-msb-in-c

Du könntest ja auch mal den Algorithmus in Delphi schreiben und schauen was er im Assembler daraus macht.
Ichkönnte mir vorstellen das Delphi sowas ganz gut optimieren kann.

Rollo
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.380 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Bit Reverse Algorithmus

  Alt 22. Jun 2017, 16:43
Was ist denn das Maximum für BitCount 32? Eine Idee wäre noch 32 Varianten für jedes Bitcount der Methode zu machen und über eine Tabelle mit Index Bitcount anzuspringen. Intern kannst du dann die Loop ausrollen.
  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 21:46 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