我正试图将CUDA代码翻译成OpenCL,现在我被这些函数/变量卡住了:
-
__syncthreads()
-
blockIdx.x
其实是我自己找到的!这是一篇有用的文章:http://www.netlib.org/utk/people/JackDongarra/PAPERS/parcocudaopencl.pdf
答案是:对于__syncthreads()使用barrier(CLK_LOCAL_MEM_FENCE);blockIdx。X使用get_group_id(0)!
__syncthreads()
-> barrier(_)
,但一定要理解barrier(CLK_LOCAL_MEM_FENCE)
和barrier(CLK_GLOBAL_MEM_FENCE)
之间的区别请检查这个问题或本文档以获取更多信息。
blockIdx.x
-> get_group_id(0)
,它会给你组/块的第一个/x维度id
网络上有很多页面可以帮助你将CUDA移植到OpenCl(例如这里)。我只想说,正如它在这里指出的"屏障",有barrier(CLK_LOCAL_MEM_FENCE)
和barrier(CLK_GLOBAL_MEM_FENCE)
:主要区别在于,当你使用本地(CUDA共享)内存时,第一个确保内存操作的正确顺序,第二个是在全局内存上操作。