【问题标题】:OpenCL workers count always 1OpenCL 工作人员计数始终为 1
【发布时间】:2015-06-30 08:57:58
【问题描述】:

我是 GPU 开发的新手,我想知道有多少工人(线程)同时执行我的内核,所以我在内核下面使用

kernel void helloWorld(global int* result) 
{     
      int gid = 0;
      gid = get_local_id(0);
      if (gid > result[0])
      {
        result[0] = gid;
      }
}

但在核心 i7 上运行时,英特尔结果 [0] 始终为 0 ;当在 nvidia GPU 上运行时,它总是 0

【问题讨论】:

  • 可以通过为本地工作组大小指定 NULL 来留给运行时。但是,此代码不正确,因为对result[0] 的访问不是原子的。所有线程都将读取初始值(如果您在运行内核之前清除缓冲区,则可能为 0)然后写入它们的值,这会导致竞争条件。相反,让每个工作项将其本地 ID 写入由其全局 ID 索引的缓冲区位置。结果因设备而异。

标签: opencl


【解决方案1】:

Opencl 将设备上的线程划分为工作组。 一个工作组被安置在同一个执行单元上(注意几个工作组可以在一个执行单元上) 可以让编译器决定工作组的大小。

但是,您在启动内核时选择了总线程数。 示例:

clEnqueueNDRangeKernel(command_queue, cl_exec, 1, NULL, &tasksize, &local_size_in, 0, NULL, NULL)

tasksize = 线程总数 local_size = 组中的线程数

因此 tasksize / local_size 是您将拥有的工作组数。

如果你写的是 NULL 而不是 local_size,编译器会决定工作组的大小。

local_size 有几个约束条件。 看这里:cl api

根据我的经验,最佳结果主要是编译器选择的结果。 这在复杂情况下可能会有所不同,在这种情况下,您对运行时发生的事情有特定的了解,而这在编译时是不可用的。

所有设备都具有最大工作组大小。

CL_DEVICE_MAX_WORK_GROUP_SIZE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2012-05-09
    • 2021-01-11
    • 1970-01-01
    • 2023-03-14
    • 2023-03-05
    相关资源
    最近更新 更多