Cache line padding oder alignment



  • Salvete,

    ich hoffe, dass dies hier das richtige Unterforum ist für meine Frage:

    Ich brauche für eine schnelle Multithreading-Queue ein Alignment für die Cachelines, um false sharing zu vermeiden. Nun bin ich mir unsicher, ob ich
    a) CacheLine padding
    oder
    b) Direkt das alignment mit Hilfe des gnu-gcc Attributes

    __attribute__( (aligned(constCacheLineSize)) )
    

    für die Knoten der Queue verwenden soll. Hat jemand eine Idee, ob b) ineffektiver als a) ist? Ist zumindest meine Vermutung...

    Danke für Hilfe,
    G.



  • bin mir jetzt nicht sicher aber abhängig von der größe deiner structs würd ichs eher mal weglassen. bei kleinen structs verschwendest unendlich viel speicher...
    das sicherste ist es einfach mal selbst zu messen.



  • gilgamash schrieb:

    ich hoffe, dass dies hier das richtige Unterforum ist für meine Frage:

    Könnte man durchaus auch stehen lassen, aber ich glaube, dass Dir in Rund um die Programmierung eher weitergeholfen werden wird. Extrem unixspezifisch ist die Frage ja nicht.

    Ich verschiebe Dich mal.



  • Dieser Thread wurde von Moderator/in nman aus dem Forum Linux/Unix in das Forum Rund um die Programmierung verschoben.

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

    Dieses Posting wurde automatisch erzeugt.



  • Pfuh, da traue ich mich jetzt keinen Tip abgeben.

    Alignment eines Typ T inkludiert Padding (sonst passt das Alignment in Arrays ja nicht mehr), führt allerdings in structs wo T als Member verwendet wird evtl. zu zusätzlichem Padding, was noch mehr Speicher frisst. Was zu mehr Cache Verwendung führt, was das Programm ab einem gewissen Punkt langsamer macht.

    Der Nachteil von nur Padding dagegen ist, dass False-Sharing dadurch nicht so effektiv unterdrückt wird wie durch Alignment.

    Ich muss mich also __-- anschiessen: probier es aus.



  • Salvete und danke für eure Nachrichten, werde wohl um ein paar Tests nicht drumherumkommen.

    Eine andere Überlegung hat sich eben bei mir eingeschlichen:

    Die von mir verwendete Datenstruktur ist eine intrusive Queue, bei welcher die zu speichernden Elemente schon von Seite der Producer aus im Speicher allokiert sind. Nun frage ich mich:

    Wenn ich die Datenelemente hier aligne (sind allerdings auch structs), sind dann Pointer auf diese auch automatisch aligned?

    Gruß und Dank für erneute Hilfe,
    G.


Anmelden zum Antworten