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()
