为 GPU 编译 Darknet 时出现分段错误

Segmentation fault when compiling Darknet for GPU

我想在支持 GPU 的 PC 上编译用于机器学习的 Darknet 框架。但是我调用 make 我会得到一个分段错误:

nvcc  -gencode arch=compute_30,code=sm_30 -gencode arch=compute_35,code=sm_35 -gencode arch=compute_50,code=[sm_50,compute_50] -gencode arch=compute_52,code=[sm_52,compute_52] -Iinclude/ -Isrc/ -DOPENCV `pkg-config --cflags opencv`  -DGPU -I/usr/local/cuda/include/ --compiler-options "-Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -DOPENCV -DGPU" -c ./src/convolutional_kernels.cu -o obj/convolutional_kernels.o
Segmentation fault (core dumped)
Makefile:92: recipe for target 'obj/convolutional_kernels.o' failed
make: *** [obj/convolutional_kernels.o] Error 139

nvidia-smi 给我以下信息:

NVIDIA-SMI 418.87.01    Driver Version: 418.87.01    CUDA Version: 10.1

当我执行 nvcc --version 时,我得到:

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Nov__3_21:07:56_CDT_2017
Cuda compilation tools, release 9.1, V9.1.85

CUDA Version 10.1 与 Cuda 编译工具的 Verions 9.1 不同。这可能是问题所在吗? NVCC 通过 apt install nvidia-cuda-toolkit

安装

我解决了这个问题。安装 cuda 后,nvcc 的实际二进制文件位于 /usr/local/cuda/bin/nvcc。在 /usr/bin/ 中为这个二进制文件创建一个符号 link 解决了这个问题。

这里只是 post 我的解决方案,因为我找到了真正的原因。所以发生这种情况的原因是因为它 运行 与实际的暗网想要 运行 不同的二进制文件。至少对我来说,which nvcc给了我/usr/bin/nvcc。您想要的实际 nvcc 位于 /usr/local/cuda-11.1/bin 中(版本号可能明显不同)。所以你需要做的就是 prepend(重要!)那个目录到你的 PATH 变量。

export PATH=/usr/local/cuda-11.1/bin${PATH:+:${PATH}} >> ~/.bashrc

来源:https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#post-installation-actions

我建议您遵循 link,因为还有一些我也没有遵循的强制性 post-installation 步骤。

另一种方法是编辑 Makefile 并设置正确的 nvcc。 就我而言: 第 24 行替换

NVCC=nvcc

NVCC=/usr/local/cuda-11.0/bin/nvcc

请注意,cuda 版本可能会有所不同。