我无法找到如何将 MTLLibrary 或 MTLFunction 对象保存到磁盘上的特定文件(我应该如何获取其二进制文件?)。
我正在创建 .metal 文件,稍后使用
newLibraryWithSource
函数进行编译。metal
编译器或 XCode。在 OpenGL 中,有 glGetProgramBinary()
函数,它正是我想要的 - MetalAPI 中有类似的东西吗?
我做了一些研究。这不可能。需要外部
metal
编译器才能获取二进制着色器。
所以,这里有几件事:
Xcode 使构建 .metallib 变得容易。只需将 .metal 文件添加到您的目标,它就会为您的目标构建一个 default.metallib 以及更传统的 CPU 二进制文件。注意,这个东西并不是最纯粹意义上的二进制。必须有一些编译过程来将 IR 缩减为机器特定的二进制文件。
Metal 保留已编译内核的编译器缓存。第一次构建着色器时,您将花费一些时间。为了大大减少这个时间,请根据上面的 (1) 构建一个 .metallib。第二次使用相同的着色器时,编译可能会命中缓存,在这种情况下,只需检索二进制文件。至少根据我的经验,在实时需要发生之前,通过在虚拟数据集上运行一次 GPU 代码来预热 GPU 代码,可以大大避免编译时间。
真正的延迟通常是为 MTLResources 分配过多内存并使 GPU 保持忙碌。通过使用 MTLHeap 将多个分配别名到同一存储,并确保在当前帧完成之前提交下一帧,您可以做更多的事情来提高性能。允许 GPU 时钟降低的成本非常昂贵。
是的,现在可以通过 Metal Binary Archives 缓存管道对象。
此外,它还支持文件的序列化和反序列化。该文件是您使用
MTLBinaryArchive
实例的 serializeToURL
方法创建的已编译的二进制着色器。