Navigation

    全志在线开发者论坛

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • 在线文档
    • 社区主页

    又在全志d1开发板上玩ncnn

    MR Series
    5
    8
    4935
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • nihui
      nihui LV 6 last edited by YuzukiTsuru

      又在全志d1开发板上玩ncnn

      可在不修改本文章内容和banner图前提下,转载本文

      0x0 工具链变得更好了

      距上次在全志d1开发板上玩ncnn,已经过去了5个月

      在此期间,ncnn收到perfxlab和腾讯犀牛鸟开源人才的学生有关riscv vector的优化

      但更重要的是,平头哥收到了社区的反馈,提供了新版工具链

      • 支持了 risc-v vector intrinsic v1.0
      • 修复了 release 模式编译 ncnn 时的非法指令问题

      occ.t-head.cn/community/download?id=3987221940543754240

      旧版本工具链的 gcc 比较笨,经常做些负优化,于是试试全新的工具链

      0x1 配置新的 cmake toolchain

      旧
      -march=rv64gcvxtheadc -mabi=lp64d -mtune=c906 -DRVV_SPEC_0_7 -D__riscv_zfh=1 -static
      
      新
      -march=rv64gcv0p7_zfh_xtheadc -mabi=lp64d -mtune=c906 -static
      
      • arch 参数要用 v0p7,不能用默认的 v,否则会生成非法指令
      • 删除 -DRVV_SPEC_0_7,开启 ncnn 的 rvv-1.0 intrinsic 代码
      • 删除 -D__riscv_zfh=1,arch 参数的 zfh 中已经指代

      放在 ncnn/toolchains/c906-v222.toolchain.cmake

      0x2 工具链修复

      因为 rvv-0.7 缺少某些指令支持,遇到一些 rvv-1.0的代码会生成 unknown op

      fneg
      frec7
      frsqrt7
      

      因此要修改下工具链头文件

      打开 Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.2.2/lib/gcc/riscv64-unknown-linux-gnu

      /10.2.0/include/riscv_vector.h

      找到以下三行
      
      _RVV_FLOAT_ITERATOR_ARG (_RVV_FLOAT_UNARY_OP, rec7)
      _RVV_FLOAT_ITERATOR_ARG (_RVV_FLOAT_UNARY_OP, rsqrt7)
      _RVV_FLOAT_ITERATOR_ARG (_RVV_FLOAT_UNARY_OP, neg)
      
      注释掉
      
      // _RVV_FLOAT_ITERATOR_ARG (_RVV_FLOAT_UNARY_OP, rec7)
      // _RVV_FLOAT_ITERATOR_ARG (_RVV_FLOAT_UNARY_OP, rsqrt7)
      // _RVV_FLOAT_ITERATOR_ARG (_RVV_FLOAT_UNARY_OP, neg)
      
      找到文件末尾的三个 #endif,添加以下兼容代码,保存
      
      #endif
      
      #define vfneg_v_f32m1(x, vl) vfsgnjn_vv_f32m1(x, x, vl)
      #define vfneg_v_f32m2(x, vl) vfsgnjn_vv_f32m2(x, x, vl)
      #define vfneg_v_f32m4(x, vl) vfsgnjn_vv_f32m4(x, x, vl)
      #define vfneg_v_f32m8(x, vl) vfsgnjn_vv_f32m8(x, x, vl)
      #define vfneg_v_f16m1(x, vl) vfsgnjn_vv_f16m1(x, x, vl)
      #define vfneg_v_f16m2(x, vl) vfsgnjn_vv_f16m2(x, x, vl)
      #define vfneg_v_f16m4(x, vl) vfsgnjn_vv_f16m4(x, x, vl)
      #define vfneg_v_f16m8(x, vl) vfsgnjn_vv_f16m8(x, x, vl)
      
      #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
      

      0x3 下载和编译ncnn

      这次可以用 release 编译啦!

      git clone https://github.com/Tencent/ncnn.git
      cd ncnn
      mkdir build-c906
      cd build-c906
      cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/c906-v222.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 ..
      make -j32
      

      0x4 新旧工具链的性能测试对比(耗时)

      v2-c7f36f6a8a0633758f77ba24d18d6652_r.jpg

      v2-707d83e4e0953ed753f7f59d6e22509d_r.jpg

      0x5 欢迎关注 ncnn github,加qq群交流!

      https://github.com/Tencent/ncnn​

      qq群在 ncnn github 首页 readme 中~

      1 Reply Last reply Reply Quote Share 2
      • aldfaaa
        whycan矿工-小叶 LV 7 last edited by

        膜拜大佬~~~~~

        1 Reply Last reply Reply Quote Share 0
        • R
          razor7788 LV 4 last edited by

          mark一下 膜拜大佬

          1 Reply Last reply Reply Quote Share 0
          • T
            tripod9 LV 5 last edited by

            新版本工具链,在某些老电脑上会出现编译器内部错误,2.0.3版本正常,但这之后的全部异常了。

            Compiler executable checksum: 91a728100f71f55a898c866a0b8bf7a7
            main.c: In function 'my_strtod':
            main.c:37:3: internal compiler error: Illegal instruction
               37 |   number = number * 10. + (*p - '0');
                  |   ^~~~~~
            Please submit a full bug report,
            with preprocessed source if appropriate.
            See <https://gcc.gnu.org/bugs/> for instructions.
            
            
            T 1 Reply Last reply Reply Quote Share 0
            • T
              tripod9 LV 5 @tripod9 last edited by

              @tripod9

              玄铁900系列GCC工具链V2.2.4发布公告

              • 编译器:修复在某些机器上cc1出现illegal instruction的问题

              1 Reply Last reply Reply Quote Share 0
              • Referenced by  q1215200171 q1215200171 
              • Referenced by  q1215200171 q1215200171 
              • Referenced by  Y yanmingjian 
              • Referenced by  Y yanmingjian 
              • Referenced by  Y yanmingjian 
              • Referenced by  Y yanmingjian 
              • N
                noah.yi LV 3 last edited by

                你好,我想问一下,全志d1支持rvv1.0吗? 为什么我用玄铁的工具链发现无法使用rvv1.0的功能?是哪里还需要设置吗?

                nihui 1 Reply Last reply Reply Quote Share 0
                • nihui
                  nihui LV 6 @noah.yi last edited by

                  @noah-yi 用最新的工具链,支持 rvv 1.0 intrinsics

                  N 1 Reply Last reply Reply Quote Share 0
                  • N
                    noah.yi LV 3 @nihui last edited by

                    @nihui 感谢你的回复,我现在使用的是最新的编译工具链,根据更新的公告,工具链是支持rvv1.0的,但是查了d1开发板了发现d1开发板只支持rvv0.71,我在github上拉取了rvv1.0的example代码,发现不能运行。所以想请问一下是有什么参数需要设置或者有rvv1.0的intrinsic文档吗?再次感谢。

                    1 Reply Last reply Reply Quote Share 0
                    • 1 / 1
                    • First post
                      Last post

                    Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

                    行为准则 | 用户协议 | 隐私权政策