Supongamos que tengo dos funciones grandes. ¿Es mejor escribirlos en núcleos separados y llamarlos secuencialmente, o es mejor escribir solo un kernel? (No quiero volver a leer los datos y forzar la forma entre el host y el dispositivo). ¿Qué pasa con la velocidad si quiero llamar al núcleo muchas veces?Escribir múltiples núcleos o un kernel único
Respuesta
Una cosa a considerar es el efecto de la presión de registro en la utilización y el rendimiento del hardware.
Como regla general, los granos grandes tienen grandes huellas de registro. Los dispositivos OpenCL típicos (es decir, GPU) tienen tamaños de archivo de registro muy finitos y los núcleos grandes pueden dar como resultado una menor concurrencia (menos warps/wavefronts simultáneos), menos oportunidades de ocultación de latencia y peor rendimiento general. Por otro lado, los gastos generales de lanzamiento del kernel son bastante bajos en la mayoría de las plataformas, por lo que si su algoritmo no tiene una gran cantidad de estado para guardar entre las "fases" de ejecución, la penalización de usar kernels múltiples puede ser bastante baja.
El uso de kernels múltiples también tiene otro beneficio secundario: obtiene sincronización implícita entre todas las unidades de trabajo de forma gratuita. A menudo eso puede eliminar la necesidad de operaciones de memoria atómica y primitivas de sincronización que pueden tener un impacto negativo en el rendimiento del código.
La última guía debe medir el rendimiento. No hay una regla empírica universal para este tipo de cosas. Benchmarking es la única forma de saberlo con certeza.
Apple acepta: https: // developer. apple.com/library/mac/documentation/Performance/Conceptual/OpenCL_MacProgGuide/TuningPerformanceOntheGPU/TuningPerformanceOntheGPU.html –
En general, esta es una cuestión de (tal vez) un rendimiento ligeramente mejor frente a la legibilidad de su código. La copia de almacenamientos intermedios no es un problema siempre que los mantenga dentro del mismo contexto. P.ej. podría establecer un buffer de salida de un kernel para que sea un buffer de entrada del kernel siguiente, lo que no implicaría ninguna copia.
La forma correcta de codificar en OpenCL es separar el código en tareas paralelas, y cada una de ellas es un kernel. Esto es, cada "bucle for" debe ser un kernel. Algunas veces, una sola función de código de CPU podría dar como resultado una implementación de 4 kernels en OCL.
Si necesita almacenar datos entre las ejecuciones del kernel solo use los búferes de OpenCL y no copie al host (esto resuelve el DEVICE < -> HOST cuello de botella).
Si ambas funciones actúan con datos diferentes, podría escribir de manera reproducible un solo núcleo, pero eso depende de la complejidad de la operación que se está ejecutando.
- 1. Ejecución simultánea del kernel CUDA con múltiples núcleos por secuencia
- 2. JVM en múltiples núcleos
- 3. Estructura TFS: ¿proyectos múltiples o proyecto único?
- 4. MPI: ¿núcleos o procesadores?
- 5. usuarios múltiples y un único repositorio en github o springloops
- 6. Cómo optimizar las aplicaciones de Android para múltiples núcleos
- 7. ¿Es posible ejecutar un kernel cuda en múltiples gpus
- 8. ¿Puede gcc usar múltiples núcleos al vincular?
- 9. Uso de múltiples núcleos/procesadores al compilar Java
- 10. Parámetros para núcleos CUDA
- 11. ¿El iOS-Simulator usa múltiples núcleos?
- 12. Recursos de múltiples núcleos en C
- 13. Compilando con g ++ usando múltiples núcleos
- 14. ¿Cómo puede una aplicación usar múltiples núcleos o CPU en .NET o Java?
- 15. bibliotecas glibc múltiples en un único host
- 16. Agregar múltiples servlets en un único web.xml
- 17. ¿Por qué un único proceso con hilos se ejecuta en varios procesadores/núcleos?
- 18. EF 4.1 Code First: ¿contexto único o contextos múltiples?
- 19. sqlalchemy único en múltiples columnas
- 20. Conjunto único de proyectos múltiples
- 21. Lectores múltiples sin bloqueo único escritor
- 22. Núcleos precalculados de Libsvm
- 23. Ejecución concurrente del kernel GPU desde procesos múltiples
- 24. ¿Cómo hacer que los sitios web de Ruby o Python usen múltiples núcleos?
- 25. Escribir en un div no único con Javascript
- 26. Android: Cómo escribir varios selectores en un único archivo xml
- 27. ¿Solr 4.0 es capaz de usar 'join' para múltiples núcleos?
- 28. ¿Siempre usa bandera de múltiples núcleos (/ MP) con Visual Studio?
- 29. ¿Puede un único esquema XML tener múltiples targetNameSpaces?
- 30. Número máximo de subprocesos que se pueden iniciar en un único kernel CUDA
mira aquí, discusión similar: stackoverflow.com/questions/9208535/how-to-handle-a-variable-number-of-algorithms-in-a-kernel – rdoubleui