如何解决如何仅通过查看内核代码来检测 L0、L1、L2 缓存可能的溢出?
我有一个 RX 570,这些是我从 clGetDeviceInfo 收到的信息
MaxComputeUnitPerGPU: 32
MaxWorkGroupSize: 256
MaxWorkItemSize: 256
MaxGlobalMemoryOfDevice: 4294967296
MaxPrivateMemoryBytesPerWorkGroup: 16384
MaxLocalMemoryBytesPerWorkGroup: 32768
如果我有 256 个工作组和每个工作组 256 个工作项,这意味着
64 Bytes Of Private(l1?) Memory per work Item(16384/256)
32768 Bytes Of Local(l2) Memory per work Group
如果我使用 17 个 floats 会溢出到 L2 吗?
或
如果我使用 15 个 float 和 2 个 private float 会溢出到 L2 吗?
也浮动和私人浮动一样吗?答案:默认相同,@doqtor
或
如果我使用 16 float 并使用 pow、sqrt 和clamp 等函数,registry(l1? ) 发生溢出?
解决方法
没有地址说明符的变量默认是私有的。来自OpenCL docs:
__kernel 函数中的变量没有用地址声明 空间限定符,非内核函数内的所有变量,以及所有 函数参数位于 __private 或私有地址空间中。 声明为指针的变量被认为指向 __私有地址空间,如果未指定地址空间限定符。
私有变量存储在 GPU 的寄存器中。如果内核使用的寄存器多于可用的寄存器,一些变量会存储在全局内存中(寄存器溢出)。
,要添加到 doqtor 的答案中,如果您处于带宽限制范围内,您可以通过进行屋顶线分析来检测寄存器溢出。您可以从程序二进制文件 (string binaries = program.getInfo<CL_PROGRAM_BINARIES>()[0]);
) 中计算 FLOP 和内存传输的数量。如果您非常接近带宽限制,则没有溢出。如果从这一点开始增加私有变量的数量,例如在私有内存中进行矩阵乘法,并且性能显着下降,那么就会出现寄存器溢出:private
变量突然从 global
内存中读取并且由于您已经处于带宽限制中,因此额外的全局内存访问会导致速度变慢。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。