Attualmente sto sviluppando un'applicazione OpenCL per un insieme di computer molto eterogeneo (utilizzando JavaCL per essere specifici). Per massimizzare le prestazioni, voglio utilizzare una GPU se è disponibile altrimenti voglio ricorrere alla CPU e utilizzare le istruzioni SIMD. Il mio piano è di implementare il codice OpenCL usando i tipi di vettore, perché la mia comprensione è che questo consente alle CPU di vettorializzare le istruzioni e utilizzare le istruzioni SIMD.OpenCL distribution
La mia domanda tuttavia riguarda l'implementazione di OpenCL da utilizzare. Per esempio. se il computer ha una GPU Nvidia, suppongo che sia meglio usare la libreria di Nvidia, ma se non ci sono GPU disponibili, voglio usare la libreria di Intel per usare le istruzioni SIMD.
Come ottengo questo? È gestito automaticamente o devo includere tutte le librerie e implementare una logica per scegliere quella giusta? Sembra che questo sia un problema per cui più persone di me stanno affrontando.
Aggiornamento Dopo aver testato i diversi OpenCL-piloti questa è la mia esperienza finora:
Intel: schiantato JVM quando JavaCL provato a chiamarlo. Dopo un riavvio, non ha fatto crashare la JVM ma non ha restituito alcun dispositivo utilizzabile (stavo usando una CPU Intel I7). Quando ho compilato offline il codice OpenCL , sembra che sia possibile eseguire alcuni vettori di vettorizzazione automatica , quindi il compilatore di Intel sembra abbastanza carino.
Nvidia: Rifiutato di installare i driver WHQL-perché sostenuto non ho avuto Nvidia-card (che computer ha una GeForce GT 330M). Quando ho provato su un altro computer, sono riuscito a creare il kernel ma alla prima esecuzione ha bloccato i driver (lo schermo ha tremato per un po 'e Windows 7 ha detto che doveva riavviare i driver) . La seconda esecuzione ha causato uno schermo blu di morte .
AMD/ATI: Rifiutato di installazione a 32 bit SDK (ho provato che da quando userò a 32 bit JVM), ma a 64-bit SDK ha funzionato bene. Questo è l'unico driver su cui sono riuscito a eseguire il codice (dopo un riavvio perché all'inizio ha generato un messaggio di errore criptico durante la compilazione). Tuttavia non sembra essere in grado di effettuare alcuna vettorizzazione implicita e poiché non ho alcuna GPU ATI non ho avuto alcun incremento delle prestazioni rispetto all'implementazione Java. Se utilizzo i tipi di vettore, I potrebbe vedere alcuni miglioramenti.
TL; DR Nessuno dei piloti sembrano pronti per l'uso commerciale. Probabilmente sono meglio creare un modulo JNI con codice C compilato per usare le istruzioni SSE.