OpenCL:只关心线程全局ID的理想block #
OpenCL: The Ideal # of Blocks when only caring about thread global ID?
所以我对OpenCL很陌生,我正在努力更好地理解工作组和工作项。我理解一个组中的所有线程(项)共享内存、原子操作和屏障同步。
然而,如果我不需要这些好处,只关心任何给定线程的全局ID怎么办?:
get_global_id(0)
如果我只关心线程的总数,那么我应该如何选择有多少组和每个组应该有多少项呢?(=组*项/组)
例如,假设我有一个程序来计算一个400x400矩阵。我总共有160,000条线。最初我想(天真地)让我们把它们都放在一个块中,然而这远远超过了每个块允许的线程限制。然后我选择一个任意#的块:1600个,每个块有100个线程。我的平均加速速度是CPU单线程的x5.5(我还没有一个好的GPU来运行我的代码…)。所以我想,既然我没有使用块,为什么不给每个线程自己的块?我的平均加速是x4.5。因此,为每个线程分配自己的块会更慢。
这里究竟发生了什么,我假设创建块有一些额外的开销?我如何计算我应该拥有的块的最佳数量?最优的解决方案就是尽可能少地建造街区吗?
一个选择是给clEnqueueNDRangeKernel
的NULL
到local_work_size
参数,在这种情况下,OpenCL实现将自己决定本地大小。这可能不会给出最优结果,但至少OpenCL实现会尝试猜测最优的局部大小。
另外,clGetKernelWorkGroupInfo
可以用来查询CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE
相关文章:
- 对于四轴飞行器,PID中I控制器的理想值应该是多少
- 将数据放在私有类中是否理想?(C++)
- 每个文件(理想情况下是每个部分)的 clang 格式样式覆盖
- 为什么我需要在以下示例中在 block_cache.h 之前包含 block_cache_key.h 和 block.h
- 代码编译但不起作用!cmd窗口只是理想和理想,但什么也没发生
- 什么 clang-format 相当于 rustfmt 的 indent_style=Block?
- 从小于或等于某个 N 的数字列表中最小化或找到 n 个理想的子集和
- 如何定义此"if block"中其他无效输入的值,以便在c ++中将字符串转换为对象?
- 对于可重定位的多平台安装,理想的 cmake 安装目录结构是什么?
- de if-Block 是什么意思
- 我可以在使用 omp_set_num_threads 后使 OpenMP 恢复到理想的线程 # 吗?
- Eigen::MatrixXd.block assignment using a std::vector
- 哪种检查方法比设置值最理想
- base64 decode with openssl BIO block by block
- 表示图像矩阵的理想数据结构是什么?
- "Do not change a loop variable inside a for loop block"的意义是什么?
- 最理想的情况是,如果一个变量在多个线程中读取,但只在一个线程中写入,那么它是否应该在写入线程中以非原子方式读取
- Metis - Block output
- 此函数是英特尔SIMD的理想候选函数吗
- OpenCL:只关心线程全局ID的理想block #