我是 GPGPU 编程新手,正在研究 OpenCL 的 NVIDIA 实现。
我的问题是如何计算 GPU 设备的限制(线程数)。
据我了解,有许多工作组(相当于 CUDA 中的块),其中包含许多工作项(~ cuda 线程)。
如何获取我的卡上存在的工作组数量(并且可以同时运行)以及一个工作组上存在的工作项目数量?
CL_DEVICE_MAX_COMPUTE_UNITS 对应什么?
khronos 规范谈到了核心(“OpenCL 设备上的并行计算核心的数量。”)与我的显卡规范中给出的 CUDA 核心有什么区别。根据 NVIDIA 网站,在我的例子中,openCL 为 14 个核心,而我的 GeForce 8800 GT 有 112 个核心。
CL_DEVICE_MAX_WORK_GROUP_SIZE(在我的例子中为 512)是否对应于分配给特定工作组的工作项总数或可以在工作组中同时运行的工作项数量?
任何建议将不胜感激。
OpenCL标准没有指定OpenCL提供的抽象执行模型如何映射到硬件。您可以将任意数量的 T 个线程(工作项)排入队列,并提供工作组大小 (WG),至少具有以下约束(有关详细信息,请参阅 OpenCL 规范 5.7.3 和 5.8):
- WG必须除T
- WG 最多必须为
DEVICE_MAX_WORK_GROUP_SIZE
- WG 最多必须为
KERNEL_WORK_GROUP_SIZE
由返回GetKernelWorkGroupInfo
;如果内核消耗大量资源,它可能小于设备最大工作组大小。
该实现管理硬件上内核的执行。单个工作组的所有线程必须调度在单个“多处理器”上,但单个多处理器可以同时管理多个工作组。
工作组内的线程以 32 个(NVIDIA warp)或 64 个(AMD wavefront)为一组执行。每个微架构都以不同的方式做到这一点。您可以在 NVIDIA 和 AMD 论坛以及每个供应商提供的各种文档中找到更多详细信息。
回答你的问题:线程数量没有限制。在现实世界中,您的问题受到输入/输出大小(即设备内存大小)的限制。要处理 4GB 的浮点缓冲区,您可以将 1G 线程入队,例如 WG=256。该设备必须在其少量(例如 2 到 40 个)多处理器上安排 4M 个工作组。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)