算能RISC-V通用云编译飞桨paddlepaddle@openKylin留档

尝试一在riscv里编译飞桨。

先总结:

下载飞桨代码,参照pr修改代码

然后编译

cmake ../ -DWITH_GPU=OFF -DWITH_RISCV=ON
make -j 16 TARGET=RISCV64_GENERIC

编译好后安装:

pip install paddlepaddle-0.0.0-cp38-cp38-linux_riscv64.whl -i https://mirror.baidu.com/pypi/simple

先git下载源码

git clone https://github.com/paddlepaddle/padle

配置环境

pip3 install protobuf

还有一些库等,具体可以参考编译pytorch的文档:算能RISC-V通用云开发空间编译pytorch @openKylin留档-CSDN博客

然后进入paddle目录编译

mkdir build

cd build

cmake ../

我的天,除了protobuf,竟然一下子编译完成了!

Automatic code generation for paddle/fluid/primitive succeed.
Automatic code generation for decomp interface succeed.
WITH_DLNNE:
-- Configuring done
-- Generating done
-- Build files have been written to: /root/github/paddle/build

是我肤浅了,后面还需要编译呢root@863c89a419ec:~/github/paddle/build# make

make -j 16

make -j 8 TARGET=RISCV64_GENERIC -dw 

如果碰到报错,根据报错进行处理,比如哪个第三方库编译失败,就删除那个目录,然后在third_party目录执行:git submodule update --init --recursive

然后再make 即可。

困了,让它编译去吧。

报错了

通过官网issue,发现cmake指令为:

cmake ../ -DWITH_GPU=OFF -WITH_RISCV=ON

make 指令为;

make -j 16 TARGET=RISCV64_GENERIC

发现cmake指令有问题

拼写错误,应该是:

cmake ../ -DWITH_GPU=OFF -DWITH_RISCV=ON

然后再make

看MakeFile文件里面没有RISCV选项,不知道是不是cmake编译器那边支持,先执行看看。(后来知道,人家这个RISCV是对应了专门的pr的,目前这个pr还没有合并,所以需要手工改密码)

cmake结束之后提示WITH_RISCV没有生效

手工添加飞桨对riscv的支持

修改CMakeFile文件,在WITH_ARM的后面加上:

if(WITH_RISCV)
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
  set(WITH_XBYAK
      OFF
      CACHE STRING "Disable XBYAK when compiling WITH_RISCV=ON." FORCE)
  set(WITH_MKL
      OFF
      CACHE STRING "Disable MKL when compiling WITH_RISCV=ON." FORCE)
  set(WITH_AVX
      OFF
      CACHE STRING "Disable AVX when compiling WITH_AVX=OFF." FORCE)
  add_definitions(-DPADDLE_WITH_RISCV)
endif()

修改文件:cmake/flags.cmake

在ARM后面加上:AND NOT WITH_RISCV

同时找到了-m64的位置。因为加了这句,就不用手工删除-m64这句。

修改文件:paddle/fluid/operators/search_compute.h

一共需要修改四处,在四处加上defined(PADDLE_WITH_RISCV):

#pragma once

#if !defined(PADDLE_WITH_ARM) && !defined(PADDLE_WITH_SW) && \
    !defined(PADDLE_WITH_MIPS) && !defined(PADDLE_WITH_LOONGARCH)
    !defined(PADDLE_WITH_MIPS) && !defined(PADDLE_WITH_LOONGARCH) && \
	!defined(PADDLE_WITH_RISCV)
#include <immintrin.h>
#endif
#include <cfloat>
@@ -103,7 +104,8 @@ void call_gemm_batched(const framework::ExecutionContext& ctx,
}

#if !defined(PADDLE_WITH_ARM) && !defined(PADDLE_WITH_SW) && \
    !defined(PADDLE_WITH_MIPS) && !defined(PADDLE_WITH_LOONGARCH)
    !defined(PADDLE_WITH_MIPS) && !defined(PADDLE_WITH_LOONGARCH) && \
	!defined(PADDLE_WITH_RISCV)

#define __m256x __m256

@@ -144,7 +146,8 @@ inline void axpy(const T* x, T* y, size_t len, const T alpha) {
                      _mm256_mul_px(mm_alpha, _mm256_load_px(x + jjj))));
  }
#elif defined(PADDLE_WITH_ARM) || defined(PADDLE_WITH_SW) || \
    defined(PADDLE_WITH_MIPS) || defined(PADDLE_WITH_LOONGARCH)
    defined(PADDLE_WITH_MIPS) || defined(PADDLE_WITH_LOONGARCH) || \
	defined(PADDLE_WITH_RISCV)
  PADDLE_THROW(platform::errors::Unimplemented("axpy is not supported"));
#else
  lll = len & ~SSE_CUT_LEN_MASK;
@@ -174,7 +177,8 @@ inline void axpy_noadd(const T* x, T* y, size_t len, const T alpha) {
    _mm256_store_px(y + jjj, _mm256_mul_px(mm_alpha, _mm256_load_px(x + jjj)));
  }
#elif defined(PADDLE_WITH_ARM) || defined(PADDLE_WITH_SW) || \
    defined(PADDLE_WITH_MIPS) || defined(PADDLE_WITH_LOONGARCH)
    defined(PADDLE_WITH_MIPS) || defined(PADDLE_WITH_LOONGARCH) || \
	defined(PADDLE_WITH_RISCV)
  PADDLE_THROW(platform::errors::Unimplemented("axpy_noadd is not supported"));
#else
  lll = len & ~SSE_CUT_LEN_MASK;

修改文件:paddle/fluid/platform/denormal.cc

33行if那句后面加上RISCV,变成这样:

#if !defined(GCC_WITHOUT_INTRINSICS) && !defined(PADDLE_WITH_ARM) && \
    !defined(PADDLE_WITH_SW) && !defined(PADDLE_WITH_MIPS) &&        \
    !defined(_WIN32) && !defined(PADDLE_WITH_LOONGARCH) &&           \
        !defined(PADDLE_WITH_RISCV)
#define DENORM_USE_INTRINSICS

修改文件paddle/phi/backends/cpu/cpu_info.cc

  } else {
#if !defined(WITH_NV_JETSON) && !defined(PADDLE_WITH_ARM) &&  \
    !defined(PADDLE_WITH_SW) && !defined(PADDLE_WITH_MIPS) && \
    !defined(PADDLE_WITH_LOONGARCH) && !defined(PADDLE_WITH_RISCV)
    std::array<int, 4> reg;
    cpuid(reg.data(), 0);
    int nIds = reg[0];

修改文件paddle/phi/backends/cpu/cpu_info.h

#define cpuid(reg, x) __cpuidex(reg, x, 0)
#else
#if !defined(WITH_NV_JETSON) && !defined(PADDLE_WITH_ARM) &&  \
    !defined(PADDLE_WITH_SW) && !defined(PADDLE_WITH_MIPS) && \
    !defined(PADDLE_WITH_LOONGARCH) && !defined(PADDLE_WITH_RISCV)
#include <cpuid.h>
inline void cpuid(int reg[4], int x) {

感觉离曙光很近了。

重新cmake和make,希望不会碰到“pmmintrin.h”文件找不到的错误。

发现少修改一个文件

修改文件cmake/third_party.cmake

if(WITH_POCKETFFT)
  include(external/pocketfft)
  list(APPEND third_party_deps extern_pocketfft)
  add_definitions(-DPADDLE_WITH_POCKETFFT)
if(WITH_RISCV)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-maybe-uninitialized") # Warnings in pocketfft_hdronly.h
endif()
endif()

11点开始编译,计时开始!15:37分编译完成,耗时4小时37分钟!

哈哈,它静静的躺在那里:

root@863c89a419ec:~/github/paddle/build/python# ls dist/
paddlepaddle-0.0.0-cp38-cp38-linux_riscv64.whl
root@863c89a419ec:~/github/paddle/build/python# pip3 install dist/paddlepaddle-0.0.0-cp38-cp38-linux_riscv64.whl  -i https://mirror.baidu.com/pypi/simple
Processing ./dist/paddlepaddle-0.0.0-cp38-cp38-linux_riscv64.whl

安装:

pip install paddlepaddle-0.0.0-cp38-cp38-linux_riscv64.whl

安装后执行import paddle 报错。

总结:

目前已编译成功。

目前import paddle报错。

调试

报错:Could NOT find PY_google.protobuf (missing: PY_GOOGLE.PROTOBUF)

Could NOT find PY_google.protobuf (missing: PY_GOOGLE.PROTOBUF)

安装protobuf

pip3 install protobuf

编译时到100%报错

[ 97%] Building CXX object gloo/CMakeFiles/gloo.dir/transport/tcp/unbound_buffer.cc.o
[100%] Linking CXX static library libgloo.a
[100%] Built target gloo
[  3%] Performing install step for 'extern_gloo'
[  3%] Completed 'extern_gloo'
[  3%] Built target extern_gloo
make: *** [Makefile:136: all] Error 2
再重新编译,到了protobuf这里报错:

-- Installing: /root/github/paddle/build/third_party/install/protobuf/lib/cmake/protobuf/protobuf-config.cmake
[  4%] Completed 'extern_protobuf'
[  4%] Built target extern_protobuf
make: *** [Makefile:136: all] Error 2

再重新编译,发现这里报错:

报错:cc1: error: '-march=loongson3a': ISA string must begin with rv32 or rv64

cc1: error: requested ABI requires '-march' to subsume the 'D' extension
cc1: error: ABI requires '-march=rv64'
make[4]: *** [Makefile:737: isamin.o] Error 1
cc1: error: '-march=loongson3a': ISA string must begin with rv32 or rv64
make[4]: *** [Makefile:611: sasum.o] Error 1
cc1: error: '-march=loongson3a': ISA string must begin with rv32 or rv64
cc1: error: '-march=loongson3a': ISA string must begin with rv32 or rv64
cc1: error: requested ABI requires '-march' to subsume the 'D' extension
cc1: error: requested ABI requires '-march' to subsume the 'D' extension
cc1: error: ABI requires '-march=rv64'
cc1: error: ABI requires '-march=rv64'
cc1: error: requested ABI requires '-march' to subsume the 'D' extension
cc1: error: ABI requires '-march=rv64'
make[4]: *** [Makefile:647: snrm2.o] Error 1
make[4]: *** [Makefile:629: ssum.o] Error 1
make[4]: *** [Makefile:701: smax.o] Error 1
make[4]: *** [Makefile:665: samax.o] Error 1
make[4]: *** [Makefile:755: ismax.o] Error 1
make[4]: *** [Makefile:773: sdsdot.o] Error 1
make[3]: *** [Makefile:164: libs] Error 1
make[2]: *** [CMakeFiles/extern_openblas.dir/build.make:86: third_party/openblas/src/extern_openblas-stamp/extern_openblas-build] Error 2
make[1]: *** [CMakeFiles/Makefile2:4001: CMakeFiles/extern_openblas.dir/all] Error 2
[  5%] Built target eager_python_c_codegen
[  5%] Built target op_map_codegen
[  5%] Built target eager_codegen
make: *** [Makefile:136: all] Error 2

参考这里重新来过:

如何在RISC-V平台编译paddle - 知乎

编译报错:

Live child 0x2af978fd70 (paddle/fluid/eager/auto_code_generator/generator/CMakeFiles/eager_codegen) PID 115530
Reaping winning child 0x2af978fd70 PID 115530
Removing child 0x2af978fd70 PID 115530 from chain.
Considering target file 'paddle/fluid/eager/auto_code_generator/generator/CMakeFiles/eager_codegen.dir/build'.
 File 'paddle/fluid/eager/auto_code_generator/generator/CMakeFiles/eager_codegen.dir/build' does not exist.
  Considering target file 'eager_codegen'.
   File 'eager_codegen' does not exist.
    Considering target file 'paddle/fluid/eager/auto_code_generator/generator/CMakeFiles/eager_codegen'.
    File 'paddle/fluid/eager/auto_code_generator/generator/CMakeFiles/eager_codegen' was considered already.
    Considering target file 'paddle/fluid/eager/auto_code_generator/generator/CMakeFiles/eager_codegen.dir/build.make'.
    File 'paddle/fluid/eager/auto_code_generator/generator/CMakeFiles/eager_codegen.dir/build.make' was considered already.
   Finished prerequisites of target file 'eager_codegen'.
  Must remake target 'eager_codegen'.
  Successfully remade target file 'eager_codegen'.
 Finished prerequisites of target file 'paddle/fluid/eager/auto_code_generator/generator/CMakeFiles/eager_codegen.dir/build'.
Must remake target 'paddle/fluid/eager/auto_code_generator/generator/CMakeFiles/eager_codegen.dir/build'.
Successfully remade target file 'paddle/fluid/eager/auto_code_generator/generator/CMakeFiles/eager_codegen.dir/build'.
make[2]: Leaving directory '/root/github/paddle/build'
Reaping winning child 0x2b00eb0510 PID 115266
Live child 0x2b00eb0510 (paddle/fluid/eager/auto_code_generator/generator/CMakeFiles/eager_codegen.dir/all) PID 115532
[  4%] Built target eager_codegen
Reaping winning child 0x2b00eb0510 PID 115532
Removing child 0x2b00eb0510 PID 115532 from chain.
make[1]: Leaving directory '/root/github/paddle/build'
Reaping losing child 0x2ad05e7c50 PID 115118
make: *** [Makefile:136: all] Error 2
Removing child 0x2ad05e7c50 PID 115118 from chain.
make: Leaving directory '/root/github/paddle/build'

在paddle/build/third_party删除eigen3目录,然后执行:git submodule update --init --recursive

问题解决。

问题没有解决,还是4%这里报错:

[  4%] Built target eager_codegen
Reaping winning child 0x2b167efa70 PID 117670
Removing child 0x2b167efa70 PID 117670 from chain.
make[1]: Leaving directory '/root/github/paddle/build'
Reaping losing child 0x2b0332dc20 PID 117206
make: *** [Makefile:136: all] Error 2
Removing child 0x2b0332dc20 PID 117206 from chain.
make: Leaving directory '/root/github/paddle/build'

重新设置make 后,cmake ../ -DWITH_GPU=OFF -WITH_RISCV=ON 编译报错

报错c++: error: unrecognized command line option '-m64'

按照文档,应该“查找makefile文件的生成逻辑,最终发现在Paddle.cmake文件中有这样一段逻辑”,将该文件中的-64去掉。

但是没有找到这个文件。找到了,在这里:

cmake/flags.cmake

  if(NOT WITH_NV_JETSON
     AND NOT WITH_ARM
     AND NOT WITH_RISCV
     AND NOT WITH_SW
     AND NOT WITH_MIPS
     AND NOT WITH_LOONGARCH)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m64")
  endif()

后期通过修改源码,添加RISCV选项的方法,使代码支持RISCV,并同时使用-m64失效

在cmake的时候加上DWITH_RISCV提示没有生效

WITH_DLNNE:
-- Configuring done
-- Generating done
CMake Warning:
  Manually-specified variables were not used by the project:

    WITH_RISCV

按照飞桨官网pr,修改飞桨make相关文件。

编译报错没有 pmmintrin.h文件

[  7%] Building CXX object paddle/fluid/platform/CMakeFiles/denormal.dir/denormal.cc.o
/root/github/paddle/paddle/fluid/platform/denormal.cc:38:10: fatal error: pmmintrin.h: No such file or directory
   38 | #include <pmmintrin.h>
      |          ^~~~~~~~~~~~~
compilation terminated.
make[2]: *** [paddle/fluid/platform/CMakeFiles/denormal.dir/build.make:76: paddle/fluid/platform/CMakeFiles/denormal.dir/denormal.cc.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:4787: paddle/fluid/platform/CMakeFiles/denormal.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....

这个对应的就是paddle/fluid/platform/denormal.cc 这个文件,已经修改。

编译安装好后,

import paddle报错

oot@863c89a419ec:~/github/paddle/build# python3
Python 3.8.2 (default, Jan 18 2024, 07:05:37)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import paddle
Error: Can not import paddle core while this file exists: /usr/local/lib/python3.8/dist-packages/paddle/base/libpaddle.so
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/dist-packages/paddle/base/core.py", line 267, in <module>
    from . import libpaddle
ImportError: /usr/local/lib/python3.8/dist-packages/paddle/base/libpaddle.so: undefined symbol: __atomic_exchange_1

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.8/dist-packages/paddle/__init__.py", line 30, in <module>
    from .base import core  # noqa: F401
  File "/usr/local/lib/python3.8/dist-packages/paddle/base/__init__.py", line 38, in <module>
    from . import (  # noqa: F401
  File "/usr/local/lib/python3.8/dist-packages/paddle/base/backward.py", line 25, in <module>
    from . import core, framework, log_helper, unique_name
  File "/usr/local/lib/python3.8/dist-packages/paddle/base/core.py", line 377, in <module>
    if not avx_supported() and libpaddle.is_compiled_with_avx():
NameError: name 'libpaddle' is not defined

看文档,有人说是patchelf版本低的缘故,升级patchelf,再重新编译,问题依旧

https://github.com/PaddlePaddle/Paddle/issues/51536

已提issue :https://github.com/PaddlePaddle/Paddle/issues/62037

学习官网issue

risc-v芯片上编译paddle报错 · Issue #61770 · PaddlePaddle/Paddle · GitHub

学习官网改risc-v的pr

Adding a compile option to Paddle for Risc-V · PaddlePaddle/Paddle@d3db383 · GitHub

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/408507.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java EE改名Jakarta EE,jakarta对程序开发的影响

一、前言 很多Java程序员在使用新版本的Spring6或者springboot3版本的时候&#xff0c;发现了一些叫jakarta的包。我在阅读开源工作流引擎camunda源代码的时候&#xff0c;也发展了大量jakarta的工程包。 比如&#xff1a;camunda的webapps编译工程就提供了2种方式javax和jaka…

linux系统---httpd

目录 Internet的起源 一、http协议——超文本传输协议 1.http相关概念 二、HTTP请求访问的完整过程 1、 建立连接 2、 接收请求 3、 处理请求 常用请求Method: GET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS 3.1 常见的HTTP方法 3.2 GET和POST比较 4、访问资源 …

【YOLO系列算法人员摔倒检测】

YOLO系列算法人员摔倒检测 模型和数据集下载YOLO系列算法的人员摔倒检测数据集可视化数据集图像示例&#xff1a; 模型和数据集下载 yolo行人跌倒检测一&#xff1a; 1、训练好的行人跌倒检测权重以及PR曲线&#xff0c;loss曲线等等&#xff0c;map达90%多&#xff0c;在行人跌…

黑马程序员——接口测试——day02

目录&#xff1a; Postman基础使用 简介和安装案例一&#xff1a;案例二&#xff1a;案例三&#xff1a;接口用例设计 接口测试的测试点 功能测试性能测试安全测试接口用例设计方法 单接口测试业务场景测试单接口测试用例 模版分析测试点 登录添加员工查询员工业务场景测试用例…

操作系统-复试笔记

http://t.csdnimg.cn/PJLWh 操作系统基础 什么是操作系统&#xff1f; 操作系统&#xff08;Operating System&#xff0c;简称 OS&#xff09;是管理计算机硬件与软件资源的程序&#xff0c;是计算机的基石。操作系统本质上是一个运行在计算机上的软件程序 &#xff0c;用于…

【问答】接地原则

以前谈到电源去耦&#xff0c;我警告过糟糕的去耦会增加放大器的失真。一位读者问了一个有趣的问题&#xff0c;去耦电容的接地脚应该在哪里接地才能消除这个问题呢&#xff1f; 这个问题升级到关于正确接地的技术。题目太大了&#xff0c;不过我也许能够提供一些启发性的例子…

doxygen 注释->API接口文档

1.doxygen官方下载 2.工程根目录下(如qt工程.pro同级目录) #doxygen file_name 用以注释生成接口文档的输入(生成file_name文件) doxygen安装目录\bin\doxygen -g doxygen_pro #生成API接口文档&#xff0c;该步骤会生成html目录与latex目录 doxygen安装目录\bin\doxygen axis…

森歌深化体育营销战略,揭晓2024奥运新代言人,携手共创影响力奇迹

2024年&#xff0c;奥运龙年的春节将将过去&#xff0c;各大高端品牌便纷纷开始激烈博弈。森歌有备而来&#xff01;布局早&#xff0c;积累深&#xff0c;以其深入骨髓的体育情怀和独具匠心的品牌策略&#xff0c;成为厨电行业的佼佼者。2月27日-2月28日&#xff0c;森歌将在杭…

MyBatis进阶

目录 一、实现多表查询 二、#{}和${} 1、#{}和${}的使用 2、#{}和${}的区别 3、${}的使用场景 三、数据库连接池 1、数据库连接池概念 2、常见数据库连接池 3、修改连接池为Hikari 四、动态sql语句--xml 1、if标签 2、tirm标签 3、where标签 4、set标签 5、fore…

Docker复习笔记

Centos7安装Docker Docker官网:www.docker.com Docker官网仓库:hub.docker.com Docker文档是比较详细的 安装相关依赖 yum -y install gcc gcc-c yum install -y yum-utils 设置docker镜像仓库 yum-config-manager --add-repo https://download.docker.com/linux/centos/do…

云尚办公-0.0.1

1. 核心技术 基础框架&#xff1a;SpringBoot数据缓存&#xff1a;Redis数据库&#xff1a;MySQL权限控制&#xff1a;SpringSecurity工作流引擎&#xff1a;Activiti前端技术&#xff1a;vue-admin-template Node.js Npm Vue ElementUI Axios微信公众号&#xff1a;公众…

【FreeRTOS】任务创建

参考博客&#xff1a; ESP-IDF FreeRTOS 任务创建分析 - [Genius] - 博客园 (cnblogs.com) 1.什么是任务 1&#xff09;独立的无法返回的函数称为任务 2&#xff09;任务是无线循环 3&#xff09;无返回数据 2.任务的实现过程 1.定义任务栈 裸机程序&#xff1a;统一分配到一…

centos7部署单机项目和自启动

centos7部署单机项目和服务器自启动 1.安装jdk和tomact1.1上传jdk、tomcat安装包1.2解压两个工具包1.3.配置并且测试jdk安装1.4.启动tomcat1.5.防火墙设置1.6配置tomcat自启动 2.安装mysql2.1卸载mariadb&#xff0c;否则安装MySql会出现冲突(先查看后删除再查看)2.2在线下载My…

2023年12月CCF-GESP编程能力等级认证C++编程七级真题解析

一、单选题(共15题,共30分) 第1题 定义变量 double x ,如果下面代码输入为 100 ,输出最接近( )。 A:0 B:-5 C:-8 D:8 答案:B 第2题 对于下面动态规划方法实现的函数,以下选项中最适合表达其状态转移函数的为( )。 A: B: C: D:

[LWC] Components Communication

目录 Overview ​Summary Sample Code 1. Parent -> Child - Public Setter / Property / Function a. Public Property b. Public getters and setters c. Public Methods 2. Child -> Parent - Custom Event 3. Unrelated Components - LMS (Lightning Message…

Vue packages version mismatch 报错解决

问题 npm run dev 运行项目的过程中&#xff0c;报错 Vue packages version mismatch 解决方法 根据报错不难看出是 vue 与 vue-template-compiler 版本产生了冲突&#xff0c;vue 与 vue-template-compiler 的版本是需要匹配的。所以解决的办法就是先修改其中一个的版本将 v…

[C++]宏定义

C/C宏的基本使用方法 宏是C/C所支持的一种语言特性&#xff0c;我对它最初的印象就是它可以替换代码中的符号&#xff0c;最常见的例子便是定义一个圆周率PI&#xff0c;之后在代码中使用 PI 来代替具体圆周率的值。 确实如此&#xff0c;宏提供了一种机制&#xff0c;能够使…

动力学约束下的运动规划算法——两点边界值最优控制问题 OBVP

OBVP 即 optimal bundary value problem&#xff0c;即最优的BVP&#xff0c; BVP 问题其实就是解决 state sampled lattice planning 的基本操作方法。 如果&#xff0c;我们期望无人机从一个状态移动到另一个状态&#xff0c;即给定初始状态和终点状态&#xff0c;求解两个状…

每日五道java面试题之spring篇(五)

目录&#xff1a; 第一题. 使用 Spring 有哪些方式&#xff1f;第二题. 什么是Spring IOC 容器&#xff1f;第三题. 控制反转(IoC)有什么作用?第四题. IOC的优点是什么&#xff1f;第五题. BeanFactory 和 ApplicationContext有什么区别&#xff1f; 第一题. 使用 Spring 有哪…

【Web】CTFSHOW 常用姿势刷题记录(全)

目录 web801 web802 web803 web804 web805 web806 web807 法一&#xff1a;反弹shell 法二&#xff1a;vps外带 web808 web809 web810 web811 web812 web813 web814 web815 web816 web817 web818 web819 web820 web821 web822 web823 web824 web825…