Forum: PC-Programmierung Beim Byte die Bits am schnellsten umsetzen.


von Peter B. (funkheld)


Lesenswert?

Wie kann man bitte ein Byte : 11000001 am schnellsten umsetzen
nach : 10000011 mit Schieben, AND , Or usw?

Danke.

von Dieter (Gast)


Lesenswert?

Wenn die Bits weiblich sind, dann gar nicht. ;)

von Falk B. (falk)


Lesenswert?

Peter B. schrieb:
> Wie kann man bitte ein Byte : 11000001 am schnellsten umsetzen
> nach : 10000011 mit Schieben, AND , Or usw?

Mit einer Tabelle. Oder Hardcore Inline Assembler.

von Fpgakuechle K. (Gast)


Lesenswert?

Peter B. schrieb:
> Wie kann man bitte ein Byte : 11000001 am schnellsten umsetzen
> nach : 10000011 mit Schieben, AND , Or usw?

mit dem passenden Maschinenbefehl" 'reverse (Address-) bit order'
DSP haben einen solchen Befehl, weil er den Butterfly-FFT Algo immens 
beschleunigt. In den PC-x86 addresssatz könnte man sowas auch in den 
MME-Teil o.ä. finden.

von Stefan P. (form)


Lesenswert?

Peter B. schrieb:
> Wie kann man bitte ein Byte : 11000001 am schnellsten umsetzen
> nach : 10000011 mit Schieben, AND , Or usw?

Du willst die Richtung umkehren, oder?

https://stackoverflow.com/questions/2602823/in-c-c-whats-the-simplest-way-to-reverse-the-order-of-bits-in-a-byte

von Teo D. (teoderix)


Lesenswert?


von Fpgakuechle K. (Gast)


Lesenswert?

Oder ins Archiv schauen, ist hier schon öfters durchgekaut worden:
Beitrag "bit invertieren"
Beitrag "Bits vertauschen"
Beitrag "Bits tauschen?!"
Beitrag "FFT Tutorial für AVR"

von Peter B. (funkheld)


Lesenswert?

Danke für die Info.

Wusste nicht , das es so ein Krampf ist mit den Bit im Byte zu tauschen.

Wir fliegen zum Mond und schreiben Bücher über dieses Bit im Byte 
tauschen.... hm

Gruss

von Teo D. (teoderix)


Lesenswert?

Peter B. schrieb:
> Wir fliegen zum Mond und schreiben Bücher über dieses Bit im Byte
> tauschen.... hm

Na, desewegen konnten wir ja erst zum Mondfliegen!

von (prx) A. K. (prx)


Lesenswert?

Peter B. schrieb:
> Wir fliegen zum Mond und schreiben Bücher über dieses Bit im Byte
> tauschen.... hm

Eine Frage eindeutig zu stellen kann es mitunter ersparen, bücherweise 
Antworten zu lesen.

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Peter B. schrieb:
> Wusste nicht , das es so ein Krampf ist mit den Bit im Byte zu tauschen.

Du hast nach der schnellsten Methode gefragt und das ist zweifelsohne 
eine Tabelle, wenn man man mal von festverdrahteter Logik absieht. Das 
ist kein Krampf, sondern straight forward - direkter geht es nicht.

von (prx) A. K. (prx)


Lesenswert?

Wolfgang schrieb:
> direkter geht es nicht

Doch. Bitreverse geht direkter und schneller - wenn als Befehl vorhanden 
und genau das gewünscht ist. Tabelle hat demgegenüber den Vorteil, trotz 
vage formulierter Frage auf jedem Prozessor für jede Permutation 
geeignet zu sein. Daher ist die Tabelle die schnellere Antwort auf die 
Frage, aber nicht unbedingt das zur Laufzeit schnellere Verfahren.

: Bearbeitet durch User
von Patrick L. (Firma: S-C-I DATA GbR) (pali64)


Lesenswert?

Schnellstes Verfahren?

wenn du 2 Ports frei hast, diese extern Gespiegelt verdrahten und dann 
geht das sehr fix über Port Out und Port in.

von Jens B. (dasjens)


Lesenswert?

(prx) A. K. schrieb:
> Wolfgang schrieb:
>> direkter geht es nicht
>
> Doch. Bitreverse geht direkter und schneller - wenn als Befehl vorhanden
> und genau das gewünscht ist.

Das muss nicht sein. Es gibt auch Befehle, die sind schneller wenn man 
die per hand bastelt statt dem fertigen Befehl, bei x86 war es beim loop 
befehl so, afaik.

von (prx) A. K. (prx)


Lesenswert?

Jens B. schrieb:
> Das muss nicht sein. Es gibt auch Befehle, die sind schneller wenn man
> die per hand bastelt statt dem fertigen Befehl, bei x86 war es beim loop
> befehl so, afaik.

Im Prinzip richtig, aber kennst du einen Prozessor mit 
Bitreverse-Befehl, der sich dafür dementsprechend viel Zeit lässt?

Beim LOOP war es auch schon so, dass der vorsätzlich ausgebremst 
wurde, damit ein herzallerliebstes Betriebssystem überhaupt bootete. ;-)

von rotation googeln (Gast)


Lesenswert?

Peter B. schrieb:
> 11000001 am schnellsten umsetzen
> nach : 10000011

sieht nach "rotation" aus.

von rotation googeln (Gast)


Lesenswert?

rotation googeln schrieb:
> sieht nach "rotation" aus.

nee ;-)

von Fpgakuechle K. (Gast)


Lesenswert?

(prx) A. K. schrieb:
> Wolfgang schrieb:
>> direkter geht es nicht
>
> Doch. Bitreverse geht direkter und schneller - wenn als Befehl vorhanden
> und genau das gewünscht ist.

Bei divesren ARM's könnte RBIT das gesuchte sein: 
https://developer.arm.com/documentation/dui0802/a/A32-and-T32-Instructions/REV--REV16--REVSH--and-RBIT

Oder man hat programmierbare Logik und bastelst sich diese Instruction 
aus ein bißchen routing ressourcen und FF.

Und natürlich stellt sich die Frage, wie man das transponierte 
weiterverwenden will, alls addresspointer braucht man es nicht extra 
drehen sondern könnte es beim TMS320 direkt zu bit reversal addressing 
verwenden.

Aber das wurde, wie gesagt, hier schon mal durchgekaut, mehr als einmal.

> Wusste nicht , das es so ein Krampf ist mit den Bit im Byte zu tauschen.
Das ist kein Krampf , das ist ganz simples bitschubsen. Wenn das zuviel 
für Deine Computerfähigkeiten ist, könntest du dir ja was weniger 
Anspruchsvolles als Freizeitbeschäftigung aussuchen.

von rbx (Gast)


Lesenswert?

Peter B. schrieb:
> Wie kann man bitte ein Byte : 11000001 am schnellsten umsetzen
> nach : 10000011 mit Schieben, AND , Or usw?

Welche CPU?

Früher wurden noch die Bios-Befehle benutzt, und da hätte man wohl AND 
und/oder je nach Vorfall OR genommen - aber der Rotationsbefehl einmal 
bzw. zweimal (über das Carry-Flag) nach links geht natürlich auch, nur 
war der früher etwas langsam.
Dafür isser aber für die Ausgabe der Bits sehr praktisch.

https://www.i8086.de/asm/8086-88-asm-rcl.html

https://www.davespace.co.uk/arm/introduction-to-arm/barrel-shifter.html

von Dirk B. (dirkb2)


Lesenswert?

Patrick L. schrieb:
> wenn du 2 Ports frei hast, diese extern Gespiegelt verdrahten und dann
> geht das sehr fix über Port Out und Port in.

Port IO ist selten fix.

von A. S. (Gast)


Lesenswert?

Peter B. schrieb:
> Danke für die Info.
>
> Wusste nicht , das es so ein Krampf ist mit den Bit im Byte zu tauschen.
>
> Wir fliegen zum Mond und schreiben Bücher über dieses Bit im Byte
> tauschen.... hm

Das sind Fingerübungen. Wenn sowas öfter gebraucht würde, würde es dafür 
ein Modul geben. Ich hätte es einmal gebraucht. Der Prozessor konnte es 
sogar (mirror), aber es lohnte nicht den Aufwand, da einen 
Assembler-Befehl einzufügen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Teo D. schrieb:
> Gug mal hier rein:
> https://www.c-plusplus.net/forum/topic/192871/byteorder-umkehren

Der TO möchte keine Bytes umkehren, sondern Bits.

von 🐧 DPA 🐧 (Gast)


Lesenswert?

Normalerweise bin ich ja kein fan von bitfields, aber bits reversen ist 
lästig. Da würde ich die dann doch nehmen, und das Optimieren dem 
Compiler überlassen:
https://godbolt.org/z/dP6T837nq
1
#include <stdint.h>
2
#include <string.h>
3
#include <assert.h>
4
5
static inline uint8_t bit8_reverse(const uint8_t u8){
6
  struct __attribute__((packed)) b8 {
7
    unsigned b0 : 1;
8
    unsigned b1 : 1;
9
    unsigned b2 : 1;
10
    unsigned b3 : 1;
11
    unsigned b4 : 1;
12
    unsigned b5 : 1;
13
    unsigned b6 : 1;
14
    unsigned b7 : 1;
15
  };
16
  static_assert(sizeof(struct b8) == sizeof(uint8_t));
17
  struct b8 in;
18
  memcpy(&in, &u8, 1);
19
  const struct b8 out = {
20
    .b0 = in.b7,
21
    .b1 = in.b6,
22
    .b2 = in.b5,
23
    .b3 = in.b4,
24
    .b4 = in.b3,
25
    .b5 = in.b2,
26
    .b6 = in.b1,
27
    .b7 = in.b0,
28
  };
29
  uint8_t res;
30
  memcpy(&res, &out, 1);
31
  return res;
32
}

von 🐧 DPA 🐧 (Gast)


Lesenswert?

Wow, die Lösung von clang ist recht beeindruckend: 
https://godbolt.org/z/KT7xWrvPc

von (prx) A. K. (prx)


Lesenswert?

🐧 DPA 🐧 schrieb:
> Wow, die Lösung von clang ist recht beeindruckend:

Umso mehr die Lösung für ARMv8.

von 🐧 DPA 🐧 (Gast)


Lesenswert?

Wow, tatsächlich. Es nutzt rbit: https://godbolt.org/z/c4ozsvP3o
1
test:                                   // @test
2
        rbit    w8, w0
3
        lsr     w0, w8, #24
4
        ret

Zwar nur bei recht aktueller clang Version, aber trotzdem. Da sieht man 
mal wieder, heute noch selber Assembler schreiben bringts nicht mehr.

von Assembler gehört zum Handwerkszeug (Gast)


Lesenswert?

🐧 DPA 🐧 schrieb:
> Wow, tatsächlich. Es nutzt rbit:
> https://godbolt.org/z/c4ozsvP3otest:
> // @test
>         rbit    w8, w0
>         lsr     w0, w8, #24
>         ret
>
> Zwar nur bei recht aktueller clang Version, aber trotzdem. Da sieht man
> mal wieder, heute noch selber Assembler schreiben bringts nicht mehr.

Doch, wenn man selbst die 3 Zeilen Assembler als inline hintippt, spart 
man sich die 30 zeilen C-Code und die Überprüfung ob der C-Compiler das 
C-Construct erkennt und wie gewünscht in die drei Assembler Zeilen 
umsetzt. Und er das immer tut und nicht abhängig wegen irgendwelchen 
genutzten Compilerschaltern, Mandphasen etc. pp. .

Zum Kellnern sagt man ja auch "Bringens mir bitte ein halbes Hefeweiße" 
und setzt nicht zu einem verquasten Vortrag über seine aktuelle 
Befindlichkeit bezüglich Kaltgetränke an, um ne Viertelstunde später den 
Kellner wieder zurückzuschicken, weil er ein veganes  Alkoholfreies 
gebracht hat.
Falls man seine Ansprache überhaupt an den richtigen Kellner gerichtet 
hat und nicht an einen Touristen, der sich aus Unkenntnis der 
Alltagsgebräuche wie ein Lokalkellner gekleidet hat.

von Patrick L. (Firma: S-C-I DATA GbR) (pali64)


Lesenswert?

Assembler gehört zum Handwerkszeug schrieb:
> Doch, wenn man selbst die 3 Zeilen Assembler als inline hintippt, spart
> man sich die 30 zeilen C-Code und die Überprüfung ob der C-Compiler das
> C-Construct erkennt und wie gewünscht in die drei Assembler Zeilen
> umsetzt. Und er das immer tut und nicht abhängig wegen irgendwelchen
> genutzten Compilerschaltern, Mandphasen etc. pp. .

Da bin ich ganz deiner Meinung. ;-)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Assembler gehört zum Handwerkszeug schrieb:
> Doch, wenn man selbst die 3 Zeilen Assembler als inline hintippt, spart
> man sich die 30 zeilen C-Code

Spätestens beim Port auf einen anderen µC bist Du aufgeschmissen. Der 
C-Code jedoch funktioniert mit allen µCs. Und dort wird er möglichst 
optimal übersetzt.

Als C-Programmierer machst Du 30 Ports mühelos mit, als 
Assembler-Programmierer musst du einfach aufgeben.

: Bearbeitet durch Moderator
von 🐧 DPA 🐧 (Gast)


Lesenswert?

Assembler gehört zum Handwerkszeug schrieb:
> Doch, wenn man selbst die 3 Zeilen Assembler als inline hintippt, spart
> man sich die 30 zeilen C-Code und die Überprüfung ob der C-Compiler das
> C-Construct erkennt und wie gewünscht in die drei Assembler Zeilen
> umsetzt. Und er das immer tut und nicht abhängig wegen irgendwelchen
> genutzten Compilerschaltern, Mandphasen etc. pp. .

1. Der C-Code funktioniert auf so ziemlich allen Platformen. Die meisten 
davon haben keine rbit Instruktion.

2. Ich wusste gar nicht, dass ARMv8 diese Instruktion besitzt. Bis ich 
mir alle Instruktionen nochmal durchgesehen habe, um mir zu überlegen, 
wie ich das am besten mache, habe ich den C Code schon längstens 
eingetippt. Der C Code ist auch absolut trivial und einfach zu 
verstehen. Da sieht man sofort, was er macht. Das man etwas mehr 
Eintippt ist doch egal.

3. Ich muss nicht nachschauen, wie gut der Compiler das optimiert. Dass 
kann mir erstmal egal sein. Wenn etwas zu langsam ist, nehme ich den 
Profiler raus. Und wenn der anzeigt, dass diese Funktion am meisten zeit 
verschwendet, erst dann lohnt es sich, überhaupt über das Optimieren 
nachzugenken.

4. Der Compiler kann das sehr wohl inlinen. Das hat er bei der Funktion 
test() auch gemacht. Aber auch ohne das static inline kann und tut der 
Compiler inlinen, wenn sinvoll.

5. Punkto Stabilität, ok, der Code könnte sich ändern. Ich habe aber 
noch nie gesehen, dass er mit neueren Compilern verschlechtern würde. 
Wenn man das wirklich unbedingt verhindern muss / will, warum auch 
immer, gibt es mehrere Möglichkeiten. Entweder, man legt einfach fest, 
welchen Compiler man verwenden soll (also Version, Build, usw.). Oder 
man packt sich die guten Assembler Versionen irgendwo hin, und lässt die 
die C Versionen ersetzen (beim build), sofern man die für die Plattform 
hat. (Aber dann auch immer reine C Builds testen,  damit man die 
Originale nicht versehentlich mal löscht, und später wieder suchen 
muss).

So oder so, kein Grund sich selbst anstrengen & mit ASM abmühen zu 
müssen.

von Assembler gehört zum Handwerkszeug (Gast)


Lesenswert?

Frank M. schrieb:
> Als C-Programmierer machst Du 30 Ports mühelos mit,
Nein, es ist nicht mühelos jedesmal den Compiler zu überprüfen ob er 
wirklich die gewollte optimale Assembler-Variante generiert hat.

> Assembler-Programmierer musst du einfach aufgeben.
Also Programmierer steht man über die infantilen Streiteren ob 
assembler oder C der 'Heilige Scheiß' sei und verlässt sich nicht auf 
die maschinelle (Un-)Intelligenz) eines Compilers.
Und auch als Programmierer der den befehlssatz und CPU-Architekturen 
beherrscht,  ist man nicht gezwungen alles in Assembler-Mnemonics  zu 
schreiben, sondern kann ganz profesionell, inline Assembler verwenden, 
wo er gegenüber Compiler-hHrsteller spezifischen C-Konstrukten 
effizienter und schneller ist.

Man will ja schliesslich 'Computer beherschen' und nicht als 
'Syntax-idiotischer' C-Fachtrottel-Programmierschwein enden.

von 🐧 DPA 🐧 (Gast)


Lesenswert?

Assembler gehört zum Handwerkszeug schrieb:
> Frank M. schrieb:
>> Als C-Programmierer machst Du 30 Ports mühelos mit,
> Nein, es ist nicht mühelos jedesmal den Compiler zu überprüfen ob er
> wirklich die gewollte optimale Assembler-Variante generiert hat.

1. Warum musst du das machen?

2. Kennst du immer die optimale Lösung?

Assembler gehört zum Handwerkszeug schrieb:
> sondern kann ganz profesionell, inline Assembler verwenden,
> wo er gegenüber Compiler-hHrsteller spezifischen C-Konstrukten
> effizienter und schneller ist.

Wie würdest du die rbit Variante vom Compiler effizienter gestalten?

Assembler gehört zum Handwerkszeug schrieb:
> Man will ja schliesslich 'Computer beherschen' und nicht als
> 'Syntax-idiotischer' C-Fachtrottel-Programmierschwein enden.

Darunter verstehe ich was anderes. Dass der Computer macht, was ich 
will. Wie das passiert, ist mir ziemlich egal, Hauptsache niemand kann 
mir vorschreiben, was ich machen kann, oder auch nicht. Daher ist mir da 
viel wichtiger, das mein Computer nicht ein abgeschottetes Smartphone 
oder was in die Richtung ist, und ich möglichst viel DRM zeug vermeide, 
als das alles in ASM geschrieben ist, bei dem keiner mehr durch blickt.

von Egon D. (Gast)


Lesenswert?

🐧 DPA 🐧 schrieb:

> Normalerweise bin ich ja kein fan von bitfields, aber
> bits reversen ist lästig. Da würde ich die dann doch
> nehmen, und das Optimieren dem Compiler überlassen:

Und Du glaubst, das wird schneller als
1
 
2
b = ((b * 0x80200802ULL) & 0x0884422110ULL) * 0x0101010101ULL >> 32;

(Es gibt auch eine Variante, die mit 32 Bit auskommt.)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Assembler gehört zum Handwerkszeug schrieb:
> Nein, es ist nicht mühelos jedesmal den Compiler zu überprüfen

Ich muss gar nix prüfen, der C-Code läuft einfach - auf dem einen µC 
performanter (dank rbit), auf dem anderen mangels passender Instruktion 
weniger performant. Aber was soll's?

Der Assembler-Programmierer muss den Code für jeden µC neu schreiben 
oder er verrottet auf seinem ATTiny. Bestes Beispiel: Moby, der kann 
auch nix anderes als ATTinys programmieren.

: Bearbeitet durch Moderator
von Egon D. (Gast)


Lesenswert?

Assembler gehört zum Handwerkszeug schrieb:

> Also Programmierer steht man über die infantilen
> Streiteren ob assembler oder C der 'Heilige Scheiß' sei

Man folgert leicht: Du bist kein Programmierer.


> Und auch als Programmierer der den befehlssatz und
> CPU-Architekturen beherrscht,

Da hätte ich ja viel zu tun.

Wenn ich ein Anwendungsprogramm entwickle, will ich dem
Nutzer vor allem ein Werkzeug zur Verfügung stellen, das
sein Problem löst. Da ich nicht wissen kann, welche CPU der
Anwender benutzt, beschränke ich mich im wohlverstandenen
Eigeninteresse auf die Auswahl und die Optimierung von
Algorithmen, die mit üblichen Architekturen möglichst gut
harmonieren. Alles, was darüber ist, ist vom Übel.


> ist man nicht gezwungen alles in Assembler-Mnemonics zu
> schreiben, sondern kann ganz profesionell, inline Assembler
> verwenden, wo er gegenüber Compiler-hHrsteller spezifischen
> C-Konstrukten effizienter und schneller ist.

Frei nach C.F.Gauss: "Mangelnde computertechnische Bildung
zeigt sich am deutlichsten in äußerster Schärfe bei der
Mikro-Optimierung."


> Man will ja schliesslich 'Computer beherschen' und nicht als
> 'Syntax-idiotischer' C-Fachtrottel-Programmierschwein enden.

???

Ich will vor allem gute Programme schreiben.

Das ist etwas anderes als "Programme schreiben, die auf meinem
aktuellen Computer schnell laufen".

von Egon D. (Gast)


Lesenswert?

Frank M. schrieb:

> Assembler gehört zum Handwerkszeug schrieb:
>> Nein, es ist nicht mühelos jedesmal den Compiler zu überprüfen
>
> Ich muss gar nix prüfen, der C-Code läuft einfach - auf dem
> einen µC performanter (dank rbit), auf dem anderen mangels
> passender Instruktion weniger performant. Aber was soll's?

Naja, die Frage bleibt: Wie drücke ich das in C so aus, dass
der Compiler bei Verfügbarkeit "rbit" verwendet und andernfall
z.B. die von mir gepostete Formel?


> Der Assembler-Programmierer muss den Code für jeden µC neu
> schreiben

Dürfen nur Assemblerprogrammierer Assembleranweisungen
verwenden?

von MaWin (Gast)


Lesenswert?

rotation googeln schrieb:
> rotation googeln schrieb:
>
>> sieht nach "rotation" aus.
>
> nee ;-)

Doch. Sieht so aus. Er hat halt ein blödes Beispiel geeählt.

von 🐧 DPA 🐧 (Gast)


Lesenswert?

Egon D. schrieb:
> 🐧 DPA 🐧 schrieb:
>
>> Normalerweise bin ich ja kein fan von bitfields, aber
>> bits reversen ist lästig. Da würde ich die dann doch
>> nehmen, und das Optimieren dem Compiler überlassen:
>
> Und Du glaubst, das wird schneller als
> b = ((b * 0x80200802ULL) & 0x0884422110ULL) * 0x0101010101ULL >> 32;

Ok, multiplizieren ist etwas schneller bei x86: 
https://godbolt.org/z/a1Ph37ffW

Aber auch wenn ich selbst Assembler geschrieben hätte wäre ich nicht auf 
die Idee gekommen.

Man könnte jetzt im build script ein benchmark einbauen, um eine 
Variante auszuwählen, oder alternativ je nach Architekturen in den build 
scripts hinterlegen, welche Variante besser ist. Aber das ist dann doch 
Overkill.

von Egon D. (Gast)


Lesenswert?

🐧 DPA 🐧 schrieb:

> Aber auch wenn ich selbst Assembler geschrieben hätte
> wäre ich nicht auf die Idee gekommen.

Bin ich auch nicht. Das stammt von den "bit twiddling hacks".


> Man könnte jetzt im build script ein benchmark einbauen,
> um eine Variante auszuwählen, oder alternativ je nach
> Architekturen in den build scripts hinterlegen, welche
> Variante besser ist. Aber das ist dann doch Overkill.

Warum eigentlich? Solche Grundoperationen können schon in
der bestmöglichen Variante zur Verfügung stehen, finde ich.
Man will ja das Rad nicht jedesmal neu erfinden...

von Εrnst B. (ernst)


Lesenswert?

Für den AVR:
https://gcc.gnu.org/onlinedocs/gcc/AVR-Built-in-Functions.html

__builtin_avr_insert_bits (0x01234567, bits, val)

wird zu
1
        bst r0,1
2
        bld r18,7
3
        bst r0,2
4
        bld r18,6
5
        bst r0,3
6
        bld r18,5
7
        bst r0,5
8
        bld r18,3
9
        bst r0,6
10
        bld r18,2
11
        bst r0,7
12
        bld r18,1

von (prx) A. K. (prx)


Lesenswert?

Εrnst B. schrieb:
> Für den AVR:

Haben deine Bytes nur 6 Bits? ;-)
Die Zeilen oben drüber gehören auch dazu:
1
lsl r18
2
adc r18,__zero_reg__
3
mov __tmp_reg__,r18
4
...

von Εrnst B. (ernst)


Lesenswert?

(prx) A. K. schrieb:
> Haben deine Bytes nur 6 Bits? ;-)

Der Codeabschnitt für die 6 Bits schaut halt so schön regelmäßig und 
geordnet aus...
Konnte ja nicht ahnen, dass hier jemand nachzählt :)

: Bearbeitet durch User
von rbx (Gast)


Lesenswert?

🐧 DPA 🐧 schrieb:
> Aber auch wenn ich selbst Assembler geschrieben hätte wäre ich nicht auf
> die Idee gekommen.
>
> Man könnte jetzt im build script ein benchmark einbauen, ..

Man könnte beim Intel auch mal schauen, wie weit man hier mit LEA kommt. 
Oder mit den CPU-Erweiterungen. Die sind zwar oft mit Speicheraufruf 
verbunden, wie auch die FPU - aber  man kann auch Sachen machen, die der 
C oder ähnlich Compiler vermutlich eh nicht kann. Aber LEA geht schon 
mit Compiler. Ist aber auch alles ein wenig Übungsache.
Überhaupt ist man, wenn man so ein Forum mit Top-Leuten kennt, wenn es 
mal drauf ankommt, gar nicht so allein mit Fragen zum Code.

Vor allem auch deswegen, weil Assembler nur eine Möglichkeit ist, ein 
Programm schneller oder kleiner zu machen. Der wahre Hintergrund für 
bessere Programme ist aber Know How und Hingabe, nicht irgendeine 
Programmierhilfe.

Früher war der Gedanke verbreitet, der Computer macht die Musik. Das ist 
aber nur ein Irrglaube, eine Täuschung.

von Daniel A. (daniel-a)


Lesenswert?

Egon D. schrieb:
>> Man könnte jetzt im build script ein benchmark einbauen,
>> um eine Variante auszuwählen, oder alternativ je nach
>> Architekturen in den build scripts hinterlegen, welche
>> Variante besser ist. Aber das ist dann doch Overkill.
>
> Warum eigentlich? Solche Grundoperationen können schon in
> der bestmöglichen Variante zur Verfügung stehen, finde ich.
> Man will ja das Rad nicht jedesmal neu erfinden...

Die diversen build tools (make, cmake, automake, meson) haben das noch 
nicht fertig eingebaut. Es gibt Wege, das dort selbst einzubauen, aber 
das ist aufwändig, und die meisten Entwickler wollen sich nicht all zu 
sehr mit den Buid Tools herumschlagen.

Ich habe als Beispiel in make mal etwas herum experimentiert, wie so 
etwas aussehen könnte: 
https://github.com/Daniel-Abrecht/test-variouse-make-stuff

Es ist bei weitem nicht perfekt, einiges fehlt noch, aber gibt eine 
grobe Idee, was man so alles machen könnte.

von Patrick L. (Firma: S-C-I DATA GbR) (pali64)


Lesenswert?

Mal noch eine Frage um da nochmals Nachzuhaken.
Welchen CPU verwendest du überhabt?

Ich habe grad heute in einer Software genau das Bit-spiegeln 
gebraucht(war für eine Tastatur-abfrage).

Glücklicherweise habe ich einen µP Verwendet der ein "LEA" Coprozessor 
onboard hat, der ist speziell für Filter,DSP, FFT Funktionen.
Da gibt es doch tatsächlich ein befehl für genau dies mit 8/16 oder 32 
Bit macht.
1
msp_cmplx_bitrev_q15    Complex bit-reversal function
2
msp_cmplx_bitrev_iq31   Complex bit-reversal function

von (prx) A. K. (prx)


Lesenswert?

Bitreverse wird für FFTs benötigt. Bei dafür gebauten Prozessoren ist 
eine entsprechende Operation daher verbreitet.

von Computer-Spezialist (Gast)


Lesenswert?

Peter B. schrieb:
> Wusste nicht , das es so ein Krampf ist mit den Bit im Byte zu tauschen.
Das ist im Grunde kein Problem.
Also für die meisten nicht.
Für einige offenbar schon.

von Patrick L. (Firma: S-C-I DATA GbR) (pali64)


Lesenswert?

Computer-Spezialist schrieb:
> Also für die meisten nicht.
> Für einige offenbar schon.

Problem ist es nicht, aber wenn ich dass als Programm schreibe erkennt 
der IAR C Kompiler dies nicht selbstständig, dass man ja den LEA-Core 
dazu "missbrauchen" kann und "Bastelt" eine Ruine die sage und schreibe 
65 Cycles braucht, das hat mich genervt und an den Thread hier gedacht.
Habe dann einfach die Daten ans richtige LEA Register übergeben und kann 
das Reversebyte dann abholen. braucht noch 6 Cyclen für 16 Bit!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.