如何解决每个工作项的 Opencl 最大私有内存大小
我有一台 AMD RX 570 4G, Opencl 告诉我,我最多可以使用 256 个工作组和每组 256 个工作项...
假设我使用了所有 256 个工作组,每个工作组中有 256 个工作项,
现在,每个工作项的最大私有内存大小是多少?
私有内存是否等于总 VRAM(4GB)除以总工作项(256x256)?
或者是否等于Cache,如果是这样,如何?
解决方法
私有内存空间是 GPU 芯片上的寄存器(0 周期访问延迟),与 VRAM(全局内存空间)的数量完全无关。私有内存的数量取决于设备(每个计算单元的私有内存)。 我不知道 RX 570 的专用内存大小,但对于较旧的 HD7000 系列 GPU,它是每个 CU 256kB。如果您的工作组大小为 256,则每个工作项将获得 1kB,这等于 256 个浮点变量。
缓存大小决定了本地和常量内存空间的大小。
,VRAM 在 OpenCL 中表示为全局内存。
私有内存最初是从寄存器文件中分配的。您的 RX 570 来自 AMD 的 Polaris 架构,也就是 GCN 4,其中每个计算单元(64 个着色器处理器)可以访问 256 个向量 (SIMD) 寄存器(64x32 位宽)和 512 个 32 位标量寄存器。因此,每个 CU 大约需要 66KiB,但这并不像引用总数那么简单。
一个工作组总是被安排在一个计算单元上,所以如果你给它分配 256 个工作项,那么它必须按顺序执行每条向量指令 4 次 (64 x 4 = 256),向量寄存器将 (稍微简化)实际上必须被视为 64 256 个条目的寄存器。
标量寄存器用于在每个工作项上相同的数据和计算,例如增加循环计数器,保存缓冲区基指针等
如果您使用的内存超过寄存器文件的容量,私有内存通常会溢出到全局。所以性能只会下降。
所以本质上,在 GCN 上,您的最佳工作组大小通常是 64。尽可能少地使用私有内存;绝对要减少可用寄存器文件的一半,以便可以安排多个工作组,从而消除内存访问的延迟,否则您的着色器核心将花费大量时间等待数据到达或写出。
缓存用于 OpenCL 本地和常量内存空间。 (如果您尝试使用太多,常量将再次溢出到全局。可以通过 OpenCL API 检查本地内存的大小,并再次在同一计算单元上安排的工作组之间进行分配,因此如果您使用超过一半,则只有一个组可以在 CU 等上运行)
我不知道您从哪里获得 256 个工作组的限制,该限制主要取决于 GPU 使用 32 位还是 64 位寻址。即使在 32 位情况下,大多数应用程序也不会接近 40 亿个工作项。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。