如何解决OpenCL计算单元和GPU处理单元不匹配
我对计算单元有些困惑。我有nvidia gtx 1650Ti显卡。当我要求提供max_compute_units时,它将返回16个单位,并且max_work_group_size为1024。 但是当我执行内核时:
int i = get_global_id (0);
result [i] = get_local_id (0);
我得到的本地重复ID范围是0到255。这与图形卡返回的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个流式多处理器。这是指硬件。 SM / CU越多,GPU(在同一微体系结构内)的速度就越快。
工作组大小/本地ID是指如何将软件中的线程分组为所谓的线程块。线程块可用于矩阵乘法,例如,因为在线程块内,线程之间的通信可通过共享内存进行。线程块可以具有不同的大小(各种优化参数,分别为32、64、128、256、512或1024(max_work_group_size
)。根据您的GPU,一些中间值也可能会起作用。在硬件上(至少对于Nvidia而言),线程块在SM上作为所谓的warp(32个线程的组)执行。对于图灵,一个SM可以同时计算2个扭曲。如果选择线程块大小16,则每个线程束仅计算16个线程,而其他16个线程处于空闲状态,因此性能只有一半。
在您的示例中,本地ID(这是线程块中的索引)在0和255之间,您的线程块大小为256。您将内核调用中的线程块大小定义为“本地范围”。 max_work_group_size
完全不与max_compute_units
相关;两者都是硬件/驱动程序的限制。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。