# PaddlePaddle的编译选项

PaddlePaddle的编译选项，包括生成CPU/GPU二进制文件、链接何种BLAS库等。用户可在调用cmake的时候设置它们，详细的cmake使用方法可以参考 官方文档 。

## Bool型的编译选项

用户可在cmake的命令行中，通过使用 `-D` 命令设置该类编译选项，例如

    cmake .. -DWITH_GPU=OFF

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_TIMER | 是否开启计时功能。如果开启会导致运行略慢，打印的日志变多，但是方便调试和测Benchmark | 否
WITH_TESTING | 是否开启单元测试 | 取决于是否寻找到GTEST
WITH_DOC | 是否编译中英文文档 | 否
WITH_SWIG_PY | 是否编译PYTHON的SWIG接口，该接口可用于预测和定制化训练 | 取决于是否寻找到SWIG

## BLAS/CUDA/Cudnn的编译选项

### BLAS

PaddlePaddle支持以下任意一种BLAS库：MKL ，ATLAS ，OpenBlAS 和 REFERENCE BLAS 。

BLAS路径相关的编译选项
编译选项 | 描述 | 注意
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的路径 | ${OPENBLAS_ROOT}/include下需要包含cblas.h，${OPENBLAS_ROOT}/lib下需要包含openblas库。
REFERENCE_CBLAS_ROOT | REFERENCE BLAS的路径 | ${REFERENCE_CBLAS_ROOT}/include下需要包含cblas.h，${REFERENCE_CBLAS_ROOT}/lib下需要包含cblas库。

### CUDA/Cudnn

PaddlePaddle可以使用cudnn v2之后的任何一个版本来编译运行，但尽量请保持编译和运行使用的cudnn是同一个版本。 我们推荐使用最新版本的cudnn v5.1。

### 编译选项的设置

PaddePaddle通过编译时指定路径来实现引用各种BLAS/CUDA/Cudnn库。cmake编译时，首先在系统路径(/usr/lib:/usr/local/lib)中搜索这几个库，同时也会读取相关路径变量来进行搜索。 通过使用 `-D` 命令可以设置，例如

    cmake .. -DMKL_ROOT=/opt/mkl/ -DCUDNN_ROOT=/opt/cudnnv5

注意：这几个编译选项的设置，只在第一次cmake的时候有效。如果之后想要重新设置，推荐清理整个编译目录（`rm -rf`）后，再指定。