rdtsc y dual core

Imagen de cariperro
0 puntos

Hola compis,

 

A ver si se explicarme. Tengo un portatil dual core y estoy peleandome con la llamada al sistema rdtsc. No consigo que me de el tiempo de ejecución de una instruccion. Nose si hago algo mal o debería hacer algo mas...

El codigo que utilizo es algo asi:

....

rdtscl(inicio);

sleep(2);

rdtscl(fin);

....

Despues resto fin-inicio y divido por la frecuencia de mi procesador. No consigo que me de algo parecido a 2 segundos que creo que es lo que me deberia dar. Mi duda es que estoy utilizando un portatil dual core (dos nucleos de 1872.772 MHz) y nose si debo dividir por la frecuencia de uno de los dos nucleos o por la global que seria 2.6 GHz. Tampoco estoy seguro de si funciona porque el proceso se ejecute en paralelo utilizando los dos nucleos y  el resultado de rdtscl no sea el correcto (aunque he realizado la prueba varias veces y nunca me ha dado bien, me extraña que siempre me coja la instrucción con cada uno de los nucleos).

Sabeis si es posible habialitar solo un nucleo, o que un proceso corra solo sobre un núcleo, o directamente estoy haciendo algo mal :)

 

Bueno espero que me haya explicado bien.

Muchas gracias por todo, saludos.

 

Imagen de cariperro
+1
0
-1

Hola, despues de mucho navegar por ahi sigo con el mismo problema.

Necesito utilizar la instruccion rdstc() y no consigo que me funcione en el portatil. He probado de meterme en la bios y deshabilitar la opcion de doble nucleo. En teoria solo utiliza uno de los dos nucleos, de hecho en unbuntu(/proc/cpuinfo) solo veo un nucleo cuando deshabilito la opcion en la bios.

He probado con un sencillo programa en c utilizando sleep(1) midiendo clocks antes y despues para ver si consigo algo parecido a 1 segundo pero nada no hay manera.

He probado esto mismo en un ordenador de sobremesa (de un solo procesasor por su puesto) y si que me da algo parecido al segundo, por lo que deduzco que sera problema del dual core.

Alguien me puede ayudar.... lo que se me ocurre es que pueda asociar el programa a un solo procesador o nucleo, pero tampoco se como hacerlo

Muchas gracias!!!!!!! 

+1
0
-1
Imagen de gotxa
+1
0
-1

hola cariperro
he leido tu hilo y llevo algún tiempo leyendo para enterarme de qué hace rdstc, para qué sirve y tal... con ánimo de enterarme sólo. Debo decir que seguramente no seré yo quien te pueda ayudar, es la primera vez que "veo" esto pero me he encontrado este enlace
http://www.midnightbeach.com/rdtsc.html

en él hay un par de ejemplillos de uso (en pascal y un poco de ensamblador, ojo). Lo que me ha salido de ojo es que apunta un error involuntario y fácil de cometer al hacer la resta de los valores tikstiempoalto - tickstiempobajo porque esto, que lo almacena en un longint es fácil que se desborde en procesos largos con las velocidades actuales de procesador.

"...If you need to compare two long running processes, the difference between the start ticks and the stop ticks can easily exceed High(LongInt)..."

Salvando las distancias de lenguajes y suponiendote valor (como en la mili) ¿no es posible que el error esté justo al hacer la resta y el tipo de variable donde se guardan estos valores?

Y si no tiene nada que ver con apuntarlo basta, no te cebes. Pues suertes

Por un pingüino calculador
GoTXa
linux counter #116453

+1
0
-1

GoTXa
linux counter #116453
Klaatu barada nikto

Imagen de cariperro
+1
0
-1

Hola Gotxa,

Muchas gracias por tu respuesta pero ya habia tenido en cuenta esto del desbordamiento. El problema esta en....

Por lo que se y habras visto, esta funcion (rdtsc()) lo que hace es guardar en un registro el numero de clocks que lleva el procesador desde que se arranco. De esta manera tu puedes hacer medidas de tiempo de proceso muy exactas leyendo estos registros antes y despues de la funcion a medir. Ahora bien, el problema lo tenemos con los "dual core", estos procesadores tienen doble nucleo y entiendo que un doble procesador cada uno con sus clocks.... cuando llamas a esta funcion el proceso se debe de volver loco porque no debe saber de que procesador vienen los clocks.

Ya te digo que he probado esta misma funcion en mi ordenador de sobremesa y un portatil que no es dual core... La prueba la he hecho con el sencillo programa que puse en el primer post y funciona correctamente... al hacer las operaciones de dividir por la frecuencia de reloj del procesador la cosa me da del orden de los 2 seg (o el valor que ponga dentro del sleep).

Con mi dual core he intentado deshabilitar en el bios uno de los nucleos, pero a la hora de ejecutar el programa sigue haciendo lo que quiere, y ya digo que el progrma en c es el mismo para las tres maquinas que he testeado y solo me falla en mi portatil dual core.

Espero que me haya sabido explicar... si encuentras alguna solucion por favor hazmelo saber te estare muy agradecido. Yo sigo sumergido en google buscando :)

Muchas gracias!!!! 

+1
0
-1
Imagen de gotxa
+1
0
-1

¿es uno de estos?: AMD Dual-core processors, including AMD Opteron™, AMD Athlon™ 64 X2, AMD Athlon 64 FX, and AMD Turion 64 X2

te explicas perfex., el problema es lo chungo del ploblema en sí.

GoTXa
linux counter #116453

+1
0
-1

GoTXa
linux counter #116453
Klaatu barada nikto

Imagen de cariperro
+1
0
-1

Perdona Gotxa por tardar tanto en contestar.. he estado unos dias fuera.

Mi procesador es Intel Core Duo.... Genuine Intel(R) CPU T2400

Porque me preguntas esto?? que ocurre con los otros procesadores que me nombras?? Alomejor me puedes dar pistas....

 Muchas gracias!!!!

+1
0
-1
Imagen de gotxa
+1
0
-1

hola,
mucha de la info encontrada sobre dual core y rdtsc hace referencia a problemas de los juegos que utilizan esta instrucción, y se habla mucho de AMD, aunque asunto juegos en winXP:

"[...]  estos programas no tienen en cuenta que el ahorro de energía modifica la velocidad al a cual es incrementado este contador, ni que en distintos núcleos podría tener valores diferentes ( poco probable si ambos núcleos corren a la misma velocidad ). Lo que hace este programa es ajustar y sincronizar periódicamente los contadores de ambos núcleos para corregir los defectos en los timings de estas aplicaciones. [...]"

http://www.psicofxp.com/forums/software.11/427163-amd-dual-core-optimizer.html 

(para corregir este problema en winXP hacen uso de dual core optimizer, con AMD) Llegué también a un PDF de AMD en el que explicaba el fenómeno y daba una lista de los procesadores afectados, pero ahora no llego a él, está ya un poco lejos en mi memoria.

También la wikipedia, aunque en general:

"[...]With the advent of multi-core/hyperthreaded CPUs, systems with multiple CPUs, and "hibernating" operating systems, RDTSC often no longer provides reliable results. The issue has two components: rate of tick and whether all cores (processors) have identical values in their time-keeping registers. There is no longer any promise that the timestamp counters of multiple CPUs on a single motherboard will be synchronized. So, you can no longer get reliable timestamp values unless you lock your program to using a single CPU. Even then, the CPU speed may change due to power-saving measures taken by the OS or BIOS, or the system may be hibernated and later resumed (resetting the time stamp counter). Also it makes the program not portable to anything other than x86.[...]" 

http://en.wikipedia.org/wiki/RDTSC 

Supongo que a estos enlaces ya has llegado pero la wikipedia explica lo erróneo de los datos que tienes aunque no da solución... en esta página hay como bibliografía un manual de Intel todo bien explicadito sobre rdtsc.

saluddds 

GoTXa
linux counter #116453

+1
0
-1

GoTXa
linux counter #116453
Klaatu barada nikto