GPU環境下的編譯配置都是在 /darknet/Makefile 文件中定義的,GPU環境的編譯有3點更改需要注意。
1. 更改Makefile前兩行GPU和CUDNN的配置:
CUDNN=1
48~51行,在"ifeq ($(GPU), 1)"語句塊中修改為自己的CUDA安裝路徑,更改前默認路徑如下:
ifeq ($(GPU), 1)
COMMON+= -DGPU -I/usr/local/cuda/include/
CFLAGS+= -DGPU
LDFLAGS+= -L/usr/local/cuda/lib64 -lcuda -lcudart -lcublas -lcurand
例如修改為:
COMMON+= -DGPU -I/usr/local/cuda-8.0/include/
CFLAGS+= -DGPU
LDFLAGS+= -L/usr/local/cuda-8.0/lib64 -lcuda -lcudart -lcublas -lcurand
23行,修改NVCC的路徑:
3. 修改ARCH配置
Loadingweights from yolo.weights...Done!
CUDA Error:invalid device function
darknet: ./src/cuda.c:21: check_error: Assertion `0' failed.
Aborted (core dumped)
這是因為配置文件Makefile中配置的GPU架構和本機GPU型號不一致導致的。
更改前默認配置如下(不同版本可能有變):
ARCH= -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]
# -gencode arch=compute_20,code=[sm_20,sm_21] \ This one is deprecated?
# This is what I use, uncomment if you know your arch and want to specify
# ARCH= -gencode arch=compute_52,code=compute_52
compute_30表示顯卡的計算能力是3.0,幾款主流GPU的compute capability列表:
- GTX Titan x : 5.2
- GTX 980 : 5.2
- Tesla K80 : 3.7
- Tesla K40 : 3.5
- K4200 : 3.0
所以Tesla K80對應compute_30,Tesla K40c對應compute_35,Titan X對應compute_52,根據自己的GPU型號的計算能力進行配置,例如配置為:
ARCH= -gencode arch=compute_35,code=compute_35 \
重新編譯即可。
CUDA官方說明文檔:http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#virtual-architecture-feature-list