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
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.
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.
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).
- 1. Llamadas síncronas con jquery
- 2. Llamadas RPC síncronas en GWT
- 3. Acceso a bases de datos síncronas vs. asíncronas
- 4. Enhebrar varias llamadas asíncronas
- 5. Configurando VS 2010 Intellisense para llamadas al núcleo CUDA
- 6. EHsc vc EHa (manejo de excepciones síncronas vs asíncronas)
- 7. Llamadas HTTP asíncronas en Python
- 8. NSURLConnection NSURLSolicitud de proxy para llamadas al servicio web asíncronas
- 9. ¿Las actualizaciones de Redis son síncronas?
- 10. diferencia entre las llamadas asíncronas y las llamadas asíncronas en io .net
- 11. Problema al llamar a la plantilla kernel CUDA
- 12. Limitación de llamadas asíncronas en Node.js
- 13. Equivalente de usleep() en kernel CUDA?
- 14. ¿Cómo se lanza un kernel CUDA?
- 15. CUDA: Llamar a una función __device__ desde un kernel
- 16. Silverlight, que trata de las llamadas asíncronas
- 17. Javascript - sincronización después de llamadas asíncronas
- 18. función dentro del kernel de cuda
- 19. ¿Cuántas llamadas al sistema hay en Linux kernel 2.6?
- 20. Se necesitan algunas aclaraciones sobre las operaciones asio síncronas y asíncronas
- 21. ¿Qué modo se prefiere cuando se realizan llamadas WCF asíncronas?
- 22. Ejecución simultánea del kernel CUDA con múltiples núcleos por secuencia
- 23. Patrón de llamadas asíncronas a API en Node.js
- 24. ¿cuál es la diferencia entre las API síncronas y las API asíncronas?
- 25. haciendo llamadas asíncronas desde el controlador genérico (.ashx)
- 26. Modo liviano de esperar un grupo de llamadas Java asíncronas
- 27. ¿La solución más elegante para encadenar llamadas asíncronas en java?
- 28. Reducción del número de registros utilizados en Kernel CUDA
- 29. ¿Es posible ejecutar un kernel cuda en múltiples gpus
- 30. llamadas WS asíncronas y espera() fuera de un controlador