En su mayor parte OpenMP y OpenCL son independientes el uno del otro. Ambas son formas de darle acceso al desarrollador al paralelismo en su plataforma.
OpenMP está diseñado para funcionar bien con procesadores múltiples (idénticos), donde el trabajo que es aproximadamente igual puede ser (casi) automáticamente cultivado entre ellos.
OpenCL es una bestia algo diferente, en el sentido de que realmente brilla cuando se trabaja con hardware especial de coprocesador. Te permitirá descargar parte del procesamiento de números de servicio pesado a la GPU o a algún otro coprocesador como en la Celda. Sin embargo, también fue construido con la idea de que podría ser utilizado para aprovechar otros procesadores principales, como ahora es común en computadoras multi-core. Consideraría que esta característica es secundaria, y si esto es todo lo que tiene la intención de utilizar OpenCL para, no recomendaría el uso de OpenCL.
Dicho esto, supongo que sería un poco desafiante, aunque definitivamente no imposible hacer que OpenMP y OpenCL trabajen juntos en el mismo problema.
Lo primero que hay que pensar es qué trabajo le está dando a OpenCL. Este sería definitivamente un caso en el que solo querría que OpenCL se ejecutara en la GPU/Coprocesador ... no en los otros procesadores principales/núcleos, ya que OpenMP ya los está usando. No (no debería) provocar errores de aplicación para ejecutar OpenCL y OpenMP en el mismo procesador principal, pero provocará una programación no deseada en la que tanto OpenMP como OpenCL se ejecuten más lentamente porque pasan una buena parte de su tiempo cambiando de nuevo. y cuarto entre ellos. Esto también sucedería si ejecuta cualquier otro proceso que consuma más procesador en el mismo núcleo al mismo tiempo.
La otra gran cosa en que pensar es en cómo programar las tareas que se ejecutan en el coprocesador. Es cierto que puede alimentar una gran cantidad de trabajo en una de las GPU modernas, pero hay muchas cosas en que pensar con el uso de la tubería y la memoria. Lo que no quiere que suceda es tener 8 hilos OpenMP diferentes, cada uno tratando de enviar su propio trabajo al Co-procesador al mismo tiempo. Yo recomendaría tener solo un hilo que maneje todas las interacciones con el Co-Procesador, para que pueda asegurarse de que funcione de una manera eficiente.
Dicho esto, estoy seguro de que hay programas que tienen múltiples tipos de tareas que suceden al mismo tiempo, donde un tipo de tarea siempre podría ser asignada al Co-Procesador y otro tipo de tarea podría ser manejada por el procesador principal multi-núcleo. Este sería un buen ejemplo de un tiempo para mezclar OpenMP y OpenCL.
¡Buena suerte!