La confusion entre Temporelle et Spatiale de la localité dans la vraie vie code
J'ai été la lecture de ce question, je voulais vous demander plus sur le code qu'il a montré, je.e
for(i = 0; i < 20; i++)
for(j = 0; j < 10; j++)
a[i] = a[i]*j;
Les questions sont,
- Je comprends temporelle de la localité, je pense que les références aux i et j doivent être temporelle de la localité. Suis-je le droit?
- Je comprends aussi spatiale de la localité, que la question que j'ai lié des réponses que les références à un[i] doit être spatiale de la localité. Suis-je le droit?
- La personne a dit,
"La boucle intérieure va appeler même adresse mémoire lors de l'accès à un[i] dix
fois donc, c'est un exemple pour le temporel de la localité, je suppose. Mais est-il
spatiale localité également au-dessus de la boucle?"Je ne suis pas d'accord avec ses deviner. Les références générées par un[i]
devrait être spatio-localité (Ils seront référencement de la prochaine
élément dans le bloc). Suis-je le droit?
OriginalL'auteur Fahad Uddin | 2011-10-18
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, les références à
var
peut être temporellement local ou dans l'espace local pas temporelle localité, ce qui est une mauvaise grammaire. Point mineur.Maintenant, à vos questions.
Le principe de Temporelle localité unis qui instructions deux font référence au même endroit, dans un délai relativement court. Par exemple, dans le code donné,
a[i]
est référencé fréquemment, avec des instructions commea[i] = a[i] * 2
eta[i] = a[i] * 3
être exécuté très proches. Si nous nous penchons sur cette portée, on pourrait dire que les références àj
eta[i]
sont temporellement local. Les références ài
sont aussi temporellement local, parce quei
est référencé à chaque foisa[i]
est. Toutefois, si la dernière ligne du code ci-lire quelque chose commea[j] = a[j] * j
, alors les références ài
ne serait pas temporellement local, au moins dans le champ de l'intérieur de la boucle[1].Le principe de Spatiale localité unis qui instructions deux référence contiguë emplacements de mémoire. Les références à
a[i]
sont un bon exemple de cela, comme on peut le supposer (la plupart du temps) quea[0]
eta[1]
sera à côté les uns des autres dans la mémoire.Les deux premiers fondamentalement, couvrir, mais le texte cité est correct, et le code montre également spatiale de la localité.
[1] - en Général, quand vous parlez de la localité, il sera dans le contexte d'un niveau dans la hiérarchie de mémoire, que ce soit la RAM ou le cache L1 ou ce que vous avez. Dans l'ensemble, mais la plupart des sens limité, les références à la fois
i
etj
sont temporellement local.correct, localité spatiale ne peut se produire entre deux emplacements dans la mémoire. Depuis
j
se réfère à la même emplacement chaque fois, les références àj
ne sont pas dans l'espace local.Pouvez-vous préciser le terme de références utilisées. Qu'est-ce que cela signifie?
Un référence pour une variable comme
j
signifie simplement que la valeur dej
est consulté ou modifié. Donc,a[i]
est une référence à la fois la valeur dei
et tout ce qui est stocké dansa[i]
.OriginalL'auteur brc
Écrit cette réponse que je n'ai pas l'obtenir, même après avoir lu les autres réponses sur cette question, quelques autres questions et d'autres wikipédia (c'est plus confus.)
Je pense que nous passons beaucoup de temps et d'énergie à comprendre la terminologie qui est un peu déroutant et complexe dans ce cas. Je l'ai trouvé plus facile à comprendre si je n'y prête pas attention aux termes 'espace' et 'temporel'.
Nous allons commencer avec les bases.
Essayons de comprendre ce que le cache est une place qui est plus rapide pour accéder à la mémoire principale. C'est cool. Mais cette place est limité et cher, donc il faut l'utiliser à bon escient. Mais comment voulez-vous (ou OS) de décider quoi mettre dans le cache et ce n'est pas à mettre? Il devrait y avoir un moyen de savoir de quoi aurions-nous besoin dans l'avenir.. ah les prédictions! ( Rapport De La Minorité! Dit quelque chose?).
Il devrait y avoir un moyen de déterminer ce que serait le programme à l'avenir. En utilisant le bon sens et le code, nous pouvons dire que certaines parties du code sont répétitifs dans la nature - par exemple - de la boucle! Si y est une variable i à l'intérieur d'une boucle, vous savez qu'il va être accessibles dans un avenir proche, encore et encore. C'est le principe de localité temporelle. j'ai peut être mis en cache comme il est temporellement local.
Dans un autre domaine, si le code est à l'aide de toute structure de données linéaire (exemple: un Tableau) et que trop dans une boucle avec une incrémentation de l'index, alors il est facile de voir que, bien que le besoin actuel est seulement le 3ème emplacement (par exemple) de cette structure de données, très bientôt, la prochaine endroits sera aussi nécessaire parce que l'indice augmente de 1 pour l'linéaire de la structure de données. Donc, ce serait formidable si nous introduire des données dans les quelques endroits. C'est le principe de localité spatiale. Prochains emplacements peuvent être mis en cache, car ils sont spacially local.
La notion de localité est essentiellement à identifier les données et les instructions pour l'amener dans le cache afin de réduire les défauts de cache et d'utiliser cette place particulière de manière efficace.
Merci pour ces points. 1. Ne pas obtenir ce que vous voulez dire par des lignes de cache contenir plusieurs lignes - quelque chose doit m'échapper de base, veuillez préciser, je n'ai pas réussi à le Microprocesseur cours de mes études 🙂 2. Donc L1/L2/L3 caches ne sont pas des OS est-il géré?
Plusieurs articles, par exemple, 16 mot de la taille d'
int
s dans une de 64 octets ligne de cache. Et non, caches CPU ne sont pas des OS géré. Un cache de requête est une charge, un magasin d'instruction, et le cache sont trop fréquentes pour gérer manque dans le logiciel même pour L3. Cohérente des caches partagés sont importants pour plusieurs cœurs pour communiquer efficacement, de sorte que vous avez vraiment besoin de MATÉRIEL pour mettre en œuvre MESI de cohérence de cache.Plusieurs articles (et les instructions, je suppose?). L'a obtenu. Revenir à l'espace de la localité suggérez-vous dans votre point 1, que la prise de décision qui se passe au niveau de la ligne et non pas au niveau de l'élément? Et à côté des éléments chargés serait le prochain à défaut d'instructions, sans réelle prise de décision (par CPU/HW)?
OriginalL'auteur Saurabh Patil
La boucle externe est un exemple de la localité spatiale. Il séquentiellement incrémente l'adresse de l'intérieur de la boucle appels.
L'intérieur de la boucle temporelle montre localité. Exactement la même adresse mémoire est accessible à dix fois dans une ligne, et multiplié par j à chaque fois.
Que pour vos deux premières questions, i et j (compteurs de boucle) sont de très bons exemples de localité temporelle.
Localité est une mesure appliquée par le cache afin de minimiser les appels à la mémoire. Si une instruction doit connaître la valeur de l'adresse mémoire qui n'est pas déjà dans le cache, elle aura accès à la mémoire et stocker tous les emplacements de mémoire dans le cache.
OriginalL'auteur Steve Barna
Permet de commencer avec de définir à la fois Temporelle et Spatiale de la Localité.
Temporelle Localité - Temporelle d'une localité signifie actuelle, de données ou d'instructions qui est récupérée peut être besoin bientôt. Donc, nous devrions stocker des données ou des instructions dans la mémoire cache afin que nous puissions éviter de nouveau à la recherche dans la mémoire principale pour les mêmes données, et donc de gagner du temps.
Spatiale Localité - Spatiale d'une localité signifie d'instructions ou de données à proximité de l'actuel emplacement de la mémoire qui est en train d'être récupéré, il peut être nécessaire, bientôt, dans un avenir proche.
Maintenant à la recherche à cet exemple, Ici, la variable somme est utilisé encore et encore ce qui montre Temporelle Localité et les valeurs de tableau arr est en cours d'accès afin de je.e arr[0], arr[1], arr[2] ,... et ainsi de suite et qui montre Spatiale localité que les tableaux sont Contiguë(à côté des blocs de mémoire de sorte que les données de près à l'actuel emplacement de la mémoire est récupérée.
Maintenant à la recherche à cet exemple
Ici, nous voyons temporelle de la localité que a[i] dans la deuxième boucle est utilisé encore et encore et puis la variable j est accessible dans l'ordre qui montre Spatiale de la Localité.
j
est un scalaire, de sorte que tousj
est accessible à la fois. Que des temps de la localité poura[i]
etj
dans la boucle interne. (Bien sûr, tout décent, le compilateur va les garder dans les registres de la boucle interne, pas de magasin/recharger à moins de désactiver l'optimisation. Mais sans doute vous dire ce que les pseudo-code pour l'asm, pas de réel C pour être compilé avec un compilateur optimisant. Parce qu'un bon compilateur de s'y dérouler la boucle interne et de le transformer ena[i] *= 0*1*2*3*4*5*6*7*8*9
, c'est à dire multipliera[i]
par une constante de compilation.) En fait justea[i] = 0
, parce que vous incluez0
comme un facteur.OriginalL'auteur Shubham Jain