# 设置PaddlePaddle的编译选项

PaddlePaddle的编译选项可以在调用cmake的时候设置。cmake是一个跨平台的编译脚本，调用 cmake可以将cmake项目文件，生成各个平台的makefile。详细的cmake使用方法可以参考 cmake的官方文档 。

PaddlePaddle的编译选项是可以控制PaddlePaddle生成CPU/GPU版本二进制，链接何种blas等等。所有的 编译选项列表如下

## PaddlePaddle的编译选项

### bool型的编译选项

设置下列编译选项时，可以在cmake的命令行设置。使用 -D命令即可。例如 `cmake -D WITH_GPU=OFF`

PaddlePaddle的bool型编译选项
选项 | 说明 | 默认值
WITH_GPU | 是否编译GPU支持。 | 是否寻找到cuda工具链
WITH_DOUBLE | 是否使用双精度浮点数。 | 否
WITH_DSO | 是否使用运行时动态加载cuda动态库，而非静态加载cuda动态库。 | 是
WITH_AVX | 是否编译含有AVX指令集的PaddlePaddle二进制 | 是
WITH_PYTHON | 是否内嵌python解释器。可以方便嵌入式工作。 | 是
WITH_STYLE_CHECK | 是否编译时进行代码风格检查 | 是
WITH_RDMA | 是否开启RDMA支持 | 否
WITH_GLOG | 是否使用GLOG，如果不使用则会使用一个简化版的日志实现。可以方便嵌入式工作。 | 取决于是否寻找到GLOG
WITH_GFLAGS | 是否使用GFLAGS，如果不使用则会使用一个简化版的命令行参数解析。可以方便嵌入式工作。 | 取决于是否寻找到GFLAGS
WITH_TIMER | 是否开启计时功能开启计时功能会导致运行略慢，打印的日志变多。但是方便调试和benchmark | 否
WITH_TESTING | 是否开启单元测试 | 取决于是否寻找到gtest
WITH_DOC | 是否编译英文文档 | 否
WITH_DOC_CN | 是否编译中文文档 | 否
WITH_SWIG_PY | 是否编译python的swig接口，python的swig接口可以方便进行预测和定制化训练 | 取决于是否找到swig

### blas相关的编译选项

PaddlePaddle可以使用 MKL ， Atlas , OpenBlas 和 refference Blas ，任意一种cblas实现。 通过编译时指定路径来实现引用各种blas。

cmake编译时会首先在系统路径(/usr/lib:/usr/local/lib)中寻找这些blas的实现。同时 也会读取相关路径变量来进行搜索。路径变量为:

PaddlePaddle的cblas编译选项
编译选项 | 描述
--- | ---
MKL_ROOT | mkl的路径，在${MKL_ROOT}/include下需要包含mkl.h，在${MKL_ROOT}/lib目录下需要包含 mkl_core，mkl_sequential和mkl_intel_lp64三个库
ATLAS_ROOT | ATLAS库的路径，在${ATLAS_ROOT}/include下需要包含cblas.h，而在${ATLAS_ROOT}/lib下需要包含cblas和atlas两个库
OPENBLAS_ROOT | 在${OPENBLAS_ROOT}/include下需要包含cblas.h，而在${OPENBLAS_ROOT}/lib下需要包含openblas库
REFERENCE_CBLAS_ROOT | 在${REFERENCE_CBLAS_ROOT}/include下需要包含cblas.h，在${REFERENCE_CBLAS_ROOT}/lib下需要包含cblas库

这些变量均可以使用 -D命令指定。例如 `cmake -D MKL_ROOT=/opt/mkl/`。这些变 量也可以通过调用cmake命令前通过环境变量指定。例如

    export MKL_ROOT=/opt/mkl
    cmake

需要注意的是，这些变量只在第一次cmake的时候有效。如果在第一次cmake之后想要重新设 置这些变量，推荐清理( `rm -rf` )掉编译目录后，再指定。

### cuda/cudnn相关的编译选项

PaddlePaddle可以使用 cudnn v2之后的任何一个cudnn版本来编译运行。但需要注意的是编译和 运行使用的cudnn尽量是同一个版本。推荐使用最新版本的cudnn v5.1。

在cmake配置时可以使用 `CUDNN_ROOT` 来配置CUDNN的安装路径。使用的命令也是 -D，例如 `cmake -D CUDNN_ROOT=/opt/cudnnv5` 。

需要注意的是，这些变量只在第一次cmake的时候有效。如果在第一次cmake之后想要重新设 置这些变量，推荐清理( `rm -rf` )掉编译目录后，再指定。