Compiler Ordering Barrier | Einigermaßen portable Implementierung



  • Samstagmorgen, Zeit ein wenig Forschung zu betreiben 😉

    Ich würde gerne eine einigermaßen portable Implementierung einer "Compiler Barrier" umsetzen. Um es anders auszudrücken, ich möchte den Compiler davon abhalten die "Program Order" aus Optimierungsgründen zu verändern.

    Ich weiß, dass es dafür bei verschiedenen Compiler unterschiedliche Intrinsics gibt (z.B. MSCVER _XXXBarrier oder GCC __sync_XXX) allerdings ist das natürlich wenig schön.

    Das Qprof project verwendet für das Define "AO_compiler_barrier" unter dem MSC "__asm {}". Einen leeren Inline Assembler Block also. Die Frage wäre: Reicht das wirklich aus und wie reagieren die anderen Compiler darauf?



  • Scheint so. Ich les mich da auch grade rein, und guck mal:

    http://www.niallryan.com/node/138 schrieb:

    Sometimes the barrier can be implicit - an inline assembly block will also function as a barrier on most compilers, ...

    Nur ob damit jetzt auch ein leerer Block gemeint ist...



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x) in das Forum Compiler- und IDE-Forum verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • InfoPlx schrieb:

    Nur ob damit jetzt auch ein leerer Block gemeint ist...

    Danke für deine Antwort. Ich hab's inzwischen selbst rausgefunden: Hier mal ein Ausschnit aus der Thread Building Blocks - Library von Intel:

    #if defined(__INTEL_COMPILER)
    #define __TBB_release_consistency_helper() __asm { __asm nop }
    #elif _MSC_VER >= 1300
    extern "C" void _ReadWriteBarrier();
    #pragma intrinsic(_ReadWriteBarrier)
    #define __TBB_release_consistency_helper() _ReadWriteBarrier()
    #else
    #error Unsupported compiler - need to define __TBB_release_consistency_helper to support it
    #endif
    

    So ähnlich werde ich es auch machen.


Anmelden zum Antworten