Numerik mit C++ und Assembler



  • Hi zusammen,

    ich bin neu hier und kann noch keinen Assembler, seid also milde wenn ich eine blöde Frage stelle 😉 Ich programmiere seit 1989 in verschiedenen Hochsprachen, überwiegend in C++.

    Für ein Programm, das viel mit 3D-Koordinatentransformationen rechnet, möchte ich einzelne Routinen (die in C++ bereits ausoptimiert sind) event. in Assembler formulieren. Es funktioniert zwar alles, aber schnellere Grafik schadet nie.

    Zu Zeiten des Atari ST gab es einen Precompiler für die 68881 FPU, der inline assembler für Modula-2 erzeugte. Mit dem Ding war es möglich, Hochsprachenvariablen in Prozessorregister zu schieben, dort nach Lust und Laune mit den FPU-Befehlen zu rechnen und das Ergebnis wieder zurück in die Hochsprachenvariable zu transferieren. Alles ohne detaillierte Assemblerkenntnisse. Einige damit optimierte Routinen waren dann ca. zehnmal schneller 🙂 Sowas in der Art würde für meinen Anwendungsfall ideal, aber gibt's das? Wahrscheinlich nicht, also ist Selbermachen und Lernen angesagt.

    In Tutorials und dem FAQ wird gezeigt, wie man Funktionen aufruft, die Integers als Parametertyp haben. Wie aber kriege ich da doubles rüber - muss man die per Adresse übergeben? Ist es nötig, zwischen dem Fließkommaformat von CPU und FPU zu konvertieren? Welche Register darf der Assemblercode benutzen? Als IDE benutze ich MSVC6 und würde dessen inline Assembler verwenden wollen.

    Könnt ihr mir Literatur empfehlen, die o.a. Fragen (und anderes rund um die Numerik und Assembler) beantwortet? Ein paar gute Beispiele würden mir aber auch helfen, ich beisse mich da schon durch..

    Greets,
    Tom



  • Die effekivste Lösung in Deinem Fall ist die Verwendung von Inline-Asm. Du musst Dir nur Gedanken über Deine CPU machen und damit über die Verwendung entsprechend schneller Register.



  • Wenn es um Grafik geht: Schon mal geschaut, ob dir die GPU einiges an Arbeit abnehmen kann?
    Ansonsten hat ein Compilerbauerprof zu uns mal gesagt: "Optimieren Sie lieber nicht per Hand, lassen Sie das die Profis [Compilerbauer] machen". Er meinte damit: Formuliere das Programm in der Hochsprache so gut wie möglich, und setze dann die höchste Optimierungsstufe im Compiler.
    Das soll dich nicht davon abhalten, deinen Quelltext einfach mal nach ASM zu übersetzen (gcc kann das z.b.) und dann die entsprechenden Routinen anzuschaun. Vielleicht fällt dir was auf.



  • Gib mir deinen ASM-Quelltext, wenn du ihn fertig hast, und ich optimiere, was ich weis. Oder ich gebe dir ein paar Tipps: Wenn in dem Code Konstruktionen wie

    call bla
    ret
    

    vorkommen, kannst du das in

    jmp bla
    

    ändern. Am Ende der Funktion bla steht nämlich auch ein ret, insofern kann man das ret aus der eigentlichen Funktion also löschen.
    Wenn es sich bei dem Programm um ein 32-Bit-Proggie handelt, steht am Ende immer so was wie

    push dword 0
    call ExitProc
    

    Lösch die Zeilen und setze ein einfaches ret an ihre Stelle.
    Sachen wie

    mov bla,0
    

    kannst du durch

    xor bla,bla
    

    ersetzen.
    Sachen wie

    cmp bla,0
    

    kannst du durch

    or bla,bla
    

    ersetzen. Wenn mir noch was einfällt, melde ich mich wieder.
    Tschö,
    nullplan


Anmelden zum Antworten