nvidia reference - ¿Son las llamadas del kernel cuda síncronas o asíncronas?




for dummies (4)

La respuesta aceptada no siempre es correcta.

En la mayoría de los casos, el lanzamiento del kernel es asíncrono. Pero en el siguiente caso, es síncrono . Y son fácilmente ignorados por las personas.

  • la variable de entorno CUDA_LAUNCH_BLOCKING es igual a 1.
  • utilizando un generador de perfiles ( nvprof ), sin habilitar la generación simultánea de perfiles del kernel
  • memcpy que involucra memoria del host que no está bloqueada en la página.

Los programadores pueden deshabilitar globalmente la asincronía de los lanzamientos del kernel para todas las aplicaciones CUDA que se ejecutan en un sistema configurando la variable de entorno CUDA_LAUNCH_BLOCKING en 1. Esta función se proporciona solo para fines de depuración y no debe utilizarse como una forma de hacer que el software de producción funcione de manera confiable.

Los lanzamientos de kernel son sincrónicos si los contadores de hardware se recolectan a través de un generador de perfiles (Nsight, Visual Profiler) a menos que se habilite la creación simultánea de perfiles de kernel. Las copias asíncronas en la memoria también serán sincrónicas si involucran memoria del host que no está bloqueada en la página.

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

Leí que uno puede usar los lanzamientos 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, debería colocar la operación 1 en un kernel y la operación 2 en otro kernel. De esta manera, puedo lograr la sincronización global entre bloques. Sin embargo, la guía de programación cuda menciona que las llamadas al kernel son asíncronas, es decir. La CPU no espera a que finalice la primera llamada del kernel y, por lo tanto, la CPU también puede llamar al segundo kernel antes de que la primera haya finalizado. Sin embargo, si esto es cierto, entonces no podemos usar los lanzamientos del kernel para sincronizar bloques. Por favor, hágamelo saber donde voy mal


Las llamadas al kernel son asíncronas desde el punto de vista de la CPU, por lo que si llama a 2 kernels en sucesión, se llamará al segundo sin esperar a que termine el primero. Solo significa que el control vuelve a la CPU inmediatamente.

En el lado de la GPU, si no ha especificado diferentes flujos para ejecutar el kernel, se ejecutarán según el orden en que fueron llamados (si no especifica un flujo, ambos van al flujo predeterminado y se ejecutan en serie). Solo después de que el primer kernel haya terminado, el segundo se ejecutará.

Este comportamiento es válido para dispositivos con capacidad de procesamiento 2.x que admiten la ejecución simultánea del kernel. En los otros dispositivos, a pesar de que las llamadas al kernel siguen siendo asíncronas, la ejecución del kernel es siempre secuencial.

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


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

Además, se puede hacer un retorno al código de la CPU antes de que todo el kernel warp haya funcionado.

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


Los núcleos tensoriales utilizan mucha menos potencia de cálculo a expensas de la precisión que los núcleos Cuda, pero esa pérdida de precisión no tiene mucho efecto en la salida final.

Esta es la razón por la cual, para los modelos de Aprendizaje automático, los núcleos tensoriales son más efectivos en la reducción de costos sin cambiar tanto el rendimiento.

Google utiliza las unidades de procesamiento de tensor para el traductor de google.