2011-10-18 25 views
9

que estaba leyendo este question, quería preguntar más sobre el código que mostró es decirconfunden entre la localidad temporal y espacial en el código de la vida real

for(i = 0; i < 20; i++) 
    for(j = 0; j < 10; j++) 
     a[i] = a[i]*j; 

Las preguntas son,

  1. entiendo localidad temporal, creo que las referencias a i y j deben ser localidad temporal. ¿Estoy en lo cierto?
  2. También entiendo la localidad espacial, ya que la pregunta que he vinculado responde que las referencias a una [i] deberían ser una localidad espacial. ¿Estoy en lo cierto?
  3. La persona dijo,

    "El bucle interno llamará misma dirección de memoria al acceder a [i] diez veces de modo que es un ejemplo para la localidad temporal supongo. Pero, ¿existe localidad espacial también en el ciclo de arriba? "

    No estoy de acuerdo con su suposición. Como las referencias generadas por un [i] deben ser una localidad espacial (se referirán al siguiente elemento en el bloque). ¿Estoy en lo cierto?

Respuesta

18

En primer lugar, las referencias a var puede ser temporal locales o espacialmente locales no localidad temporal, que es la gramática incorrecta. Punto menor.

Ahora, a sus preguntas.

  1. El principio de localidad temporal establece que dos instrucciones hacen referencia a la misma ubicación dentro de un plazo relativamente corto. Por ejemplo, en el código proporcionado, se hace referencia con frecuencia al a[i], con instrucciones como a[i] = a[i] * 2 y a[i] = a[i] * 3 ejecutándose muy juntas. Si estamos viendo este alcance, podríamos decir que las referencias a j y a[i] son temporalmente locales. Las referencias a i también son temporalmente locales, porque i se referencia cada vez que a[i] es. Sin embargo, si la última línea del código dado lee algo como a[j] = a[j] * j, las referencias a i no serían temporalmente locales, al menos en el alcance del bucle interno [1].

  2. El principio de localidad espacial indica que dos instrucciones hacen referencia a ubicaciones de memoria contigua. Las referencias a a[i] son un buen ejemplo de esto, ya que se puede suponer (la mayoría de las veces) que a[0] y a[1] estarán uno junto al otro en la memoria.

  3. Los dos primeros básicamente lo cubren, pero el texto citado es correcto y el código también muestra la localidad espacial.

[1] - En general, cuando se habla de la localidad, que será en el contexto de un determinado nivel en la jerarquía de memoria, ya sea en la memoria RAM o la memoria caché L1 o lo que sea. En todo excepto en el sentido más limitado, las referencias tanto a i como a j son temporalmente locales.

+0

Gracias por la respuesta. ¿Puedes aclarar mis conceptos sobre variables y localidad? La variable j se incrementará cada vez que se ejecute el bucle interno y obtendrá un nuevo valor. Obtener un nuevo valor NO es una localidad espacial (a pesar de que se incrementa en 1 cada vez)? –

+0

@Akito la ubicación espacial correcta solo puede ocurrir entre dos * ubicaciones * diferentes en la memoria. Como 'j' se refiere a la misma ubicación cada vez, las referencias a' j' no son espacialmente locales. – brc

+0

¿Puede por favor también elaborar el término referencias que se utilizan? Qué significa eso? –

2

El lazo exterior es un ejemplo de localidad espacial. Secuencialmente incrementa la dirección de las llamadas for-loop internas.

El bucle interno muestra la localidad temporal. Se accede a la misma dirección de memoria exacta diez veces seguidas, y se multiplica por j cada vez.

En cuanto a sus dos primeras preguntas, tanto i como j (contadores de bucle) son muy buenos ejemplos de localidad temporal.

La localidad es una medida aplicada por la memoria caché para minimizar las llamadas a la memoria. Si una instrucción necesita saber el valor de una dirección de memoria que aún no está en la memoria caché, accederá a la memoria y almacenará todas las ubicaciones de memoria circundantes en la memoria caché.

Cuestiones relacionadas