是否可以缓存MTLLibrary或MTLFunction?

时间:2015-09-03 12:33:15

标签: metal


我无法找到如何将MTLLibrary或MTLFunction对象保存到磁盘上的特定文件(我应该如何获取其二进制文件?)。
我正在创建.metal文件,后来用newLibraryWithSource函数编译 我不想使用单独的metal编译器或XCode。在OpenGL中有glGetProgramBinary()函数,它完全符合我的要求 - MetalAPI中有类似的东西吗?

2 个答案:

答案 0 :(得分:2)

我做过一些研究。这不可能。获取二进制着色器需要外部metal编译器。

答案 1 :(得分:0)

所以,这里有几件事:

  1. Xcode使构建.metallib变得容易。只需将.metal文件添加到目标中,它将为您的目标构建default.metallib以及更传统的CPU二进制文件。请注意,从最纯粹的意义上讲,这不是二进制文件。必须有一些编译过程才能将IR降低到机器特定的二进制文件。

  2. Metal保留已编译内核的编译器缓存。第一次构建着色器时,会花一些时间。为了极大地减少此时间,请根据上述(1)构建一个.metallib。第二次使用相同的着色器时,编译可能会到达高速缓存,在这种情况下,仅会检索二进制文件。至少以我的经验,在实时需求出现之前,通过在虚拟数据集上运行一次GPU代码来预热您的GPU代码,在很大程度上可以避免编译时间。

真正的等待时间通常是为MTLResources分配过多的内存并保持GPU繁忙。您可以通过使用MTLHeap为同一存储的多个分配使用别名来提高性能,并确保在当前帧完成之前提交下一帧。允许GPU时钟下降的成本非常高。