From e1288616f6e594f853a507dae229f811e77eca2b Mon Sep 17 00:00:00 2001 From: hedaoyuan Date: Thu, 20 Apr 2017 18:56:58 +0800 Subject: [PATCH 1/4] Fix compile on raspberry pi --- doc/howto/raspberry/build_for_raspberry.md | 45 ++++++++++++++++++++++ paddle/api/CMakeLists.txt | 2 +- paddle/utils/CpuId.cpp | 11 +++--- 3 files changed, 52 insertions(+), 6 deletions(-) create mode 100644 doc/howto/raspberry/build_for_raspberry.md diff --git a/doc/howto/raspberry/build_for_raspberry.md b/doc/howto/raspberry/build_for_raspberry.md new file mode 100644 index 0000000000000..ba23c8457bce2 --- /dev/null +++ b/doc/howto/raspberry/build_for_raspberry.md @@ -0,0 +1,45 @@ +# 如何构建raspberry pi下运行的paddle + +这里考虑的是交叉编译方式,即在Linux-X86环境下构建raspberry pi下可运行的paddle。 + +## 下载较差编译环境 +``` +git clone https://github.com/raspberrypi/tools +``` +如果host是x86-64环境,选用`arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64`下的作为编译工具。注意,需要系统glibc支持2.14以上。 + + +## 编译第三方库 +Paddle在cmake会在编译paddle的时候自动编译依赖的第三方库,不过openblas和protobuf最好还是在编译paddle之前先编译好,这样可以保证编译paddle的时候更加顺畅。 + +### 编译openblas +``` +git clone https://github.com/xianyi/OpenBLAS.git +make TARGET=ARMV7 HOSTCC=gcc CC=arm-linux-gnueabihf-gcc NOFORTRAN=1 USE_THREAD=0 +``` + +### 编译protobuf +``` +git clone https://github.com/google/protobuf.git +git checkout 9f75c5aa851cd877fb0d93ccc31b8567a6706546 +cmake ../protobuf/cmake \ +-Dprotobuf_BUILD_TESTS=OFF \ +-DCMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++ \ +-DCMAKE_C_COMPILER=arm-linux-gnueabihf-gcc \ +-DCMAKE_POSITION_INDEPENDENT_CODE=ON \ +-DCMAKE_BUILD_TYPE=Release \ +-DCMAKE_INSTALL_LIBDIR=lib +``` +注意:这样编译出来的`libprotobuf.a`和`protoc`都是ARM版本的,而我们需要的是一个x86-64版本的`protoc`,所以需要用host gcc再编译一遍protobuf然后使用其中的`protoc`。 + + +## 编译Paddle +``` +cmake .. -DWITH_GPU=OFF -DWITH_PYTHON=OFF -DWITH_SWIG_PY=OFF \ +-DCMAKE_CXX_COMPILER:FILEPATH=arm-linux-gnueabihf-g++ \ +-DCMAKE_C_COMPILER:FILEPATH=arm-linux-gnueabihf-gcc \ +-DCMAKE_C_FLAGS="-mfpu=neon" \ +-DCMAKE_CXX_FLAGS="-mfpu=neon" \ +-DOPENBLAS_ROOT=openblas \ +-DCMAKE_PREFIX_PATH=protobuf +``` diff --git a/paddle/api/CMakeLists.txt b/paddle/api/CMakeLists.txt index 4d0dacae9058f..c7993553e359f 100644 --- a/paddle/api/CMakeLists.txt +++ b/paddle/api/CMakeLists.txt @@ -26,7 +26,7 @@ FILE(GLOB PY_PADDLE_PYTHON_FILES ${PROJ_ROOT}/paddle/py_paddle/*.py) SET_SOURCE_FILES_PROPERTIES(Paddle.i PROPERTIES CPLUSPLUS ON) SET(CMAKE_SWIG_OUTDIR ${CMAKE_CURRENT_BINARY_DIR}) -SET(CMAKE_CXX_FLAGS "-std=c++11 -fPIC -Wall") +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fPIC -Wall") IF(WITH_COVERAGE) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0 -fprofile-arcs -ftest-coverage") ENDIF(WITH_COVERAGE) diff --git a/paddle/utils/CpuId.cpp b/paddle/utils/CpuId.cpp index edd33c454122d..5abeeecae8d37 100644 --- a/paddle/utils/CpuId.cpp +++ b/paddle/utils/CpuId.cpp @@ -19,19 +19,22 @@ limitations under the License. */ /// for MSVC #define CPUID(info, x) __cpuidex(info, x, 0) -#elif !defined(__ANDROID__) +#else +#if !defined(__arm__) #include - /// for GCC/Clang #define CPUID(info, x) __cpuid_count(x, 0, info[0], info[1], info[2], info[3]) +#endif #endif namespace paddle { SIMDFlags::SIMDFlags() { -#if !defined(__ANDROID__) +#if defined(__arm__) + simd_flags_ = SIMD_NEON; +#else unsigned int cpuInfo[4]; // CPUID: https://en.wikipedia.org/wiki/CPUID // clang-format off @@ -52,8 +55,6 @@ SIMDFlags::SIMDFlags() { CPUID(cpuInfo, 0x80000001); simd_flags_ |= cpuInfo[2] & (1 << 16) ? SIMD_FMA4 : SIMD_NONE; // clang-fotmat on -#else - simd_flags_ = SIMD_NEON; #endif } From 5ba7f6167aaf378d807e2b4f3c5b0125e5462f5d Mon Sep 17 00:00:00 2001 From: hedaoyuan Date: Mon, 24 Apr 2017 15:14:19 +0800 Subject: [PATCH 2/4] follow comment --- doc/howto/raspberry/build_for_raspberry.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/howto/raspberry/build_for_raspberry.md b/doc/howto/raspberry/build_for_raspberry.md index ba23c8457bce2..d6888e47ec69e 100644 --- a/doc/howto/raspberry/build_for_raspberry.md +++ b/doc/howto/raspberry/build_for_raspberry.md @@ -2,7 +2,7 @@ 这里考虑的是交叉编译方式,即在Linux-X86环境下构建raspberry pi下可运行的paddle。 -## 下载较差编译环境 +## 下载交叉编译环境 ``` git clone https://github.com/raspberrypi/tools ``` From fe7825bf9bce1688efeb326c79f409d8c7283c66 Mon Sep 17 00:00:00 2001 From: hedaoyuan Date: Tue, 25 Apr 2017 13:59:39 +0800 Subject: [PATCH 3/4] follow comments --- doc/howto/raspberry/build_for_raspberry.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/howto/raspberry/build_for_raspberry.md b/doc/howto/raspberry/build_for_raspberry.md index d6888e47ec69e..7e843a659f87e 100644 --- a/doc/howto/raspberry/build_for_raspberry.md +++ b/doc/howto/raspberry/build_for_raspberry.md @@ -1,6 +1,6 @@ -# 如何构建raspberry pi下运行的paddle +# 如何构建Raspberry pi下运行的PaddlePaddle -这里考虑的是交叉编译方式,即在Linux-X86环境下构建raspberry pi下可运行的paddle。 +这里考虑的是交叉编译方式,即在Linux-x86环境下构建Raspberry pi下可运行的PaddlePaddle。 ## 下载交叉编译环境 ``` @@ -10,9 +10,9 @@ git clone https://github.com/raspberrypi/tools ## 编译第三方库 -Paddle在cmake会在编译paddle的时候自动编译依赖的第三方库,不过openblas和protobuf最好还是在编译paddle之前先编译好,这样可以保证编译paddle的时候更加顺畅。 +cmake编译PaddlePaddle时候会自动下载编译依赖的第三方库,不过openblas和protobuf最好还是在编译PaddlePaddle之前先编译好,这样可以保证编译PaddlePaddle的时候更加顺畅。 -### 编译openblas +### 编译OpenBLAS ``` git clone https://github.com/xianyi/OpenBLAS.git make TARGET=ARMV7 HOSTCC=gcc CC=arm-linux-gnueabihf-gcc NOFORTRAN=1 USE_THREAD=0 From 5cdc4955271ff04866a0b9cc5247e6dee79a7ddc Mon Sep 17 00:00:00 2001 From: hedaoyuan Date: Wed, 3 May 2017 21:29:45 +0800 Subject: [PATCH 4/4] Fix some bug --- doc/howto/raspberry/build_for_raspberry.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/doc/howto/raspberry/build_for_raspberry.md b/doc/howto/raspberry/build_for_raspberry.md index 7e843a659f87e..4a98aba8f2a88 100644 --- a/doc/howto/raspberry/build_for_raspberry.md +++ b/doc/howto/raspberry/build_for_raspberry.md @@ -33,13 +33,15 @@ cmake ../protobuf/cmake \ 注意:这样编译出来的`libprotobuf.a`和`protoc`都是ARM版本的,而我们需要的是一个x86-64版本的`protoc`,所以需要用host gcc再编译一遍protobuf然后使用其中的`protoc`。 -## 编译Paddle +## 编译PaddlePaddle +cmake参数如下;其中`WITH_C_API`设置为ON,编译输出的output目录会中包含`include`和`lib`目录,其中`include`中包含CAPI的头文件,`lib`中包含一个ARM版本的库。另外,`CMAKE_BUILD_TYPE`设置为`MinSizeRel`可以减小编译的库的大小。 ``` -cmake .. -DWITH_GPU=OFF -DWITH_PYTHON=OFF -DWITH_SWIG_PY=OFF \ +cmake .. -DWITH_GPU=OFF -DWITH_C_API=ON -DWITH_PYTHON=OFF -DWITH_SWIG_PY=OFF \ -DCMAKE_CXX_COMPILER:FILEPATH=arm-linux-gnueabihf-g++ \ -DCMAKE_C_COMPILER:FILEPATH=arm-linux-gnueabihf-gcc \ -DCMAKE_C_FLAGS="-mfpu=neon" \ -DCMAKE_CXX_FLAGS="-mfpu=neon" \ -DOPENBLAS_ROOT=openblas \ --DCMAKE_PREFIX_PATH=protobuf +-DCMAKE_PREFIX_PATH=protobuf \ +-DCMAKE_BUILD_TYPE=MinSizeRel ```