usare gpu_kernel
La lettura di questo post richiede una buona conoscenza dei paradigmi sottesi alle API di OpenCL; Per accedere a ulteriori informazioni si propongono questi articoli :
Descriveremo ora i metodi e le funzioni della classe :
class AFX_EXT_CLASS gpu_kernel { public: gpu_kernel(); ~gpu_kernel(); char *Name(); void Set_id(cl_kernel id); cl_kernel Get_id(); gpu_program *Program(); bool SetIndexSpace(size_t *index_spize_size, size_t *work_group_size = 0); bool Set_index_space_2d(size_t dx, size_t dy); bool FlushMemObjects(); bool PushArg(gpu_mem_object *memobj); bool PushArg(cl_sampler sampler); bool PushArg(cl_int value); bool PushArg(cl_uint value); bool PushArg(cl_float value); bool PushArg(void *ptr, size_t size); bool PopArg(gpu_mem_object *buf); bool Exec(); size_t Get_preferred_multiple_workgroup_size(); cl_ulong Get_local_mem_size(); size_t Get_workgroup_size(); size_t *Get_compile_workgroup_size(size_t compile_work_group_size[3]); friend class gpu_program; friend class gpu_buffer; friend class GPU; private: bool SetName(char *name); bool SetProgram(gpu_program *prg); bool SetId(cl_kernel kid); __use_private_struct };
Ottenere un’istanza gpu_kernel
Le istanze della classe la classe gpu_kernel sono create in due diversi modi;
un modo, completamente automatico, è già stato presentato in questo articolo di descrizione della classe gpu_context; Il comando gpu_kernel *kernel = OPCL::GPU::OpenKernel(prog_name, kernel_name) rimanda un kernel dati i nomi del programma e della funzione __kernel contenuta nel codice C OpenCl;
un secondo modo è quello di richiamare la funzione OpenKernel di un’istanza gpu_program (questo metodo è comunque usato internamente dalla GPU::OpenKernel).
Il primo metodo è semplice da usare, come descritto nell’articolo citato; Il secondo metodo richiede un numero maggiore di passaggi ed è utile solo in casi particolari dei quali scriveremo in seguito;