2011-12-12 14 views
19

He leído que se pueden usar inicios del kernel para sincronizar diferentes bloques, es decir, si quiero que todos los bloques completen la operación 1 antes de pasar a la operación 2, debo colocar la operación 1 en un kernel y operación 2 en otro núcleo. De esta manera, puedo lograr la sincronización global entre bloques. Sin embargo, la guía de programación de cuda c menciona que las llamadas al núcleo son asíncronas, es decir. la CPU no espera a que finalice la primera llamada al núcleo y, por lo tanto, la CPU también puede llamar al segundo kernel antes de que termine el primero. Sin embargo, si esto es cierto, entonces no podemos usar lanzamientos de kernel para sincronizar bloques. Indique dónde me equivocoSon llamadas al kernel cuda síncronas o asíncronas

Respuesta

28

Las llamadas al kernel son asincrónicas desde el punto de vista de la CPU, por lo que si llama a 2 núcleos en sucesión, se llamará al segundo sin esperar a que termine el primero. Solo significa que el control vuelve a la CPU de inmediato.

En el lado de la GPU, si no ha especificado diferentes flujos para ejecutar el kernel, se ejecutarán por el orden en que se llamaron (si no especifica una secuencia, ambos van a la secuencia predeterminada y se ejecutan en serie). Solo después de que el primer kernel finalice, se ejecutará el segundo.

Este comportamiento es válido para dispositivos con capacidades de cómputo 2.x que admiten la ejecución simultánea del kernel. En los otros dispositivos, aunque las llamadas al kernel siguen siendo asincrónicas, la ejecución del núcleo siempre es secuencial.

Consulte la guía de programación CUDA C en la sección 3.2.5 que todo programador de CUDA debería leer.

0

La ejecución simultánea del kernel es compatible desde la versión con capacidad 2.0 CUDA.

Además, se puede hacer una vuelta al código de la CPU antes de que todo el núcleo warp haya funcionado.

En este caso, puede proporcionar la sincronización usted mismo.

2

La respuesta aceptada no siempre es correcta.

En la mayoría de los casos, el inicio del kernel es asincrónico. Pero en el siguiente caso, es sincrónico. Y son fácilmente ignorados por las personas.

  • variable de entorno CUDA_LAUNCH_BLOCKING es igual a 1.
  • utilizando un perfilador (nvprof), sin habilitar concurrente de kernels de perfiles
  • establecimiento de memoria que involucran la memoria del host que no es la página bloqueada.

programadores pueden deshabilitar globalmente asincronía del kernel de lanzamientos para todas las aplicaciones CUDA ejecutan en un sistema mediante el establecimiento de la variable de entorno CUDA_LAUNCH_BLOCKING a 1. Esta función se facilita fines de depuración solamente y no debe ser utilizado como una forma de hacer que el software de producción se ejecute de manera confiable.

Los lanzamientos de kernel son síncronos si los contadores de hardware se recopilan a través de un generador de perfiles (Nsight, Visual Profiler) a menos que esté habilitado el perfil de kernel concurrente. Las copias de memoria asíncrona también serán síncronas si involucran memoria del host que no está bloqueada en la página.

De la guía de programación NVIDIA CUDA (http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#concurrent-execution-host-device).

Cuestiones relacionadas