2016-12-29 2 views
2

Je découvrais la ligne de cache et l'effet de la foulée de boucle sur le cache. Je suis tombé sur la page this qui montre le temps d'exécution d'une boucle par rapport à la foulée de la boucle. Selon le benchmark, l'augmentation de la foulée de la boucle diminue le temps d'exécution ce qui est très confus pour moi. Comme je comprends si la ligne de cache est de 64 octets, et supposons que dans le premier cas la boucle est juste 1 ce qui signifie que la boucle passe sur l'élément de tableau séquentiellement alors cela devrait avoir le moins de temps d'exécution = 64 octets) sont chargés dans le cache. Le temps d'exécution devrait être le plus bas jusqu'à une foulée de 16 parce que les 16 éléments sont chargés dans la même ligne de cache. Lorsque la foulée est augmentée au-dessus de 16, cela devrait augmenter le temps d'exécution car l'élément du tableau ne sera pas dans la ligne de cache, mais le graphique sur la page est complètement opposé.Boucle de foulée et ligne de cache

running times of loop for different step values

Répondre

3

Dans cet exemple la longueur est constante, donc plus la foulée - les moins d'éléments que vous traversez. Le phénomène intéressant est qu'il ne s'applique pas en dessous d'une ligne de cache, et c'est parce que vous ne pouvez pas apporter des parties d'une ligne. Donc en dessous de 16, vous payez la même pénalité pour aller chercher toutes les lignes de cache. Au-dessus de 16, vous commencez à sauter quelques lignes. au-dessus de 32 par exemple (128B) vous récupérez toutes les autres lignes - donc +/- la moitié du temps (en supposant que votre temps d'exécution est dominé par la latence de la mémoire)

+0

Alors quand vous dites "ci-dessous 16, vous payez la même pénalité d'aller chercher tout les lignes de cache "cela signifie-t-il que le tableau entier (tous les éléments) est chargé dans le cache et quand plus de 16 parties du tableau sont chargées dans le cache ?. J'étais sous l'impression que le nombre d'éléments chargés dépendrait de la foulée – zer0c00l

+1

la mise en cache est effectuée à 64 granularité d'octets. Si vous accédez à un seul élément d'une ligne de cache, vous devez toujours extraire la ligne complète. Cependant, si votre foulée est large de deux lignes de cache, vous n'aurez pas à récupérer les lignes au milieu. Si vous le dessinez, vous verrez que toute foulée au-dessus de 64B permettra quelques sauts, et plus la foulée sera longue, plus vous aurez de sauts – Leeor