Comment puis-je démontrer aux étudiants la facilité d'utilisation de likely
et de unlikely
indices de compilateur (__builtin_expect
)? Pouvez-vous écrire un exemple de code, qui sera plusieurs fois plus rapide avec ces conseils comparant le code sans indices.exemple d'apprentissage des indices de compilateur probables() et peu probables (
Répondre
Voici celui que j'utilise, une mise en œuvre très inefficace des nombres de Fibonacci:
#include <stdio.h>
#include <inttypes.h>
#include <time.h>
#include <assert.h>
#define likely(x) __builtin_expect((x),1)
#define unlikely(x) __builtin_expect((x),0)
uint64_t fib(uint64_t n)
{
if (opt(n == 0 || n == 1)) {
return n;
} else {
return fib(n - 2) + fib(n - 1);
}
}
int main(int argc, char **argv)
{
int i, max = 45;
clock_t tm;
if (argc == 2) {
max = atoi(argv[1]);
assert(max > 0);
} else {
assert(argc == 1);
}
tm = -clock();
for (i = 0; i <= max; ++i)
printf("fib(%d) = %" PRIu64 "\n", i, fib(i));
tm += clock();
printf("Time elapsed: %.3fs\n", (double)tm/CLOCKS_PER_SEC);
return 0;
}
Pour démontrer, en utilisant GCC:
~% gcc -O2 -Dopt= -o test-nrm test.c
~% ./test-nrm
...
fib(45) = 1134903170
Time elapsed: 34.290s
~% gcc -O2 -Dopt=unlikely -o test-opt test.c
~% ./test-opt
...
fib(45) = 1134903170
Time elapsed: 33.530s
A quelques centaines de millisecondes moins. Ce gain est dû à la prédiction de branchement assistée par programmateur.
Mais maintenant, pour ce que le programmeur doit vraiment faire au lieu:
~% gcc -O2 -Dopt= -fprofile-generate -o test.prof test.c
~% ./test.prof
...
fib(45) = 1134903170
Time elapsed: 77.530s /this run is slowed down by profile generation.
~% gcc -O2 -Dopt= -fprofile-use -o test.good test.c
~% ./test.good
fib(45) = 1134903170
Time elapsed: 17.760s
Avec le profilage d'exécution assistée par le compilateur, nous avons réussi à réduire des 34.290s originaux à 17.760s. Beaucoup mieux qu'avec une prédiction de branche assistée par programmeur!
l'utilisation du profil est la bonne option, mais je dois démontrer «probable» et «peu probable» – osgx
aah, tm = -clock(); tm + = clock(); est belle, je ne l'ai pas vu avant, merci! –
Je pense que ce que cela démontre est que "probable" et "improbable" ne sont pas très utiles. Aussi peut-être que c'est une implémentation vraiment mauvaise de 'fib()' ... –
- 1. Fractionner les limites probables des mots anglais
- 2. Obtention de la densité de données probables
- 3. Utilisation des nombres premiers probables BigInteger de Java
- 4. Module Python pour extraire les dates probables des chaînes?
- 5. Quelles sont les questions d'entrevue SSIS probables pour un débutant?
- 6. Des macros probables/improbables peuvent-elles être utilisées dans le code d'espace utilisateur?
- 7. Quelles sont les causes les plus probables des erreurs Javascript dans IE8?
- 8. Détecter les mots les plus probables du texte sans espaces/mots combinés
- 9. Comment parcourir les résultats probables de l'historique dans un shell Unix en utilisant CTRL-R?
- 10. Problèmes probables liés à l'exécution d'une application flexible/swf en mode local
- 11. Quelles sont les raisons les plus probables pour lesquelles une application échouerait sur un seul de mes serveurs?
- 12. SQL Timeout et les indices
- 13. Test unitaire des indices Lucene
- 14. Suppression de tableau PHP et ayant des indices ajustés
- 15. Accès: Les noms des indices
- 16. Indices et performances de l'ensemble imbriqué
- 17. Hudson continue d'échouer avec Phing ET Ant. Des indices?
- 18. Indices explosifs?
- 19. Indices et collections plafonnées avec MongoMapper
- 20. MySQL: Utilisation des indices UNION subselects
- 21. Exemple de 'volatile' empêchant une optimisation du compilateur en C#?
- 22. Des indices sur le crash "SIGSEGV"?
- 23. Ordre du compilateur et des attributs JAXB
- 24. Comment obtenons-nous des indices pour glDrawElements()?
- 25. Indices SQL Server statiques
- 26. CSS z-indices
- 27. Les indices de couverture remplacent-ils en toute sécurité les plus petits indices de couverture?
- 28. uint comme indices
- 29. Empêcher l'impression() de sortie des indices de liste dans R
- 30. ASP.NET MVC ViewData (en utilisant les indices)
http://kerneltrap.org/node/4705 –
@ T.J. Crowder, oui. mais je veux un exemple de programme dans lequel les étudiants peuvent sentir la différence, ne pas le lire en assembleur. – osgx
@osgx: Vous n'obtiendrez pas un tel échantillon, car il n'y a pas de différence à ressentir. C'est le pire, le plus laid type de micro-optimisation inutile. –