OpenCL vs OpenMP performance
gpgpu (2)
Tengo un programa que tiene la opción de usar openCL o openMP en algunos cuellos de botella clave, básicamente agregando vectores y realizando reducciones.
En mi caso, openMP tarda 13 segundos, mientras que openCL tarda 10 segundos, en la CPU. Intel I5.
La configuración más rápida para mí hasta ahora es agregar los vectores usando GPU openCL, y hacer las reducciones en openMP para reducir a 7 segundos. Cuando hago la reducción en el kernel openCL, en GPU, toma un total de 8 segundos.
Desde mi experiencia, diría que tal vez depende del uso, y mucho puede optimizar su kernel openCL.
¿Ha habido estudios que comparen OpenCL con el rendimiento de OpenMP? Específicamente, estoy interesado en el costo general del lanzamiento de subprocesos con OpenCL, por ejemplo, si uno fuera a descomponer el dominio en una gran cantidad de elementos de trabajo individuales (cada uno ejecutado por un subproceso que hace un trabajo pequeño) versus subprocesos de mayor peso en OpenMP. el dominio se descompuso en subdominios cuyo número es igual al número de núcleos.
Parece que el modelo de programación OpenCL está más orientado a chips masivamente paralelos (GPU, por ejemplo), en lugar de CPU que tienen menos núcleos pero más potentes.
¿Puede OpenCL ser un reemplazo efectivo para OpenMP?
Los puntos de referencia que he visto indican que OpenCL y OpenMP que se ejecutan en el mismo hardware suelen ser comparables en rendimiento, o OpenMP tiene un rendimiento ligeramente mejor. Sin embargo, no he visto ningún punto de referencia que pueda considerar concluyente, porque en su mayoría carecen de explicaciones detalladas de su metodología. Sin embargo, hay algunas cosas útiles a considerar:
OpenCL siempre tendrá una sobrecarga adicional al compilar el kernel en tiempo de ejecución. Cualquier punto de referencia debe enumerar este tiempo por separado, usar kernels nativos precompilados o correr el tiempo suficiente para que la compilación del kernel sea insignificante.
Las implementaciones de OpenCL variarán. Los proveedores de GPU como NVidia no tienen incentivos para asegurarse de que su implementación OpenCL basada en CPU sea lo más rápida posible. Es probable que ninguna de las implementaciones de OpenCL sea tan madura como una buena implementación de OpenMP.
La especificación de OpenCL básicamente no dice nada acerca de cómo las implementaciones basadas en la CPU utilizan subprocesos bajo el capó, por lo que cualquier discusión sobre si el subprocesamiento es relativamente ligero o pesado será necesariamente específica a la implementación.
Cuando ejecuta código OpenCL en una CPU, sus elementos de trabajo no tienen que ser pequeños y numerosos. Puede desglosar el problema de la misma manera que lo haría con OpenMP.
Incluso si OpenCL tiene un poco más de sobrecarga, puede haber otras razones para preferirlo.
Obviamente, si su código puede hacer un buen uso de una GPU, querrá tener una implementación OpenCL. El rendimiento de OpenCL en una CPU puede ser lo suficientemente bueno como para que no valga la pena mantener también una ruta de código de respaldo OpenMP para los usuarios que no tienen GPU potentes.
Una buena implementación de OpenCL basada en la CPU significa que obtendrá automáticamente el beneficio de cualquier extensión de conjunto de instrucciones que la CPU y el soporte de implementación de OpenCL. Con OpenMP, tiene que hacer un trabajo adicional para asegurarse de que su ejecutable incluya las rutas de los códigos SSEx y AVX.
Las primitivas de vectores de OpenCL pueden ayudarlo a expresar cierto paralelismo explícito sin los sacrificios de portabilidad y legibilidad que obtiene al usar intrínsecos SSE.