2011-04-13 17 views
6

Quiero ejecutar tareas paralelas en GPU y CPU con varios dispositivos OpenCL. Los ejemplos estándar de AMD SDK no son muy claros en este tema. ¿Puede aconsejarme sobre tutoriales adicionales o ejemplos sobre este tema? Cualquier consejo servirá.OpenCL: ejecutar múltiples dispositivos CPU/GPU

Gracias.

+0

Mi artículo [Una encuesta de las técnicas de computación heterogénea de la CPU-GPU] (https://goo.gl/hBK9nw) analiza muchos sistemas de tiempo de ejecución y lenguajes de programación para el uso de la CPU y la GPU. – user984260

Respuesta

1

Por tutorial y detalles sobre el uso de múltiples dispositivos, es posible que desee consultar la sección 4.12 de las tareas paralelas AMD-APP-SDK Programming guide

1

No hay nada que te frene de hacer esto. Deberá suministrar todos los dispositivos que desee utilizar a su llamada al clCreateContext() y luego crear al menos una cola de comandos para cada uno de ellos. Dependiendo de lo que intente hacer, es posible que deba consultar las técnicas de programación de tareas más avanzadas, p. usar colas de comandos y eventos fuera de orden para programar tareas entre dispositivos.

1

Con clGetPlatforms sabrá si tiene más de una plataforma o no. Si ejecuta una placa GPU nVidia y una CPU AMD, encontrará plataformas. Una plataforma para AMD SDK y otra para la implementación nVidia CUDA OpenCL. Con clGetDevices encontrará para cada plataforma los dispositivos disponibles. Puede ser uno por plataforma como 1xGPU y 1xCPU.

Para cada dispositivo crea un contexto con clCreateContext y luego puedes ejecutar ambos en paralelo.

+0

Desafortunadamente, no encontrará gpu y cpu en esta situación. Para ejecutar OpenCL en el hardware de Nvidia, necesita la biblioteca de tiempo de ejecución de Nvidia. Solo verá los dispositivos Nvidia. Si tiene AMD gpu, puede ver cpu y gpu a la vez, porque comparten una biblioteca en tiempo de ejecución. AMD ha creado una plataforma heterogénea más verdadera. – MiKom

+0

Puede usar, por ejemplo, AMD OpenCL y registrar la implementación para NVida también. Lo hice una vez y hasta donde sé, funcionó. Debe ingresar los proveedores en/etc/OpenCL/vendors para Linux. Para Windows, no conozco la ubicación, pero debería haber algo similar. –

+0

Las cosas cambiaron un poco desde la última vez. Khronos introdujo el Controlador Installable Client, es decir, la biblioteca shim OpenCL que busca implementaciones reales y expone sus API. (http://www.khronos.org/registry/cl/sdk/2.0/docs/man/xhtml/cl_khr_icd.html). – MiKom

5

ejecuta en varios dispositivos requiere programación dinámica para el bien del effeciency porque nunca se sabe el rendimiento exacto de cualquier dispositivo - es depende de la carga actual (no solo por su programa sino también por todos los demás), reloj actual (puede cambiar significativamente en la mayoría de las CPU y GPU según el perfil o carga de ahorro de energía actual). Además, el rendimiento en el mundo real puede depender de sus datos de entrada.

Por supuesto, usted puede escribir todos los códigos necesarios usted mismo como todas las demás respuestas sugieren, pero en mi opinión es una pérdida de tiempo y es una idea mucho mejor utilizar la solución existente. Recomiendo usar StarPU. He usado StarPU en mi proyecto OpenCL y funcionó bastante bien. StarPU viene con ejemplos de cómo escribir código capaz de utilizar múltiples GPU y CPU de manera eficiente.

StarPU:

procesadores tradicionales han llegado a límites arquitectónicos que los diseños de varios núcleos heterogéneos y la especialización de hardware (por ejemplo, coprocesadores, aceleradores, ...) tienen la intención de tratar. Sin embargo, la explotación de tales máquinas presenta numerosos problemas desafiantes en todos los niveles, que van desde modelos de programación y compiladores hasta el diseño de soluciones de hardware escalables. El diseño de sistemas de tiempo de ejecución eficientes para estas arquitecturas es un problema crítico. StarPU normalmente hace que sea mucho más fácil para bibliotecas de alto rendimiento o entornos de compilación explotar máquinas heterogéneas multinúcleo posiblemente equipadas con GPGPU o procesadores de celda: en lugar de manejar problemas de bajo nivel, los programadores pueden concentrarse en problemas algorítmicos.

También hay otro proyecto, SkePU, pero no lo probé yo mismo:

SkePU:

SkePU es un marco de programación tales esqueleto para sistemas de CPU multinúcleo y multi-GPU. Es una biblioteca de plantillas C++ con seis esqueletos paralelos a datos y uno paralelo a tareas, dos tipos de contenedores y soporte para ejecución en sistemas multi-GPU con CUDA y OpenCL.Recientemente, SkePU ha desarrollado un soporte para la ejecución híbrida, la programación dinámica y el balanceo de carga basados ​​en el rendimiento implementando un back-end para el sistema de tiempo de ejecución StarPU.

Si busca en Google "programación dinámica gpu cpu opencl", puede encontrar aún más proyectos y documentación comercial o gratuita útiles.

0

OpenCL Guía de programación de Aftab Munshi & más le dará más detalles.

Cuestiones relacionadas