Direktes Registermapping unter x64 in C



  • Ahoy, Leute.

    Ich schreibe derzeit eine virtuelle Maschine für eine ältere RISC-Plattform für die x64-Architektur (x86 soll nicht supported werden), in der die Genauigkeit und Leistung der Maschine in Software eine Rolle spielt. Die Maschine besteht aus meheren Prozessoren, die untereinander immer synchronisiert werden müssen, sodass ich mir nicht sicher bin, ob ich zur besseren Flußkonstrolle die Ausführung in einen Thread packen soll oder ob ich doch lieber mehrere Threads verwende, die dann synchronisiert werden ... sei's drum.

    Mein Hauptanliegen ist: jeder Prozessor - und damit auch jeder Software-Thread in meiner VM (Hybrid-Thread btw, d.h. wird vom Kernel gescheduled und kann daher parallel laufen) - wurde mit eigenen Registern ausgeliefert, in welche reingeschrieben werden konnten. Ich könnte den Speicher der Register, der in der virtuellen Maschine verwendet werden soll, auch im Hauptspeicher auslagern, aber dies wäre bei zeitkritischeren Aufgaben ein bisschen langsam, glaube ich, rein von der Logik her, dass ein gewisser Prozentsatz an Cycles bei Hauptspeicherzugriffen eigentlich unnötig ist. x64 besitzt viele freie 64-Bit-Register, mit der ich die RISC-Register von damals direkt in Hardware implementieren könnte.

    Meine Fragen:

    1. Allein von eurer bisherigen Erfahrung her, hört sich das nach einen soliden Konzept an, oder eher nach crackpot-Plan, und ich soll gefälligst den Speicher der Register im Hauptspeicher übernehmen anstatt jetzt eine Präprozessor-Mapping-API zu schreiben?
    2. Wenn 1 eine gute Idee ist: wie könnte ich dem Compiler mitteilen, welcher Thread welche freien Register belegt? Bisher habe ich nur ermitteln können, dass man hierfür das register -Schlüsselwort verwendet, und dass es sich hierbei um eine Empfehlung wie bei inline handelt, und jemand wird es sich nicht nehmen lassen und jetzt schreiben, dass das auch eine gute Idee ist, nicht direktes Registermapping zu machen und dass man sich dabei öfter in den Fuss schießt, als dass es nutzen bringt. Und ein anderer wird fragen, wieso ich diese Fragen stelle, wenn ich die Antworten doch bereits kenne ... einfach weil ich sichergehen will, dass ich auf dem Holzweg bin und es garantierterweise keinen anderen, ordentlichen Weg gegeben hätte.



  • Wow - keine Antwort. Hatte keiner Bock/Sicherheit genug, mir zu antworten, oder habe ich den Post falsch gestellt?

    Für diejenigen, die in der Zukunft das gleiche Problem haben: wenigstens der GCC kennt einen Shortcut über Inline-Assembler:

    register long rsp asm volatile("rsp");
    

    Kuckst du hier noch mehr.

    Wenn jemand aber noch eine bessere Idee hat oder was einwerfen will, ich werd gelegentlich noch mal hier rein blinzeln.


  • Mod

    dachschaden schrieb:

    Wow - keine Antwort. Hatte keiner Bock/Sicherheit genug, mir zu antworten, oder habe ich den Post falsch gestellt?

    Ein bisschen beides:
    -Die Frage ist extrem speziell. Selbst wenn jemand eine Vermutung hat, hat er wohl kaum eine Chance, diese zu testen.
    -Die meisten dürften wohl die Vermutung gehabt haben "in Standard-C geht das jedenfalls nicht". Die Frage wäre vielleicht im Assembler- oder RudP-Subforum besser aufgehoben gewesen.



  • Ohne dir auf die Füße treten zu wollen, aber du bist Moderator. 🙂 Wenn du der Meinung warst, dass der Thread in einem anderen Subforum besser aufgehoben gewesen wäre - wieso hast du ihn dann nicht verschoben? Dann hätten eindeutige C-Leute ihn immer noch gesehen, und in dem entsprechenden Subforum hätte man auch Bescheid gewusst.


Anmelden zum Antworten