From 7ace8a933db1da8e9734b3988f332dbf672d4dd2 Mon Sep 17 00:00:00 2001 From: nihui Date: Sat, 5 Sep 2020 14:15:24 +0800 Subject: [PATCH] powerpc64, fix #2054 (#2058), workaround gcc altivec bug --- .github/workflows/linux-ppc64-cpu-gcc.yml | 45 +++++++++++++++++++ CMakeLists.txt | 2 + src/layer/interp.cpp | 5 +++ .../powerpc64le-linux-gnu.toolchain.cmake | 16 +++++++ 4 files changed, 68 insertions(+) create mode 100644 .github/workflows/linux-ppc64-cpu-gcc.yml create mode 100644 toolchains/powerpc64le-linux-gnu.toolchain.cmake diff --git a/.github/workflows/linux-ppc64-cpu-gcc.yml b/.github/workflows/linux-ppc64-cpu-gcc.yml new file mode 100644 index 000000000..23a7a1cb0 --- /dev/null +++ b/.github/workflows/linux-ppc64-cpu-gcc.yml @@ -0,0 +1,45 @@ +name: linux-ppc64-cpu-gcc +on: [push, pull_request] +jobs: + linux-gcc-ppc64le: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v2 + + - name: cache-qemu + id: cache-qemu + uses: actions/cache@v1 + with: + path: qemu-install + key: qemu-ppc64le-install-1 + - name: checkout-qemu + if: steps.cache-qemu.outputs.cache-hit != 'true' + uses: actions/checkout@v2 + with: + repository: qemu/qemu + path: qemu + ref: 8746309137ba470d1b2e8f5ce86ac228625db940 + - name: qemu + if: steps.cache-qemu.outputs.cache-hit != 'true' + run: | + cd qemu + ./configure --prefix=install --target-list=ppc64le-linux-user --disable-system + make -j2 + make install + cp -r ppc64le-linux-user/install $GITHUB_WORKSPACE/qemu-install + + - name: powerpc64le-gnu-toolchain + run: | + sudo apt-get update + sudo apt-get install g++-powerpc64le-linux-gnu + + - name: configure + run: mkdir build && cd build && cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/powerpc64le-linux-gnu.toolchain.cmake -DNCNN_BUILD_TOOLS=OFF -DNCNN_BUILD_EXAMPLES=OFF .. + - name: build + run: cmake --build build -j 2 + + - name: test + run: | + export PATH=$GITHUB_WORKSPACE/qemu-install/bin:$PATH + cd build + TESTS_EXECUTABLE_LOADER=qemu-ppc64le TESTS_EXECUTABLE_LOADER_ARGUMENTS="-L;/usr/powerpc64le-linux-gnu" ctest --output-on-failure -j 2 diff --git a/CMakeLists.txt b/CMakeLists.txt index 57eca1a50..52a73368f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -79,6 +79,8 @@ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(mips)") set(NCNN_TARGET_ARCH mips) elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(riscv)") set(NCNN_TARGET_ARCH riscv) +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc)") + set(NCNN_TARGET_ARCH powerpc) else() set(NCNN_TARGET_ARCH x86) option(NCNN_AVX2 "optimize x86 platform with avx2" ON) diff --git a/src/layer/interp.cpp b/src/layer/interp.cpp index 1cb3bddbe..051c0ac4e 100644 --- a/src/layer/interp.cpp +++ b/src/layer/interp.cpp @@ -45,6 +45,11 @@ int Interp::load_param(const ParamDict& pd) return 0; } +#if defined(__GNUC__) && defined(__powerpc__) && defined(__ALTIVEC__) +// NOTE gcc altivec optimized version produce wrong result +// so I have to disable vectorize here --- nihui +__attribute__((optimize("no-tree-vectorize"))) +#endif static void linear_coeffs(int w, int outw, int* xofs, float* alpha) { double scale = (double)w / outw; diff --git a/toolchains/powerpc64le-linux-gnu.toolchain.cmake b/toolchains/powerpc64le-linux-gnu.toolchain.cmake new file mode 100644 index 000000000..89ee67887 --- /dev/null +++ b/toolchains/powerpc64le-linux-gnu.toolchain.cmake @@ -0,0 +1,16 @@ +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_PROCESSOR powerpc64le) + +set(CMAKE_C_COMPILER "powerpc64le-linux-gnu-gcc") +set(CMAKE_CXX_COMPILER "powerpc64le-linux-gnu-g++") + +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + +set(CMAKE_C_FLAGS "-mcpu=powerpc64le") +set(CMAKE_CXX_FLAGS "-mcpu=powerpc64le") + +# cache flags +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" CACHE STRING "c flags") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" CACHE STRING "c++ flags")