2009-09-07 14 views
11

Ho giocato con l'implementazione ATI OpenCL nella beta 2.0 Stream. L'OpenCL nella versione beta attuale utilizza solo la CPU per ora, la versione successiva supporterà i kernel GPU. Ho scaricato Stream perché ho una GPU ATI nella mia macchina da lavoro.Esecuzione di OpenCL su hardware da fornitori misti

Scrivo software che trarrebbe enorme vantaggio dai guadagni utilizzando la GPU. Tuttavia questo software funziona su macchine clienti, non ho il lusso (come molti ambienti di calcolo scientifico hanno) per scegliere l'hardware esatto da sviluppare e ottimizzare per quello. Quindi la mia domanda è, se distribuisco l'implementazione ATI OpenCL con la mia applicazione, significa che non sarà mai in grado di usarlo, ad es. Schede video NVidia? E se utilizzo NVidia OpenCL SDK, non funzionerà mai in modo ottimale con i chip AMD (considerando il collegamento ATI/AMD)?

In altre parole, chi è il responsabile della fornitura dell'implementazione di OpenCL? Gli utenti saranno in grado, ad es. installare un "driver" OpenCL per la scheda video NVidia, insieme a un "driver" che offre loro prestazioni ottimali sulla CPU AMD?

Per inciso, ci sono forum di supporto validi/attivi per OpenCL oltre alle bacheche di Khronos, o è il posto dove andare? Ho visto che ATI ha una scheda e presumibilmente NVidia ne ha una propria, dove si trova la comunità di utenti/sviluppatori di OpenCL? Si è già consolidato in un unico posto?

risposta

6

In definitiva, OpenCL funzionerà allo stesso modo di OpenGL. In altre parole, gli utenti installeranno i driver correnti dai loro fornitori di hardware (ATI, NVIDIA, Intel). Durante lo sviluppo delle applicazioni, lo sviluppatore si collegherà semplicemente a una libreria OpenCL. Quando gli utenti eseguono l'applicazione, l'applicazione reindirizza alle librerie specifiche del fornitore appropriate fornite dai driver.

Questo è il modo in cui funzionerà, ma non funziona ancora in questo modo.

Un'altra cosa importante da tenere a mente è che probabilmente sarà necessario fornire percorsi di codice specifici del fornitore poiché il codice in esecuzione sulla CPU utilizzando OpenCL probabilmente utilizzerà parametri del kernel ottimizzati diversi rispetto al codice in esecuzione sulla GPU. Lo stesso è probabilmente vero per le differenze tra i fornitori di GPU.

+0

La differenza con OpenGL è che per OpenGL, il fornitore della GPU scrive i driver - periodo. OpenGL funziona solo sulla scheda video. Ma per OpenCL, idealmente, il fornitore di CPU scrive il driver per i kernel della CPU e il produttore della GPU scrive i driver per i kernel GPU, in quanto i kernel OpenCL possono essere eseguiti su thread CPU o thread GPU. È così che dovrebbe funzionare in futuro? – Roel

+0

OpenGL supporta sempre un percorso software per quando l'hardware non supporta determinate operazioni. Pertanto, i produttori di sistemi operativi devono fornire un'implementazione software OpenGL (l'OpenGL di MS Windows è bloccato su OpenGL 1.1). Probabilmente succederà qualcosa di simile con OpenCL. In ogni caso, AMD/ATI pubblicherà probabilmente una versione di OpenCL che supporterà sia le loro CPU che le loro GPU. Allo stesso modo, Intel rilascerà probabilmente un OpenCL che supporta le normali CPU e le GPU Larrabee. Non ne so abbastanza sull'implementazione OpenCL di Apple per sapere cosa supporta. – Eric

+1

Ok, quindi posso concludere che se un cliente ha una scheda video ATI e una CPU Intel, non avrà prestazioni ottimali? A seconda di quale driver OpenCL/implementazione hanno installato, eseguiranno kernel nella CPU o nella GPU? Voglio dire, so che probabilmente * eseguirà * sulla macchina, non è una mia preoccupazione; la mia preoccupazione è che eseguirà * fast * (quindi utilizzando tutto l'hardware sulla macchina, tutti i core della CPU e tutti i core della GPU). – Roel

8

So che questa è una vecchia domanda con le vecchie risposte sopra. Ho pensato di aggiornarlo con una risposta aggiornata.

Sì, un'implementazione dei kernel e del codice OpenCL funzionerà su una vasta gamma di dispositivi oggi con codice di enumerazione della piattaforma e della periferica correttamente scritto. È abbastanza facile scrivere la piattaforma corretta e il codice di enumerazione del dispositivo, la parte difficile è selezionare quale piattaforma o dispositivo. Probabilmente dovresti presentare un'opzione di configurazione nella tua app in cui l'utente può selezionarne uno, o eseguire un microbenchmark su ciascuno di essi e selezionarne uno dinamicamente e mettere in cache il risultato del bench.

Le persone possono avere e avranno più di una piattaforma. Ad esempio, il mio sistema ha GTX 580 SLI, quindi ha due dispositivi nella piattaforma NVidia. Ha anche l'SDK Intel OpenCL, quindi la mia CPU CoreI7 990x Extreme si presenta come un dispositivo nella piattaforma Intel.

Sì, un binario sviluppato e realizzato utilizzando, ad esempio, NVidia OpenCL SDK, funzionerà su ATI o Intel OpenCL e viceversa. Non c'è più bisogno di preoccuparsi di questo.

Ovviamente, un utente finale potrebbe non avere alcun OpenCL di qualsiasi tipo, quindi potrebbe essere necessario caricare in ritardo o LoadLibrary opencl.dll e collegamento dinamico.

Consiglio vivamente di testare il codice con Intel OpenCL SDK, su GPU NVidia, AND su GPU AMD. Probabilmente troverai bug che causano problemi su una piattaforma, ma funziona bene su altri.Probabilmente troverai anche che un codice totalmente fine misteriosamente non fornisce risultati corretti su una di queste piattaforme, a causa di errori del driver.

+0

Grazie per quello, stavo scrivendo una nuova domanda per sapere se le cose erano cambiate dalla prima risposta ... – Mikarnage