如何获取OpenCL设备的内核数?

如何获取OpenCL设备的内核数?,opencl,Opencl,在我的应用程序中,我想向用户显示各种OpenCL设备。 我无法决定如何显示设备中的内核数。 这只是为了让我们知道有多少线程可以同时并行运行 计算单元告诉我们多处理器的数量,这可以通过CL\u设备\u MAX\u计算单元获得。 要确定每个多处理器支持多少线程,CL\u设备\u最大工作\u组\u大小是正确的参数吗 在我的笔记本电脑上获得以下结果: ATI 7670m GPU CL_DEVICE_MAX_COMPUTE_UNITS = 6 CL_DEVICE_MAX_WORK_GROUP_SIZE =

在我的应用程序中,我想向用户显示各种OpenCL设备。 我无法决定如何显示设备中的内核数。 这只是为了让我们知道有多少线程可以同时并行运行

计算单元告诉我们多处理器的数量,这可以通过
CL\u设备\u MAX\u计算单元
获得。 要确定每个多处理器支持多少线程,
CL\u设备\u最大工作\u组\u大小
是正确的参数吗

在我的笔记本电脑上获得以下结果:

ATI 7670m GPU
CL_DEVICE_MAX_COMPUTE_UNITS = 6
CL_DEVICE_MAX_WORK_GROUP_SIZE = 256

Intel 3rd gen i5
CL_DEVICE_MAX_COMPUTE_UNITS = 4
CL_DEVICE_MAX_WORK_GROUP_SIZE = 1024
所以我的GPU支持1536个线程,而CPU支持4096个线程?
这显然不是真的,因此需要一些帮助。

CL\u设备\u最大工作\u组\u大小是工作组中允许的最大元素数。这与并行性的大小无关。也就是说,没有规则要求工作组中的所有工作项并行执行,我知道有一些实现没有并行执行。(有一些方法可以处理工作组同步结构,如屏障。)


不幸的是,另一个值CL_DEVICE_MAX_COMPUTE_UNITS的定义也很模糊。至少对于英特尔来说,“计算单元”的数量通常是处理器,但对于CPU来说是一个硬件线程,而对于GPU来说是一个EU,具有多个执行通道。我也不了解ATI,但我打赌在CPU实现中,6个单元可能比4个“单元”提供更多的并行性。换句话说,“单位”是苹果和桔子。最大工作组大小的1024和256与计算无关。

计算单元的数量更接近原始的“核心”定义。但是,考虑到它可能具有任意的硬件架构,在我看来,它只能迷惑用户

OpenCL精华和硬件之间的映射非常不稳定