2011-05-02 15 views
7

Estoy interesado en ejecutar un programa a una frecuencia específica (como 25MHz) en mi procesador de 2GHz +. El único método que se me ocurre para hacer algo como esto es usar una función de sueño de precisión de microsegundos, pero no estoy seguro de cómo calcular cuánto tiempo debe dormir el hilo para que coincida con una frecuencia específica. ¿Alguna sugerencia u otras ideas? Estoy haciendo esto en C en un sistema operativo Linux X86.¿Cómo se simularía programáticamente frecuencias de procesador más bajas?

+0

¿Cuál es su objetivo/"caso de uso" para hacer esto? ¿Estás tratando de medir el rendimiento a velocidades más bajas? – jwmacdon

+0

Hice un procesador virtual y quiero ejecutarlo a una frecuencia específica. – ytrp

Respuesta

2

Aquí hay un par de problemas. Esto primero es lo que estás tratando de simular. Los procesadores modernos registran a 2Ghz pero las instrucciones de la tubería así que una instrucción individual puede tomar 10-30 relojes para terminar. Al poner un descanso en el hilo, rompes la tubería. El segundo es qué tan granular quieres tener tu simulación. ¿Necesita tener el tiempo de nivel de instrucción de podemos falsificarlo poniendo un poco de espacio entre las funciones.

Mi último pensamiento es que probablemente no desee simular un procesador moderno que funcione a 25Mhz, sino algún tipo de chip ARM en un dispositivo incrustado. Si este es el caso, hay muy buenos simuladores para la mayoría de estos chips que ya están en el mercado. Compila tu código con instrucciones nativas para tu chip objetivo, usa un simulador ya disponible si hay alguno disponible.


Editar:

Así que ahora entiendo lo que quiere ejecutar una instrucción en un virtual del procesador 25M veces por segundo. Lo que podría probar es un enfoque adaptativo. Tienes mucho tiempo para "perder el tiempo" entre las instrucciones. comience colocando algo de espacio, probablemente el sueño funcione, entre cada instrucción. Tenga en cuenta que en una matriz con tanta precisión como sea posible cuando cada reloj virtual comenzó a mantener una media móvil de, digamos, los últimos 25, 100 o 1000 ciclos. Si el promedio aumenta por encima de 25Mhz, comience a agregar más espacio. Si es demasiado lento, reduzca el espacio.

Como dije originalmente, es muy difícil calcular la cantidad de tiempo que una instrucción toma un procesador moderno. El primer conjunto de instrucciones puede ejecutarse demasiado rápido o lento, pero una técnica como esta debería mantenerla tan cerca de la velocidad correcta como lo haría un oscilador típico en una implementación de hardware comparable.

+1

Este tipo de respuesta no es útil. El autor preguntó cómo, no dónde comprar software preexistente. – subwar

+1

Subwar, cuando escribí esta respuesta, el comentario "Hice un procesador virtual ..." no se publicó. Respondí la pregunta que pensé que era cómo simular la ejecución de un procesador 2Ghz X86 a 25Mhz. El segundo párrafo suponía que esto no era exactamente lo que quería hacer. Resulta que estaba medio en lo correcto. Él realmente quería simular un procesador diferente, simplemente no uno preexistente. –

+0

Salté el arma. Disculpas amigo :) – subwar

1

Sugeriría una arquitectura basada en eventos: en cada STEP (1/hz), ejecute 1 operación de instrucción.

2

Simplemente ejecutaría la simulación en ráfagas. Por ejemplo, puede ejecutar 250 mil ciclos, luego dormir durante el resto de un intervalo de 10 ms. Puede ajustar la vista del reloj que la simulación ve para que sea completamente transparente, a menos que esté interactuando con algún tipo de hardware externo con el que se deba interconectar a una velocidad determinada (en cuyo caso se convierte en un problema mucho más difícil).

0

Consulte el emulador de CPU Fracas para tener un enfoque al respecto. Los autores presentaron esto en el taller Heteropar, una parte de EUROPAR 2010. Básicamente, modifican el programador del sistema operativo para permitir el uso de solo fracciones de la frecuencia de CPU real que utilizarán los programas de usuario.

1

Para resumir lo que han dicho las respuestas anteriores, si está en modo de usuario intentando emular un procesador virtual a una frecuencia específica, debe implementar algún tipo de "programación" manual del hilo que procesa las instrucciones de la CPU a través de llamadas de espera o funciones y funciones más avanzadas como fibras en Windows. Una advertencia que debe tener en cuenta es que algunas llamadas de suspensión del sistema operativo no duermen durante la cantidad exacta de tiempo que especifique, por lo que puede tener que agregar un código adicional para calibrar la desviación de la computadora a la computadora para acercarse a la frecuencia objetivo . En la mayoría de los casos, no podrá programar con precisión su procesador virtual para que funcione a una velocidad constante de 25 MHz (22-28 MHz es más probable).De todas formas, estoy de acuerdo con Nathan y con la idea del estallido. ¡Buena suerte en cualquier camino que uses!

+0

Para calcular el n. ° de segundos deberías usar algún ensamblaje para sincronizar la ejecución de algún código ficticio (código que probablemente se ejecutará). A continuación, obtenga algún tipo de algoritmo (a través de la experimentación) que relacione el tiempo que lleva el código de ejecución con el tamaño del código ficticio ejecutado. Puede usar este algoritmo para calcular aún más cuánto tardará en ejecutar su código de procesador virtual o, mejor aún, reutilizar el algoritmo dinámicamente en su ciclo de emulación para determinar cuánto tiempo debe dormir (factor en la calibración). – subwar

1

Para una máquina virtual, todo es virtual, incluido el tiempo. Por ejemplo, en 123 segundos reales, puede emular 5432 segundos virtuales de procesamiento. Una forma común de medir el tiempo virtual es incrementar (o agregar algo a) un contador de "número de ciclos" cada vez que se emula una instrucción virtual.

De vez en cuando intentas sincronizar el tiempo virtual con el tiempo real. Si el tiempo virtual está demasiado adelantado al tiempo real, inserte un retraso para que el tiempo real se ponga al día. Si el tiempo virtual está atrás en tiempo real, entonces necesita encontrar una excusa para la desaceleración. Dependiendo de la arquitectura emulada, puede que no haya nada que puedas hacer; pero para algunas arquitecturas hay funciones de administración de energía, como el estrangulamiento térmico (por ejemplo, puede pretender que la CPU virtual se calienta y se está enfriando más lentamente).

También es probable que desee tener una cola de eventos, donde diferentes dispositivos emulados pueden decir "en algún momento específico se producirá algún evento"; de modo que si la CPU emulada está inactiva (esperando a que ocurra un evento), puede saltear adelante para cuando ocurra el próximo evento. Esto proporciona una forma natural para que la máquina virtual se ponga al día si se está ejecutando lentamente.

El siguiente paso es determinar los lugares donde el tiempo importa y solo sincronizar el tiempo virtual con el tiempo real en esos lugares específicos. Si la máquina emulada realiza un procesamiento pesado y no hace nada que sea visible para un observador externo, un observador externo no tiene forma de saber si el tiempo virtual está cerca de tiempo real o no. Cuando la máquina virtual hace algo que es visible para un observador externo (por ejemplo, enviar un paquete de red, actualizar el video/pantalla, hacer un sonido, etc.) primero sincroniza la hora virtual con el tiempo real.

El paso más allá es el uso de almacenamiento en búfer para desacoplar cuando ocurren cosas dentro del emulador desde cuando son visibles para un observador externo. Para un ejemplo (exagerado), imagine que la máquina emulada cree que son las 8:23 de la mañana y quiere enviar un paquete de red, pero en realidad solo son las 8:00 de la mañana. La solución simple es retrasar la emulación durante 23 minutos y luego enviar el paquete. Eso suena bien, pero si (después de que la máquina virtual envía el paquete) el emulador tiene dificultades para mantenerse al día (debido a otros procesos que se ejecutan en la computadora real o por cualquier otro motivo) el emulador puede quedarse atrás y puede tener problemas la ilusión de que el tiempo virtual es lo mismo que el tiempo real. Alternativamente, podría pretender que el paquete fue enviado y poner el paquete en un búfer y continuar emulando otras cosas, y luego enviar el paquete más tarde (cuando en realidad es las 8:23 de la mañana en el mundo real). En este caso, si (después de que la máquina virtual envía el paquete) el emulador tiene dificultades para mantenerse al día con el tiempo real, todavía tiene 23 minutos de margen.

Cuestiones relacionadas