6
votes

Performance décevante à Ubuntu pour la charge de travail informatique

J'ai trouvé des performances assez médiocres à exécuter du code de calcul sous Ubuntu sur une nouvelle machine de poste de travail sans tête sans tête que j'utilise pour calcul scientifique. J'ai remarqué une différence de vitesse exécutant un code légèrement complexe sur Ubuntu par rapport à mon ancien ordinateur portable Mac que j'utilise pour le développement. Cependant, j'ai réussi à le distiller à un exemple incroyablement simple qui présente encore moins que des améliorations stélaires sur mon ancienne machine: xxx pré>

maintenant, le Mac est un noyau de 2,4 GHz de près de 5 ans 2 Duo MacBook Pro exécutant OS X 10.5 qui exécute ce code dans environ 6,8 secondes. Cependant, sur une nouvelle nouvelle Core 3.4GHz Core I7 Dell exécutant Ubuntu 11.10 Il faut environ 6,1 secondes! Quelqu'un peut-il éclairer ce qui se passe ici, car il est absurde qu'un ordinateur portable de près de 5 ans soit dans 10% d'un nouveau poste de travail de bureau? C'est encore plus absurde car je peux voir le noyau i7 turbo-boostant à près de 4 GHz avec des outils de surveillance! P>

Mac compilé avec: p>

gcc -o test test.c -std=gnu99 -m64 -O2 -lm


14 commentaires

Sans le code de l'assembleur étant donné qu'il est inutile. Les compilateurs peuvent générer un code différent (en raison de différentes implémentations de bibliothèques). Il serait beaucoup mieux d'avoir un code de référence de niveau d'assembleur pour garantir le temps d'exécution.


Je comprends ce que vous dites, mais je ne vais pas pouvoir coder mon application scientifique à Assembleur. Je ne doute pas que le matériel brut soit plus rapide: mon problème est que le nouveau poste de travail fonctionne mal avec le code C compilé, comme indiqué et que j'aimerais assister à la compréhension de la manière dont cela peut arriver. En d'autres termes: que dois-je faire pour obtenir le nouveau poste de travail pour poster des numéros de performance plus en ligne avec les 5 années d'évolution technologique qui s'est passée entre le Core 2 Duo et Core i7?


@ user1055918 Le compilateur produit l'assemblage que nous suivons - nous ne vous demandons pas d'écrire un assemblée. OS X était en retard à Intel CPus - ils font beaucoup de choses différemment (par exemple, ils peuvent assumer certains ensembles d'instructions). De plus, les bibliothèques peuvent être différentes ou elles peuvent se comporter différemment (légèrement) différemment.


@Justin Merci - Oui, il semble que toute la mise en œuvre est différente de chaque plate-forme, bien que j'avais supposé que Apple utiliserait les bibliothèques de mathématiques GNU étant une base UNIX - évidemment pas! Je reçois des réponses numériquement identiques, alors comment puis-je faire une bibliothèque de mathématiques qui aide ma boîte à Ubuntu à la hauteur de son potentiel est la question que je suppose?


Juste une autre remarque, votre programme a également un résultat indéterminé, car vous n'initialisez pas res . Donc, le compilateur est fondamentalement autorisé à ignorer votre pour boucle et sortie tout ce qu'il aime. Peut-être que la version GCC sur OS X fait cela?


Alors, donnez-nous l'assembleur, l'option est -s .


Sur OS X, vous utilisez probablement SSE / SIMD; Cela peut ne pas être le cas sur Linux. Si vous utilisez le FPU sur Linux, vous pouvez obtenir un résultat légèrement différent, et cela pourrait prendre beaucoup plus de temps à calculer. L'Assemblée aiderait vraiment. Si cela a recours à une bibliothèque plutôt qu'à une intrinsèque, la bibliothèque peut avoir beaucoup de travail pour obtenir un résultat idéal, tandis qu'un intrinsèque convient à la plupart des cas.


Plus précisément, le temps / la précision de nombreux transcendainaux n'est pas linéaire au nombre de bits - beaucoup prennent plus d'insnications à calculer à mesure que le nombre de bits augmente (par exemple, Double peut prendre plus de deux fois plus longtemps que de flotteur). L'ESS fonctionnera sur la valeur à 64 bits, potentiellement utiliser plusieurs instructions hautement optimisées. S'il est fait dans le FPU ... cela pourrait vraiment prendre deux fois plus long.


@Jensgustedt oh chère / blush! Désolé ... corrigé pour initialiser Res à 0,0, mêmes timings. J'ai téléchargé l'assembleur pour les versions Mac et Linux ici: Test_mac.asm et Test_ubuntu.asm Merci d'avoir examiné cela!


Eh bien, les aperçus des deux ressemblent très similaires. La différence est que la version "Ubuntu" utilise des instructions vectorielles de l'unité SSE, E.g vaddsd et l'OS X utilise addsd . Mais je suppose que la différence devrait être plus la version du compilateur que le système d'exploitation, à moins que la différence ne soit dans l'appel à exp . Quelles sont les versions?


@Jensgustedt: vaddsd et addsd sont à la fois des opérations scalaires. VaddSD est l'équivalent AVX de l'instruction SSE AddSD .


Droite - ils appellent tous deux simplement dans les fonctions externe C EXP , où la plupart du temps est dépensé.


@Jensgustedt Re les versions Question: sur Ubuntu LDD montre qu'il utilise /lib/x86_64-liLux-gnu/libm.so.6 dans le libc6 paquet , tandis que sur le Mac Ootool -l montre qu'il utilise /usr/lib/libsystem.b.dylib (compatibilité version 1.0 .0, version actuelle 111.1.7) (Je pense que je suis juste en pensant que la libymie est à l'intérieur de la Mac?)


@ user1055918: Oui, la libm est une sous-bibliothèque de Libsystem sur OS X.


6 Réponses :


3
votes

Il est absurde qu'un ordinateur portable de près de 5 ans soit dans 10% d'un nouveau poste de travail de bureau

Gardez à l'esprit que vous êtes comparatif une fonction spécifique ( exp ). Nous ne savons pas vraiment si les deux implémentations de la fonction exp () que vous avez l'analyse comparative sont identiques (il n'est pas inconcevable qu'on est mieux optimisé que le autre).

Si vous deviez comparer une fonction différente, les résultats pourraient être très différents (peut-être plus en ligne avec vos attentes; ou non).

si exp () est vraiment le goulot d'étranglement de votre application réelle, une possibilité est de rechercher une approximation rapide. Voici un papier qui offre une de ces approximations: une approximation rapide et compacte de la fonction exponentielle .


6 commentaires

Il est également très possible qu'une implémentation de exp soit complètement erroné , c'est-à-dire des résultats inexacts pour de nombreuses intrants. Les mauvaises bibliothèques de mathématiques sont plus courantes que vous ne le pensez, en particulier avec la tension entre les personnes qui souhaitent des résultats corrects pour l'informatique scientifique et les gamer enfants qui souhaitent que leurs jeux 3D fonctionnent aussi vite que possible et ne se soucient pas si l'affichage ou la physique est légèrement à modérément faux.


@aix Merci, oui, je suppose que j'avais supposé que Apple utilisait la bibliothèque de mathématiques GNU standard avec celle-ci étant une base Unix dans OS X, mais cela ne semble probablement pas. Cependant, je suis assez surpris qu'une fonction aussi mature telle que exp () aurait une performance aussi significativement plus pauvre sous Linux. Je reçois des réponses numériquement identiques, alors je ne pense pas que la mise en œuvre de MAC est en sacrifiant la précision.


@ user1055918: OS / X doit supporter une gamme de processeurs très limitée, alors que Linux doit supporter une plage beaucoup plus large. Une possibilité est que sur OS / X, libm.a est compilé pour utiliser certaines fonctionnalités matérielles récentes que la version Linux ne peut pas utiliser tout en restant largement portable.


@aix: Dans ce cas, la bibliothèque OS X ne peut pas tirer parti des fonctionnalités matérielles trop très récentes, car la CPU en question a 5 ans. IIRC, X86_64 implique SSE2, la seule fonctionnalité qui pourrait éventuellement être utilisée au-delà de la ligne de base est [S] SSE3, qui n'est pas vraiment utile pour mettre en œuvre EXP ().


@R. En tant qu'ancien gars de calcul mathématique, j'ai été totalement choqué par cela. (Pas que le jeu devient beaucoup mieux, l'esprit).


@R ..: Je trouve un certain (petit) groupe de gars informatiques scientifiques qui se soucient énormément de précision jusqu'à la précision de la précision de la méthode numérique ils utilisent . Au-delà de ce point, je m'en fiche du moindre, et c'est juste votre chance difficile si quel que soit le calcul vous êtes faire de meilleurs résultats.



0
votes

Vous comparez des pommes et des oranges, car Mac vous permettez aux optimisations spécifiques à l'architecture que vous ne faites pas pour Ubuntu. Utilisez -O3 -March = natif sur les deux pour avoir une comparaison équitable.


2 commentaires

Par intérêt, j'ai essayé ces options sur ma boîte Ubuntu et elle n'a fabriqué aucune différence perceptible à la performance.


Merci Jens - j'ai essayé cela et aussi essayé -march = Corei7, mais aucune différence de vitesse, je pense donc que les problèmes sont d'ailleurs dans ce cas.



0
votes

Quelques choses à essayer:

  • Assurez-vous que votre CPU est réglé pour fonctionner fixé à toute sa vitesse pendant l'expérience. Il peut s'agir de monter et de descendre, ce qui ajoute beaucoup de frais généraux
  • PIN Le programme de test sur un noyau à l'aide de TaskSet , de sorte que le planificateur de système d'exploitation ne la migre pas autour de

1 commentaires

Merci, je ne savais pas sur TaskSet ... Je viens d'apprendre un nouvel outil Linux. Malheureusement, cela ne montre pas une différence de timing. J'ai utilisé CPUFREQ-SET pour modifier le gouverneur en performance et il n'y a pas vraiment de changement statistiquement notable. Belles idées à essayer cependant, merci.



1
votes

Comme d'autres notés, vous comparez simplement une implémentation d'une bibliothèque de mathématiques de exp () contre un autre. Si vous avez besoin de bibliothèques de mathématiques de haute qualité sur Linux, je suggère de regarder les outils de compilation d'Intel (qui dispose d'un excellent ensemble de bibliothèques); Ils sont également disponibles pour OS X et Windows.


2 commentaires

Oui, j'ai l'impression qu'il y a une convergence de l'opinion ici qu'il s'agit des bibliothèques du système. C'est une surprise pour moi car je pensais naïvement que quelque chose comme le calcul de l'exp () serait optimisé dans l'oubli par défaut. Ce n'est qu'un goulot d'étranglement que j'ai pu descendre, mais je suis sûr que mon code réel aura d'autres. Y a-t-il des bibliothèques de mathématiques gratuites (A-La Atlas dans l'espace Blas) qui accélère les opérations de mathématiques? Je ne pense pas pouvoir s'étirer à des compilateurs d'Intel chers (?)!


@ user1055918: pas sur le dessus de ma tête; Les bibliothèques de la CPI sont les seules à Linux, j'ai une expérience personnelle et je me sens à l'aise recommandant. Espérons que quelqu'un d'autre peut vous diriger dans une bonne direction.



0
votes

La différence de nombre de cycles de processeur n'est que de 30%. Étant donné que nous ne savons pas exactement quel code le compilateur a généré, je ne dirais pas que c'est absurde. La majeure partie du gain de performance avec votre nouveau processeur est le nombre de cœurs et votre code ne l'utilise pas.

Il peut également être intéressant d'essayer de dérouler la boucle. Le rapport de vitesse peut changer. P>

int main() {
    double res0 = 0.0;        
    double res1 = 0.0;        
    double res2 = 0.0;        
    double res3 = 0.0;        
    double res4 = 0.0;        
    for(int i=1; i<200000000; i+=5) {
            res0 += exp((double) 100.0/i);
            res1 += exp((double) 100.0/(i+1));
            res2 += exp((double) 100.0/(i+2));
            res3 += exp((double) 100.0/(i+3));
            res4 += exp((double) 100.0/(i+4));
    }
    double res=res0+res1+res2+res3+res4;
    printf("%lf", res);
    return(0);
}


5 commentaires

Votre boucle "déroulée" change effectivement le comportement en raison du fait que l'addition n'est pas associative.


Si vous souhaitez essayer des choses comme ceci, vous feriez mieux de passer directement à OpenMP, GCC implémente bien. Je viens d'essayer et ça me donne une vitesse de 3,29.


Merci. En réalité, bien que l'exemple que j'ai fourni est ineffibu simplement de montrer quelque chose qui (dans mon expérience limitée), j'ai trouvé surprenant: que je n'ai pas de difficulté à ne pas être frappé de la nouvelle station de travail qui était supposée accélérer mon travail plus de 10%! Le travail que je fais n'est pas facilement parallélisible, d'où allant le noyau le plus rapide possible possible, plutôt que, dites, un double Xeon à 6 nœuds d'horloge inférieur. Je suppose que @stephencanon indique mon espoir d'obtenir plus que l'amélioration du cycle du cycle, ou d'au moins plus de 10% d'amélioration n'est pas irréaliste d'avoir espéré?


@R .., bien sûr c'est vrai. Mais comme ils sont là seulement comme exemple, je pense que nous pouvons vivre avec cela.


@ user1055918: Je pense que vous obtiendriez beaucoup plus de bangs pour votre argent en déterminant vos exigences de précision et en écriture ou en adoptant votre propre fonction exp optimisé pour votre cas d'utilisation particulière au lieu d'acheter de nouvelles machines.



1
votes

Essayez d'allumer l'option -ffast-math . Cela pourrait vous donner une implémentation beaucoup moins pédantiquement correcte de exp () . La question est alors de savoir si vous voulez que la réponse potentiellement erronée pouvant produire.


0 commentaires