【问题标题】:Why does OpenCL's clEnqueueNDRangeKernel uses const size_t * as arguments?为什么 OpenCL 的 clEnqueueNDRangeKernel 使用 const size_t * 作为参数?
【发布时间】:2017-03-08 03:35:09
【问题描述】:

OpenCL 标准是否有任何理由选择使用参数类型 const size_t * 而不仅仅是在 clEnqueueNDRangeKernel 函数中传递 const size_t

这个决定背后的原因是什么?

如果标准将clEnqueueNDRangeKernel 定义为使用const size_t 而不是const size_t *,性能或任何其他指标是否会有任何变化?

谢谢

【问题讨论】:

  • 也许它可以让您在入队之后但在实际命令执行之前更改全局范围。没有它,它将在队列中保持不变。或者,当您将 null 保留为本地范围时,它会进行自动调整,并且可能会将那个值放在那个位置,我没有尝试检查。

标签: opencl


【解决方案1】:

manual 中解释了所有内容。基本上const size_t * 参数用于传递数组。当使用 2 维和 3 维时,需要数组来传递工作项的数量。下面摘取了一些重要的片段:

cl_int clEnqueueNDRangeKernel (   cl_command_queue command_queue,
  cl_kernel kernel,
  cl_uint work_dim,
  const size_t *global_work_offset,
  const size_t *global_work_size,
  const size_t *local_work_size,
  cl_uint num_events_in_wait_list,
  const cl_event *event_wait_list,
  cl_event *event)

global_work_offset - 当前必须是 NULL 值。在 OpenCL 的未来版本中,global_work_offset 可用于指定 work_dim 无符号值的数组...

global_work_size - 指向一个 work_dim 无符号值数组,这些值描述了将执行内核函数的 work_dim 维度中的全局工作项的数量...

local_work_size - 指向一个 work_dim 无符号值数组,这些值描述了组成工作组的工作项的数量(也称为工作组的大小),这些工作项将执行由内核指定的内核...

例子:

size_t global[2] = {1024, 1024};
size_t local[2]  = {64, 64};
clEnqueueNDRangeKernel(queue, kernel, 2, NULL, global, local, 0, NULL, NULL);

【讨论】:

  • 这完全有道理。谢谢!下次我需要更仔细地阅读手册。我只想象 work_dim = 1 的情况。
猜你喜欢
  • 2013-04-28
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
  • 1970-01-01
相关资源
最近更新 更多