x86_64架构的VINS-fusion-GPU部署

2023-05-16

x86_64架构的VINS-fusion-GPU部署

1. 环境配置(Ubuntu 18.04

(0)CUDA 10.2 安装

由于笔记本的GPU太老(GeForce 840M),只能使用较低版本的 CUDA,但是也能有个好处就是能够同时兼顾 ARM 架构的 GPU 部署。

1.0.0 卸载原来的版本CUDA-11.4和相应的显卡驱动

卸载 cuda-toolkit 工具包

sudo apt remove cuda
sudo apt autoremove 
sudo apt remove --purge "cuda*" "*cublas*"

进入到安装目录下,删除剩余的安装包文件。

 cd /usr/local/
sudo rm -r cuda-11.4

查看剩余的残留文件

sudo dpkg -l |grep cuda
rc  cuda-cudart-10-2                                  10.2.89-1                                       amd64        CUDA Runtime native Libraries
rc  cuda-cudart-dev-10-2                              10.2.89-1                                       amd64        CUDA Runtime native dev links, headers
rc  cuda-cufft-10-2                                   10.2.89-1                                       amd64        CUFFT native runtime libraries
rc  cuda-cupti-10-2                                   10.2.89-1                                       amd64        CUDA profiling tools runtime libs.
rc  cuda-curand-10-2                                  10.2.89-1                                       amd64        CURAND native runtime libraries
rc  cuda-cusolver-10-2                                10.2.89-1                                       amd64        CUDA solver native runtime libraries
rc  cuda-cusparse-10-2                                10.2.89-1                                       amd64        CUSPARSE native runtime libraries
rc  cuda-npp-10-2                                     10.2.89-1                                       amd64        NPP native runtime libraries
rc  cuda-nvcc-10-2                                    10.2.89-1                                       amd64        CUDA nvcc
rc  cuda-nvgraph-10-2                                 10.2.89-1                                       amd64        NVGRAPH native runtime libraries
rc  cuda-nvjpeg-10-2                                  10.2.89-1                                       amd64        NVJPEG native runtime libraries
rc  cuda-nvprof-10-2                                  10.2.89-1                                       amd64        CUDA Profiler tools
rc  cuda-nvrtc-10-2                                   10.2.89-1                                       amd64        NVRTC native runtime libraries
rc  cuda-nvtx-10-2                                    10.2.89-1                                       amd64        NVIDIA Tools Extension
ii  cuda-repo-ubuntu1804-10-2-local                   10.2.2-1                                        amd64        cuda repository configuration files
ii  cuda-repo-ubuntu1804-10-2-local-10.2.89-440.33.01 1.0-1                                           amd64        cuda repository configuration files
rc  cuda-sanitizer-api-10-2                           10.2.89-1                                       amd64        CUDA Sanitizer API
rc  cuda-toolkit-10-2                                 10.2.89-1                                       amd64        CUDA Toolkit 10.2 meta-package
rc  cuda-visual-tools-10-2                            10.2.89-1                                       amd64        CUDA visual tools

卸载对应的残留,即可完成cuda版本的纯净卸载。

sudo dpkg -P 残留文件名 # 例如:
sudo dpkg -P cuda-visual-tools-11-4 

卸载显卡驱动

sudo apt-get --purge remove "*nvidia*"

1.0.1 安装合适的新驱动

windows 系统中有GeFroce 840M 的驱动和 Cuda-Toolkit-10.2 工具包:

# 型号GeFroce 840M 的 GPU 驱动
460.89-notebook-win8-win7-64bit-international-whql.exe
474.11-notebook-win8-win7-64bit-international-whql.exe
GeForce_Experience_v3.26.0.160_requires_win10.exe
# Cuda-Toolkit-10.2 工具包及其补丁
cuda_10.2.89_441.22_windows.exe
cuda_10.2.1_win10.exe
cuda_10.2.2_win10.exe

以及和 pytorchpython 等对应的 CUDAcudnn-tools 等安装包。为了在 pytorch中使用 GPU 的安装包。

torchvision-0.9.1-py38_cu102.tar.bz2	# 0.9.1, 0.8.1 二种任选一
torchvision-0.8.1-py38_cu102.tar.bz2	# 0.9.1, 0.8.1 二种任选一
pytorch-1.8.0-py3.8_cuda10.2_cudnn7_0.tar.bz2	# py3.6, py3.8, py3.9 三种任选一
pytorch-1.8.0-py3.9_cuda10.2_cudnn7_0.tar.bz2	# py3.6, py3.8, py3.9 三种任选一
pytorch-1.8.0-py3.6_cuda10.2_cudnn7_0.tar.bz2	# py3.6, py3.8, py3.9 三种任选一

首先,安装 cuda-toolkit-10-2 工具包:
CUDA-Toolkit-10.2 的下载位置为:https://developer.nvidia.com/cuda-toolkit-archive
或者https://developer.nvidia.com/cuda-10.2-download-archive
对应的安装指令为:
Base Installer Installation Instructions:

cd  ~/CUDA-Toolkit-10.2
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
下载 deb 包
wget https://developer.download.nvidia.com/compute/cuda/10.2/Prod/local_installers/cuda-repo-ubuntu1804-10-2-local-10.2.89-440.33.01_1.0-1_amd64.deb
wget https://developer.download.nvidia.com/compute/cuda/10.2/Prod/patches/2/cuda-repo-ubuntu1804-10-2-local_10.2.1-1_amd64.deb
wget https://developer.download.nvidia.com/compute/cuda/10.2/Prod/patches/2/cuda-repo-ubuntu1804-10-2-local_10.2.2-1_amd64.deb
# 安装 deb 包
sudo dpkg -i cuda-repo-ubuntu1804-10-2-local-10.2.89-440.33.01_1.0-1_amd64.deb
# 增加 密钥然后 安装 CUDA(连带的把 cudnn 和 nvidia驱动也一并安装了)
sudo apt-key add /var/cuda-repo-10-2-local-10.2.89-440.33.01/7fa2af80.pub
sudo apt update
sudo apt -y install cuda
# 重启系统
sudo reboot
sudo dpkg -i cuda-repo-ubuntu1804-10-2-local_10.2.1-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1804-10-2-local_10.2.2-1_amd64.deb
# 重启系统
sudo reboot

以及两个补丁包:
Patch 1 (Released Aug 26, 2020) 和 Patch 2 (Released Nov 17, 2020)。

或者使用以下命令(没有测试过,不保证成功率)。

sudo apt-get update
sudo apt-get install cuda-toolkit-10-2

安装好之后,在 .bashrc中配置环境变量。source ~/.bashrc之后,nvcc -- version 即可查看cuda版本。

export PATH=/usr/local/cuda-10.2/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-10.2/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export CUDA_ROOT=/usr/local/cuda

运行nvidia-smi 即可查看GPU的驱动版本、CUDA的版本以及 GPU 的使用情况。

Mon Jan  2 19:41:44 2023       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.33.01    Driver Version: 440.33.01    CUDA Version: 10.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce 840M        On   | 00000000:03:00.0 Off |                  N/A |
| N/A   39C    P8    N/A /  N/A |    189MiB /  2004MiB |      7%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0       913      G   /usr/lib/xorg/Xorg                            15MiB |
|    0       983      G   /usr/bin/gnome-shell                          46MiB |
|    0      1293      G   /usr/lib/xorg/Xorg                            55MiB |
|    0      1448      G   /usr/bin/gnome-shell                          67MiB |
+-----------------------------------------------------------------------------+
显然,系统桌面占用了 `Nvidia` 独立显卡的显存。一般来讲,这是我们不希望看到的,因此需要解决它。问题解决办法参见《[Ubuntu桌面占用独显显存问题](https://zhuanlan.zhihu.com/p/410580436)

解决思路
该问题点主要是由于系统默认使用独立显卡,可以通过修改xorg的显卡使用来让xorg切换到集成显卡。
解决办法
1、编辑文件/etc/X11/xorg.conf,如果没有则手动添加之。

sudo vim /etc/X11/xorg.conf

2、可以通过 lspci | grep VGA 查看集显信息

lspci | grep VGA

得到如下输出:

00:02.0 VGA compatible controller: Intel Corporation HD Graphics 5500 (rev 09)

其中00:02.0就是BusId,将其改写成PCI:0:2:0
在文件/etc/X11/xorg.conf中插入以下内容,其中BusId为自己的集成显卡的BusId

Section "Device"
    Identifier      "intel"
    Driver          "intel"
    BusId           "PCI:0:2:0"
EndSection

Section "Screen"
    Identifier      "intel"
    Device          "intel"
EndSection

保存后重启系统,再用 nvidia-smi 查看输出。

Tue Jan  3 16:33:26 2023       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.33.01    Driver Version: 440.33.01    CUDA Version: 10.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce 840M        On   | 00000000:03:00.0 Off |                  N/A |
| N/A   37C    P8    N/A /  N/A |      0MiB /  2004MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

完美解决显存占用问题。

注意:
如果是双显卡,则还可以设法配置日常系统不使用Nvidia的显卡,例如本例程的GeForce 840M
方法一:使用 nvidia-settings 来切换。
方法二:使用 prime-select 命令来切换。

sudo prime-select nvidia # 切换回独显 Nidia GeForce 840M
sudo reboot

或者切换到 intel 显卡(可能会导致 nvidia-smi 以及 nvidia-setting 无法启动)

sudo prime-select intel # 切换回集显 Intel HD Graphics 550 (BDW GT2)
sudo reboot

(1)Eigen 安装与配置

设置编译目录为 eigen-build,默认安装路径 /usr/local。如果要修改,可以安装并使用cmake-gui来设置。

#  Remove pre-built Eigen

sudo apt-get remove libeigen3-dev 
cd ~/Downloads/
wget -O eigen-3.3.7.zip https://gitlab.com/libeigen/eigen/-/archive/3.3.7/eigen-3.3.7.zip #check version
unzip eigen-3.3.7.zip
mkdir eigen-build && cd eigen-build
cmake ../eigen-3.3.7/ && sudo make install
pkg-config --modversion eigen3 # Check Eigen Version

(2)Ceres solver 安装与配置

安装相关依赖

sudo apt install -y libgoogle-glog-dev libatlas-base-dev libsuitesparse-dev

设置编译目录为 ceres-bin,设置安装路径 /Downloads/ceres-solver。如果要修改,可以安装并使用cmake-gui来设置。

cd ~/Downloads/
wget http://ceres-solver.org/ceres-solver-1.14.0.tar.gz
tar zxf ceres-solver-1.14.0.tar.gz
mkdir ceres-bin
mkdir ceres-solver && cd ceres-bin
cmake ../ceres-solver-1.14.0 -DEXPORT_BUILD_DIR=ON -DCMAKE_INSTALL_PREFIX="../ceres-solver" 
 
#good for build without being root privileged and at wanted directory
  
make -j3 # 6 : number of cores
make install
# 可如下进行测试:
bin/simple_bundle_adjuster ../ceres-solver-1.14.0/data/problem-16-22106-pre.txt # to check version

显示的输出结果为:
在这里插入图片描述

(3) OpenCV 安装与配置

关于 OpenCV 的安装需要特别谨慎,不建议频繁删除以前的库,因为多个项目使用的版本可能不同,所以可以将常用的版本安装在 /usr/local下,将其余版本安装在自己Download 或者 home 下,并设置 CUDA_ARCH_BIN=5.0——与机器上的显卡型号有关,可以去Nvidia官网查看确认。

如果需要删除原来的版本并重修安装相应的依赖:

# remove prebuilt opencv
sudo apt purge libopencv* python-opencv 
sudo apt update
sudo apt install -y build-essential pkg-config
 
## libeigen3-dev # recommend to build from source
 
sudo apt install -y cmake libavcodec-dev libavformat-dev libavutil-dev \
    libglew-dev libgtk2.0-dev libgtk-3-dev libjpeg-dev libpng-dev libpostproc-dev \
    libswscale-dev libtbb-dev libtiff5-dev libv4l-dev libxvidcore-dev \
    libx264-dev qt5-default zlib1g-dev libgl1 libglvnd-dev pkg-config \
    libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev mesa-utils     
 
sudo apt-get install python2.7-dev python3-dev python-numpy python3-numpy

如果是 arm 架构的系统则需要对 /usr/lib/aarch64-linux-gnu//usr/local/cuda/include/cuda_gl_interop.h 作一点修改。

# To fix OpenGL related compilation problems 
 
cd /usr/lib/aarch64-linux-gnu/
sudo ln -sf libGL.so.1.0.0 libGL.so
sudo vim /usr/local/cuda/include/cuda_gl_interop.h
 
# Comment (line #62~68) of cuda_gl_interop.h 
 
//#if defined(__arm__) || defined(__aarch64__)
//#ifndef GL_VERSION
//#error Please include the appropriate gl headers before including cuda_gl_interop.h
//#endif
//#else
 #include <GL/gl.h>
//#endif

安装新的版本(因为 VINS-FUSION-GPU 版本需要支持CUDAOpenCV,所以选择3.4.1 版本)安装opencv-3.4.1的教程可以参见《opencv-3.4.1-x86编译安装 – 超详细》。
设置编译目录为 .\build,设置安装路径 /usr/local。如果要修改,可以安装并使用cmake-gui来设置。根据 GPU 的型号来设置 CUDA_ARCH_BIN,我的显卡是GeForce 840M,由官网链接查到为 5.0

# Then once linking is done, go to Downloads to begin opencv installation
cd ~/Downloads/
wget -O opencv.zip https://github.com/opencv/opencv/archive/3.4.1.zip # check version
unzip opencv.zip
cd opencv-3.4.1/ && mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
        -D CMAKE_INSTALL_PREFIX=/usr/local \
        -D WITH_CUDA=ON \
        -D CUDA_ARCH_BIN=5.0 \
        -D CUDA_ARCH_PTX="" \
        -D ENABLE_FAST_MATH=ON \
        -D CUDA_FAST_MATH=ON \
        -D WITH_CUBLAS=ON \
        -D WITH_LIBV4L=ON \
        -D WITH_GSTREAMER=ON \
        -D WITH_GSTREAMER_0_10=OFF \
        -D WITH_QT=ON \
        -D WITH_OPENGL=ON \
        -D CUDA_NVCC_FLAGS="--expt-relaxed-constexpr" \
        -D WITH_TBB=ON \
         ../
make  # 建议使用单核编译,以免出现意外错误 running in single core is good to resolve the compilation issues         
sudo make install
cd ../../ && sudo rm -rf opencv-3.4.1 # optional (can save 10GB Disk Space)
pkg-config --modversion opencv # Check opencv Version

在这里插入图片描述
OpenCVJeston NX上的安装比较慢,差不多需要1个小时。OpenCV 安装好以后,需要进一步编译 cv_bridge ( cv_bridge 是在ROS 图像消息和 OpenCV 图像之间进行转换的一个功能包)。

(4)cv_bridge的编译 (ARM架构适用)

cv_bridge 的安装需要下载对应的版本,由于 Jeston NX 是基于 Ubuntu 18.04ARM 系统,因此下载 melodic 版本的 cv_bridge。首先,通过以下连接进入下载页面:

https://github.com/ros-perception/vision_opencv

在这里插入图片描述
选择下载 melodic 版本到 catkin_ws/src 目录下,并安装:

gedit vision_opencv/cv_bridge/CMakeLists.txt
# Edit OpenCV PATHS in CMakeLists and include cmake file
# /usr/local/share/OpenCV 选择自己安装的OpenCV对应路径
find_package(OpenCV 3 REQUIRED PATHS /usr/local/share/OpenCV NO_DEFAULT_PATH 
  COMPONENTS
    opencv_core
    opencv_imgproc
    opencv_imgcodecs
  CONFIG
)
include(/usr/local/share/OpenCV/OpenCVConfig.cmake)  #under catkin_python_setup()
# Save and close CMakeLists
#  Build the package
cd .. && catkin_make

(5) ROS 安装与配置

参考ros.org 网站自行安装。此处与教程(vins-fusion-gpu-tx2-nano)略有差异,我直接使用了ros内置的cv_bridge。因为涉及到源码安装opencvcv_bridgeConfig.cmakeinclude的地址要做修改,否则后续编译报错,可以参考这一篇文章。

3. VINS-Fusion-GPU 安装及编译

具体参数可看源文档 https://github.com/pjrambo/VINS-Fusion-gpu。
具体操作如下:

(1)下载和更改 cmake 文件

cd ~/catkin_ws/src && git clone https://github.com/pjrambo/VINS-Fusion-gpu #GPU
 
sudo apt-get install ros-melodic-tf
sudo apt-get install ros-melodic-image-transport
sudo apt-get install ros-melodic-rviz

下载完之后,需要更改vins_estimator/CMakeLists.txt第20行,把OpenCV路径改成自己的安装路径

# 
# Edit CMakeLists.txt for loop_fusion and vins_estimator
cd ~/catkin_ws/src/VINS-Fusion-gpu/loop_fusion && gedit CMakeLists.txt

需要更改的还有 loop_fusion/CMakeLists.txt,同样也需要更改路径

##For loop_fusion : line 19
#find_package(OpenCV)
include(/usr/local/share/OpenCV/OpenCVConfig.cmake)
 
cd ~/catkin_ws/src/VINS-Fusion-gpu/vins_estimator && gedit CMakeLists.txt
 
##For vins_estimator : line 20
#find_package(OpenCV REQUIRED)
include(/usr/local/share/OpenCV/OpenCVConfig.cmake)

更改完之后,开始编译。

cd ~/catkin_ws/
source devel/setup.bash
catkin_make

如果OpenCVCUDA环境安装不对,这里就会报错。

(2) 更改配置参数

config 配置文件中,有两个 gpu 加速 参数。

use_gpu: 0 # 0 for off, 1 for on
use_gpu_acc_flow: 0 # 0 for off, 1 for on

GPU 资源受限或者程序需要使用 GPU 进行其他计算时,可以设置为:

use_gpu: 1
use_gpu_acc_flow: 0 

否者,可以设置为:

use_gpu: 1
use_gpu_acc_flow: 1 

Jeston TX2 中后者可能会占用 20%GPU 使用率。
IMU的数据需要由事先的测试试验标定得到。
需要注意在线估计IMU与相机之间的时间差,虽然说Intel D435i已经做好硬件同步,但是用Kalibr标定出来还是会有1.5ms左右的时间误差。
在这里插入图片描述

(3) 启动VINS

前期的参数配置工作完成后,我们就可以启动 VINS

3-1 启动D435i

修改D435i的发布频率,建议为15Hz,这样NX上不会有较大的延迟。路径还是你自己安装 realsense_ros 的路径。
在这里插入图片描述
启动 D435i方式:realsense2_camera rs_camera.launch
需要查看下 D435i 是否发布 IMU 数据,主要是X、Y、Z三个轴的线速度。
rostopic echo /camera/imu

3-1 启动VINS

启动方式:rosrun vins vins_node + D435i配置文件的路径
例如:

rosrun vins vins_node ~/vins_gpu/src/VINS-Fusion-gpu-master/config/realsense/realsense1.yaml 

可以显示出当前位姿信息。
在这里插入图片描述
然后启动RVIZ

roslaunch vins vins_rviz.launch 

启动完之后,可以拿着飞机走两圈,看看定位精度以及延时情况。如果没有问题就可以接入Prometheus中了。

4. 数据测试

4.1 公开数据集测试

EuRoCStereo cameras + IMU)为例,

 roslaunch vins vins_rviz.launch
rosrun vins vins_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_imu_config.yaml 
(optional) rosrun loop_fusion loop_fusion_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_imu_config.yaml 
rosbag play YOUR_DATASET_FOLDER/MH_01_easy.bag

数据可以通过这个链接在百度网盘下载到。

4.2 测试设备(D435i+P450

在配置参数文件中加入以下参数,使得GPU起作用。

imu_topic: "/mavris/imu/data_raw"
image0_topic: "/camera/infra1/image_rect_raw"
image1_topic: "/camera/infra2/image_rect_raw"

IMU相机外参标定可以通过VINS实时在线标定或者使用Kalibr工具包进行标定。

5. 接入Prometheus

5.1 修改px4_pos_estimator.cpp

Prometheus/Modules/control/src文件夹中修改文件px4_pos_estimator.cpp
主要修改内容如下:回调函数中,主要是VINS发布数据格式为YXZ,而Prometheus需要ENU,所以这里做一个变换。VINS的四元数虚部在前,这里也需要调整下。
在这里插入图片描述

5.2 修改p450_vio的启动文件

Amov_lab/src/P450_expriments/launch_basic 中找到 p450_vio的启动文件 p450_vio_onboard.launch。修改位姿数据来源,因为我们不再依赖T265

5.3 修改订阅话题

最后,需要修改主函数里面的订阅话题
在这里插入图片描述

6. 启动VINSPrometheus配置文件

roslaunch realsense2_camera rs_camera.launch
rosrun vins vins_node + D435i配置文件路径 # 具体应该是在VINS 包下面
roslaunch p230_expriments p230_vio_onboard.launch

查看下 rqt_graph,可以看到 VINS 发布的位姿已经被px4_pos_estimator 订阅,类似于T265发布的 odom/sample,通信链路正常。
在这里插入图片描述
我们还可以看到终端可以正确打印位姿数据,即代表VINS接入Prometheus成功。
在这里插入图片描述
在这里插入图片描述
至此,我们已经成功把 VINS 接入到 Prometheus 中。

文献参考

1、无人机自主导航(ARM架构的vins-fusion-GPU部署)
2、安装环境OpenCV
3、调内外参数
4、带你具体部署VINS_FUSION_GPU版本
5、NVIDIA Jetson Xavier NX部署VINS-fusion-GPU版本
6、VINS-Fusion-GPU-TX2-nano的github技术说明

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

x86_64架构的VINS-fusion-GPU部署 的相关文章

  • 为什么x86分页没有特权环的概念?

    早在 1982 年 当 Intel 发布 80286 时 他们在分段方案中添加了 4 个特权级别 环 0 3 由全局描述符表 GDT 和局部描述符表 LDT 中的 2 位指定 在 80386 处理器中 Intel 添加了分页功能 但令人惊讶
  • Intel 64 和 IA-32 上的 MESI 有何意义

    MESI 的要点是保留共享内存系统的概念 然而 对于存储缓冲区 事情就变得复杂了 一旦数据到达 MESI 实现的缓存 下游内存就会保持一致 然而 在此之前 每个核心可能对内存位置 X 中的内容存在分歧 具体取决于每个核心的本地存储缓冲区中的
  • 如何知道寄存器是否是“通用寄存器”?

    我试图了解寄存器必须具备什么标准才能被称为 通用寄存器 我相信通用寄存器是一个可以用于任何用途的寄存器 用于计算 将数据移入 移出等 并且是一个没有特殊用途的寄存器 现在我读到了ESP寄存器是通用寄存器 我猜是ESP寄存器可以用于任何事情
  • 如何读取 GPU 负载?

    我正在编写一个程序 用于监控计算机的各种资源 例如CPU使用率等 我还想监控 GPU 使用情况 GPU 负载 而不是温度 using System using System Collections Generic using System
  • AVX-512 指令编码 - {er} 含义

    在 Intel x86 指令集参考中 有许多 AVX 512 指令在指令中具有可选的 er 例如 VADDPD 的一种形式定义为 EVEX NDS 512 66 0F W1 58 r VADDPD zmm1 k1 z zmm2 zmm3 m
  • X86 预取优化:“计算 goto”线程代码

    我有一个相当重要的问题 我的计算图有循环和多个 计算路径 我没有制作一个调度程序循环 其中每个顶点将被一一调用 而是将所有预先分配的 框架对象 放置在堆中 代码 数据 这有点类似于线程代码 甚至更好 CPS 只是在堆中跳转 执行代码 每个代
  • GPU的编程语言有哪些

    我读过一篇文章 指出 GPU 是超级计算的未来 我想知道在GPU上编程使用什么编程语言 OpenCL 是开放式跨平台解决方案 可在 GPU 和 CPU 上运行 另一个是 NVIDIA 为其 GPU 构建的 CUDA HLSL Cg 等少数几
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • 避免 gcc 函数序言开销?

    我最近遇到了很多 gcc 在 x86 上生成非常糟糕的代码的函数 它们都符合以下模式 if some condition do something really simple and return else something comple
  • 为什么X86中没有NAND、NOR和XNOR指令?

    它们是您可以在计算机上执行的最简单的 指令 之一 它们是我亲自实施的第一个指令 执行 NOT AND x y 会使执行时间和依赖链长度和代码大小加倍 BMI1 引入了 andnot 这是一个有意义的补充 是一个独特的操作 为什么不是这个问题
  • 错误:分配具有形状的张量时出现 OOM

    在使用 Apache JMeter 进行性能测试期间 我面临着初始模型的问题 错误 分配形状为 800 1280 3 和类型的张量时出现 OOM 通过分配器浮动在 job localhost replica 0 task 0 device
  • 具有 Cuda Thrust 的多个 GPU?

    如何将 Thrust 与多个 GPU 一起使用 这只是使用 cudaSetDevice deviceId 的问题吗 然后运行相关的 Thrust 代码 使用 CUDA 4 0 或更高版本 cudaSetDevice deviceId 接下来
  • 在 Intel x86 架构上使用非 AVX 指令移动 xmm 整数寄存器值

    我有以下问题 需要使用 AVX2 以外的任何工具来解决 我有 3 个值存储在 m128i 变量中 不需要第四个值 需要将这些值移动 4 3 5 我需要两个功能 一个用于按这些值进行右逻辑移位 另一个用于左逻辑移位 有谁知道使用 SSE AV
  • Polygot 包含 nasm/yasm 和 C 的文件

    我有一堆幻数 我想将它们包含在由 nasm 或 yasm 编译的 C 程序和汇编文件中 在纯 C 语言中 该文件看起来像是一系列定义 例如 define BLESS 55378008 define ANSWER 42 在 nasm 或 ya
  • long double(GCC 特定)和 __float128

    我正在寻找有关的详细信息long double and float128在 GCC x86 中 更多是出于好奇而不是因为实际问题 可能很少有人需要这些 我只是有史以来第一次 truly需要一个double 但我想知道你的工具箱里有什么以及它
  • 从 DX:AX 寄存器转移到单个 32 位寄存器

    我在添加 16 位乘法的乘积时遇到问题 我想将一年 例如 2015 年 乘以 365 为此 我 mov dx 0 to clear the register mov ax cx cx holds the year such as 2015
  • 在没有 SurfaceView 的 Android 上获取 GPU 信息

    在Android上 有没有一种方法可以在不创建SurfaceView的情况下获取GPU信息 我不想使用 OpenGL 绘制任何内容 但我只需要获取硬件信息 例如供应商 OpenGL ES 版本 可用扩展等 抱歉 我不知道如何在 Androi
  • 比“add esp, 4”更小的指令

    又是我 我的程序中有很多 add esp 4 我正在尝试减小它的大小 是否有任何更小的指令可以替代 add esp 4 pop edx 或者您不介意破坏的任何其他整数寄存器 这就是现代编译器实际上所做的 https stackoverflo
  • 将 XMM 寄存器压入堆栈

    有没有办法将打包双字整数从 XMM 寄存器推送到堆栈 然后在需要时将其弹出 理想情况下 我正在寻找通用寄存器的 PUSH 或 POP 之类的东西 我已经检查了英特尔手册 但我要么错过了命令 要么没有 或者我是否必须将值解压到通用寄存器然后推
  • 测试 xmm/ymm 寄存器是否为零的更快方法?

    It s fortunate that PTEST does not affect the carry flag but only sets the rather awkward ZF also affects both CF and ZF

随机推荐

  • 《项目经验》--简单三层使用DataTable向数据库表批量导入数据---向SqlServer多张张表中导入数据

    前面已经介绍过如何向数据库的一张表中批量导入数据 xff0c 详情见博客 项目经验 简单三层使用DataTable向数据库表批量导入数据 向SqlServer一张表中导入数据 xff1b 本文主要介绍如何向SqlServer的多张表中批量导
  • 《项目经验》--后台一般处理程序向前台JS文件传递JSON,JS解析JSON,将数据显示在界面--显示在DropDownList 或 显示在动态创建的table中

    先看一下我要实现的功能界面 xff1a 这篇文章主要介绍 xff1a 后台一般处理程序把从数据库查找的数据 xff0c 转换成JSON xff0c 然后传递到前台JS文件中 xff0c JS解析JSON数据 xff0c 并将数据显示在界面
  • 英语快照1---英语正能量

    突发奇想 xff0c 想记录一下近来自己的英语感觉 xff0c 最近特别想学英语 xff0c 感觉学英语是一种享受 xff0c 说不出来的感觉 这两天发生了一些事 xff0c 描述一下 xff0c 也算是对现在英语感觉的一种快照吧 xff0
  • 由自身经历谈“不谋全局者,不足以谋一域”

    古人云 xff1a 不谋全局者 xff0c 不足以谋一域 xff1b 不谋万世者 xff0c 不足以谋一时 就是说领导者要胸有全局 xff0c 抓好大事 xff0c 善于解决全局性 战略性 方向性问题 xff0c 决不能眉毛胡子一把抓 xf
  • 软考之下午题做题技巧

    距离5月25日的软考还有2天时间 xff0c 考试前的状态尤为重要 上午题虽然很零散 xff0c 但是很简单 xff0c 下午题虽然就5道 xff0c 但是做题时需要认真 认真再认真 xff0c 答案题中找 xff0c 好好读题 xff0c
  • 看过J2EE视频,你是否也有雨过地皮湿的感觉

    软考过后开始了J2EE的学习 xff0c 初认识J2EE视频感觉不是很好 xff0c 有种雨过地皮湿的感觉 xff0c 还需要通过后续的学习来加强巩固 至今已接触的JAVA方向的J2SE 和J2EE xff0c 下面简单对JAVA方面的技术
  • 视频分析算法的原理简介

    视频分析算法的原理简介 视频分析技术来源于计算机视觉 xff0c 它能够在图象及图象描述之间建立映射关系 xff0c 从而使计算机能够通过图象处理和分析来理解画面中的内容 xff0c 其实质是 自动分析和抽取视频源中的关键信息 智能视频监控
  • x86实模式保护模式

    windows intel 8086 版权所有 xff1a x86 汇编语言 从实模式到保护模式 李忠 王晓波 余洁 加载器 用户程序 两者需要遵从一致的协议 用户程序内部的某个固定位置 xff0c 包含有对该程序的描述信息 加载器在该固定
  • ORB-SLAM2 | Prometheus_px4 | OpenCV 3.4.9

    Reference to ORB SLAM2 GTK 43 2 x symbols detected Using GTK 43 2 x and 3 in the same process is not supported https zhu
  • 看了我的 RPC 实战,同事拍案叫绝

    1 RPC 1 1 什么是 RPC xff1f RPC xff08 Remote Procedure Call Protocol xff09 远程过程调用协议 xff0c 目标就是让远程服务调用更加简单 透明 RPC 框架负责屏蔽底层的传输
  • 无人机姿态表示方法及相互转换(欧拉角、方向余弦矩阵、四元数)

    常用的姿态表示方法有欧拉角 方向余弦矩阵 四元数这几种 欧拉角表示方法采用来表示飞行器的姿态 xff0c 其中为滚转角 xff0c 为俯仰角和为航向角 xff0c 表示飞行器首先航向偏转角度 xff0c 再俯仰角度 xff0c 然后机体滚转
  • 无人飞行器数学模型

    这里是运动学和动力学模型 xff0c 也适用于任何其它类型的飞行器 xff0c 乃至无人车等各种载体 飞行器的状态包括位置 xff0c 速度 xff0c 姿态角度 xff0c 角速度 xff0c 姿态也可以用坐标转换矩阵来表示 xff0c
  • 无人飞行器的控制

    飞行器的控制通过几个环来实现 xff0c 外环控制为位置的控制 xff0c 内环控制为姿态的控制 xff0c 通过姿态的控制来实现飞行器的动态控制 xff0c 从而控制飞行器的速度和位置 xff0c 大致框架如下 位置控制根据目标位置得出飞
  • ROS目录结构

    参考 xff1a https zhuanlan zhihu com p 139405796 ROS项目通常组织在一个catkin的workspace下面 xff0c 里面包含典型的文件和目录 xff0c 如下 如上图所示 xff0c 首先是
  • 二、编译PX4飞控的Bootloader

    二 编译PX4飞控的Bootloader 环境 xff1a Ubuntu 14 04 LTS 声明 xff1a 本人用的是window安装VMware虚拟机 xff0c 然后安装ubuntu 步骤 xff1a 1 先安装GCC环境变量 这里
  • Jetson nano 使用笔记(二):系统备份与恢复

    本文参考了网友 企鹅的外层世界 的文章https blog csdn net lianbus article details 104733412 xff0c 在其基础上添加了部分说明 配置好系统和TensorFlow等运行环境后 xff0c
  • 嵌入式软件工程师(6-15k)笔试面试经验分享(应届毕业生)

    先看一下工资情况 xff1a 一 笔试部分 xff08 一 xff09 技术测试题 xff08 拍了部分内容 xff09 xff08 二 xff09 人格测试题 二 面试部分 xff08 一 xff09 技术面试题 面试百问 xff1a 问
  • 2021-02-13

    昨天学习了关于位运算的一些常识 xff0c 自己也跟着视频敲了一些位运算代码如下 xff1a package com raisecom tiap ems basic mgt domain acl import java util Array
  • 字符串匹配中KMP算法的next数组构造与思考

    对于KMP算法的next算法 xff0c 匹配规则i不动 xff0c j而是根据 next j 61 k 如果在j位置失配 xff0c 则退到k位置 构造next数组的 是根据前缀与后缀的最长匹配 如ababaa 的next数组是 1001
  • x86_64架构的VINS-fusion-GPU部署

    x86 64架构的VINS fusion GPU部署 1 环境配置 xff08 Ubuntu 18 04 xff09 xff08 0 xff09 CUDA 10 2 安装 由于笔记本的GPU太老 xff08 GeForce 840M xff