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;
