Est-ce un binaire plus grande avec des parties de code qui ne sont pas exécutées au moment, affecter l'utilisation de la mémoire CPU niveau 2?

StackOverflow https://stackoverflow.com/questions/4662321

Question

Il semble que les processeurs fonctionnent beaucoup plus rapidement si leur L2 est pas rempli. Est-ce un programmeur être mieux de code quelque chose qui finira par être plus petit en binaire, même si certains éléments de ce code ne sont pas exécutées tout le temps? Dites, parties du code qui ne sont activés dans un fichier de configuration.

Était-ce utile?

La solution

La vérité est un peu plus complexe, je vais essayer de vous décrire.

Si vous regardez la hiérarchie de la mémoire dans un PC moderne avec un processeur multi-core, vous trouverez qu'il ya six niveaux:

  1. Le prefetcher, une pour chaque noyau (pas de latence)
  2. Le cache L1, un ou deux (combiné ou un code et des données, 2 * 64K sur     AMD K10) pour chaque noyau (par exemple de temps d'attente     trois CLKS)
  3. Le cache L2, un (512K sur AMD K10) pour chaque noyau (par exemple la latence 10)
  4. Le cache L3, un (ncores * 1 Mo sur AMD K10) par processeur utilisé par tous les noyaux (temps d'attente soit 30)
  5. RAM système, un par système utilisé par tous les processeurs (par exemple la latence 100)
  6. Synchronisation (ou verrouillage de bus), une méthode par le système utilisé par tout le contrôle du bus     dispositifs (temps d'attente au moins 300 cycles jusqu'à 1 nous si une ancienne carte PCI utilise toutes les 32 horloges disponibles quand de maîtrise de bus avec horloge à 33 MHz - sur un processeur 3 GHz Cela signifie que 3000 cycles d'horloge)

Vous ne trouvez pas le cycle compte comme exact, ils sont censés vous donner une idée des pénalités possibles encourus lors de l'exécution du code.

J'utilise la synchronisation en tant que niveau de mémoire parce que vous avez parfois besoin de synchroniser la mémoire trop et que le temps des coûts.

La langue que vous utilisez aura un grand impact sur les performances. Un programme écrit en C, C ++ ou Fortran sera plus petite et exécuter plus rapidement qu'un programme interprété comme Basic, C # et Java. C et Fortran également vous donner un meilleur contrôle lors de l'organisation de vos zones de données et l'accès au programme pour eux. Certaines fonctions dans des langages OO (C ++, C # et Java) telles que l'encapsulation et de l'utilisation des classes standard se traduira par un code plus généré.

Comment le code est écrit a aussi un impact sur la performance - bien que certaines personnes mal informées diront que les compilateurs sont si bien ces jours-ci qu'il est pas nécessaire d'écrire du bon code source. Code Great signifie des performances exceptionnelles et Garbage In entraînera toujours Garbage Out.

Dans le cadre de votre petite écriture question est généralement mieux pour la performance que ne pas se soucier. Si vous êtes habitué à coder efficacement (petit / code rapide), vous allez le faire, peu importe que vous soyez seldom- d'écriture ou des séquences souvent utilisées.

Le cache sera très probablement pas votre programme complet chargé (bien qu'il pourrait) mais de nombreux 32 ou 64 morceaux d'octets ( « lignes de cache ») de données extraites de même 32 ou adresses 64 octets dans votre code. Plus l'information dans l'un de ces morceaux est accessible plus il gardera la ligne de cache, il est assis. Si le noyau veut un morceau qui n'est pas en L1 il recherchera tout le chemin vers la RAM si nécessaire et engager horloge de pénalité cycles tout en le faisant.

Donc, en général faible, serré et les séquences de code inline exécutera plus rapidement parce que leur impact sur le cache (s) moins. Le code qui fait beaucoup d'appels vers d'autres zones de code aura un plus grand impact sur le cache, sous forme de code avec des sauts volonté non optimisés. Les divisions sont extrêmement préjudiciables, mais seulement à l'exécution du noyau en question. Apparemment, AMD est beaucoup mieux que les intel ( http://gmplib.org/~tege/x86 -timing.pdf ).

Il y a aussi la question de l'organisation des données. Ici, il est également préférable d'avoir des données souvent utilisées en résidant dans une zone physiquement petite de telle sorte que la ligne d'un cache fetch apporter plusieurs variables souvent utilisées au lieu d'un pour aller chercher (ce qui est la norme).

Lors de l'accès des réseaux de structures de données ou de données essaient de vous assurer que vous les accès de bas à des adresses de mémoire plus élevées. Encore une fois, l'accès à tous les sens aura un impact négatif sur les caches.

Enfin, il y a la technique de donner des données de prélecture-conseils au processeur afin qu'il puisse diriger les caches pour commencer l'extraction de données dans la mesure du possible avant que les données seront effectivement utilisées.

Pour avoir une chance raisonnable de uncompréhen- ces choses afin que vous puissiez les mettre à utiliser à un niveau pratique, il sera nécessaire pour vous de tester différentes constructions et le temps eux, de préférence avec le compteur rdtsc (beaucoup d'informations à ce sujet ici à stackoverflow) ou en utilisant un profileur .

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