Куда мне положить cblas.h, чтобы моя сборка mxnet его нашла? - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь установить mxnet путем клонирования репозитория git следующим образом:

git clone --recursive https://github.com/dmlc/mxnet

Однако, когда я пытаюсь собрать его, поместив его в каталог mxnet и запустив make следующим образом:

make -j $(nproc) USE_OPENCV=1 USE_BLAS=openblas USE_CUDA=1 USE_CUDA_PATH=/usr/local/cuda USE_CUDNN=1

Я получаю ошибки, указывающие, что cblas.h не может быть найден - например,

/home/me/mxnet/3rdparty/mshadow/mshadow/./base.h:162:14: fatal error: cblas.h: No such file or directory
 #include <cblas.h>

Вывод команды make представляет собой последовательность команд компиляции nvcc, которые выглядят какследует:

/usr/local/cuda/bin/nvcc -std=c++11 -Xcompiler -D_FORCE_INLINES -O3 -ccbin /home/me/anaconda2/envs/deepnets/bin/x86_64-conda_cos6-linux-gnu-c++  -gencode arch=compute_30,code=sm_30 -gencode arch=compute_35,code=sm_35 -gencode arch=compute_50,code=sm_50 -gencode arch=compute_52,code=sm_52 -gencode arch=compute_60,code=sm_60 -gencode arch=compute_61,code=sm_61 -gencode arch=compute_70,code=sm_70 -gencode arch=compute_75,code=[sm_75,compute_75] --fatbin-options -compress-all -Xcompiler "-DMSHADOW_FORCE_STREAM -Wall -Wsign-compare -O3 -DNDEBUG=1 -I/home/me/mxnet/3rdparty/mshadow/ -I/home/me/mxnet/3rdparty/dmlc-core/include -fPIC -I/home/me/mxnet/3rdparty/tvm/nnvm/include -I/home/me/mxnet/3rdparty/dlpack/include -I/home/me/mxnet/3rdparty/tvm/include -Iinclude -funroll-loops -Wno-unused-parameter -Wno-unknown-pragmas -Wno-unused-local-typedefs -msse3 -mf16c -I/usr/local/cuda/include -DMSHADOW_USE_CBLAS=1 -DMSHADOW_USE_MKL=0 -I/home/me/mxnet/3rdparty/mkldnn/build/install/include -DMSHADOW_RABIT_PS=0 -DMSHADOW_DIST_PS=0 -DMSHADOW_USE_PASCAL=0 -DMXNET_USE_MKLDNN=1 -DUSE_MKL=1 -I/home/me/mxnet/src/operator/nn/mkldnn/ -I/home/me/mxnet/3rdparty/mkldnn/build/install/include -DMXNET_USE_OPENCV=1 -I/usr/local/include/opencv -I/usr/local/include -fopenmp -DMXNET_USE_OPERATOR_TUNING=1 -DMXNET_USE_LAPACK -DMSHADOW_USE_CUDNN=1  -I/home/me/mxnet/3rdparty/cub -DMXNET_ENABLE_CUDA_RTC=1 -DMXNET_USE_NCCL=0 -DMXNET_USE_LIBJPEG_TURBO=0" --generate-dependencies -MT build/src/operator/tensor/elemwise_unary_op_trig_gpu.o src/operator/tensor/elemwise_unary_op_trig.cu >build/src/operator/tensor/elemwise_unary_op_trig_gpu.d

Если я выделю (во что я верю) все включаемые каталоги, я могу выбрать следующие каталоги:

-I/home/me/mxnet/3rdparty/mshadow/
-I/home/me/mxnet/3rdparty/dmlc-core/include -fPIC
-I/home/me/mxnet/3rdparty/tvm/nnvm/include
-I/home/me/mxnet/3rdparty/dlpack/include
-I/home/me/mxnet/3rdparty/tvm/include
-Iinclude -funroll-loops -Wno-unused-parameter -Wno-unknown-pragmas -Wno-unused-local-typedefs -msse3 -mf16c
-I/usr/local/cuda/include -DMSHADOW_USE_CBLAS=1 -DMSHADOW_USE_MKL=0
-I/home/me/mxnet/3rdparty/mkldnn/build/install/include -DMSHADOW_RABIT_PS=0 -DMSHADOW_DIST_PS=0 -DMSHADOW_USE_PASCAL=0 -DMXNET_USE_MKLDNN=1 -DUSE_MKL=1
-I/home/me/mxnet/src/operator/nn/mkldnn/
-I/home/me/mxnet/3rdparty/mkldnn/build/install/include -DMXNET_USE_OPENCV=1
-I/usr/local/include/opencv
-I/usr/local/include -fopenmp -DMXNET_USE_OPERATOR_TUNING=1 -DMXNET_USE_LAPACK -DMSHADOW_USE_CUDNN=1
-I/home/me/mxnet/3rdparty/cub

Когда я ищу cblas.hЯ вижу эти копии:

(deepnets) me@Chanticleer:~/mxnet$ sudo find /home -name 'cblas.h'
[sudo] password for me: 
/home/me/anaconda2/pkgs/openblas-0.3.3-h9ac9557_1001/include/cblas.h
/home/me/anaconda2/pkgs/lapack-3.6.1-ha44fe06_2/include/cblas.h
/home/me/anaconda2/pkgs/openblas-0.3.5-h9ac9557_1001/include/cblas.h
/home/me/anaconda2/envs/deepnets/include/cblas.h
/home/me/mxnet/julia/deps/cblas.h
(deepnets) me@Chanticleer:~/mxnet$ sudo find /usr -name 'cblas.h'
/usr/include/atlas/cblas.h
/usr/include/openblas/cblas.h
/usr/include/cblas.h

Очевидно, что ни один из них, кажется, не относится к тому месту, куда направлен Makefile.Нужно ли каким-то образом изменить Makefile (как?) Или мне нужно поместить копию cblas.h в какой-то другой каталог или хотя бы мягкую ссылку на него.Если да, то какой каталог и как?

1 Ответ

1 голос
/ 21 марта 2019

Если вы компилируете с nvcc, вы можете просто использовать последний включаемый файл, так как он уже находится в вашем каталоге включения, вот так :

nvcc -I/usr/include <other stuff here...>

Вы надеваетене нужно делать что-либо столь же радикальное, как ручное копирование;на самом деле, я бы действительно рекомендовал против этого, потому что вам придется помнить, чтобы повторить это при обновлении.

Чтобы ответить на ваш вопрос о make-файле, если вы собираетесь добавить объявление IЯ бы сказал, что довольно часто можно увидеть, как его добавляют в переменную $(CPPFLAGS), что означает флаги препроцессора C / C ++.Однако вместо этого я бы сделал следующее:

INCLUDE_DIRS  = -I/usr/include

COMPILE.cpp   = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(INCLUDE_DIRS) $(TARGET_ARCH) -c
OUTPUT_OPTION = -o $@    

%.o: %.cpp
    $(COMPILE.cpp) $(OUTPUT_OPTION) $^

(Правильное) соглашение для ваших пользователей - возможность настраивать переменные $(CXX), $(CXXFLAGS) и $(CPPFLAGS).По сути, вы хотите, чтобы они выбирали и настраивали свой компилятор, флаги и параметры сборки.Однако, поскольку вам, очевидно, нужен этот файл включения (или вы не получили бы эту ошибку), я бы рекомендовал установить его отдельно, чтобы избежать путаницы.

В любом случае, удачи, мужик.Надеюсь, это поможет.

...