MacOS编译realcugan-ncnn-vulkan

本文最后更新于 15 小时前,文中所描述的信息可能已发生改变。

Vulkan SDK 建议选择旧版本 1.2.162.1

配置环境,可参考Github Actions

Artifacts下载

下载Vulkan SDK ,这里手动安装到用户目录

配置cmake: brew install cmake

可选: 配置openmp

clone主仓库和ncnn

git clone https://github.com/nihui/realcugan-ncnn-vulkan.git
cd realcugan-ncnn-vulkan
git submodule update --init --recursive
在构建目录下,不开启openmp交叉编译
export VULKAN_SDK=/Users/tohru/VulkanSDK/1.3.239.0/macOS

# x86_64
mkdir build-x86_64 && cd build-x86_64
cmake -DUSE_STATIC_MOLTENVK=ON -DCMAKE_OSX_ARCHITECTURES="x86_64" \
      -DVulkan_INCLUDE_DIR=/Users/tohru/VulkanSDK/1.3.239.0/MoltenVK/include \
      -DVulkan_LIBRARY=/Users/tohru/VulkanSDK/1.3.239.0/MoltenVK/MoltenVK.xcframework/macos-arm64_x86_64/libMoltenVK.a \
      ../src

# arm64
mkdir build-arm64 && cd build-arm64
cmake -DUSE_STATIC_MOLTENVK=ON -DCMAKE_OSX_ARCHITECTURES="arm64" \
      -DVulkan_INCLUDE_DIR=/Users/tohru/VulkanSDK/1.3.239.0/MoltenVK/include \
      -DVulkan_LIBRARY=/Users/tohru/VulkanSDK/1.3.239.0/MoltenVK/MoltenVK.xcframework/macos-arm64_x86_64/libMoltenVK.a \
      ../src

make -jN 多任务并行化,加快构建速度

cmake --build . -j 4
移入models目录下测试
./realcugan-ncnn-vulkan -i input.jpg -o output.jpg
[0 Apple M1]  queueC=0[1]  queueG=0[1]  queueT=0[1]
[0 Apple M1]  bugsbn1=0  bugbilz=105  bugcopc=0  bugihfa=0
[0 Apple M1]  fp16-p/s/a=1/1/1  int8-p/s/a=1/1/1
[0 Apple M1]  subgroup=32  basic=1  vote=1  ballot=1  shuffle=1

至此可以愉快的使用了,下面是开启openmp时的编译过程

交叉编译openmp并合并成Fat-Library

此处选择openmp-11.0.0版本编译

# 下载解压openmp
wget https://github.com/llvm/llvm-project/releases/download/llvmorg-11.0.0/openmp-11.0.0.src.tar.xz
tar -xf openmp-11.0.0.src.tar.xz
cd openmp-11.0.0.src
sed -i'' -e '/.size __kmp_unnamed_critical_addr/d' runtime/src/z_Linux_asm.S
sed -i'' -e 's/__kmp_unnamed_critical_addr/___kmp_unnamed_critical_addr/g' runtime/src/z_Linux_asm.S
# x86_64
mkdir build-x86_64 && cd build-x86_64
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=install -DCMAKE_OSX_ARCHITECTURES="x86_64" \
      -DLIBOMP_ENABLE_SHARED=OFF -DLIBOMP_OMPT_SUPPORT=OFF -DLIBOMP_USE_HWLOC=OFF ..
cmake --build . -j 2
cmake --build . --target install

# arm64
mkdir build-arm64 && cd build-arm64
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=install -DCMAKE_OSX_ARCHITECTURES="arm64" \
      -DLIBOMP_ENABLE_SHARED=OFF -DLIBOMP_OMPT_SUPPORT=OFF -DLIBOMP_USE_HWLOC=OFF ..
cmake --build . -j 2
cmake --build . --target install
# merge-fat-library
cd ..
mkdir -p openmp-install
cp -r openmp-11.0.0.src/build-x86_64/install/include openmp-install
mkdir -p openmp-install/lib
lipo -create openmp-11.0.0.src/build-x86_64/install/lib/libomp.a openmp-11.0.0.src/build-arm64/install/lib/libomp.a -o openmp-install/lib/libomp.a

配置Xcode,openmp,Vulkan SDK,准备编译

# Apple Store 安装 Xcode,以14.2.0为例配置
# xcode-version: '14.2.0'
# 则此时 Developer目录为/Applications/Xcode_14.2.app/Contents/Developer
# 把编译好的openmp放入
sudo cp openmp-install/include/* /Applications/Xcode_14.2.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include
sudo cp openmp-install/lib/libomp.a /Applications/Xcode_14.2.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib

# 静默安装 Vulkan SDK 1.2.162.1,也可手动下载安装到对应位置,此处直接安装在项目下,手动安装可参考前文
wget https://sdk.lunarg.com/sdk/download/1.2.162.1/mac/vulkansdk-macos-1.2.162.1.dmg -O vulkansdk-macos-1.2.162.1.dmg
hdiutil attach vulkansdk-macos-1.2.162.1.dmg
cp -r /Volumes/vulkansdk-macos-1.2.162.1 .
rm -rf vulkansdk-macos-1.2.162.1/Applications
find vulkansdk-macos-1.2.162.1 -type f | grep -v -E 'vulkan|glslang|MoltenVK' | xargs rm
hdiutil detach /Volumes/vulkansdk-macos-1.2.162.1

在构建目录下,开启openmp交叉编译并合并成Fat-Library

export VULKAN_SDK=`pwd`/vulkansdk-macos-1.2.162.1/macOS
# x86_64
mkdir build-x86_64 && cd build-x86_64
cmake -DUSE_STATIC_MOLTENVK=ON -DCMAKE_OSX_ARCHITECTURES="x86_64" \
      -DCMAKE_CROSSCOMPILING=ON -DCMAKE_SYSTEM_PROCESSOR=x86_64 \
      -DOpenMP_C_FLAGS="-Xclang -fopenmp" -DOpenMP_CXX_FLAGS="-Xclang -fopenmp" \
      -DOpenMP_C_LIB_NAMES="libomp" -DOpenMP_CXX_LIB_NAMES="libomp" \
      -DOpenMP_libomp_LIBRARY="/Applications/Xcode_14.2.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib/libomp.a" \
      -DVulkan_INCLUDE_DIR=`pwd`/../vulkansdk-macos-1.2.162.1/MoltenVK/include \
      -DVulkan_LIBRARY=`pwd`/../vulkansdk-macos-1.2.162.1/MoltenVK/MoltenVK.xcframework/macos-arm64_x86_64/libMoltenVK.a \
      ../src
cmake --build . -j 2

# arm64
mkdir build-arm64 && cd build-arm64
cmake -DUSE_STATIC_MOLTENVK=ON -DCMAKE_OSX_ARCHITECTURES="arm64" \
      -DCMAKE_CROSSCOMPILING=ON -DCMAKE_SYSTEM_PROCESSOR=arm64 \
      -DOpenMP_C_FLAGS="-Xclang -fopenmp" -DOpenMP_CXX_FLAGS="-Xclang -fopenmp" \
      -DOpenMP_C_LIB_NAMES="libomp" -DOpenMP_CXX_LIB_NAMES="libomp" \
      -DOpenMP_libomp_LIBRARY="/Applications/Xcode_14.2.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib/libomp.a" \
      -DVulkan_INCLUDE_DIR=`pwd`/../vulkansdk-macos-1.2.162.1/MoltenVK/include \
      -DVulkan_LIBRARY=`pwd`/../vulkansdk-macos-1.2.162.1/MoltenVK/MoltenVK.xcframework/macos-arm64_x86_64/libMoltenVK.a \
      ../src
cmake --build . -j 2

如果编译时报错fatal error: 'omp.h' file not found,可将编译好的openmp里的omp.h放入对应位置再编译

# merge-fat-library,移入模型和README、LICENSE
cd ..
mkdir -p realcugan-ncnn-vulkan-macos
cp README.md LICENSE realcugan-ncnn-vulkan-macos
lipo -create build-x86_64/realcugan-ncnn-vulkan build-arm64/realcugan-ncnn-vulkan -o realcugan-ncnn-vulkan-macos/realcugan-ncnn-vulkan
strip realcugan-ncnn-vulkan-macos/realcugan-ncnn-vulkan
cp -r models/* realcugan-ncnn-vulkan-macos
使用Cloudflare Workers反向代理网站