c++ - OpenCL:只关心线程全局 ID 时的理想 block 数?

标签 c++ multithreading opencl block

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

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

get_global_id(0)

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

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

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

最佳答案

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

此外,clGetKernelWorkGroupInfo 可用于查询CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE

关于c++ - OpenCL:只关心线程全局 ID 时的理想 block 数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39584317/

相关文章:

c - 初始化 OpenCL 对象

c++ - Kcachegrind 循环估计

c++ - Google Protocol Buffers C++ 实现在面对恶意数据时的稳定性和安全性

c++ - vector<bool> 特化与 range base 不兼容

java - java中join()方法的JVM内部工作

c - 在运行其他任务时接受网络连接的方法?

c++ - Win32 API : App Freezes after opening dialog window

objective-c - 使用 coredata 和多线程枚举时集合发生了变化

python - PyOpenCL 矩阵乘法

c - 将 C 程序与 libclBLAS 链接