我是GPGPU编程的新手,我正在使用NVIDIA实现的OpenCL。
我的问题是如何计算GPU设备的限制(线程数) 根据我的理解,有许多工作组(相当于CUDA中的块)包含许多工作项(~cuda线程)。
如何获取卡上存在的工作组数量(可以同时运行)和一个工作组中存在的工作项数?
CL_DEVICE_MAX_COMPUTE_UNITS对应什么?
khronos规范说明了核心(“OpenCL设备上的并行计算核心数”。)与我的图形卡规范中给出的CUDA核心有什么不同。在我的情况下,openCL给出14,我的GeForce 8800 GT有112核,基于NVIDIA网站。
CL_DEVICE_MAX_WORK_GROUP_SIZE(在我的情况下为512)是否与给定特定工作组的工作项总数或工作组中可同时运行的工作项数相对应?
任何建议都会非常感激。
答案 0 :(得分:22)
OpenCL标准没有规定OpenCL提供的抽象执行模型如何映射到硬件。您可以排队任意数量的线程(工作项),并提供工作组大小(WG),至少具有以下约束(有关详细信息,请参阅OpenCL规范5.7.3和5.8):
DEVICE_MAX_WORK_GROUP_SIZE
KERNEL_WORK_GROUP_SIZE
返回GetKernelWorkGroupInfo
;如果内核消耗大量资源,它可能小于设备最大工作组大小。该实现管理硬件上内核的执行。必须在单个“多处理器”上调度单个工作组的所有线程,但单个多处理器可以同时管理多个工作组。
工作组内的线程由32(NVIDIA warp)或64(AMD wavefront)组执行。每个微架构都以不同的方式实现这一点。您可以在NVIDIA和AMD论坛以及各供应商提供的各种文档中找到更多详细信息。
回答你的问题:线程数没有限制。在现实世界中,您的问题受输入/输出的大小限制,即设备存储器的大小。要处理浮动的4GB缓冲区,您可以将1G线程排入队列,例如WG = 256。该设备必须在其较小数量(例如2到40个)的多处理器上安排4M工作组。