409 votes

macros susceptibles/improbable dans le noyau Linux

J’ai été fouiller de certaines parties du noyau Linux et trouvé des appels comme ceci :

ou

J’ai trouvé la définition d'entre eux :

Je sais qu’ils sont pour l’optimisation, mais comment ça marche ? Et combien performance/taille baisse est susceptible de les utiliser ? Et est-ce utile de la dispute (et perd la portabilité propably) au moins dans le code de goulot d’étranglement (en espace utilisateur, bien sûr).

378voto

1800 INFORMATION Points 55907

Ils sont d'une instruction pour le compilateur d'émettre des instructions qui va causer la direction de la prévision en faveur de la "probable" côté d'une instruction de saut. Cela peut être une grande victoire, si la prédiction est correcte, cela signifie que l'instruction de saut est fondamentalement libre et prendra zéro cycles. D'autre part, si la prédiction est fausse, alors cela signifie que le processeur pipeline doit être rincée et cela peut coûter plusieurs cycles. Aussi longtemps que la prédiction est correcte la plupart du temps, cela aura tendance à être bénéfique pour les performances.

Comme tous les autres d'optimisation des performances, vous ne devez le faire après de longues profilage afin de s'assurer que le code est vraiment dans un goulot d'étranglement, et probablement donné le micro de la nature, qu'il est exécuté dans une boucle serrée. Généralement les développeurs de Linux sont assez expérimentés, donc j'imagine qu'ils l'ont fait. Ils n'ont pas vraiment de trop s'occuper de portabilité, elles ne ciblent que gcc, et ils ont un très proche de l'idée de l'assemblée, ils veulent qu'elle génère.

78voto

dvorak Points 9516

Ce sont des macros qui donnent des conseils pour le compilateur sur une branche peut aller. Les macros étendre à GCC d'extensions spécifiques, si elles sont disponibles.

GCC utilise pour optimiser pour la direction de la prévision. Par exemple, si vous avez quelque chose comme ce qui suit

if (unlikely(x)) {
  dosomething();
}

return x;

Ensuite, il peut restructurer ce code à quelque chose de plus comme:

if (!x) {
  return x;
}

dosomething();
return x;

L'avantage de ceci est que lorsque le processeur prend une branche la première fois, il y a une surcharge importante, car elle peut avoir été éventuellement le chargement et l'exécution de code à l'avant. Lorsqu'il détermine qu'il va prendre la direction, puis il a à invalider, et de commencer à la direction de la cible.

La plupart des processeurs modernes ont maintenant une sorte de direction de la prévision, mais que seulement aide lorsque vous avez été par le biais de la branche, et la branche est toujours dans la direction de la prévision du cache.

Il y a un certain nombre d'autres stratégies que le compilateur et le processeur peut utiliser dans ces scénarios. Vous pouvez trouver plus de détails sur la façon de la branche prédicteurs à Wikipedia: http://en.wikipedia.org/wiki/Branch_predictor

19voto

Torsten Marek Points 27554

Le livre ce que chaque programmeur devrait connaître mémoire (p. 57) contient des explications détaillées.

11voto

moonshadow Points 28302

Ils provoquent le compilateur à émettre de la branche appropriée conseils où le matériel prend en charge. Généralement, cela signifie juste tourner un peu les bits de l'instruction opcode, de sorte que la taille du code ne changera pas. Le PROCESSEUR de commencer l'extraction des instructions de la prédite emplacement, et de vider le pipeline et de recommencer si cela s'avère être erroné lorsque la branche est atteint; dans le cas où l'indicateur est correcte, cela permettra à la direction générale beaucoup plus rapide - précisément comment beaucoup plus rapide dépendra du matériel; et combien cela affecte les performances du code dépend de la proportion du temps de l'indice est correct.

Par exemple, sur un PROCESSEUR PowerPC une unhinted direction peut prendre 16 cycles, correctement fait allusion un 8 et un tort fait allusion 24. Dans la plus intime des boucles de bonne allusion peuvent faire une énorme différence.

La portabilité n'est pas vraiment un problème - sans doute la définition est dans une per-plate-forme d'en-tête; vous pouvez simplement définir "probable" et "peu probable" n'est rien pour les plates-formes qui ne prennent pas en charge statique de la direction des conseils.

9voto

Mandeep Sandhu Points 41

Selon le kernelnewbies FAQ (et la dernière source de 3,11 noyau), les définitions de macros sont maintenant légèrement différentes :

Je suppose que cela ajoute un peu plus à la confusion ! ? :) Je ne comprends pas la nécessité d’une double pas ( `` ).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X