1 测试结果
总体上,截止至发文日(4月4日 星期四……好日子……)ncnn在iOS上的vulkan支持效果还不尽理想,vulkan版本的执行速度有至少20%的下降。(仅仅是我的测试结果,不排除有我的测试方式不理想的可能,不过官方也有声明,现在的vulkan优化还不完善,如下图)

不过毋庸置疑的是:提前熟悉一下集成流程不会有什么坏处的~
2 工程参考
https://github.com/chrisYooh/ncnnSrcDemo
其下有3个工程:
1)NcnnSrcDemo
将ncnn(非vulkan支持版本)直接以 源码方式 集成,可打断点调试。
2)NcnnSrcDemo_MoltenVK
将ncnn(vulkan版本)直接以 源码方式 集成,可打断点调试。
ncnn源码对应提交号:c778265(源码有小幅vulkan无关改动)
3)NcnnFrmDemo_MoltenVK
将ncnn(vulkan版本)以 Framework的方式 集成,不可调试ncnn源码,仅做工程配置参考。
ncnn源码对应提交号:c778265(源码有小幅vulkan无关改动)
3 集成步骤(先练习一下吧!19.05.24. 更新)
3.1 下载最新的VulkanSDK
比如:1.1.106.0版本:编译ncnn使用
下载地址:https://vulkan.lunarg.com/sdk/home#mac

Tips:
1 不需要下载MoltenVK的源码自己编译(当然你想也可以)
2 你会发现MoltenVK/iOS/framework下的Framework只支持arm64平台,没错,MoltenVK在iOS上只支持arm64。

3.2 编译ncnn
倪神 更新过ncnn代码后在mac的编译还蛮顺利的,只需要下载ncnn的源码按照提示编译即可
3.2.1 ncnn源码地址
https://github.com/Tencent/ncnn
3.2.2 在MacOSX上编译iOS ncnn
进入上面的源码地址后,往下来,就看到了【HowTo】一节,
选择【Build for iOS on MacOSX with xcode】即有详细说明。
当然,我都写简书了,你可以选择不看“她”的!(这个“她”颇有深意啊哈哈……)

3.2.3 vulkan ncnn 编译脚本参考
对,不用看她的,在ncnn源码工程的根目录下创建build_ios_vulkan.sh文件,然后文件内容按下面代码的填写,一个vulkan的ncnn ios framework的编译脚本 就完成了。
运行脚本,会在ncnn源码工程的根目录下生成ncnn.framework。
!!!脚本要修改两个路径哦!!!
-DVulkan_LIBRARY
-DVulkan_INCLUDE_DIR
对应的路径改为你的 vulkansdk 对应的绝对路径
vulkansdk-macos-1.1.106.0 即为 你在3.1节下载的vlukan SDK
#!/bin/sh
# Build For iphoneOS
rm -rf build-ios-vulkan
mkdir build-ios-vulkan
cd build-ios-vulkan
cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/ios.toolchain.cmake \
-DIOS_PLATFORM=OS \
-DENABLE_BITCODE=0 \
-DIOS_ARCH="arm64" \
-DVulkan_LIBRARY=/Users/chris/Documents/Software/vulkansdk/vulkansdk-macos-1.1.106.0/MoltenVK/iOS/dynamic/libMoltenVK.dylib \
-DVulkan_INCLUDE_DIR=/Users/chris/Documents/Software/vulkansdk/vulkansdk-macos-1.1.106.0/MoltenVK/include \
-DNCNN_VULKAN=ON ..
make -j8
make install
cd ../
# Combine Framework
rm -rf ncnn.framework
mkdir -p ncnn.framework/Versions/A/Headers
mkdir -p ncnn.framework/Versions/A/Resources
ln -s A ncnn.framework/Versions/Current
ln -s Versions/Current/Headers ncnn.framework/Headers
ln -s Versions/Current/Resources ncnn.framework/Resources
ln -s Versions/Current/ncnn ncnn.framework/ncnn
lipo -create \
build-ios-vulkan/install/lib/libncnn.a \
-o ncnn.framework/Versions/A/ncnn
cp -r build-ios-vulkan/install/include/* ncnn.framework/Versions/A/Headers/
cp Info.plist ncnn.framework/Versions/A/Resources/
3.3 集成工程
3.3.1 Search Path Setting
Framework Search Path 添加:
[路径前缀]/vulkansdk-macos-1.1.106.0/MoltenVK/iOS/framework
Head Search Path 添加:
[路径前缀]/vulkansdk-macos-1.1.106.0/MoltenVK/include

3.3.2 framework集成
Link Frameworks and Libraries添加:
ncnn.framework
MoltenVK.framework

3.4 ncnn 开启vulkan功能
其实就2行代码,头文件包含<ncnn/Net> 直接搞定
云里雾里?直接去第2节下载源码看一看吧。
// 初始化gpu
ncnn::destroy_gpu_instance();
// 设置网络支持vulkan
ncnn_net.use_vulkan_compute = 1;

4 结语与展望
至此,我们完成了ncnn 的 vulkan 版本在iOS的集成,虽然现在的优化效果不仅理想。但考虑到vulkan在mac端的支持也才仅仅2、3个月,我们有理由为ncnn vulkan版本之后的优化速度报以信心。
为倪神打Call吧!
网友评论