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