Assembly Intrinsics auf Itanium2



  • Hallo,

    ich hoffe, dass ich hier im richtigen Forumsteil bin, da es sich bei meinem Problem zum einen nicht um reines Assembler handelt und zum anderen noch eine Frage der Compilereinstellungen zu sein scheint.

    Ich habe einige Assembler Intrinsics in meinem Programm verwendet. Unter anderem setze ich ein Feld des floating-point status register (_Asm_fsetc), um die Rundungsrichtung zu verändern. Direkt im Anschluss möchte ich eine Gleitkommaoperation (_Asm_fnorm) ausführen, die das gerade veränderte status field nutzt.
    Abhängig vom Optimierungsmodus (-O0, -O1, -O2, -O3) des Compilers (icc) wird jedoch nicht die korrekte Rundung durchgeführt (nur bei -O0 läuft es wie gewünscht). Dies deutet für mich auf eine Änderung der Befehlsreihenfolge durch den Compiler hin. Wie kann ich sicherstellen, dass eine bestimmte Anweisung erst gestartet wird, wenn eine vorherige vollständig durchgeführt wurde?
    Und wie kann ich herausfinden, wie die genaue Befehlsreihenfolge nach dem Compilieren aussieht? Habe leider noch nie mit einem Debugger gearbeitet 😞

    Dank und Gruss,
    Heinz



  • Habe es mittlerweile mit einem

    __memory_barrier()
    

    (Intel Compiler) selbst gelöst.
    Bei GCC funktioniert es mit

    #define ia64_barrier()    asm volatile ("":::"memory")
    


  • Die GCC-Version ist aber keine echte memory barrier, weil sie ja nichts tut, außer den Compiler am Umschachteln der Befehle zu hindern. Eine echte memory barrier ist nämlich richtig langsam (100+ Zyklen).



  • Ringding schrieb:

    Die GCC-Version ist aber keine echte memory barrier, weil sie ja nichts tut, außer den Compiler am Umschachteln der Befehle zu hindern. Eine echte memory barrier ist nämlich richtig langsam (100+ Zyklen).

    Herzlichen Dank für die Info. Dann habe ich es von meiner anderen Quelle auch nicht richtig mitgeteilt bekommen. Was genau macht denn dann eine memory barrier genau? Einfach nur den Rechner mit nop-Anweisungen zu 'langweilen'? Mein Anliegen war nämlich eigentlich, nur eine Umschachtelung durch den Compiler zu verhindern. Gibt es denn auf icc-Seite auch etwas vergleichbares? Die memory barrier scheint in meinem Fall dann ja doch deutlich über das Ziel hinauszuschiessen.


Anmelden zum Antworten