每个工作项的 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 亿个工作项。
我有 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 亿个工作项。