Pregunta

Así que estoy siendo enseñado montaje y tenemos una misión que es encontrar la diferencia de tiempo entre la lectura de la memoria y la lectura de la memoria caché. Tenemos que hacer esto mediante la creación de 2 bucles y cronometrándolos. (Se lee de la memoria principal y el otro de caché). Lo que pasa es que no sé y no puedo encontrar nada de lo que me dice cómo leer desde cualquier caché o memoria principal = /. ¿Podrían ustedes me pueden ayudar? Estoy haciendo esto en MASM32. Entiendo cómo hacer bucles y así la mayoría del lenguaje ensamblador, pero yo no puedo hacer que lee = /


Editar

Tengo una pregunta, he hecho esto ...

mov ecx, 100 ;loop 100 times
xor eax, eax ;set eax to 0
_label:
mov eax, eax ;according to me this is read memory is that good?
dec ecx ;dec loop
jnz _label ;if still not equal to 0 goes again to _label

... tendría que estar bien?


Editar 2:

Pues bien, no tengo la intención de hacer palanca y aprecio su ayuda, sólo tengo otra pregunta, ya que estos son dos bucles que tengo que hacer. Necesito compararlos de alguna manera, he estado buscando una instrucción de temporizador pero no he encontrado ninguna que he encontrado solamente: timeGetTime , GetTickCount y Contador de rendimiento pero por lo que entiendo estas instrucciones de devolución no la hora del sistema el tiempo que toma para que el bucle termina. ¿Hay una manera de hacer realidad lo que quiero? o tengo que pensar en otra forma?

Además, para leer de diferentes registros en el segundo bucle (el que no la lectura de la memoria caché) ¿Está bien si me dan varias instrucciones "mov"? o estoy totalmente fuera de base aquí?

Lo siento por todas las preguntas, pero esta vez más gracias por su ayuda.

¿Fue útil?

Solución

Para leer desde la memoria caché. tener un bucle que se lee de la misma (o muy similar) de direcciones de memoria:

  • La primera vez que se lee desde esa dirección, los valores de esa dirección de memoria (y desde otra dirección, la memoria cercana) se moverá en la caché
  • Siguiente momento de leer de que mismo dirección, los valores ya se almacenan en caché y por lo que está leyendo de la memoria caché.

Para leer la memoria no almacenado en caché, tener un bucle que lee de muchos, muy diferente (es decir, más separados que el tamaño de caché) las direcciones de memoria.


Para responder a su segunda pregunta:

  • Las cosas que estás haciendo con ecx y JNZ buscar OK (no sé cómo es exacto / sensibilidad de su temporizador es, pero es posible que desee bucle de más de 100 veces)

  • El mov eax, eax no es "leer la memoria" ... es un no-op, que se mueve en EAX EAX. En su lugar, creo que la sintaxis MASM para la lectura de la memoria es algo más parecido a mov eax,[esi] ( "leer el de la ubicación de memoria cuya dirección está contenida en esi")

  • En función de lo que O / S que está utilizando, usted debe leer desde una dirección de memoria que en realidad existe y es legible. En Windows, por ejemplo, no se permitiría una aplicación para hacer mov esi, 0 seguido por mov eax, [esi] porque una aplicación no se le permite leer la memoria cuya dirección / ubicación es cero.


Para responder a su tercera pregunta:

  

timeGetTime, GetTickCount y contador de rendimiento

Su mencionar timeGetTime, GetTickCount y contador de rendimiento implica que usted está funcionando bajo Windows.

Sí, estos devolver la hora actual, a varias resoluciones / precisiones: por ejemplo, GetTickCount tiene una resolución de aproximadamente 50 milisegundos, por lo que deja de eventos de tiempo que duran menos de 50 ms, es inexacta cuando eventos de tiempo que sólo duran 50-100 milisegundos. Es por eso que dije que 100 en su ecx probablemente no es lo suficientemente grande.

La función QueryPerformanceCounter es probablemente el temporizador más preciso que usted tiene.

Para usar cualquiera de estos temporizadores como un temporizador de intervalos:

  • Obtener el tiempo, antes de empezar a bucle
  • Obtener la hora más, después de terminar de bucle
  • Restar estas dos veces: la diferencia es el intervalo de tiempo
  

¿Está bien si me dan varias instrucciones "mov"?

Sí yo creo que sí. Creo que se puede hacerlo de esta manera (cuidado No estoy seguro / no recuerdo si esta es la sintaxis MASM adecuado para la lectura desde una posición de memoria nombre) ...

mov eax,[memory1]
mov eax,[memory2]
mov eax,[memory3]
mov eax,[memory4]
mov eax,[memory5]

... donde memory1 través memory5 son las direcciones de las variables globales ampliamente espaciados en el segmento de datos.

O, usted podría hacer ...

mov eax,[esi]
add esi,edx
mov eax,[esi]
add esi,edx
mov eax,[esi]
add esi,edx
mov eax,[esi]
add esi,edx
mov eax,[esi]

... donde ESI está apuntando a la parte inferior de un largo trozo de memoria, y EDX es algún incremento que es igual a aproximadamente una quinta parte de la longitud del trozo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top