sto cercando di tradurre il codice CUDA in OpenCL e in questo momento io sono bloccato con queste funzioni/variabili:Qual è l'analogo di OpenCL per __syncthreads() e blockIdx.x di CUDA?
__syncthreads()
blockIdx.x
sto cercando di tradurre il codice CUDA in OpenCL e in questo momento io sono bloccato con queste funzioni/variabili:Qual è l'analogo di OpenCL per __syncthreads() e blockIdx.x di CUDA?
__syncthreads()
blockIdx.x
In realtà ho trovato per la mia! Ecco un articolo utile: http://www.netlib.org/utk/people/JackDongarra/PAPERS/parcocudaopencl.pdf
La risposta è: per la barriera di utilizzo __syncthreads() (CLK_LOCAL_MEM_FENCE); per blockIdx.x usa get_group_id (0)!
__syncthreads()
->barrier(_)
ma assicuratevi di capire la differenza tra barrier(CLK_LOCAL_MEM_FENCE)
e barrier(CLK_GLOBAL_MEM_FENCE)
controllo questo question o questo documentation per maggiori informazioni.
blockIdx.x
->get_group_id(0)
che vi darà il primo/x dimensione id del gruppo/blocco
Ci sono molte pagine sul web che possono aiutare per il porting CUDA per OpenCL (per esempio here). Voglio solo rimarcare, come si nota per la "barriera" here, che ci sono barrier(CLK_LOCAL_MEM_FENCE)
e barrier(CLK_GLOBAL_MEM_FENCE)
: principalmente la differenza è che il primo garantisce l'ordine corretto delle operazioni di memoria quando si utilizza la memoria locale (condivisa in CUDA) e il secondo quando si opera sulla memoria globale. Assicurati di utilizzare quello giusto per il tuo caso.