diff --git a/docs/how-to-build/how-to-build.md b/docs/how-to-build/how-to-build.md index 26ff11111..7edd19a7b 100644 --- a/docs/how-to-build/how-to-build.md +++ b/docs/how-to-build/how-to-build.md @@ -70,13 +70,13 @@ Vulkan drivers do exists, but are not mature. You are free to experiment at your cd ncnn mkdir -p build cd build -cmake -DCMAKE_BUILD_TYPE=Release -DNCNN_VULKAN=ON -DNCNN_SYSTEM_GLSLANG=ON -DNCNN_BUILD_EXAMPLES=ON .. +cmake -DCMAKE_BUILD_TYPE=Release -DNCNN_VULKAN=ON -DNCNN_BUILD_EXAMPLES=ON .. make -j$(nproc) ``` You can add `-GNinja` to `cmake` above to use Ninja build system (invoke build using `ninja` or `cmake --build .`). -For Rasberry Pi 3, add `-DCMAKE_TOOLCHAIN_FILE=../toolchains/pi3.toolchain.cmake -DPI3=ON` to cmake. You can also consider disabling Vulkan support as the Vulkan drivers for Rasberry Pi are still not mature, but it doesn't hurt to build the support in, but not use it. +For Rasberry Pi 3 on 32bit OS, add `-DCMAKE_TOOLCHAIN_FILE=../toolchains/pi3.toolchain.cmake` to cmake. You can also consider disabling Vulkan support as the Vulkan drivers for Rasberry Pi are still not mature, but it doesn't hurt to build the support in, but not use it. #### Verification @@ -121,7 +121,7 @@ Download and Install Visual Studio Community 2017 from https://visualstudio.micr Start the command prompt: `Start → Programs → Visual Studio 2017 → Visual Studio Tools → x64 Native Tools Command Prompt for VS 2017` -Download protobuf-3.4.0 from https://github.com/google/protobuf/archive/v3.4.0.zip +Download protobuf-3.11.2 from https://github.com/google/protobuf/archive/v3.11.2.zip Build protobuf library: @@ -129,9 +129,9 @@ Build protobuf library: cd mkdir build cd build -cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%cd%/install -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_MSVC_STATIC_RUNTIME=OFF ../cmake -nmake -nmake install +cmake -A x64 -DCMAKE_INSTALL_PREFIX=%cd%/install -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_MSVC_STATIC_RUNTIME=OFF ../cmake +cmake --build . --config Release -j 2 +cmake --build . --config Release --target install ``` (optional) Download and install Vulkan SDK from https://vulkan.lunarg.com/sdk/home @@ -141,9 +141,9 @@ Build ncnn library (replace with a proper path): cd mkdir -p build cd build -cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%cd%/install -DProtobuf_INCLUDE_DIR=/build/install/include -DProtobuf_LIBRARIES=/build/install/lib/libprotobuf.lib -DProtobuf_PROTOC_EXECUTABLE=/build/install/bin/protoc.exe -DNCNN_VULKAN=ON .. -nmake -nmake install +cmake -A x64 -DCMAKE_INSTALL_PREFIX=%cd%/install -DProtobuf_INCLUDE_DIR=/build/install/include -DProtobuf_LIBRARIES=/build/install/lib/libprotobuf.lib -DProtobuf_PROTOC_EXECUTABLE=/build/install/bin/protoc.exe -DNCNN_VULKAN=ON .. +cmake --build . --config Release -j 2 +cmake --build . --config Release --target install ``` Note: To speed up compilation process on multi core machines, configuring `cmake` to use `jom` or `ninja` using `-G` flag is recommended. @@ -288,8 +288,8 @@ cmake -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake" # If you want to enable Vulkan, platform api version >= android-24 is needed cmake -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake" \ - -DANDROID_ABI="armeabi-v7a" -DANDROID_ARM_NEON=ON \ - -DANDROID_PLATFORM=android-24 -DNCNN_VULKAN=ON .. + -DANDROID_ABI="armeabi-v7a" -DANDROID_ARM_NEON=ON \ + -DANDROID_PLATFORM=android-24 -DNCNN_VULKAN=ON .. make -j$(nproc) make install @@ -306,13 +306,13 @@ mkdir -p build-android-aarch64 cd build-android-aarch64 cmake -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake"\ - -DANDROID_ABI="arm64-v8a" \ - -DANDROID_PLATFORM=android-21 .. + -DANDROID_ABI="arm64-v8a" \ + -DANDROID_PLATFORM=android-21 .. # If you want to enable Vulkan, platform api version >= android-24 is needed cmake -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake" \ - -DANDROID_ABI="arm64-v8a" \ - -DANDROID_PLATFORM=android-24 -DNCNN_VULKAN=ON .. + -DANDROID_ABI="arm64-v8a" \ + -DANDROID_PLATFORM=android-24 -DNCNN_VULKAN=ON .. make -j$(nproc) make install @@ -466,8 +466,8 @@ ln -s A glslang.framework/Versions/Current ln -s Versions/Current/Headers glslang.framework/Headers ln -s Versions/Current/Resources glslang.framework/Resources ln -s Versions/Current/glslang glslang.framework/glslang -libtool -static build-ios/install/lib/libglslang.a build-ios/install/lib/libSPIRV.a build-ios/install/lib/libOGLCompiler.a build-ios/install/lib/libOSDependent.a -o build-ios/install/lib/libglslang_combined.a -libtool -static build-ios-sim/install/lib/libglslang.a build-ios-sim/install/lib/libSPIRV.a build-ios-sim/install/lib/libOGLCompiler.a build-ios-sim/install/lib/libOSDependent.a -o build-ios-sim/install/lib/libglslang_combined.a +libtool -static build-ios/install/lib/libglslang.a build-ios/install/lib/libMachineIndependent.a build-ios/install/lib/libGenericCodeGen.a build-ios/install/lib/libSPIRV.a build-ios/install/lib/libOGLCompiler.a build-ios/install/lib/libOSDependent.a -o build-ios/install/lib/libglslang_combined.a +libtool -static build-ios-sim/install/lib/libglslang.a build-ios-sim/install/lib/libMachineIndependent.a build-ios-sim/install/lib/libGenericCodeGen.a build-ios-sim/install/lib/libSPIRV.a build-ios-sim/install/lib/libOGLCompiler.a build-ios-sim/install/lib/libOSDependent.a -o build-ios-sim/install/lib/libglslang_combined.a lipo -create build-ios/install/lib/libglslang_combined.a build-ios-sim/install/lib/libglslang_combined.a -o glslang.framework/Versions/A/glslang cp -r build/install/include/glslang glslang.framework/Versions/A/Headers/ sed -e 's/__NAME__/glslang/g' -e 's/__IDENTIFIER__/org.khronos.glslang/g' -e 's/__VERSION__/1.0/g' Info.plist > glslang.framework/Versions/A/Resources/Info.plist @@ -555,19 +555,47 @@ Pick `build-XYZ/install` folder for further usage. ### Build for AllWinner D1 -Download c906 toolchain package from https://occ.t-head.cn/community/download?id=3913221581316624384 +Download c906 toolchain package from https://occ.t-head.cn/community/download?id=4046947553902661632 ```shell -tar -xf riscv64-linux-x86_64-20210512.tar.gz -export RISCV_ROOT_PATH=/home/nihui/osd/riscv64-linux-x86_64-20210512 +tar -xf Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.2.6-20220516.tar.gz +export RISCV_ROOT_PATH=/home/nihui/osd/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.2.6 +``` + +You need to fix riscv_vector.h header for workaround vfrec7/vfrsqrt7 bug. + +Open ```$RISCV_ROOT_PATH/lib/gcc/riscv64-unknown-linux-gnu/10.2.0/include/riscv_vector.h```, goto the file end, you will find three ```#endif```, and apply changes as the following +```c +#endif + +#define vfrec7_v_f32m1(x, vl) vfrdiv_vf_f32m1(x, 1.f, vl) +#define vfrec7_v_f32m2(x, vl) vfrdiv_vf_f32m2(x, 1.f, vl) +#define vfrec7_v_f32m4(x, vl) vfrdiv_vf_f32m4(x, 1.f, vl) +#define vfrec7_v_f32m8(x, vl) vfrdiv_vf_f32m8(x, 1.f, vl) +#define vfrec7_v_f16m1(x, vl) vfrdiv_vf_f16m1(x, 1.f, vl) +#define vfrec7_v_f16m2(x, vl) vfrdiv_vf_f16m2(x, 1.f, vl) +#define vfrec7_v_f16m4(x, vl) vfrdiv_vf_f16m4(x, 1.f, vl) +#define vfrec7_v_f16m8(x, vl) vfrdiv_vf_f16m8(x, 1.f, vl) + +#define vfrsqrt7_v_f32m1(x, vl) vfrdiv_vf_f32m1(vfsqrt_v_f32m1(x, vl), 1.f, vl) +#define vfrsqrt7_v_f32m2(x, vl) vfrdiv_vf_f32m2(vfsqrt_v_f32m2(x, vl), 1.f, vl) +#define vfrsqrt7_v_f32m4(x, vl) vfrdiv_vf_f32m4(vfsqrt_v_f32m4(x, vl), 1.f, vl) +#define vfrsqrt7_v_f32m8(x, vl) vfrdiv_vf_f32m8(vfsqrt_v_f32m8(x, vl), 1.f, vl) +#define vfrsqrt7_v_f16m1(x, vl) vfrdiv_vf_f16m1(vfsqrt_v_f16m1(x, vl), 1.f, vl) +#define vfrsqrt7_v_f16m2(x, vl) vfrdiv_vf_f16m2(vfsqrt_v_f16m2(x, vl), 1.f, vl) +#define vfrsqrt7_v_f16m4(x, vl) vfrdiv_vf_f16m4(vfsqrt_v_f16m4(x, vl), 1.f, vl) +#define vfrsqrt7_v_f16m8(x, vl) vfrdiv_vf_f16m8(vfsqrt_v_f16m8(x, vl), 1.f, vl) + +#endif +#endif ``` Build ncnn with riscv-v vector and simpleocv enabled: ```shell mkdir -p build-c906 cd build-c906 -cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/c906.toolchain.cmake \ - -DCMAKE_BUILD_TYPE=relwithdebinfo -DNCNN_OPENMP=OFF -DNCNN_THREADS=OFF -DNCNN_RUNTIME_CPU=OFF -DNCNN_RVV=ON \ +cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/c906-v226.toolchain.cmake \ + -DCMAKE_BUILD_TYPE=release -DNCNN_OPENMP=OFF -DNCNN_THREADS=OFF -DNCNN_RUNTIME_CPU=OFF -DNCNN_RVV=ON \ -DNCNN_SIMPLEOCV=ON -DNCNN_BUILD_EXAMPLES=ON .. cmake --build . -j 4 cmake --build . --target install @@ -636,7 +664,7 @@ Install app Termux on your phone,and install Ubuntu in Termux. If you want use ssh, just install openssh in Termux -``` +```shell pkg install proot-distro proot-distro install ubuntu ``` @@ -647,7 +675,7 @@ while you install ubuntu successfully, using `proot-distro login ubuntu` to logi Then make ncnn,no need to install any other dependencies. -``` +```shell git clone https://github.com/Tencent/ncnn.git cd ncnn git submodule update --init @@ -661,7 +689,7 @@ Then you can run a test > on my Pixel 3 XL using Qualcomm 845,cant load `256-ncnn.png` -``` +```shell cd ../examples ../build/examples/squeezenet ../images/128-ncnn.png ``` diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3d0292503..71163c806 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -304,10 +304,6 @@ else() target_compile_options(ncnn PRIVATE -ffast-math) endif() - if(PI3) - target_compile_options(ncnn PRIVATE -march=native -mfpu=neon -mfloat-abi=hard) - target_compile_definitions(ncnn PRIVATE __ARM_NEON __ANDROID__) - endif() # target_compile_options(ncnn PRIVATE -march=native) target_compile_options(ncnn PRIVATE -fvisibility=hidden -fvisibility-inlines-hidden) if(NCNN_SHARED_LIB AND NCNN_ENABLE_LTO) diff --git a/toolchains/c906-v226.toolchain.cmake b/toolchains/c906-v226.toolchain.cmake new file mode 100644 index 000000000..038799db6 --- /dev/null +++ b/toolchains/c906-v226.toolchain.cmake @@ -0,0 +1,33 @@ +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR riscv64) +set(C906 True) + +if(DEFINED ENV{RISCV_ROOT_PATH}) + file(TO_CMAKE_PATH $ENV{RISCV_ROOT_PATH} RISCV_ROOT_PATH) +else() + message(FATAL_ERROR "RISCV_ROOT_PATH env must be defined") +endif() + +set(RISCV_ROOT_PATH ${RISCV_ROOT_PATH} CACHE STRING "root path to riscv toolchain") + +set(CMAKE_C_COMPILER "${RISCV_ROOT_PATH}/bin/riscv64-unknown-linux-gnu-gcc") +set(CMAKE_CXX_COMPILER "${RISCV_ROOT_PATH}/bin/riscv64-unknown-linux-gnu-g++") + +set(CMAKE_FIND_ROOT_PATH "${RISCV_ROOT_PATH}/riscv64-unknown-linux-gnu") + +set(CMAKE_SYSROOT "${RISCV_ROOT_PATH}/sysroot") + +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + +set(CMAKE_C_FLAGS "-march=rv64gcv0p7_zfh_xtheadc -mabi=lp64d -mtune=c906 -DC906=1 -static") +set(CMAKE_CXX_FLAGS "-march=rv64gcv0p7_zfh_xtheadc -mabi=lp64d -mtune=c906 -DC906=1 -static") + +# cache flags +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" CACHE STRING "c flags") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" CACHE STRING "c++ flags") + +# export RISCV_ROOT_PATH=/home/nihui/osd/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.2.6 +# cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/c906-v226.toolchain.cmake -DCMAKE_BUILD_TYPE=release -DNCNN_BUILD_TESTS=ON -DNCNN_OPENMP=OFF -DNCNN_THREADS=OFF -DNCNN_RUNTIME_CPU=OFF -DNCNN_RVV=ON -DNCNN_SIMPLEOCV=ON -DNCNN_BUILD_EXAMPLES=ON .. diff --git a/toolchains/pi3.toolchain.cmake b/toolchains/pi3.toolchain.cmake index 38526e183..19e4c2650 100644 --- a/toolchains/pi3.toolchain.cmake +++ b/toolchains/pi3.toolchain.cmake @@ -1,6 +1,12 @@ -SET(CMAKE_SYSTEM_NANE Android) -SET(CMAKE_SYSTEM_PROCESSOR "armv7l") -SET(ANDROID_ARCH_NAME "arm") -SET(UNIX true) -SET(CMAKE_C_COMPILER "gcc") -SET(CMAKE_CXX_COMPILER "g++") +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR armv7l) + +set(CMAKE_C_COMPILER "gcc") +set(CMAKE_CXX_COMPILER "g++") + +set(CMAKE_C_FLAGS "-march=native -mfpu=neon -mfloat-abi=hard ${CMAKE_C_FLAGS}") +set(CMAKE_CXX_FLAGS "-march=native -mfpu=neon -mfloat-abi=hard ${CMAKE_CXX_FLAGS}") + +# cache flags +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" CACHE STRING "c flags") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" CACHE STRING "c++ flags")