OpenCL 计算单元和 GPU 处理单元不匹配
OpenCL Compute units and GPU Processing units mismatch
我对计算单元有点困惑。我有一块 nvidia gtx 1650Ti 显卡。当我要求 max_compute_units 时,它 returns 16 个单位,而 max_work_group_size 是 1024。
但是当我执行内核时:
int i = get_global_id (0);
result [i] = get_local_id (0);
我得到了从 0 到 255 的重复本地 ID。这与显卡返回的 max_compute_units 有什么关系?这是 max_compute_units 值中的错误吗?GPU 实际上有比它指示的更多的计算单元吗?或者 OpenCl get_local_id 是否有自己的不依赖于硬件的分配逻辑?谢谢!
OpenCL 计算单元是指 Nvidia GPU 上的流式多处理器 (SM) 或 AMD GPU 上的计算单元 (CU)。每个 SM 包含 128 个 CUDA 内核(Pascal 及更早版本)或 64 个 CUDA 内核 (Turing/Volta)。对于 AMD,每个 CU 包含 64 个流式多处理器。这是指硬件。 SMs/CUs 越多,GPU 越快(在相同的微架构中)。
工作组大小/本地 ID 指的是您如何将软件中的线程分组到 so-called 个线程块中。例如,线程块对于矩阵乘法很有用,因为在线程块内,线程之间的通信可以通过共享内存进行。线程块可以有不同的大小(某种优化参数,32、64、128、256、512 或 1024 (max_work_group_size
))。根据您的 GPU,一些中间值也可能有效。在硬件上(至少对于 Nvidia),线程块在 SM 上作为 so-called 扭曲(32 个线程组)执行。对于图灵,一个 SM 可以同时计算 2 个扭曲。如果您选择线程块大小 16,那么每个 warp 只计算 16 个线程,其他 16 个线程空闲,因此您只能获得一半的性能。
在您的本地 ID(这是线程块中的索引)介于 0 和 255 之间的示例中,您的线程块大小为 256。您将内核调用中的线程块大小定义为“本地范围” . max_work_group_size
与 max_compute_units
没有任何关联;两者都是硬件/驱动程序限制。
我对计算单元有点困惑。我有一块 nvidia gtx 1650Ti 显卡。当我要求 max_compute_units 时,它 returns 16 个单位,而 max_work_group_size 是 1024。 但是当我执行内核时:
int i = get_global_id (0);
result [i] = get_local_id (0);
我得到了从 0 到 255 的重复本地 ID。这与显卡返回的 max_compute_units 有什么关系?这是 max_compute_units 值中的错误吗?GPU 实际上有比它指示的更多的计算单元吗?或者 OpenCl get_local_id 是否有自己的不依赖于硬件的分配逻辑?谢谢!
OpenCL 计算单元是指 Nvidia GPU 上的流式多处理器 (SM) 或 AMD GPU 上的计算单元 (CU)。每个 SM 包含 128 个 CUDA 内核(Pascal 及更早版本)或 64 个 CUDA 内核 (Turing/Volta)。对于 AMD,每个 CU 包含 64 个流式多处理器。这是指硬件。 SMs/CUs 越多,GPU 越快(在相同的微架构中)。
工作组大小/本地 ID 指的是您如何将软件中的线程分组到 so-called 个线程块中。例如,线程块对于矩阵乘法很有用,因为在线程块内,线程之间的通信可以通过共享内存进行。线程块可以有不同的大小(某种优化参数,32、64、128、256、512 或 1024 (max_work_group_size
))。根据您的 GPU,一些中间值也可能有效。在硬件上(至少对于 Nvidia),线程块在 SM 上作为 so-called 扭曲(32 个线程组)执行。对于图灵,一个 SM 可以同时计算 2 个扭曲。如果您选择线程块大小 16,那么每个 warp 只计算 16 个线程,其他 16 个线程空闲,因此您只能获得一半的性能。
在您的本地 ID(这是线程块中的索引)介于 0 和 255 之间的示例中,您的线程块大小为 256。您将内核调用中的线程块大小定义为“本地范围” . max_work_group_size
与 max_compute_units
没有任何关联;两者都是硬件/驱动程序限制。