add support for riscv32+rvv1.0 (rv32 and rv64ilp32) with c907 support (#6280)

* add support for riscv32+rvv1.0 (rv32 and rv64ilp32) with c907 support

* add new action linux rv32 and some fix
1. add new action linux rv32
2. add new toolchains c907-v310 for lp64d
3. fix action paths check
This commit is contained in:
柚木 鉉
2025-08-25 14:12:30 +08:00
committed by GitHub
parent 6aac76b60d
commit 1679a50c2d
8 changed files with 269 additions and 41 deletions
+1 -1
View File
@@ -81,7 +81,7 @@ jobs:
run: | run: |
export RISCV_ROOT_PATH=/data/action/osd/riscv32-elf export RISCV_ROOT_PATH=/data/action/osd/riscv32-elf
mkdir build && cd build mkdir build && cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/riscv32-unknown-elf.toolchain.cmake -DNCNN_THREADS=OFF -DNCNN_OPENMP=OFF -DNCNN_BUILD_TESTS=ON .. cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/riscv32-unknown-elf.toolchain.cmake -DNCNN_THREADS=OFF -DNCNN_OPENMP=OFF -DNCNN_BUILD_TESTS=ON -DNCNN_RVV=OFF -DNCNN_XTHEADVECTOR=OFF -DNCNN_ZFH=OFF -DNCNN_ZVFH=OFF ..
cmake --build . -j 4 cmake --build . -j 4
- name: test - name: test
+62
View File
@@ -0,0 +1,62 @@
name: linux-riscv32
on:
push:
branches: [master]
paths:
- '.github/workflows/linux-riscv32.yml'
- 'toolchains/c907-rv32-v310.toolchain.cmake'
- 'CMakeLists.txt'
- 'cmake/**'
- 'src/*'
- 'src/layer/*'
- 'src/layer/riscv/**'
- 'tests/**'
pull_request:
branches: [master]
paths:
- '.github/workflows/linux-riscv32.yml'
- 'toolchains/c907-rv32-v310.toolchain.cmake'
- 'CMakeLists.txt'
- 'cmake/**'
- 'src/*'
- 'src/layer/*'
- 'src/layer/riscv/**'
- 'tests/**'
concurrency:
group: linux-riscv32-${{ github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
xuantie:
name: xuantie-${{ matrix.cpu }}
runs-on: [self-hosted, linux, ubuntu]
strategy:
fail-fast: false
matrix:
include:
- { cpu: c907-rv32, QEMU_CPU: c907fdv-rv32, OPENMP: ON, RVV: ON, XTHEADVECTOR: OFF, ZFH: ON, ZVFH: ON }
steps:
- uses: actions/checkout@v5
- name: build
run: |
export RISCV_ROOT_PATH=/data/action/osd/Xuantie-900-gcc-linux-6.6.0-glibc-x86_64-V3.1.0
mkdir build && cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/${{ matrix.cpu }}-v310.toolchain.cmake -DCMAKE_BUILD_TYPE=release \
-DNCNN_OPENMP=${{ matrix.OPENMP }} -DNCNN_THREADS=${{ matrix.OPENMP }} \
-DNCNN_RUNTIME_CPU=OFF \
-DNCNN_RVV=${{ matrix.RVV }} \
-DNCNN_XTHEADVECTOR=${{ matrix.XTHEADVECTOR }} \
-DNCNN_ZFH=${{ matrix.ZFH }} \
-DNCNN_ZVFH=${{ matrix.ZVFH }} \
-DNCNN_SIMPLEOCV=ON -DNCNN_BUILD_EXAMPLES=ON -DNCNN_BUILD_TESTS=ON ..
cmake --build . -j 8
- name: test
run: |
export PATH=/data/action/osd/Xuantie-qemu-x86_64-Ubuntu-20.04-V5.2.6-B20250415-1115/bin:$PATH
cd build
TESTS_EXECUTABLE_LOADER=qemu-riscv32 TESTS_EXECUTABLE_LOADER_ARGUMENTS="-cpu;${{ matrix.QEMU_CPU }}" ctest --output-on-failure -j 8
+7 -6
View File
@@ -7,9 +7,9 @@ on:
- 'toolchains/riscv64-linux-gnu.toolchain.cmake' - 'toolchains/riscv64-linux-gnu.toolchain.cmake'
- 'toolchains/riscv64-unknown-linux-gnu.toolchain.cmake' - 'toolchains/riscv64-unknown-linux-gnu.toolchain.cmake'
- 'toolchains/riscv64-unknown-linux-gnu.llvm-toolchain.cmake' - 'toolchains/riscv64-unknown-linux-gnu.llvm-toolchain.cmake'
- 'toolchains/c906-v301.toolchain.cmake' - 'toolchains/c906-v310.toolchain.cmake'
- 'toolchains/c908-v301.toolchain.cmake' - 'toolchains/c908-v310.toolchain.cmake'
- 'toolchains/c910-v301.toolchain.cmake' - 'toolchains/c910-v310.toolchain.cmake'
- 'toolchains/k1.toolchain.cmake' - 'toolchains/k1.toolchain.cmake'
- 'toolchains/k1.llvm.toolchain.cmake' - 'toolchains/k1.llvm.toolchain.cmake'
- 'CMakeLists.txt' - 'CMakeLists.txt'
@@ -25,9 +25,9 @@ on:
- 'toolchains/riscv64-linux-gnu.toolchain.cmake' - 'toolchains/riscv64-linux-gnu.toolchain.cmake'
- 'toolchains/riscv64-unknown-linux-gnu.toolchain.cmake' - 'toolchains/riscv64-unknown-linux-gnu.toolchain.cmake'
- 'toolchains/riscv64-unknown-linux-gnu.llvm-toolchain.cmake' - 'toolchains/riscv64-unknown-linux-gnu.llvm-toolchain.cmake'
- 'toolchains/c906-v301.toolchain.cmake' - 'toolchains/c906-v310.toolchain.cmake'
- 'toolchains/c908-v301.toolchain.cmake' - 'toolchains/c908-v310.toolchain.cmake'
- 'toolchains/c910-v301.toolchain.cmake' - 'toolchains/c910-v310.toolchain.cmake'
- 'toolchains/k1.toolchain.cmake' - 'toolchains/k1.toolchain.cmake'
- 'toolchains/k1.llvm.toolchain.cmake' - 'toolchains/k1.llvm.toolchain.cmake'
- 'CMakeLists.txt' - 'CMakeLists.txt'
@@ -102,6 +102,7 @@ jobs:
- { cpu: c906, QEMU_CPU: c906fdv, OPENMP: OFF, RVV: OFF, XTHEADVECTOR: ON, ZFH: ON, ZVFH: OFF } - { cpu: c906, QEMU_CPU: c906fdv, OPENMP: OFF, RVV: OFF, XTHEADVECTOR: ON, ZFH: ON, ZVFH: OFF }
- { cpu: c910, QEMU_CPU: c910v, OPENMP: ON, RVV: OFF, XTHEADVECTOR: ON, ZFH: ON, ZVFH: OFF } - { cpu: c910, QEMU_CPU: c910v, OPENMP: ON, RVV: OFF, XTHEADVECTOR: ON, ZFH: ON, ZVFH: OFF }
- { cpu: c908, QEMU_CPU: c908v, OPENMP: ON, RVV: ON, XTHEADVECTOR: OFF, ZFH: ON, ZVFH: ON } - { cpu: c908, QEMU_CPU: c908v, OPENMP: ON, RVV: ON, XTHEADVECTOR: OFF, ZFH: ON, ZVFH: ON }
- { cpu: c907, QEMU_CPU: c907fdv-rv64, OPENMP: ON, RVV: ON, XTHEADVECTOR: OFF, ZFH: ON, ZVFH: ON }
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v5
+40
View File
@@ -465,6 +465,46 @@ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(riscv)")
message(WARNING "The compiler does not support risc-v zfh extension. NCNN_ZFH will be OFF.") message(WARNING "The compiler does not support risc-v zfh extension. NCNN_ZFH will be OFF.")
endif() endif()
elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
set(CMAKE_REQUIRED_FLAGS "-march=rv32gcv")
check_cxx_source_compiles("#include <riscv_vector.h>\nvfloat32m8_t test(vfloat32m8_t s, vfloat32m8_t w, float v, size_t vl) { return __riscv_vfmacc_vf_f32m8(s, v, w, vl); }\nvfloat32m1x2_t test2(vfloat32m1_t x) { return __riscv_vcreate_v_f32m1x2(x, x); }" NCNN_COMPILER_SUPPORT_RISCV_V)
set(CMAKE_REQUIRED_FLAGS "-march=rv32gc_zfh -D__fp16=_Float16")
check_cxx_source_compiles("__fp16 test(__fp16 a) { return a * a; }" NCNN_COMPILER_SUPPORT_RISCV_ZFH)
set(CMAKE_REQUIRED_FLAGS "-march=rv32gcv_zfh_zvfh -D__fp16=_Float16")
check_cxx_source_compiles("#include <riscv_vector.h>\nvfloat16m8_t test(vfloat16m8_t s, vfloat16m8_t w, __fp16 v, size_t vl) { return __riscv_vfmacc_vf_f16m8(s, v, w, vl); }\nvfloat16m1x2_t test2(vfloat16m1_t x){ return __riscv_vcreate_v_f16m1x2(x, x); }" NCNN_COMPILER_SUPPORT_RISCV_ZVFH)
set(CMAKE_REQUIRED_FLAGS "-march=rv32gc_zfh_xtheadvector -D__fp16=_Float16")
check_cxx_source_compiles("#include <riscv_vector.h>\nvfloat16m8_t test(vfloat16m8_t s, vfloat16m8_t w, __fp16 v, size_t vl) { return __riscv_vfmacc_vf_f16m8(s, v, w, vl); }\nvfloat16m1x2_t test2(vfloat16m1_t x){ return __riscv_vcreate_v_f16m1x2(x, x); }" NCNN_COMPILER_SUPPORT_RISCV_XTHEADVECTOR)
unset(CMAKE_REQUIRED_FLAGS)
if(NCNN_COMPILER_SUPPORT_RISCV_V OR NCNN_COMPILER_SUPPORT_RISCV_XTHEADVECTOR)
option(NCNN_RVV "optimize risc-v platform with v extension" ON)
else()
message(WARNING "The compiler does not support risc-v v or xtheadvector extension. NCNN_RVV will be OFF.")
endif()
if(NCNN_COMPILER_SUPPORT_RISCV_XTHEADVECTOR)
option(NCNN_XTHEADVECTOR "optimize risc-v platform with xtheadvector extension" ON)
else()
message(WARNING "The compiler does not support risc-v xtheadvector extension. NCNN_XTHEADVECTOR will be OFF.")
endif()
if(NCNN_COMPILER_SUPPORT_RISCV_ZFH)
option(NCNN_ZFH "optimize risc-v platform with zfh extension" ON)
if(NCNN_COMPILER_SUPPORT_RISCV_ZVFH OR NCNN_COMPILER_SUPPORT_RISCV_XTHEADVECTOR)
if(NCNN_RVV AND NCNN_ZFH)
option(NCNN_ZVFH "optimize risc-v platform with zvfh extension" ON)
endif()
else()
message(WARNING "The compiler does not support zvfh extension. NCNN_ZVFH will be OFF.")
endif()
else()
message(WARNING "The compiler does not support risc-v zfh extension. NCNN_ZFH will be OFF.")
endif()
endif() endif()
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)") elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)")
set(NCNN_TARGET_ARCH powerpc) set(NCNN_TARGET_ARCH powerpc)
+42 -19
View File
@@ -415,26 +415,49 @@ macro(ncnn_add_layer class)
endif() endif()
endif() endif()
if(NCNN_TARGET_ARCH STREQUAL "riscv" AND CMAKE_SIZEOF_VOID_P EQUAL 8) if(NCNN_TARGET_ARCH STREQUAL "riscv")
if(NCNN_RUNTIME_CPU AND NCNN_RVV) if(CMAKE_SIZEOF_VOID_P EQUAL 8)
ncnn_add_arch_opt_layer(${class} rvv "-march=rv64gcv") if(NCNN_RUNTIME_CPU AND NCNN_RVV)
endif() ncnn_add_arch_opt_layer(${class} rvv "-march=rv64gcv")
if(NCNN_ZFH) endif()
if(NOT NCNN_RUNTIME_CPU AND NCNN_ZVFH) if(NCNN_ZFH)
ncnn_add_arch_opt_source(${class} zfh "-march=rv64gcv_zfh_zvfh -D__fp16=_Float16") if(NOT NCNN_RUNTIME_CPU AND NCNN_ZVFH)
elseif(NOT NCNN_RUNTIME_CPU AND NCNN_XTHEADVECTOR) ncnn_add_arch_opt_source(${class} zfh "-march=rv64gcv_zfh_zvfh -D__fp16=_Float16")
ncnn_add_arch_opt_source(${class} zfh "-march=rv64gc_zfh_xtheadvector -D__riscv_zvfh=1 -D__fp16=_Float16") elseif(NOT NCNN_RUNTIME_CPU AND NCNN_XTHEADVECTOR)
else() ncnn_add_arch_opt_source(${class} zfh "-march=rv64gc_zfh_xtheadvector -D__riscv_zvfh=1 -D__fp16=_Float16")
ncnn_add_arch_opt_source(${class} zfh "-march=rv64gc_zfh -D__fp16=_Float16") else()
ncnn_add_arch_opt_source(${class} zfh "-march=rv64gc_zfh -D__fp16=_Float16")
endif()
endif()
if(NCNN_RUNTIME_CPU AND NCNN_XTHEADVECTOR)
# linker complains the conflict of v and xtheadvector, so disable generating any riscv attributes
ncnn_add_arch_opt_layer(${class} xtheadvector "-march=rv64gc_xtheadvector -mno-riscv-attribute -Wa,-mno-arch-attr")
ncnn_add_arch_opt_layer_source(${class} zfh xtheadvector "-march=rv64gc_zfh_xtheadvector -mno-riscv-attribute -Wa,-mno-arch-attr -D__fp16=_Float16")
endif()
if(NCNN_RUNTIME_CPU AND NCNN_ZVFH)
ncnn_add_arch_opt_layer_source(${class} zfh rvv "-march=rv64gcv_zfh_zvfh -D__fp16=_Float16")
endif()
elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
if(NCNN_RUNTIME_CPU AND NCNN_RVV)
ncnn_add_arch_opt_layer(${class} rvv "-march=rv32gcv")
endif()
if(NCNN_ZFH)
if(NOT NCNN_RUNTIME_CPU AND NCNN_ZVFH)
ncnn_add_arch_opt_source(${class} zfh "-march=rv32gcv_zfh_zvfh -D__fp16=_Float16")
elseif(NOT NCNN_RUNTIME_CPU AND NCNN_XTHEADVECTOR)
ncnn_add_arch_opt_source(${class} zfh "-march=rv32gc_zfh_xtheadvector -D__riscv_zvfh=1 -D__fp16=_Float16")
else()
ncnn_add_arch_opt_source(${class} zfh "-march=rv32gc_zfh -D__fp16=_Float16")
endif()
endif()
if(NCNN_RUNTIME_CPU AND NCNN_XTHEADVECTOR)
# linker complains the conflict of v and xtheadvector, so disable generating any riscv attributes
ncnn_add_arch_opt_layer(${class} xtheadvector "-march=rv32gc_xtheadvector -mno-riscv-attribute -Wa,-mno-arch-attr")
ncnn_add_arch_opt_layer_source(${class} zfh xtheadvector "-march=rv32gc_zfh_xtheadvector -mno-riscv-attribute -Wa,-mno-arch-attr -D__fp16=_Float16")
endif()
if(NCNN_RUNTIME_CPU AND NCNN_ZVFH)
ncnn_add_arch_opt_layer_source(${class} zfh rvv "-march=rv32gcv_zfh_zvfh -D__fp16=_Float16")
endif() endif()
endif()
if(NCNN_RUNTIME_CPU AND NCNN_XTHEADVECTOR)
# linker complains the conflict of v and xtheadvector, so disable generating any riscv attributes
ncnn_add_arch_opt_layer(${class} xtheadvector "-march=rv64gc_xtheadvector -mno-riscv-attribute -Wa,-mno-arch-attr")
ncnn_add_arch_opt_layer_source(${class} zfh xtheadvector "-march=rv64gc_zfh_xtheadvector -mno-riscv-attribute -Wa,-mno-arch-attr -D__fp16=_Float16")
endif()
if(NCNN_RUNTIME_CPU AND NCNN_ZVFH)
ncnn_add_arch_opt_layer_source(${class} zfh rvv "-march=rv64gcv_zfh_zvfh -D__fp16=_Float16")
endif() endif()
endif() endif()
+35 -15
View File
@@ -671,24 +671,44 @@ if(NCNN_TARGET_ARCH STREQUAL "loongarch")
endif() endif()
endif() endif()
if(NCNN_TARGET_ARCH STREQUAL "riscv" AND CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT C906) if(NCNN_TARGET_ARCH STREQUAL "riscv" AND NOT C906)
if(NOT NCNN_RUNTIME_CPU AND NCNN_RVV) if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(RISCV_MARCH_FLAG "-march=rv64gcv") if(NOT NCNN_RUNTIME_CPU AND NCNN_RVV)
if(NCNN_ZFH) set(RISCV_MARCH_FLAG "-march=rv64gcv")
set(RISCV_MARCH_FLAG "${RISCV_MARCH_FLAG}_zfh") if(NCNN_ZFH)
target_compile_options(ncnn PRIVATE -D__fp16=_Float16) set(RISCV_MARCH_FLAG "${RISCV_MARCH_FLAG}_zfh")
target_compile_options(ncnn PRIVATE -D__fp16=_Float16)
endif()
if(NCNN_ZVFH)
set(RISCV_MARCH_FLAG "${RISCV_MARCH_FLAG}_zvfh")
endif()
elseif(NOT NCNN_RUNTIME_CPU AND NCNN_XTHEADVECTOR)
set(RISCV_MARCH_FLAG "-march=rv64gc_xtheadvector")
if(NCNN_ZFH)
set(RISCV_MARCH_FLAG "${RISCV_MARCH_FLAG}_zfh")
target_compile_options(ncnn PRIVATE -D__riscv_zvfh=1 -D__fp16=_Float16)
endif()
endif() endif()
if(NCNN_ZVFH) target_compile_options(ncnn PRIVATE ${RISCV_MARCH_FLAG})
set(RISCV_MARCH_FLAG "${RISCV_MARCH_FLAG}_zvfh") elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
endif() if(NOT NCNN_RUNTIME_CPU AND NCNN_RVV)
elseif(NOT NCNN_RUNTIME_CPU AND NCNN_XTHEADVECTOR) set(RISCV_MARCH_FLAG "-march=rv32gcv")
set(RISCV_MARCH_FLAG "-march=rv64gc_xtheadvector") if(NCNN_ZFH)
if(NCNN_ZFH) set(RISCV_MARCH_FLAG "${RISCV_MARCH_FLAG}_zfh")
set(RISCV_MARCH_FLAG "${RISCV_MARCH_FLAG}_zfh") target_compile_options(ncnn PRIVATE -D__fp16=_Float16)
target_compile_options(ncnn PRIVATE -D__riscv_zvfh=1 -D__fp16=_Float16) endif()
if(NCNN_ZVFH)
set(RISCV_MARCH_FLAG "${RISCV_MARCH_FLAG}_zvfh")
endif()
elseif(NOT NCNN_RUNTIME_CPU AND NCNN_XTHEADVECTOR)
set(RISCV_MARCH_FLAG "-march=rv32gc_xtheadvector")
if(NCNN_ZFH)
set(RISCV_MARCH_FLAG "${RISCV_MARCH_FLAG}_zfh")
target_compile_options(ncnn PRIVATE -D__riscv_zvfh=1 -D__fp16=_Float16)
endif()
endif() endif()
target_compile_options(ncnn PRIVATE ${RISCV_MARCH_FLAG})
endif() endif()
target_compile_options(ncnn PRIVATE ${RISCV_MARCH_FLAG})
endif() endif()
if(NCNN_PPC64LE_VSX) if(NCNN_PPC64LE_VSX)
+41
View File
@@ -0,0 +1,41 @@
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR riscv32)
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")
if(NOT CMAKE_FIND_ROOT_PATH_MODE_PROGRAM)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
endif()
if(NOT CMAKE_FIND_ROOT_PATH_MODE_LIBRARY)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
endif()
if(NOT CMAKE_FIND_ROOT_PATH_MODE_INCLUDE)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
endif()
if(NOT CMAKE_FIND_ROOT_PATH_MODE_PACKAGE)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
endif()
set(CMAKE_FIND_LIBRARY_SUFFIXES_INIT ".a")
set(CMAKE_C_FLAGS "-march=rv32gcv_zicbom_zicbop_zicboz_zihintpause_zfh_zvfh_zba_zbb_zbc_zbs_svinval_svnapot_svpbmt_xtheadc_xtheadvdot -mabi=ilp32d -mtune=c907 -static")
set(CMAKE_CXX_FLAGS "-march=rv32gcv_zicbom_zicbop_zicboz_zihintpause_zfh_zvfh_zba_zbb_zbc_zbs_svinval_svnapot_svpbmt_xtheadc_xtheadvdot -mabi=ilp32d -mtune=c907 -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/yuzuki/SDK/Xuantie-900-gcc-linux-6.6.0-glibc-x86_64-V3.1.0
# cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/c907-rv32-v310.toolchain.cmake -DCMAKE_BUILD_TYPE=release -DNCNN_BUILD_TESTS=ON -DNCNN_OPENMP=ON -DNCNN_RUNTIME_CPU=OFF -DNCNN_RVV=ON -DNCNN_XTHEADVECTOR=OFF -DNCNN_ZFH=ON -DNCNN_ZVFH=ON -DNCNN_SIMPLEOCV=ON -DNCNN_BUILD_EXAMPLES=ON ..
+41
View File
@@ -0,0 +1,41 @@
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR riscv32)
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")
if(NOT CMAKE_FIND_ROOT_PATH_MODE_PROGRAM)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
endif()
if(NOT CMAKE_FIND_ROOT_PATH_MODE_LIBRARY)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
endif()
if(NOT CMAKE_FIND_ROOT_PATH_MODE_INCLUDE)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
endif()
if(NOT CMAKE_FIND_ROOT_PATH_MODE_PACKAGE)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
endif()
set(CMAKE_FIND_LIBRARY_SUFFIXES_INIT ".a")
set(CMAKE_C_FLAGS "-march=rv64gcv_zicbom_zicbop_zicboz_zihintpause_zfh_zvfh_zba_zbb_zbc_zbs_svinval_svnapot_svpbmt_xtheadc_xtheadvdot -mabi=lp64d -mtune=c907 -static")
set(CMAKE_CXX_FLAGS "-march=rv64gcv_zicbom_zicbop_zicboz_zihintpause_zfh_zvfh_zba_zbb_zbc_zbs_svinval_svnapot_svpbmt_xtheadc_xtheadvdot -mabi=lp64d -mtune=c907 -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/yuzuki/SDK/Xuantie-900-gcc-linux-6.6.0-glibc-x86_64-V3.1.0
# cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/c907-v310.toolchain.cmake -DCMAKE_BUILD_TYPE=release -DNCNN_BUILD_TESTS=ON -DNCNN_OPENMP=ON -DNCNN_RUNTIME_CPU=OFF -DNCNN_RVV=ON -DNCNN_XTHEADVECTOR=OFF -DNCNN_ZFH=ON -DNCNN_ZVFH=ON -DNCNN_SIMPLEOCV=ON -DNCNN_BUILD_EXAMPLES=ON ..