Am 10.06.2022 um 10:39 schrieb Helmut Schellong:
> Mit der FPU x87 kann man z.B.:
>
> sin() cos() tan() cot() sec() csc()
> asin() acos() atan() acot() asec() acsc()
> sinh() cosh() tanh() coth() sech() csch()
> asinh() acosh() atanh() acoth() asech() acsch()
> sqrt() pow() log() lg() ln() ld() ilg() iln() ild()
Einiges ist bei SSE 4.1 nicht mehr dabei weil es in Software einfach
effizienter zu implementieren ist. Ich habe z.B. mal eine Sinus- bzw.
Cosinus-Berechnung mit den verbreiteten CORDIC-Algorithmus (absolut
geniale Erfindung) selbst implementiert, und das war im Endeffekt
viermal schneller als FSINCOS. Ich mein diese ganzen komplexen Opera-
tionen wie FSINCOS, FTAN etc. sind ja eh alle weitestgehend in Micro-
code realisiert, dass die eh nicht besonders schnell sind.
Es gibt auch praktisch außer x86/7 keine FPU einer anderen CPU, die
sowas in "Hardware" (letztlich ja Microcode) macht. Ganz einfach weil
die Idee einfach abwegig ist. Einzig FSQRT ist nahezu durchgänig in
Hardware realisiert weil das eben in Hardware gravierend effizienter
geht und das eine häufig gebrauchte Operation ist; und das gilt eben
entsprechend auch für die FPUs anderer CPUs.
> Nein, wenn man damit konkret gearbeitet hat, hat man den Stack schätzen gelernt.
Ach, und aus welchem Grund hat man das bei SSE, AVX & Co nicht mehr
fortgesetzt ? Ganz einfach: weil das dauernde Swappen des obersten
Stack-Elements mit anderen Elementen auf dem Stack so nicht mehr
nötig ist. Das ist für den Entwickler der noch händischen Assembler
-Code schreibt komfortabler zu nutzen, und bei einer OoO-CPU ist
das Register-Renaming viel einfacher zu implementieren, während
die Stack-Logik den Grad an instruction-level parallelism doch
deutlich begrenzt.
Ich mein früher gab es ja HPC-Systeme die noch mit 32-bittigen x86
-CPUs arbeiteten und wo die x87-FPU mangels Alternative genutzt wurde.
Ich mein "HPC" mit so einem Murks ? Da kam ich schon damals ins Stutzen.
Kompilierst Du 64-bittigen Code, so wird die x87-FPU nicht mehr genutzt.
Meines Wissens sogar nicht mehr bei 32-bittigem Code, außer Du sagst
dem Compiler händisch, dass der doch bitte die x87-FPU nutzen soll.
Die x87-FPU hatte lediglich nur den Vorteil, dass die für die häufigst
genutzten Operationen ohne Performance-Verlust mit 80 Bit Genauigkeit
rechnen konnte. Ausnahmen waren Loads und Stores, die wg. der 10-Byte
-Operationen recht langsam waren. Die meisten C/C++-Runtimes haben
das aber bei der Initialisierung auf 64 Bit abgedreht damit die Ergeb-
nisse eben kompatibler zu anderen CPUs sind.
Die x87-FPU ist eigentlich seit SSE2, also seitdem SSE doppelte Präzi-
sion kann, so gut wie kaum genutzt.