首页 > 解决方案 > Opencl 每个工作项的最大私有内存大小

问题描述

我有一个 AMD RX 570 4G,Opencl 告诉我每组最多可以使用 256 个工作组和 256 个工作项...

假设我使用了所有 256 个工作组,每个工作组都有 256 个工作项,

现在,每个工作项的最大私有内存大小是多少?

私有内存是否等于总 VRAM(4GB)除以总工作项(256x256)?

或者如果是这样,它是否等于缓存,如何?

标签: gpuopenclamd

解决方案


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 亿个工作项。


推荐阅读