Ogni classe gpu_platform individua e gestisce una delle piattaforme OpenCL la cui list può essere ottenuta usando la funzione clGetPlatformIDs.
Le istanza della classe sono in numero pari alle piattaforme hardware presenti, ed una delle specifiche piattaforme è ottenibile come descritto nel segmento di codice che segue
if (GPU::Open ( )) { for (cl_uint np = 0; np < GPU::NumPlatForms ( ); np++) { gpu_platform *platform = GPU::Platform ( np ); ........................................... ....................... ............. } }
La gestione delle piattaforme OpenCL è completamente effettuata all’interno della classe GPU, sia per l’allocazione che per il rilascio delle stesse. Una piattaforma può contenere più device, ai quali si accede attraverso la funzione platform->Device(x) dove x è un ordinale valido.
ogni gpu_platform contiene un context OpenCL gestito attraverso la classe gpu_context e visibile attraverso la funzione platform->Context(); tutti i device della piattaforma accedono allo stesso context.
E’ rara l’esigenza di accedere direttamente alle funzioni di gpu_platform, a meno che non si intenda scrivere nuove classi del namespace OPCL ed in genere, come già descritto qui , per utilizzare un programma OpenCL (un suo kernel) non è necessario ottenere informazioni sulla piattaforma e classi incapsulate;
Analizziamo ora le funzionalità della classe
class AFX_EXT_CLASS gpu_platform { public: gpu_platform ( ); ~gpu_platform ( ); cl_platform_id Id ( ); char *Name ( ); int NumDevices ( ); /** rimanda il device ord-esimo */ class gpu_device *Device ( int ord ); /** \brief rimanda il context della piattaforma details il contesto opencl è automaticamente definito quando viene inizializzata la struttura gpu_platform dall'interno GPU ed è comune a tutti i device nella piattaforma; */ class gpu_context *Context ( ); /** rimanda la descrizione della versione opencl gestita dalla piattaforma */ char *OpenCl_Version ( ); friend class GPU; friend class gpu_context; private: bool SetDevices ( int n, cl_device_id *devs ); bool SetName ( char *name ); bool SetId ( cl_platform_id id ); bool SetOpenCL_Version ( char *version ); __use_private_struct };
Le funzioni private sono usate dalle classi GPU e gpu_context per definire gli attributi durante l’inizializzazione della infrastruttura nel namespace OPCL; Le altre funzioni permettono di accedere alle istanze gpu_device e gpu_context incapsulate;
Tutti gli attributi esposti attraverso i metodi della gpu_platform sono visibili nella finestra richiamabile dal menu dei Tools di Colibri; la finestra presenta inoltre un insieme di caratteristiche utili per individuare le potenzialità delle piattaforme OpenCL installate nel computer in uso; Un’ultima annotazione: più piattaforme e device possono essere presenti nella stesso host, tutti utilizzabili attraverso le classi del namespace OPCL.