【问题标题】:Where should I put cblas.h so that my build of mxnet will find it?我应该把 cblas.h 放在哪里,以便我构建的 mxnet 可以找到它?
【发布时间】:2024-06-04 14:35:01
【问题描述】:

我正在尝试通过克隆 git 存储库来安装 mxnet,如下所示:

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 的副本放在其他目录中,或者至少是指向它的软链接。如果是,是哪个目录以及如何使用?

【问题讨论】:

    标签: makefile mxnet cblas


    【解决方案1】:

    如果您使用nvcc 进行编译,您可以只使用最后一个包含文件,因为它已经在您的包含目录中,like this

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

    您不必做任何像手动复制那样激烈的事情;事实上,我真的不建议这样做,因为您必须记住在有更新时重新执行此操作。

    为了回答您关于 makefile 的问题,如果您要添加声明,我想说看到它被添加到代表 C/C++ 预处理器标志的 $(CPPFLAGS) 变量是很常见的。但是,我会这样做:

    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) 变量。本质上,您希望他们选择和自定义他们的编译器、标志和构建选项。但是,由于您显然需要此包含文件(否则您不会收到此错误),我建议您完全单独设置它以避免任何混淆。

    无论如何,祝你好运,伙计。我希望这会有所帮助。

    【讨论】: