为 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 版本可能会有所不同。
我想在支持 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 版本可能会有所不同。