MNN GPU float16 使用原理
我观察到 MNN 在使用 GPU OpenCL 时,会默认使用 float16 的格式,导致模型评测时时间不同,如图。因此查看了 MNN 的源码,发现了一些有趣的东西。 MNN 使用 MNN::BackendConfig::Precision_Low 时,会根据 GPU 的实际情况判断是否使用 float16 的数据格式。代码随附。 当导出的模型可以使用 float32 或者 float16 保存,当权重转换到 GPU 上时,会转换格式,在代码的第19行到第22行。代码随附。 Pipeline 中保存的 tensor 指向的 opencl buffer 保存的还是 float16。但是 OpenCL::onMapTensor 和 OpenCL::onUnmapTensor 的实现保证了映射前后得到的是 float32。OpenCLBackend::onAcquire 给出了 tensor 中保存的 buffer 格式,其中调用了 isSupportedFP16 判断目前是否支持 float16,如果支持则使用 float16 的大小创建 buffer。 OpenCLBacken...