Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: OsDevNewbie am 29. June 2013, 17:01

Titel: SSE benutzen
Beitrag von: OsDevNewbie am 29. June 2013, 17:01
Hallo liebe Community,
die FPU kann ja Zahlen Potenzieren. Da aber die FPU nicht gerade schnell ist, dachte ich man könnte ja die schnellere SSE- oder sogar AVX-Einheit verwenden. Ist dies denn möglich?
Titel: Re: SSE benutzen
Beitrag von: OsDevNewbie am 16. July 2013, 22:49
Ist dies nihct möglich?
Titel: Re: SSE benutzen
Beitrag von: Martin Erhardt am 16. July 2013, 23:44
Ist dies nihct möglich?
http://wiki.osdev.org/SSE
sowie chapter 11.3 in den AMD und 9.6 in den Intel Manuals. AVX ist allerdings nicht gut dokumentiert.
Titel: Re: SSE benutzen
Beitrag von: XanClic am 17. July 2013, 02:52
Eine Liste von SSE-Befehlen (bis SSSE3) hätte ich unter http://xanclic.bplaced.net/sse.html (http://xanclic.bplaced.net/sse.html). Eine Möglichkeit zum Potenzieren kenne ich nicht.
AVX ist allerdings nicht gut dokumentiert.
Eigentlich ist AVX schon ziemlich gut dokumentiert – soweit ich weiß, erweitert es einfach die 128-Bit-XMM-Register zu 256-Bit-YMM-Registern (auf denen man dann weiterhin die SSE-Befehle ausführen kann) und führt (für zumindest einige SSE-Befehle) das drei-Operanden-Format ein, oder gibt es da sonst noch was neues?

EDIT: Hm, ja, WP sagt, es gibt auch ein paar neue Befehle, die im Allgemeinen der Behandlung der neuen oberen Hälfte der YMM-Register geschuldet sind. Die stehen aber auch alle in meinem Intelmanual.
Titel: Re: SSE benutzen
Beitrag von: Martin Erhardt am 17. July 2013, 10:44
Eine Liste von SSE-Befehlen (bis SSSE3) hätte ich unter http://xanclic.bplaced.net/sse.html (http://xanclic.bplaced.net/sse.html). Eine Möglichkeit zum Potenzieren kenne ich nicht.
AVX ist allerdings nicht gut dokumentiert.
Eigentlich ist AVX schon ziemlich gut dokumentiert – soweit ich weiß, erweitert es einfach die 128-Bit-XMM-Register zu 256-Bit-YMM-Registern (auf denen man dann weiterhin die SSE-Befehle ausführen kann) und führt (für zumindest einige SSE-Befehle) das drei-Operanden-Format ein, oder gibt es da sonst noch was neues?

EDIT: Hm, ja, WP sagt, es gibt auch ein paar neue Befehle, die im Allgemeinen der Behandlung der neuen oberen Hälfte der YMM-Register geschuldet sind. Die stehen aber auch alle in meinem Intelmanual.
stimmt schon aber ich dachte jetzt eher an die Initialisierung von AVX(auch wenn OsDevNewbie das vielleicht nicht primär gemaint hat :) ); Oder wird AVX auch gleichzeitig aktiviert wenn SSE initialisiert wird?
Titel: Re: SSE benutzen
Beitrag von: OsDevNewbie am 17. July 2013, 15:24
Warum muss man denn SSE oder AVX initialisieren? Mein Kernel initialisiert nur die FPU aber SSE nicht und die Programme können SSE ohne Probleme verwenden.
Titel: Re: SSE benutzen
Beitrag von: Martin Erhardt am 17. July 2013, 16:05
Warum muss man denn SSE oder AVX initialisieren? Mein Kernel initialisiert nur die FPU aber SSE nicht und die Programme können SSE ohne Probleme verwenden.
Nunja eigentlich löst eine SSE Instruktion einen #UD Undefined Opcode aus, wenn nicht entsprechende bits in CR0 (Bit 2 leeren und 1 setzen)und CR4 (Bit 9 und 10 setzen) gesetzt wurden. Allerdings sehe ich hier http://wiki.osdev.org/FPU (http://wiki.osdev.org/FPU) dass man bei der FPU dasselbe machen muss, du SSE also schon mitinitialisiert hast.
Titel: Re: SSE benutzen
Beitrag von: XanClic am 17. July 2013, 16:39
Warum muss man denn SSE oder AVX initialisieren? Mein Kernel initialisiert nur die FPU aber SSE nicht und die Programme können SSE ohne Probleme verwenden.
Zumindest ein Programm zu einem Zeitpunkt. Wenn man FPU/SSE erlaubt, muss man beim Taskwechsel ggf. darauf achten, den Zustand der FP- bzw. XMM-Register zu sichern (fxsave/fxrestor). Wie man die obere Hälfte der YMM-Register sichert, weiß ich nicht.
Titel: Re: SSE benutzen
Beitrag von: Martin Erhardt am 17. July 2013, 17:05
Warum muss man denn SSE oder AVX initialisieren? Mein Kernel initialisiert nur die FPU aber SSE nicht und die Programme können SSE ohne Probleme verwenden.
Zumindest ein Programm zu einem Zeitpunkt. Wenn man FPU/SSE erlaubt, muss man beim Taskwechsel ggf. darauf achten, den Zustand der FP- bzw. XMM-Register zu sichern (fxsave/fxrestor). Wie man die obere Hälfte der YMM-Register sichert, weiß ich nicht.
In den Intel Manuals in 13.10.1 und .2 steht wie man AVX aktiviert. Man muss wohl zusätzlich bit 18 in cr4 setzen(CR4.OSXSAVE), um dann XSETBV auszuführen wobei EDX=0x0 und EAX=7 seien sollte. Dann wird mit fxstor und fxrestor auch die obere Hälfte von ymm gesichert und erst wenn man das so getan hat, kann man AVX Instruktionen ausführen, womit ich meine eigene Frage beantwortet hätte :D
Titel: Re: SSE benutzen
Beitrag von: XanClic am 18. July 2013, 01:04
\o/