Próbuję tłumaczyć kodu CUDA do OpenCL i teraz siedzę z tymi funkcjami/zmiennych:Co to jest analog OpenCL dla CUDA __syncthreads() i blockIdx.x?
__syncthreads()
blockIdx.x
Próbuję tłumaczyć kodu CUDA do OpenCL i teraz siedzę z tymi funkcjami/zmiennych:Co to jest analog OpenCL dla CUDA __syncthreads() i blockIdx.x?
__syncthreads()
blockIdx.x
Właściwie znalazłem go przez własną rękę! Oto przydatny artykuł: http://www.netlib.org/utk/people/JackDongarra/PAPERS/parcocudaopencl.pdf
Odpowiedź brzmi: dla funkcji __syncthreads() użyj bariery (CLK_LOCAL_MEM_FENCE); dla blockIdx.x użyj get_group_id (0)!
__syncthreads()
->barrier(_)
ale upewnij się, aby zrozumieć różnicę między barrier(CLK_LOCAL_MEM_FENCE)
i barrier(CLK_GLOBAL_MEM_FENCE)
czeku to question lub niniejszego documentation aby uzyskać więcej informacji.
blockIdx.x
->get_group_id(0)
który daje pierwszy/x wymiar identyfikator grupy/bloku
Istnieje wiele stron internetowych, które mogą pomóc w przenoszeniu CUDA do OpenCL (np here). Chcę tylko zauważyć, ponieważ dla "bariery" wskazuje się here, że są barrier(CLK_LOCAL_MEM_FENCE)
i barrier(CLK_GLOBAL_MEM_FENCE)
: Głównie różnica polega na tym, że pierwsza zapewnia poprawne porządkowanie operacji pamięciowych podczas korzystania z lokalnej (udostępnionej w CUDA) pamięci a drugi, gdy pracujesz w pamięci globalnej. Pamiętaj, aby użyć właściwego dla swojej sprawy.