Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - cpu2

#441
ASM / Re: Duda con la Cache
29 Enero 2014, 02:17 AM
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.
#442
ASM / Duda con la Cache
28 Enero 2014, 02:26 AM
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.

#443
Exacto si tienes una direccion dinamica cuando esta cambie el cliente no conectara, tienes soluciones como noip.com, tambien puedes llamar a tu ISP e informarte de cuanto te cuesta una direccion estatica, esta ultima es la que te recomiendo, pero telefonica te cobra unos 15 euros mas en la factura...

Pero bueno eso depende de lo serio que sea el proyecto y tu, para mi esta mil veces mejor la segunda opcion, a saber quien esta detras de noip...

Y sobre NAT, tienes que configurar tu la regla.

Un saludo.
#444
Solo me dio la sensacion de que no te mirastes el manual.

Lo unico que hace ese codigo es pasar argumentos y llamar a funciones del kernel. La instruccion mov "mover" el nombre engaña no mueve copia, es una instruccion esencial, basicamente es eso lo que hace, pero si te vas a los manuales de intel veras que esta mejor explicada.

La instruccon int es mas compleja, carga el numero de la funcion en %eax, y transfiere al vector 0x80 "vale para mas vectores", que es el que usa linux para las llamadas, pero para entenderla mejor tendrias que saber para que sirve la IDT y todo eso, yo aun no lo tengo muy claro.

Un saludo.
#445
No, los host de tu red no tienen la direccion WAN la tiene una interfaz del "router" mejor llamado router/modem.

Lo que tienes que hacer es poner la direccion WAN en el cliente, pero no requiere del cliente saber a que host de tu red conectarse, si no de tu propio router, tienes que hacer un NAT.

Que de tal puerto, direccion o ambas que vengan de fuera a tu direccion WAN, se traduzcan a el host de tu red interna "direccion privada".

Un saludo.
#446
Pues para tener una referencia nada mas, pero esas declaraciones de C no te sirven para nada.

A ver, te explico de forma basta, si quieres saber mas lee los manuales como te dije.

.text y .data: Los programas se dividen en secciones, .text es la que contiene las instrucciones (opcodes) bueno tambien puedes cargar opcode en otras secciones como data pero eso ya es otra cosa, estas secciones algunas tienen permisos como de escritura y lectura, por ejemplo la .text solo puedes leerla pero no escribirla. La .data como dice su nombre es para almacenar datos, esta puede escribirse y leerse.

Depende de la sección que utilices tendra un offset o otro, ya que usas linux podrias usar readelf y algo con objdump, para mirar esas direcciones y permisos. Si quieres saber con mas profundidad ya sabes.

.globl es una directiva que le dice al linker por que offset empezar.

https://sourceware.org/binutils/docs/as/Global.html#Global

No miraste el link.

Y las instrucciones lo unico que hacen es pasar los parametros a una funcion de C alojada en el kernel, en este caso write y exit, tienes que leer el man de esas funciones, para saber que pasar a los parametros.

Deja bien claro lo que hace al lado, esfuerzate mas. Los de .data lo solucionas leyendo el man de as.

Un saludo.
#447
Si el servidor no esta en la misma red interna que el cliente, es bastante logico que tengas que poner la direccion publica (WAN) del server.

Un saludo.
#448
Cita de: Tzhed\ Kyperf/ en 24 Enero 2014, 21:13 PM
La tabla está bien, se refiere a números con coma flotante.

Al op, yo tampoco entiendo la pregunta xD

Para mover un double "ocho bytes", no tiene porque ser un numero de coma flotante se usa el subijo q

Código (asm) [Seleccionar]
movq %rax, (%rsp) ; double
movl %eax, (%rsp) ; long


A lo mejor es que no entiendo bien la tabla, es igual yo me entiendo jeje.


@ADMIRATION

Vale quieres decir que te pasemos las declaraciones que estan en C a python?

Si es eso no hace falta, tienes que cambiar el chip, en ASM (GAS) esas declaraciones no existen, bueno mentira hay algunas declaraciones que tienen practicamnete el mismo nombre. Bueno mejor llama a declaraciones directivas.

Las tienes en el link que te pase de as.

.byte    b  ; 1 byte
.word    w  ; 2 byte
.long    l  ; 4 byte
.quad    q  ; 8 byte
.octa       ;16 byte  ; xmm registro


Depende de si tabajas con numeros de coma flotante tienes que usar otras instrucciones y no hace falta el prefijo, seguro que Tzhed\ Kyperf/  se referia a eso.

Los registros se asemejan a esas directivas, ya veras cuando avances, tambien existe un registro de 32 byte ymm, y los zmm 64 byte, depende de la CPU. No se si hay directivas para esos dos.

Un saludo.
#449
A ver no se entiende tu pregunta, pero no estas en ASM para que preguntas en python y C.

Ademas esa tabla esta equivocada yo no la miraria mucho para un double o .quad el sufijo es q.

Un saludo.
#450
Si, es lo que intente decirte en mi primer mensaje, pero bueno a la segunda me haces caso.

En el link que nos pasaste si te fijas declara un array para 6 octeos que son para la direccion MAC, tu puedes hacer lo mismo si quieres para las direcciones ipv4 solo que con 4 octeos.

Un saludo.