Question

Selon Intel 64 et IA-32 Architectures Logicielles Manuel de développeur LOCK Prefix Signal « Les assure que le processeur a l'usage exclusif d'une mémoire partagée alors que le signal est affirmé ». Cela peut être sous la forme d'un verrou de bus ou le cache.

Mais - et c'est la raison pour laquelle je pose cette question -. Il est clair pour moi, si ce préfixe fournit également une barrière de mémoire

Je développe avec MSNA dans un environnement multi-processeur et de mettre en œuvre des opérations besoin atomiques avec option d'acquérir et / ou la sémantique de libération.

Alors, dois-je utiliser le MFENCE, les instructions SFENCE et LFENCE ou serait-ce superflu?

Était-ce utile?

La solution

Non, il n'y a pas besoin d'instructions d'utilisation MFENCE, SFENCE and LFENCE en relation avec préfixe LOCK.

instruction de MFENCE, SFENCE and LFENCE garantie la visibilité de la mémoire dans tous les cœurs de processeur. En exemple, l'instruction MOV ne peut pas être utilisé avec préfixe LOCK, afin d'être sûr que grâce au passage de la mémoire est visible à tous les cœurs de processeur, nous devons nous assurer que le cache du processeur est rincée à la RAM et que nous parvenions à des instructions de clôture.

EDIT: plus sur du manuel Intel verrouillé opérations atomiques:

BLOQUE LES OPÉRATIONS ATOMIQUE

Le 32 bits IA-32 processeurs prennent en charge atomique verrouillés les opérations sur les emplacements dans le système Mémoire. Ces opérations sont généralement utilisé pour gérer les structures de données partagées (Tels que les sémaphores, le segment descripteurs, des segments du système, ou à la page tables) dans lesquels deux ou plusieurs processeurs peuvent essayer simultanément modifier le même domaine ou un drapeau. le processeur utilise trois interdépendants mécanismes pour la mise en lock-out opérations atomiques:

• Les opérations atomiques garanties

• Verrouillage bus, en utilisant le signal LOCK # et le préfixe instruction LOCK

• Les protocoles qui assurent la cohérence du cache que les opérations atomiques peuvent être effectuées sur les structures de données mises en cache (verrouillage du cache); ce mécanisme est présent dans le Pentium 4, Intel Xeon et les processeurs de la famille P6

Ces mécanismes sont interdépendants de la manière suivante. certains de base des transactions de mémoire (telles que la lecture ou l'écriture d'un octet dans la mémoire système) sont toujours garantis à traiter atomiquement. C'est, une fois commencé, le garantit que le processeur opération sera terminée avant un autre agent de traitement ou de bus est accès autorisé à l'emplacement de la mémoire. Le processeur supporte également le bus de verrouillage pour effectuer une mémoire sélectionnée les opérations (par exemple un opération de lecture-modification-écriture dans un espace commun de la mémoire) qui typiquement doivent être traitées atomiquement, mais sont ne sont pas manipulés automatiquement de cette façon. Parce que la mémoire fréquemment utilisée les emplacements sont souvent mises en cache dans un de traitement des caches L1 ou L2, atomique les opérations peuvent souvent être effectuées à l'intérieur des caches d'un processeur sans affirmant le verrou de bus. Ici le Les protocoles de cohérence du cache du processeur assurer que les autres processeurs qui sont mise en cache des mêmes emplacements de mémoire sont géré correctement pendant atomique les opérations sont effectuées sur mises en cache des emplacements de mémoire.

Autres conseils

Non les manuels IA32 (Volume 3A, chapitre 8.2: Commande de mémoire ).

lecture ou d'écriture ne peut pas être réorganisés avec des instructions d'E / S, verrouillé instructions , ou les instructions sérialisation.

Par conséquent, une instruction de clôture n'est pas nécessaire avec des instructions verrouillées.

problème se produit encore quand intel_lock1.c (disponible à l'adresse ci-dessus) est compilé sous Linux avec GCC 5 ou 7 sans qu'aucun des s -D_WITH_CLFLUSH_ 'les arguments ou « -D_WITH_HLE_ » (de sorte que ni CLFLUSH * ni XACQUIRE sont utilisés ELH) - l'assembleur mutex_lock ressemble maintenant à:

# 74 "intel_lock1.c" 1
    LFENCE
    lock subl   $1, lck(%rip)
    rep nop
    SFENCE

Alors, je suis en train de remplacer {L, S} avec MFENCE BARRIÈRE.

Je ne comprends toujours pas comment deux fils peuvent se retrouver avec la même -1 * valeur LCK bien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top