2011-04-29 14 views
8

¿Cuál es la diferencia entre usar un temporizador de CPU y el evento de temporizador CUDA para medir el tiempo necesario para la ejecución de algún código CUDA? ¿Cuál de estos debería usar un programador de CUDA y por qué?CUDA: ¿diferencia entre el temporizador de la CPU y el evento del temporizador CUDA?

El uso del temporizador de CPU implicaría llamar al cudaThreadSynchronize antes de anotar cualquier momento. Para saber el tiempo clock() se puede utilizar o se puede consultar el contador de rendimiento de alta resolución como QueryPerformanceCounter (en Windows).

El evento del temporizador CUDA implicaría registrar antes y después utilizando cudaEventRecord. En un momento posterior, el tiempo transcurrido se obtendría llamando al cudaEventSynchronize en los eventos, seguido de cudaEventElapsedTime para obtener el tiempo transcurrido.

+0

¿Comenzó a escribir una pregunta y a terminar de escribir otra? No entiendo cómo el último párrafo encaja con el resto de la pregunta. ¿Qué es lo que realmente quieres saber? ¿Está intentando conciliar la salida de las mediciones del temporizador del host y del dispositivo y no puede, o algo más? – talonmies

+0

Talonmies: he eliminado el último párrafo. Entonces la pregunta simplemente es ... como programador, estoy confundido, ¿cuál de estos 2 temporizadores usar y por qué? –

Respuesta

9

La respuesta a la primera parte de la pregunta es que cudaEvents temporizadores están basados ​​en contadores de alta resolución a bordo de la GPU, y tienen una menor latencia y una mejor resolución que el uso de un temporizador de acogida porque vienen "en el metal". Debería esperar una resolución por debajo de microsegundos desde los temporizadores de cudaEvents. Deberías preferirlos para sincronizar las operaciones de la GPU precisamente por esa razón. La naturaleza por flujo de cudaEvents también puede ser útil para instrumentar operaciones asíncronas, como la ejecución simultánea del núcleo y la copia superpuesta y la ejecución del kernel. Hacer ese tipo de medición de tiempo es casi imposible usando temporizadores de host.

EDITAR: No responderé el último párrafo porque lo eliminó.

+0

Talonmies: ¿Podría elaborar lo que quiere decir con "copia superpuesta y kernel" y por qué es imposible medir esto usando la CPU? –

+2

@Ashwin: todas las GPU compatibles con CUDA enviadas en los últimos 3 años admiten la copia simultánea del dispositivo <-> del host con la ejecución del kernel. Pero hacerlo requiere las versiones asincrónicas de las API de cudaMemcpy, y como son asincrónicas con el host, no puede instrumentar las operaciones sin forzar que las llamadas sean síncronas, y eso detiene la superposición. De modo que puede medir la operación de copiado superpuesta total con un temporizador de host, pero no puede resolver lo que sucedió entre la hora de inicio y la de finalización. Pero con los eventos insertados en las transmisiones, puedes. – talonmies

3

La principal ventaja de usar eventos CUDA para el tiempo es que están menos sujetos a perturbaciones debido a otros eventos del sistema, como la paginación o las interrupciones del disco o del controlador de red. Además, como el Cu (da) EventRecord es asíncrono, hay menos efecto de Heisenberg cuando se cronometran las operaciones intensivas de GPU.

Otra ventaja de los eventos CUDA es que tienen una API limpia multiplataforma, no es necesario ajustar gettimeofday() o QueryPerformanceCounter().

Una última nota: tenga cuidado al usar eventos CUDA transmitidos en tiempo: si no especifica la secuencia NULL, puede terminar las operaciones de temporización que no tenía intención de realizar. Existe una buena analogía entre los eventos CUDA y la lectura del contador de marca de tiempo de la CPU, que es una instrucción de serialización. En los procesadores superescalares modernos, la semántica de serialización hace que el tiempo sea inequívoco. También como RDTSC, siempre debe alinear los eventos que desea cronometrar con suficiente trabajo para que el tiempo sea significativo (al igual que no puede usar RDTSC para sincronizar significativamente una sola instrucción de máquina).