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.