2010-08-14 37 views

Répondre

2

rmb() et wmb() sont les fonctions du noyau Linux. Il y a aussi mb(). Les instructions x86 sont lfence, sfence et mfence, IIRC.

+0

rmb() et wmb sont des macros dans le code d'assemblage plutôt que des fonctions. Je veux juste voir comment gcc va optimiser ceci si aucune barrière n'est définie. – schemacs

+1

Si vous voulez être particulièrement paranoïaque, vous pouvez utiliser 'asm volatile (" quelquechose "::: memory);' qui indique à GCC que des adresses mémoire arbitraires peuvent avoir été clobées. Je ne pense pas qu'émettre les instructions est nécessairement suffisant si une charge est mise en cache dans un registre par GCC. –

0

Il y a un fichier particulier dans l'exécution Cilk vous trouverez peut-être intéressant à savoir CILK-sysdep.h où il contient des correspondances spécifiques du système w.r.t barrières de mémoire. J'extrais une petite section w.r.t ur question sur x86 à savoir i386

 
    file:-- cilk-sysdep.h (the numbers on the LHS are actually line numbers) 

    252  * We use an xchg instruction to serialize memory accesses, as can 
    253  * be done according to the Intel Architecture Software Developer's 
    254  * Manual, Volume 3: System Programming Guide 
    255  * (http://www.intel.com/design/pro/manuals/243192.htm), page 7-6, 
    256  * "For the P6 family processors, locked operations serialize all 
    257  * outstanding load and store operations (that is, wait for them to 
    258  * complete)." The xchg instruction is a locked operation by 
    259  * default. Note that the recommended memory barrier is the cpuid 
    260  * instruction, which is really slow (~70 cycles). In contrast, 
    261  * xchg is only about 23 cycles (plus a few per write buffer 
    262  * entry?). Still slow, but the best I can find. -KHR 
    263  * 
    264  * Bradley also timed "mfence", and on a Pentium IV xchgl is still quite a bit faster 
    265  * mfence appears to take about 125 ns on a 2.5GHZ P4 
    266  * xchgl apears to take about 90 ns on a 2.5GHZ P4 
    267  * However on an opteron, the performance of mfence and xchgl are both *MUCH MUCH BETTER*. 
    268  * mfence takes 8ns on a 1.5GHZ AMD64 (maybe this is an 801) 
    269  * sfence takes 5ns 
    270  * lfence takes 3ns 
    271  * xchgl takes 14ns 
    272  * see mfence-benchmark.c 
    273  */ 
    274  int x=0, y; 
    275  __asm__ volatile ("xchgl %0,%1" :"=r" (x) :"m" (y), "0" (x) :"memory"); 
    276 } 

Ce qui m'a plu à ce sujet est le fait que xchgl semble être plus rapide :) mais vous devriez vraiment les mettre en œuvre et vérifier.

+0

Plus rapide sur un P6? mfence est plus rapide que xchg sur AMD64. – doug65536

0

Vous ne dites pas exactement ce verrouillage et de déverrouillage sont dans ce code. Je présume qu'ils sont des opérations de mutex. Sur powerpc fonction acquire mutex utilisera un iSync (sans laquelle le matériel peut évaluer votre if (! Pinst) avant que le verrou()), et aura un lwsync (ou synchronisation si votre implémentation mutex est ancienne) dans le déverrouillage() .

Donc, en supposant que tous vos accès (lecture et écriture) à Pinst sont gardés par votre serrure et déverrouiller votre utilisation des méthodes de barrière est redondante. Le déverrouillage aura une barrière suffisante pour s'assurer que le magasin pInst est visible avant la fin de l'opération de déverrouillage (de sorte qu'il sera visible après l'acquisition d'un verrou ultérieur, en supposant que le même verrou est utilisé).

sur x86 et x64 votre serrure() utilisera une certaine forme de BLOCAGE préfixé instruction, qui a automatiquement le comportement d'escrime bidirectionnelle. Votre déblocage sur x86 et x64 doit uniquement être une instruction de stockage (à moins que vous n'utilisiez certaines instructions de chaînes spéciales dans votre CS, auquel cas vous aurez besoin d'un SFENCE).

Le manuel:

http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325462.pdf

a de bonnes informations sur toutes les clôtures, ainsi que les effets du préfixe LOCK (et quand cela est sous-entendu).

ps. Dans votre code de déverrouillage, vous devrez également avoir quelque chose qui impose la commande du compilateur (donc s'il s'agit d'un magasin zéro, vous aurez besoin de quelque chose comme le style GCC asm _ volatile _ ("" ::: "Mémoire") ​​).