2011-10-13 15 views
6

Actualmente estoy desarrollando una aplicación OpenCL para un conjunto muy heterogéneo de computadoras (usando JavaCL para ser específico). Para maximizar el rendimiento, quiero usar una GPU si está disponible; de ​​lo contrario, quiero recurrir a la CPU y usar instrucciones SIMD. Mi plan es implementar el código OpenCL usando vectores de tipos porque mi entendimiento es que esto permite a las CPU vectorizar las instrucciones y usar instrucciones SIMD.Distribución de OpenCL

Mi pregunta, sin embargo, es sobre qué implementación de OpenCL usar. P.ej. si la computadora tiene una GPU Nvidia, supongo que es mejor usar la biblioteca de Nvidia, pero si no hay GPU disponible, quiero usar la biblioteca de Intel para usar las instrucciones SIMD.

¿Cómo logro esto? ¿Esto se maneja automáticamente o tengo que incluir todas las bibliotecas e implementar alguna lógica para elegir la correcta? Parece que este es un problema que enfrentan más personas que yo.

actualización Después de probar los diferentes conductores de OpenCL esta es mi experiencia hasta ahora:

  • Intel: estrellado la JVM cuando JavaCL trató de llamarlo. Después de un reinicio, no bloqueó la JVM, pero tampoco devolvió ningún dispositivo utilizable (estaba usando una CPU Intel I7). Cuando compilé OpenCL-code fuera de línea, parecía poder realizar auto-vectorización de , por lo que el compilador de Intel parece bastante bueno.

  • Nvidia: Se negó a instalar sus controladores WHQL porque afirmaba que no tenía Nvidia-card (esa computadora tiene una Geforce GT 330M). Cuando lo intenté en una computadora diferente logré llegar hasta crear un kernel pero en la primera ejecución se bloquearon los controladores (la pantalla parpadeó por un momento y Windows 7 dijo que tenía que reiniciar los controladores) . La segunda ejecución provocó una bluee-screen de muerte.

  • AMD/ATI: Se niega a instalar SDK de 32 bits (lo he intentado ya me va a utilizar una JVM de 32 bits), pero de 64 bits SDK funcionó bien. Este es el único controlador que he logrado ejecutar el código (después de reiniciar porque al principio dio un mensaje de error críptico al compilar). Sin embargo, no parece poder hacer ninguna vectorización implícita y como no tengo ninguna GPU ATI, no obtuve ningún aumento de rendimiento en comparación con la implementación de Java. Si uso vectores-tipos I pueden ver algunas mejoras sin embargo.

TL; DR Ninguno de los pilotos parecen estar listos para su uso comercial. Probablemente sea mejor que crear un módulo JNI con código C compilado para usar instrucciones SSE.

Respuesta

4

En primer lugar tratar de entender anfitriones & dispositivos: http://www.streamcomputing.eu/blog/2011-07-14/basic-concept-hosts-and-devices/

Básicamente sólo se puede hacer exactamente lo que usted describe: comprobar si un determinado driver está disponible y si no es así, intente lo siguiente. Lo que elijas primero depende completamente de tu preferencia. Escogería el dispositivo en el que he probado mejor mi kernel. En JavaCL puede elegir el dispositivo más rápido con JavaCL.createBestContext y CLPlatform.getBestDevice, compruebe el código de host aquí: http://ochafik.com/blog/?p=501

Conozca NVidia no admite CPU a través de su controlador; solo AMD e Intel lo hacen. También apunta a múltiples dispositivos (digamos 2 GPU y una CPU) un poco más difícil.

2

No hay API que proporcione lo que desea. sin embargo, puede hacer lo siguiente:

sugiero que itere sobre clGetPlatformIDs y busque el número de dispositivos (clGetDeviceIDs) y el tipo de dispositivo para cada dispositivo; y elige la plataforma que tiene ambos tipos. luego construye un mapa en u'r código, que mapea para cada tipo la lista de plataformas que lo soportan, ordenadas de alguna manera. finalmente, solo obtenga el primer elemento en la lista correspondiente para CL_DEVICE_TYPE_CPU y el primer elemento correspondiente para CL_DEVICE_TYPE_GPU. si ambos resultados devueltos son iguales (platform_cpu == platform_gpu) luego seleccione uno de ellos y úselo para ambos.

si hay una plataforma que soporte ambos, obtendrá la coincidencia como antes, ya que obtuvo las listas de pedidos. a continuación, también puede hacer balanceo de carga si lo desea en una plataforma única, como lo que Intel tiene.