2011-10-13 6 views
6

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.

risposta

4

Prima cerchiamo di capire gli host & dispositivi: http://www.streamcomputing.eu/blog/2011-07-14/basic-concept-hosts-and-devices/

In pratica si può solo fare esattamente quello che hai descritto: verificare se un certo driver è disponibile e se no, provare il prossimo. Ciò che scegli per prima dipende completamente dalle tue preferenze. Prenderò il dispositivo su cui ho testato meglio il mio kernel. In JavaCL è possibile scegliere il dispositivo più veloce con JavaCL.createBestContext e CLPlatform.getBestDevice, controlla qui il codice host: http://ochafik.com/blog/?p=501

Conoscere NVidia non supporta le CPU tramite il loro driver; solo AMD e Intel. Inoltre, il targeting di più dispositivi (ad esempio 2 GPU e una CPU) è un po 'più difficile.

2

Nessuna API fornisce ciò che si desidera. tuttavia, è possibile effettuare le seguenti operazioni:

Suggerisco di eseguire iterate su clGetPlatformIDs e interrogare il numero di dispositivi (clGetDeviceIDs) e il tipo di dispositivo per ciascun dispositivo; e scegli la piattaforma che ha entrambi i tipi. quindi costruisci una mappa nel tuo codice, che mappa per ogni tipo l'elenco delle piattaforme che lo supportano, ordinato in qualche modo. infine, ottieni il primo elemento nell'elenco corrispondente per CL_DEVICE_TYPE_CPU e il primo elemento corrispondente per CL_DEVICE_TYPE_GPU. se entrambi i risultati restituiti sono uguali (platform_cpu == platform_gpu) quindi sceglierne uno e usarlo per entrambi.

se c'è una piattaforma che supporta entrambi, si otterrà la corrispondenza come prima dato che si hanno liste di ordini. quindi puoi anche eseguire il bilanciamento del carico, se ti piace su una singola piattaforma, come quello che ha Intel.