estrarre i dati modificati dal kernel
Alcuni degli argomenti passati al kernel saranno elaborati durante l’esecuzione dello stesso; Queste informazioni potranno essere estratte dal programma host utilizzando il metodo gpu_kernel::PopArg. Il frammento di codice che segue mostra il codice per l’esecuzione del kernel e quello di estrazione dei risultati:
if (kernel->Set_index_space_2d(ret_area->dx, ret_area->dy)) { if (kernel->Exec()) { bool res = kernel->PopArg(dest); MSGS name; SPRINTF(name, L"%s_dth", img_src->GetName()); img_dest->InitDocInfo(name); img_dest->SetHtmlToolTip(); } else { OPCL::GPU::Display_error_info(); __delete (img_dest); }
Del metodo Set_index_space_2d(..) contenuto nella prima riga scriveremo fra poco; per ora ricordiamo che definisce l’intervallo di indici usato dalla gpu per eseguire i singoli work_item;
Il metodo gpu_kernel::Exec() lancia in esecuzione il kernel e rimanda un valore true se il codice è stato eseguito correttamente; il passaggio successivo è l’estrazione delle informazioni calcolata attraverso la gpu_kernel::PopArg():
bool res = kernel->PopArg(dest);
PopArg()
La funzione riceve un puntatore ad una istanza di tipo gpu_mem_object e rimanda true se le informazioni sono state estratte correttamente; in questo esempio l’argomento dest passato è lo stesso che in precedenza era stato trasferito come argomento al kernel:
gpu_matrix_2d *dest = gpu_matrix_2d::New(kernel, img_dest, CL_MEM_WRITE_ONLY); dest->Push_kernel();
Da quanto scritto si può dedurre che le informazioni elaborate ed estratte dal kernel usando la PopArg sono necessariamente del tipo gpu_mem_object; inoltre va ricordato che queste istanze devono essere state create con il flag CL_MEM_WRITE_ONLY o CL_MEM_READ_WRITE definiti mediante le funzioni gpu_mem_object::Set_mem_flags()