Les logiciels scientifiques ne diffèrent pas beaucoup des autres logiciels en ce qui concerne la manière de savoir ce qui doit être réglé.
La méthode que j'utilise est la pause aléatoire . Voici quelques exemples d'accélérations qu'il a trouvées pour moi:
Si une grande partie du temps est passée dans des fonctions comme log
et exp
, je peux voir quels sont les arguments de ces fonctions, en fonction des points à partir desquels elles sont appelées. Souvent, ils sont appelés à plusieurs reprises avec le même argument. Si c'est le cas, la mémorisation produit un facteur d'accélération énorme.
Si j'utilise les fonctions BLAS ou LAPACK, il se peut que je trouve qu'une grande partie du temps est consacrée aux routines pour copier des tableaux, multiplier des matrices, transformer de choleski, etc.
La routine pour copier des tableaux n’est pas là pour la vitesse, mais pour la commodité. Vous trouverez peut-être un moyen moins pratique, mais plus rapide, de le faire.
Les routines pour multiplier ou inverser les matrices, ou effectuer des transformations choleski, ont tendance à avoir des arguments de caractères spécifiant des options, telles que 'U' ou 'L' pour le triangle supérieur ou inférieur. Encore une fois, ceux-ci sont là pour plus de commodité. Ce que j’ai trouvé, c’est que, comme mes matrices n’étaient pas très grosses, les routines passaient plus de la moitié de leur temps à appeler le sous-programme permettant de comparer des caractères uniquement pour déchiffrer les options. L’écriture de versions spéciales des routines mathématiques les plus coûteuses a entraîné une accélération considérable.
Si je peux m'étendre sur le dernier point: la routine de multiplication de matrice DGEMM appelle LSAME pour décoder ses arguments de caractères. En examinant le pourcentage de temps global (la seule statistique qui vaille la peine d'être regardé), les profileurs considérés comme "bons" pourraient montrer que DGEMM utilise un pourcentage du temps total, tel que 80%, et LSAME, utilisant un pourcentage du temps total, tel que 50%. En regardant l'ancien, vous seriez tenté de dire "il doit être fortement optimisé, donc je ne peux rien faire à ce sujet". En regardant ce dernier, vous seriez tenté de dire "Hein? Qu'est-ce que c'est? Qu'est-ce que c'est? Ce n'est qu'une routine minuscule. Ce profileur doit se tromper!"
Ce n'est pas faux, c'est juste ne pas vous dire ce que vous devez savoir. Ce que la pause aléatoire vous montre, c'est que DGEMM est sur 80% des échantillons de pile et que LSAME est sur 50%. (Vous n'avez pas besoin de beaucoup d'échantillons pour détecter cela. 10, c'est généralement beaucoup.) De plus, sur beaucoup de ces échantillons, DGEMM est en train d'appeler LSAME à partir de deux lignes de code différentes.
Alors maintenant, vous savez pourquoi les deux routines prennent autant de temps inclusif. Vous savez également où, dans votre code, ils sont appelés pour passer tout ce temps. C'est pourquoi j'utilise des pauses aléatoires et jette un regard noir sur les profileurs, peu importe leur qualité. Ils sont plus intéressés à obtenir des mesures qu'à vous dire ce qui se passe.
Il est facile de supposer que les routines de la bibliothèque mathématique ont été optimisées au nième degré, mais en réalité, elles ont été optimisées pour pouvoir être utilisées à des fins très diverses. Vous devez voir ce qui se passe réellement et non ce qui est facile à supposer.
ADDED: Donc pour répondre à vos deux dernières questions:
Quelles sont les choses les plus importantes à essayer en premier?
Prélevez 10 à 20 échantillons de pile et ne vous contentez pas de les résumer, comprenez ce que chacun vous dit. Faites ceci en premier, dernier et entre les deux. (Il n'y a pas "d'essayer", jeune Skywalker.)
Comment savoir combien de performances je peux obtenir?
Xβ( s + 1 , ( n - s ) + 1 )sn1 / ( 1 - x )n = 10s = 5X

XX
Comme je vous l’ai déjà dit, vous pouvez répéter l’ensemble de la procédure jusqu’à ce que vous ne puissiez plus vous en passer, et le taux d’accélération composé peut être assez important.
( S + 1 ) / ( n + 2 ) = 3 / vingt-deux = 13,6 %.) La courbe inférieure du graphique suivant représente sa distribution:

Considérez si nous avons prélevé jusqu'à 40 échantillons (plus que ce que j'ai jamais eu à la fois) et que nous n’avons vu un problème que sur deux d’entre eux. Le coût estimé (mode) de ce problème est de 5%, comme indiqué sur la courbe la plus haute.
Qu'est-ce qu'un "faux positif"? Si vous résolvez un problème, vous réalisez un gain tellement inférieur à celui attendu, vous regrettez de l'avoir résolu. Les courbes montrent (si le problème est "petit") que, même si le gain pourrait être inférieur à la fraction d'échantillons le montrant, il sera en moyenne plus important.
Il existe un risque beaucoup plus grave - un "faux négatif". C'est quand il y a un problème, mais il n'est pas trouvé. (Cela contribue au "biais de confirmation", où l'absence de preuve tend à être traitée comme une preuve d'absence.)
Ce que vous obtenez avec un profileur (un bon) est que vous obtenez la mesure beaucoup plus précise (donc moins de chance de faux positifs), au détriment des informations beaucoup moins précises sur ce que le problème en fait est (donc moins de chance de trouver et d' obtenir tout gain). Cela limite l'accélération globale qui peut être obtenue.
J'encourage les utilisateurs de profileurs à signaler les facteurs d'accélération qu'ils obtiennent réellement dans la pratique.
Il y a un autre point à faire re. La question de Pedro sur les faux positifs.
Il a mentionné qu'il pourrait y avoir une difficulté à s'attaquer aux problèmes mineurs dans un code hautement optimisé. (Pour moi, un petit problème est celui qui représente 5% ou moins du temps total.)
Comme il est tout à fait possible de construire un programme totalement optimal à l'exception de 5%, ce point ne peut être traité que de manière empirique, comme dans cette réponse . Pour généraliser à partir de l'expérience empirique, voici ce qui se passe:
Un programme, tel qu’il est écrit, contient généralement plusieurs possibilités d’optimisation. (On peut les appeler "problèmes" mais ce sont souvent un code parfaitement correct, simplement susceptible d'une amélioration considérable.) ... que, une fois trouvés et corrigés, économisez 30%, 21%, etc. sur les 100 originaux.

Notez que le problème F coûte 5% du temps initial, il est donc "petit" et difficile à trouver sans 40 échantillons ou plus.
Cependant, les 10 premiers échantillons trouvent facilement le problème A. ** Une fois le problème résolu, le programme ne prend que 70 secondes, pour une accélération de 100/70 = 1,43x. Cela rend non seulement le programme plus rapide, mais il amplifie, par ce rapport, les pourcentages pris par les problèmes restants. Par exemple, le problème B prenait à l'origine 21, soit 21% du total, mais après suppression de A, B prend 21 sur 70, soit 30%, de sorte qu'il est plus facile de rechercher le processus complet répété.
Une fois le processus répété cinq fois, le temps d'exécution est maintenant de 16,8 secondes, le problème F étant de 30% et non de 5%. 10 échantillons le trouvent facilement.
Donc c'est le point. De manière empirique, les programmes contiennent une série de problèmes ayant une distribution de tailles, et tout problème trouvé et résolu facilite la recherche des problèmes restants. Pour ce faire, aucun des problèmes ne peut être ignoré car, s’ils le sont, ils prennent le temps, limitant l’accélération totale et n’amplifiant pas les problèmes restants.
C'est pourquoi il est très important de trouver les problèmes qui se cachent .
Si les problèmes A à F sont trouvés et résolus, l'accélération est 100 / 11.8 = 8.5x. Si l’un d’eux manque, par exemple D, l’accélération n’est que de 100 / (11.8 + 10.3) = 4.5x.
C'est le prix payé pour les faux négatifs.
Donc, quand le profileur dit "il ne semble pas y avoir de problème significatif ici" (c’est-à-dire un bon codeur, c’est un code pratiquement optimal), c’est peut-être vrai et peut-être que non. (Un faux négatif .) Vous ne savez pas avec certitude s'il y a plus de problèmes à résoudre, pour une accélération plus rapide, à moins que vous n'utilisiez une autre méthode de profilage et que vous en découvriez. D'après mon expérience, la méthode de profilage ne nécessite pas un grand nombre d'échantillons, résumés, mais un petit nombre d'échantillons, où chaque échantillon est suffisamment bien compris pour reconnaître toute possibilité d'optimisation.
2 / 0,3 = 6,671 - pbinom(1, numberOfSamples, sizeOfProblem)
1 - pbinom(1, 20, 0.3) = 0.9923627
Xβ( s + 1 , ( n - s ) + 1 )nsy1 / ( 1 - x )Xyy- 1Distribution BetaPrime . Je l'ai simulé avec 2 millions d'échantillons, aboutissant à ce comportement:
distribution of speedup
ratio y
s, n 5%-ile 95%-ile mean
2, 2 1.58 59.30 32.36
2, 3 1.33 10.25 4.00
2, 4 1.23 5.28 2.50
2, 5 1.18 3.69 2.00
2,10 1.09 1.89 1.37
2,20 1.04 1.37 1.17
2,40 1.02 1.17 1.08
3, 3 1.90 78.34 42.94
3, 4 1.52 13.10 5.00
3, 5 1.37 6.53 3.00
3,10 1.16 2.29 1.57
3,20 1.07 1.49 1.24
3,40 1.04 1.22 1.11
4, 4 2.22 98.02 52.36
4, 5 1.72 15.95 6.00
4,10 1.25 2.86 1.83
4,20 1.11 1.62 1.31
4,40 1.05 1.26 1.14
5, 5 2.54 117.27 64.29
5,10 1.37 3.69 2.20
5,20 1.15 1.78 1.40
5,40 1.07 1.31 1.17
( n + 1 ) / ( n - s )s = ny
Ceci est une représentation graphique de la distribution des facteurs d'accélération et de leurs moyennes pour 2 résultats positifs sur 5, 4, 3 et 2 échantillons. Par exemple, si 3 échantillons sont pris et que 2 d’entre eux sont des occurrences d’un problème et que ce problème peut être supprimé, le facteur d’accélération moyen serait de 4x. Si les 2 résultats sont vus dans seulement 2 échantillons, l'accélération moyenne est indéfinie - conceptuellement, car les programmes avec des boucles infinies existent avec une probabilité non nulle!
