是否可以缓存MTLLibrary或MTLFunction?

问题描述 投票:0回答:3


我无法找到如何将 MTLLibrary 或 MTLFunction 对象保存到磁盘上的特定文件(我应该如何获取其二进制文件?)。
我正在创建 .metal 文件,稍后使用

newLibraryWithSource
函数进行编译。
我不想使用单独的
metal
编译器或 XCode。在 OpenGL 中,有
glGetProgramBinary()
函数,它正是我想要的 - MetalAPI 中有类似的东西吗?

metal
3个回答
3
投票

我做了一些研究。这不可能。需要外部

metal
编译器才能获取二进制着色器。


0
投票

所以,这里有几件事:

  1. Xcode 使构建 .metallib 变得容易。只需将 .metal 文件添加到您的目标,它就会为您的目标构建一个 default.metallib 以及更传统的 CPU 二进制文件。注意,这个东西并不是最纯粹意义上的二进制。必须有一些编译过程来将 IR 缩减为机器特定的二进制文件。

  2. Metal 保留已编译内核的编译器缓存。第一次构建着色器时,您将花费一些时间。为了大大减少这个时间,请根据上面的 (1) 构建一个 .metallib。第二次使用相同的着色器时,编译可能会命中缓存,在这种情况下,只需检索二进制文件。至少根据我的经验,在实时需要发生之前,通过在虚拟数据集上运行一次 GPU 代码来预热 GPU 代码,可以大大避免编译时间。

真正的延迟通常是为 MTLResources 分配过多内存并使 GPU 保持忙碌。通过使用 MTLHeap 将多个分配别名到同一存储,并确保在当前帧完成之前提交下一帧,您可以做更多的事情来提高性能。允许 GPU 时钟降低的成本非常昂贵。


0
投票

是的,现在可以通过 Metal Binary Archives 缓存管道对象。

此外,它还支持文件的序列化和反序列化。该文件是您使用

MTLBinaryArchive
实例的
serializeToURL
方法创建的已编译的二进制着色器。

© www.soinside.com 2019 - 2024. All rights reserved.