【问题标题】:OpenCL clEnqueueNDRangeKernel work_dim VS global_work array elementsOpenCL clEnqueueNDRangeKernel work_dim VS global_work 数组元素
【发布时间】:2015-11-09 19:16:14
【问题描述】:

我是 OpenCL 的新手,我正在尝试理解这段代码:

size_t global_work1[3]  = {BLOCK_SIZE, 1, 1};
size_t local_work1[3]  = {BLOCK_SIZE, 1, 1};

err = clEnqueueNDRangeKernel(cmd_queue, diag, 2, NULL, global_work1, local_work1, 0, 0, 0);

因此,在clEnqueueNDRangeKernel 2 维中为内核指定了(work_dim 字段),这意味着:

  • 0维内核得到的线程数等于BLOCK_SIZE,只有一个组(我猜组数可以这样计算=>( global_work1[0] ) / ( local_work1[0] ))。
  • 维度为 1 的内核获得的线程数等于 1,并且只有一组。

以及为什么当global_work1local_work1中的元素为三个时,队列指令中的维度为2。

【问题讨论】:

  • 可能只有这些数组的前两个元素将用作 2D 执行。
  • 是的,但这听起来很奇怪,特别是对于数组的第二个元素...... 1 组中的 1 个线程......没有任何意义。可能我对 OpenCL 的理解有问题。谢谢你的评论!!!!!!
  • 我同意这段代码看起来不正确。
  • 它正在执行 BLOCK_SIZE x 1 大小的块。
  • 它们不会被忽略。你告诉 enqueue 函数注意前两个。只是第二个是 1。n*1 是一个有效的大小,就像 1 个工作项的一维启动是有效的一样。相当于请求一维,但实际上和忽略参数不一样。

标签: opencl gpu


【解决方案1】:

你是在告诉 CL: “在这个队列中运行这个内核,使用 2D 和这些全局/局部大小”

CL 只是获取参数的前 2 个维度,而忽略第 3 个维度。

关于 1D 和 2D 的区别。空无一人。由于作为一维启动的 OpenCL 内核在 get_global_id(1)get_global_id(2) 调用上不会失败。它们只会返回 0。因此,除了内核可能支持更大尺寸的二维参数(即:512x128)之外,没有任何区别

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多