所以我对OpenCL很陌生,我正在努力更好地理解工作组和工作项。据我所知,单个组内的所有线程(项)共享内存,原子操作和屏障同步。
但是,如果我不需要这些好处并且只关心任何给定线程的全局ID,该怎么办?:
get_global_id(0)
如果我关心的是线程总数,那么我应该如何选择每组应该拥有多少组和多少项? (=每组*组*项目)
例如,让我说我有一个计算400x400矩阵的程序。我总共有160,000个主题。最初我认为(天真地)好吧让它们全部放在一个块中,但是这远远高于每个块的允许线程限制。那么我选择任意#块:1600每块100个线程。我的平均速度是CPU单线程的x5.5(我没有一个很好的GPU来运行我的代码......)。那么我觉得很好,因为我没有使用块,为什么不给每个线程自己的块?我的加速平均为x4.5。因此,给每个线程提供自己的块更慢。
这里究竟发生了什么,我认为创建块有一些额外的开销?如何计算我应该拥有的最佳块数?最简单的解决方案是尽可能减少块数吗?
答案 0 :(得分:2)
一种选择是将NULL
提供给local_work_size
的{{1}}参数,在这种情况下,OpenCL实现将自行决定本地大小。这可能无法给出最佳结果,但至少OpenCL实现会尝试猜测最佳本地大小。
此外,clEnqueueNDRangeKernel
可用于查询clGetKernelWorkGroupInfo
。