Pregunta

Busco maneras de realizar micro-puntos de referencia en los procesadores de múltiples núcleos.

Contexto:

Casi al mismo tiempo los procesadores de escritorio introducidas fuera de orden de ejecución que hizo el rendimiento difícil de predecir, que, instrucciones especiales quizá no por casualidad, también introducidas para conseguir tiempos muy precisos. Ejemplo de estas instrucciones son rdtsc en x86 y rftb en PowerPC. Estas instrucciones dieron los tiempos que eran más precisos que se podía permitir alguna vez por una llamada al sistema, programadores permiten a las micro-punto de referencia con el corazón, para bien o para mal.

En un procesador aún más moderno con varios núcleos, algunos de los cuales duermen parte del tiempo, los contadores no están sincronizados entre los núcleos. Se nos dice que rdtsc ya no es seguro de usar para la evaluación comparativa, pero debe de haber sido dormido cuando nos explicó las soluciones alternativas.

Pregunta:

Algunos sistemas pueden guardar y restaurar el contador de rendimiento y proporcionar una llamada a la API para leer la suma correcta. Si sabe lo que esta llamada es para cualquier sistema operativo, por favor háganoslo saber con una respuesta.

Algunos sistemas puede permitir apagar núcleos, dejando sólo uno corriendo. Sé que Mac OS X Leopard hace cuando el panel de preferencias de la derecha se instala desde las herramientas de desarrolladores. ¿Cree que esta caja fuerte marca rdtsc a utilizar de nuevo?

Más contexto:

Por favor, asuma que sé lo que estoy haciendo cuando se trata de hacer un micro de referencia. Si usted es de la opinión que si las ganancias de una optimización no se puede medir midiendo el tiempo de toda la aplicación, que no vale la optimización, estoy de acuerdo con usted, pero

  1. No puedo medir el tiempo toda la aplicación hasta que la estructura de datos alternativo está acabado, que se llevará mucho tiempo. De hecho, si el micro de referencia no fueron prometedores, podría decidir renunciar a la aplicación ahora;

  2. Necesito cifras para proporcionar en una publicación cuyo plazo tengo ningún control.

¿Fue útil?

Solución

En OSX (ARM, Intel y PowerPC), que desea utilizar mach_absolute_time( ):

#include <mach/mach_time.h>
#include <stdint.h>    

// Utility function for getting timings in nanoseconds.
double machTimeUnitsToNanoseconds(uint64_t mtu) {
    static double mtusPerNanosecond = 0.0;
    if (0.0 == mtusPerNanosecond) {
        mach_timebase_info_data_t info;
        if (mach_timebase_info(&info)) {
            // Handle an error gracefully here, whatever that means to you.
            // If you do get an error, something is seriously wrong, so
            // I generally just report it and exit( ).
        }
        mtusPerNanosecond = (double)info.numer / info.denom;
    }
    return mtu * mtusPerNanosecond;
}

// In your code:
uint64_t startTime = mach_absolute_time( );
// Stuff that you want to time.
uint64_t endTime = mach_absolute_time( );
double elapsedNanoseconds = machTimeUnitsToNanoseconds(endTime - startTime);

Tenga en cuenta que no hay necesidad de limitar a un núcleo para esto. Los identificadores de sistema operativo de la corrección requerida en marcha detrás de las escenas para mach_absolute_time( ) para dar resultados meaninful en un multi-núcleo (y multi-socket) medio ambiente.

Otros consejos

Los núcleos están regresando los valores sincronizados correctos para "rtdsc". Si usted tiene una máquina múltiple con usted tiene que fijar el processe a una toma de corriente. Este no es el problema.

El problema principal es que el programador está haciendo que los datos poco fiables. Hay una cierta API rendimiento para Linux Kernel> 2.6.31 pero no he mirado. Windows> Vista está haciendo un gran trabajo aquí, y utilizar QueryThreadCycleTime QueryProcessCycleTime.

No estoy seguro acerca de OSX, pero que yo sepa "mach_absolute_time" no ajusta la hora programada.

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