OpenCL工作人员总是1

时间:2015-06-18 09:54:43

标签: opencl

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

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

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

1 个答案:

答案 0 :(得分:0)

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