2008-11-07 8 views
7

Je cherche des choses comme la réorganisation du code qui pourrait même casser le code dans le cas d'un processeur multiple.Quelles sont les astuces qu'un processeur utilise pour optimiser le code?

+0

Pourriez-vous s'il vous plaît mettre à jour cette phrase sous la forme d'une question? –

+0

Voulez-vous dire le compilateur? Parce que vous aurez des réponses très différentes ... –

+0

Quel complier? Quelle plateforme? –

Répondre

0

Wikipedia a une liste assez complète des techniques d'optimisation here.

+3

+0: Cela répond à la façon dont les compilateurs optmisent le code, pas comment les processeurs le font. –

0

Oui, mais quelle est exactement votre question?

Cependant, puisqu'il s'agit d'un sujet intéressant: les astuces que les compilateurs et les processeurs utilisent pour optimiser le code ne doivent pas casser le code, même avec plusieurs processeurs, en l'absence de conditions de concurrence dans ce code. C'est ce qu'on appelle la garantie de cohérence séquentielle: si votre programme n'a pas de conditions de course, et que toutes les données sont correctement verrouillées avant d'y accéder, le code se comportera comme s'il était exécuté séquentiellement.

Il y a une vidéo vraiment bien de Herb Sutter parle de cette ici:

http://video.google.com/videoplay?docid=-4714369049736584770

Tout le monde devrait regarder ce :)

13

Le plus important serait le réordonnancement de l'accès à la mémoire. En l'absence de clôtures de mémoire ou d'instructions de sérialisation, le processeur est libre de réorganiser les accès mémoire. Certaines architectures de processeur ont des restrictions sur combien ils peuvent réorganiser; L'alpha est connu pour être le plus faible (c'est-à-dire celui qui peut le plus réordonner).

Un très bon traitement du sujet peut être trouvé dans la documentation source du noyau Linux, au Documentation/memory-barriers.txt.

La plupart du temps, il est préférable d'utiliser des primitives de verrouillage de votre compilateur ou de votre bibliothèque standard; ceux-ci sont bien testés, devraient avoir toutes les barrières de mémoire nécessaires en place, et sont probablement assez optimisés (l'optimisation des primitives de verrouillage est délicate, même les experts peuvent parfois se tromper).

+0

Question connexe: http://stackoverflow.com/questions/286629/what-is-mean-by-memory-fences – CesarB

0

La réponse de DavidK est correcte, mais il est également très important d'être conscient du modèle de mémoire pour votre langue/exécution. Même sans conditions de concurrence et avec la consistance séquentielle et l'utilisation du mutex, votre code peut encore casser lorsque les données sont mises en cache par différents threads s'exécutant dans les différents cœurs du CPU. Certaines langues, Java par exemple, assurent l'état des données entre les threads lorsqu'un verrou mutex est utilisé, mais il suffit rarement de s'assurer que deux threads ne peuvent pas accéder aux données en même temps. Vous devez utiliser le mutex de manière correcte pour vous assurer que l'exécution de la langue synchronise l'état des données entre les deux threads. En Java, cela se fait en synchronisant les deux threads sur le même objet.

Voici une bonne page expliquant le problème et comment il est traité dans le modèle de mémoire javas.

http://gee.cs.oswego.edu/dl/cpj/jmm.html

Questions connexes