Duda con la Cache

Iniciado por cpu2, 28 Enero 2014, 02:26 AM

0 Miembros y 1 Visitante están viendo este tema.

cpu2

Hola

Leyendo el set de instrucciones me fije en una instruccion llamada Prefetch, por lo que e leido esta carga datos en la cache, pudiendo escojer los distintos niveles. Leyendo un diagrama del volumen dos, estaba viendo que acceder a la cache L1 es mas rapido que a la memoria principal.

No entendi muy bien el funcionamiento, cargas el contenido pero como lo lees luego? O es para instrucciones?

Código (asm) [Seleccionar]
movzx (%rsp, %r8), %r14
movzx offset(, %r14), %r14


Tengo que repetir eso unas cuantas veces, accediendo siempre a la memoria, no podria usar la cache?

Espero que se me entienda y perdon por si dije alguna burrada.

Un saludo.


Amadeo Magnus

Vos no podes acceder directamente a la cache. Según estuve leyendo en el manual, es una instrucción que básicamente le avisa al procesador que vas a usar tal posición de memoria, y si es posible, la levanta y la guarda en la cache, pero todo esto es transparente para vos. Vos deberías hacer un prefetch y seguir trabajando como si nada, y supongo que habrá una probabilidad mayor de que cuando muevas a un registro algo que está en memoria, tengas un hit en la cache y no haga falta ir a buscar el dato a memoria.
El secreto del éxito es la constancia.

cpu2

#2
Gracias por la aclaracion, solamente era eso, si lo que dices tiene sentido ya me extraña, solamente se pasan los datos pero no se pueden leer.

Si yo tengo lo siguiente.

Código (asm) [Seleccionar]
prefetchnta (%rsp, %r8)
movb (%rsp, %r8), %r14b


Se supone que la CPU usaria la cache, pero eso en mi caso funcionaria? Bueno es que no quiero subir el codigo, pero eso en realidad ayudaria mucho.

Un saludo.

Modifico:

offset es un array de unos 200 bytes, lo que tengo que hacer es pasar un byte de un puntero y luego sumarlo offset y pasar el valor.

Ejemplo:

offset = 0x6000 r14b = 0x10

r14b * 1 + offset = 0x6010


Y pasaria el valor de la posicion 0x6010, pero puedo aplicar la cache para algo asi?

Bueno tambien e estado leyendo que prefetchtna depende de la CPU y de la implementacion carga como minimo unos 32 bytes, eso pone en el manual.

A donde pretendo llegar es a esto, como dije anteriormente carga unos 32 bytes, entonces esto siguiente tendria que funcionar no?

Código (asm) [Seleccionar]
prefetchnta (%rsp, %r8)
movb (%rsp, %r8), %r14b
movb 1(%rsp, %r8), %r14b
movb 2(%rsp, %r8), %r14b


Sabrias decirme de cuanto seria la optimizacion?

Bueno modifico una vez mas para decir que ya se como implementarlo, segun estado leyendo un athlon 64 o un opteron carga en la cache unos 64 bytes, si no entendi mal, solamente tengo que usar prefetch unas cuantas veces para cargar el array en la L1 de la cache, supongo que asi sera mas rapido ya que tengo que repetir eso unas 50 veces en un loop, lo que no se como comprobarlo.

Bueno no me enrollo mas, gracias por tu tiempo Amadeo Magnus.