如何解决在Metal中浮动↔︎一半转换的性能成本
我有一个基于 Metal 的 Core Image 卷积核,它使用 half
精度变量来跟踪总和和权重。但是,我现在认为 16 位 half
的范围在某些情况下是不够的,这意味着我需要 32 位 float
用于某些变量。
现在我想知道什么更高效:
- 尽可能多地使用
half
(对于采样器和大多数本地变量)并且仅在需要时才转换为float
(这意味着很多,在循环内) - 或将所有采样器和本地变量更改为
float
类型,以便无需转换。
前者意味着所有算术都以 32 位精度执行,尽管它只在某些操作中需要。
是否有任何文档或基准可以用来计算 Metal 中 float
↔︎ half
转换的成本?
解决方法
我认为您应该选择选项 A:
尽可能多地使用一半(对于采样器和大多数本地变量),并且仅在需要时才转换为浮点数(这意味着很多,在循环内)
基于 WWDC 2016 年题为“高级金属着色器优化”的讨论,链接 here。
大约在 17:17-18:58 之间是该主题的相关部分。演讲者 Fiona 提到了一些重要的事情:
- A8 及更高版本的 GPU 具有 16 位寄存器,这意味着 32 位浮点格式(如
float
)使用两倍的寄存器,这意味着带宽增加一倍、能源等。所以使用half
可以节省寄存器(这总是好的)和能源 - 在 A8 和更高版本的 GPU 上,“数据类型转换通常免费,甚至在浮点数和半数之间[强调]。” Fiona 甚至提出了一些您可能会问自己的问题,涵盖了我认为您关心的所有转换,并说它可能仍然很快,因为转换是免费的。此外,根据 Metal Shading Language Specification Version 2.3 (pg. 218)
对于具有半精度浮点像素颜色值的纹理,从 half 到 float 的转换是无损的
这样您就不必担心精度也会丢失。
该部分还有一些其他相关点值得研究,但我相信这足以证明选择 A 是合理的
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。