首页 文章

OpenCL:只关心线程全局ID时的理想块数?

提问于
浏览
1

所以我对OpenCL很新,我正在努力更好地理解工作组和工作项 . 据我所知,单个组内的所有线程(项)共享内存,原子操作和屏障同步 .

但是,如果我不需要这些好处并且只关心任何给定线程的全局ID,那该怎么办?:

get_global_id(0)

如果我所关心的是线程总数,那么我应该如何选择每组应该拥有多少组和多少项? (=每组项目)

例如,假设我有一个计算400x400矩阵的程序 . 我总共有160,000个主题 . 最初我认为(天真)好吧让我们把它们全部放在一个块中,但是这远远高于每个块的允许线程限制 . 那么我选择任意#块:1600每块100个线程 . 我的平均速度是CPU单线程的x5.5(我没有很好的GPU来运行我的代码......) . 所以我觉得很好,因为我没有使用块,为什么不给每个线程自己的块?我的加速平均为x4.5 . 因此,给每个线程提供自己的块比较慢 .

究竟是怎么发生的,我认为创建块有一些额外的开销?如何计算我应该拥有的最佳块数?最佳解决方案是简单地制作尽可能少的块吗?

1 回答

  • 2

    一个选项是给 NULL clEnqueueNDRangeKernelNULL 参数,在这种情况下,OpenCL实现将自己决定本地大小 . 这可能无法提供最佳结果,但至少OpenCL实现会尝试猜测最佳本地大小 .

    另外, clGetKernelWorkGroupInfo 可用于查询 CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE .

相关问题