Question

Je recherche des choses telles que la réorganisation du code qui pourrait même le casser dans le cas d’un processeur multiple.

Était-ce utile?

La solution

Wikipedia dispose d'une liste assez complète de techniques d'optimisation ici .

Autres conseils

Le plus important serait la réorganisation des accès à la mémoire.

En l'absence de clôture de mémoire ou d'instructions de sérialisation, le processeur est libre de réorganiser les accès à la mémoire. Certaines architectures de processeurs imposent des restrictions quant au nombre de commandes qu'elles peuvent réorganiser. Alpha est connu pour être le plus faible (c’est-à-dire celui qui peut réorganiser le plus).

Vous trouverez un très bon traitement du sujet dans la documentation relative aux sources du noyau Linux, à l’adresse Documentation / memory-barrières.txt .

La plupart du temps, il est préférable d'utiliser les 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 du verrouillage des primitives est délicate; même les experts peuvent parfois s'y tromper).

Oui, mais quelle est exactement votre question?

Cependant, puisqu'il s'agit d'un sujet intéressant: les astuces utilisées par les compilateurs et les processeurs pour optimiser le code ne doivent pas rompre 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 ne présente aucune condition de concurrence critique et que toutes les données sont correctement verrouillées avant l'accès, le code se comportera comme s'il était exécuté de manière séquentielle.

Il y a une très bonne vidéo de Herb Sutter qui en parle ici:

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

Tout le monde devrait regarder ça:)

La réponse de DavidK est correcte, mais il est également très important de connaître le modèle de mémoire pour votre langue / votre environnement d’exécution. Même en l'absence de conditions de concurrence, de cohérence séquentielle et d'utilisation de mutex, votre code peut toujours être interrompu lorsque les données sont mises en cache par différents threads s'exécutant dans les différents cœurs du processeur. Certaines langues, Java par exemple, garantissent l’état des données entre les threads lorsqu’un verrou mutex est utilisé, mais il est rarement suffisant de s’assurer simplement 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 le runtime de 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 son traitement dans le modèle de mémoire javas.

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

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