并行处理 - CUDA 的 __syncthreads() 和 blockIdx.x 的 OpenCL 类似物是什么?



我正试图将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共享)内存时,第一个确保内存操作的正确顺序,第二个是在全局内存上操作。

相关内容

  • 没有找到相关文章

最新更新