Autor Thema: SSE benutzen  (Gelesen 8947 mal)

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« 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?
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #1 am: 16. July 2013, 22:49 »
Ist dies nihct möglich?
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

Martin Erhardt

  • Beiträge: 165
    • Profil anzeigen
Gespeichert
« Antwort #2 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.
« Letzte Änderung: 16. July 2013, 23:46 von Martin Erhardt »

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #3 am: 17. July 2013, 02:52 »
Eine Liste von SSE-Befehlen (bis SSSE3) hätte ich unter 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.
« Letzte Änderung: 17. July 2013, 02:57 von XanClic »

Martin Erhardt

  • Beiträge: 165
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 17. July 2013, 10:44 »
Eine Liste von SSE-Befehlen (bis SSSE3) hätte ich unter 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?
« Letzte Änderung: 17. July 2013, 11:01 von Martin Erhardt »

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #5 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.
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

Martin Erhardt

  • Beiträge: 165
    • Profil anzeigen
Gespeichert
« Antwort #6 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 dass man bei der FPU dasselbe machen muss, du SSE also schon mitinitialisiert hast.

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #7 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.

Martin Erhardt

  • Beiträge: 165
    • Profil anzeigen
Gespeichert
« Antwort #8 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

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #9 am: 18. July 2013, 01:04 »
\o/

 

Einloggen