【问题标题】:OpenCL: The Ideal # of Blocks when only caring about thread global ID?OpenCL:只关心线程全局 ID 时的理想块数?
【发布时间】:2016-09-20 01:19:37
【问题描述】:

所以我对 OpenCL 还是很陌生,我正在努力更好地理解工作组和工作项。我了解单个组内的所有线程(项目)共享内存、原子操作和屏障同步。

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

get_global_id(0)

如果我只关心线程的总数,我应该如何选择多少组以及每个组应该有多少项目? (= 组 * 每组的项目)

例如,假设我有一个计算 400x400 矩阵的程序。我总共有 160,000 个线程。最初我认为(天真地)让我们将它们全部放在一个块中,但是这远远超出了每个块允许的线程限制。因此,我选择任意的块数:1600 个,每个块有 100 个线程。我的平均加速是 CPU 单线程的 x5.5(我还没有一个好的 GPU 来运行我的代码……)。所以我想得很好,因为我没有使用块,为什么不给每个线程自己的块呢?我的平均加速是 x4.5。所以给每个线程自己的块会比较慢。

这里到底发生了什么,我认为创建块有一些额外的开销?我该如何计算我应该拥有的最佳块数?最佳解决方案是否只是尽可能少地制作块?

【问题讨论】:

  • 你能分享你的代码吗?这是矩阵加法或乘法还是其他?您可以更改代码以处理每个组的另一个矩阵,以便可以完成矩阵级并行性?

标签: c++ multithreading opencl block


【解决方案1】:

一种选择是将NULL 赋予clEnqueueNDRangeKernellocal_work_size 参数,在这种情况下,OpenCL 实现将自行决定本地大小。这可能不会给出最佳结果,但至少 OpenCL 实现会尝试猜测最佳局部大小。

另外,clGetKernelWorkGroupInfo可以用来查询CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE

【讨论】:

  • 感谢您的帮助,先生!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-20
  • 2018-01-30
  • 2012-07-24
  • 2018-06-24
  • 1970-01-01
相关资源
最近更新 更多