2008-12-10 8 views
10

La especificación 1.0 para OpenCL acaba de salir hace unos días (Spec es here) y acabo de empezar a leerla. Quiero saber si funciona bien con otras API de multiprocesamiento de alto rendimiento como OpenMP (spec) y quiero saber qué debo aprender. Entonces, aquí están mis preguntas básicas:OpenCL: funciona bien con OpenMP, puedo conectarle otros idiomas, etc.

  1. Si ya estoy usando OpenMP, ¿eso romperá OpenCL o viceversa?
  2. ¿OpenCL es más poderoso que OpenMP? ¿O están destinados a ser complementarios?
  3. ¿Hay una forma estándar de conectar un programa OpenCL a un programa estándar C99 (o cualquier otro idioma)? ¿Qué es?
  4. ¿Alguien sabe si alguien está escribiendo un libro de OpenCL? Estoy leyendo las especificaciones, pero he encontrado que los libros son más útiles.

Respuesta

0
  1. ?
  2. ?
  3. Se supone que OpenCL debe escribirse directamente en C99 afaik? Ahora hay archivos de encabezado disponibles para él de todos modos.
  4. ?
7

OpenMP y OpenCL son distintos, pero se pueden hacer para que funcionen juntos. Ninguno de ellos debería "romper" el otro.

Por razones de argumentación, supongamos que hay una compensación entre minimizar los cambios en una base de código existente y el rendimiento o la potencia de cálculo. OMP es "fácil" en cuanto a que puedes aplicarlo "mágicamente" a problemas embarazosamente paralelos con un pragma rápido o dos.

OpenCL presenta nuevos conceptos de alto nivel más allá de los típicos modelos de subprocesos OS. Khronos probablemente no quiera decirlo en voz alta, pero su génesis está en CUDA de NVIDIA. Si quiere ver cómo funciona hoy, descargue el SDK de CUDA y comience a jugar. Si no tiene ninguna GPU NVIDIA, no se preocupe, existe una opción de software GPU-emulator. OpenCL es una práctica abstracción de una GPU que debe aplicarse a CPU, DSP, "aceleradores" (apodo de Khronos para CellBE de IBM y probablemente Larrabee de Intel).

OpenCL no se debe "escribir directamente en C99". Se conoce como una extensión C99 ya que su sintaxis es similar/idéntica a C99 con algunas palabras clave nuevas. No puede llamar libc (o cualquier otra biblioteca) desde un kernel.

Puede usar ambos, pero teóricamente, OpenCL debería ser "mejor" (en el sentido de que es portátil para más dispositivos informáticos) si está dispuesto a portar su código. No puede usar pragmas OpenMP en un kernel OpenCL.

Consulte también:

4

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!

Cuestiones relacionadas