每个工作项的 Opencl 最大私有内存大小

Opencl Maximum Size of Private memory per Work Item

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

假设我使用所有 256 个工作组,每个工作组有 256 个 WorkItem,

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

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

或者如果是等于Cache,怎么样?

私有内存 space 是 GPU 芯片上的寄存器(0 周期访问延迟),与 VRAM(全局内存 space)的数量完全无关。专用内存量取决于设备(每个计算单元的专用内存)。 我不知道 RX 570 的专用内存大小,但对于较旧的 HD7000 系列 GPU,它是每个 CU 256kB。如果工作组大小为 256,则每个工作项将获得 1kB,等于 256 个浮点变量。

缓存大小决定了本地和常量内存的大小space。

VRAM 在 OpenCL 中表示为全局内存。

私有内存最初是从寄存器文件中分配的。您的 RX 570 来自 AMD 的 Polaris 架构,a.k.a。 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 亿个工作项。