2016-10-05 1 views
0

Je suis à essayer de comprendre un problème pour hw, où je dois voir combien misses cache se produisent pour la boucle imbriquée suivanteentièrement Associatif Cache

for i=0; i < 32 ; i++ 
    for j=0; j < 32; j++ 
     sum += arr[i][j]; 

J'ai un cache entièrement associatif qui dispose de 16 lignes de cache , où chaque ligne de cache peut stocker 32 mots. Le cache est initialement vide et arr [0] [0] correspond à la première ligne de cache

Maintenant, d'après ce que je crois comprendre, il y aura un total de 32 échecs.Initialement, lorsqu'une requête est faite, le cache est vide compte comme un manque et selon un cache entièrement associatif tous les blocs sont peuplés et ensuite le LRU est appliqué.

Je suis un peu confus ici, pourrait utiliser quelques conseils ici

+0

Si 'arr' est un tableau multidimensionnel normal (et non un tableau de pointeurs ou quelque chose), alors votre boucle est juste une lecture séquentielle du bloc de mémoire. En supposant que i, j et sum ne débordent pas en mémoire, l'associativité du cache ne fait pas de différence ici; même un cache mappé directement fonctionnerait de manière identique. –

+0

Oui l'arr est un tableau multidimensionnel – RRP

Répondre

2

En supposant un entier est stocké dans un mot.

Commençons par le 1 st accès mémoire ie. arr[0][0]. Il en résultera une mésaventure qui tombe sous la contrainte de manquer. Cela amènera 32 entiers dans le cache. Pour notre bénéfice, nous allons accéder à ces emplacements de mémoire exacte dans nos autres accès. Qui est de arr[0][0] à arr[0][31].

Maintenant que nous accédons au arr[1][0], nous accédons au 33e emplacement et ce n'est pas dans notre cache. Donc, c'est encore un manque.

En général, pour chaque 32 valeurs auxquelles vous accédez, vous aurez un échec. S'il vous plaît pas que ce soit seulement pour le genre de boucle que vous avez montré:

for i=0; i < 32 ; i++ 
    for j=0; j < 32; j++ 
     sum += arr[i][j]; 

Ici, l'accès à la mémoire est continue. De plus, comme l'a dit @Peter Cordes dans les commentaires, le cache entièrement associatif se comportera exactement de la même manière qu'un cache mappé direct dans votre cas particulier.

+0

La question ne dit pas des entiers. Ils pourraient être des 'float's de taille de mot, ou vraiment n'importe quoi d'autre. Votre hypothèse selon laquelle chaque élément d'un tableau est un mot est probablement ce qui était prévu, même si la question n'exclut pas un double mot 'double', ou 4-par-mot' char', ou (puisque c'est C++) grande classe avec un 'opérateur ++ surchargé. –

+0

@PeterCordes Oui. J'ai supposé que la taille de l'élément est un mot. Mais l'idée que je donnais serait suffisante pour calculer des données de toute taille – PRP

+0

oui, bien sûr :) Je pense que je voulais surtout me plaindre de la qualité de la question un peu plus. –