In un post precedente è stata descritta la classe gpu_platform, interfaccia c++ verso le platform OpenCL; la gpu_platform incapsula un insieme di istanze della classe gpu_device, ciascuna interfaccia di uno dei device OpenCL presenti.
Tutti i device appartenenti alla stessa piattaforma condividono lo stesso context, e possono utilizzare gli stessi oggetti di memoria (gpu_buffer, gpu_image e classi derivate, come la gpu_screener, gpu_vector ecc).
class AFX_EXT_CLASS gpu_device { public: gpu_device ( ); ~gpu_device ( ); /** \brief rimanda l'id opencl del device */ cl_device_id Get_id( ); /** \brief rimanda la piattaforma di appartenenza del device */ gpu_platform *Platform ( ); bool gpu_device::Set_platform ( gpu_platform *platform, int progr ); /** \brief rimanda la classe work-group del device */ gpu_work_group *WorkGroup ( ); /** \brief rimanda la coda dei comandi del device */ gpu_command_queue *Queue ( ); /** \brief genera un programma estraendo dal database dei sorgenti precaricati \details La funzione compila il sorgente di nome program_name presente nella lista gestita dalla classe gpu_programs_db e lo rende disponibile per tutte le chiamate successive; Il programma compilato è memorizzato nel database e reso disponibile anche per tutte le chiamate successive, fino alla chiusura del framework opencl */ class gpu_program *Get_program ( STRING program_name); /** \brief verifica la compatibilita sharing con openGL */ bool Is_OpenGL_Sharing_Supported ( ); /** \brief nome del device */ char *Name ( ); void Set_id( cl_device_id id ); /** \brief rimanda il puntatore alla struttura device_caps del device */ device_caps *Get_device_caps(); __use_private_struct };
Come le istanze valide delle classi gpu_platform e gpu_context, anche quelle di gpu_device sono definite in fase di inizializzazione del namespace OPCL; Le istanze sono ottenibili attraverso la classe GPU. Di seguito è riportato un esempio di codice per ottenere l’istanza di un particolare device:
using namespace OPCL ..... if (GPU::Open()) { if (GPU::NumPlatForms()) { gpu_platform *platform = GPU::Platform(0); if (platform->NumDevices()) { gpu_device *device= platform->Device(0) } ....................... } ............ }
Il device di default
Se non è necessario utilizzare più device, è sufficiente ricorrere alla funzione GPU::GetDefaultDevice ( ) per ottenere un gpu_device valido; la funzione effettua automaticamente tutte le inizializzazioni preliminari e rimanda il device di default sulla piattaforma di default;
Le funzioni e metodi di questa classe sono usate internamente dalle altre classi del namespace OPCL, e difficilmente saranno utilizzate direttamente nella progettazione dei programmi che fanno uso di OpenCL; pertanto questa breve esposizione non propone la spiegazione delle funzioni, ma solo una informazione preliminare che sarà ripresa in prossimi articoli, nei quali si esporranno esempi di codice OpenCL e le relative interfacce c++ verso le GPU;