我无法找到如何将MTLLibrary或MTLFunction对象保存到磁盘上的特定文件(我应该如何获取其二进制文件?)。
我正在创建.metal文件,后来用newLibraryWithSource
函数编译
我不想使用单独的metal
编译器或XCode。在OpenGL中有glGetProgramBinary()
函数,它完全符合我的要求 - MetalAPI中有类似的东西吗?
答案 0 :(得分:2)
我做过一些研究。这不可能。获取二进制着色器需要外部metal
编译器。
答案 1 :(得分:0)
所以,这里有几件事:
Xcode使构建.metallib变得容易。只需将.metal文件添加到目标中,它将为您的目标构建default.metallib以及更传统的CPU二进制文件。请注意,从最纯粹的意义上讲,这不是二进制文件。必须有一些编译过程才能将IR降低到机器特定的二进制文件。
Metal保留已编译内核的编译器缓存。第一次构建着色器时,会花一些时间。为了极大地减少此时间,请根据上述(1)构建一个.metallib。第二次使用相同的着色器时,编译可能会到达高速缓存,在这种情况下,仅会检索二进制文件。至少以我的经验,在实时需求出现之前,通过在虚拟数据集上运行一次GPU代码来预热您的GPU代码,在很大程度上可以避免编译时间。
真正的等待时间通常是为MTLResources分配过多的内存并保持GPU繁忙。您可以通过使用MTLHeap为同一存储的多个分配使用别名来提高性能,并确保在当前帧完成之前提交下一帧。允许GPU时钟下降的成本非常高。