Browse Source

powerpc64, fix #2054 (#2058), workaround gcc altivec bug

tags/20200916
nihui GitHub 5 years ago
parent
commit
7ace8a933d
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 68 additions and 0 deletions
  1. +45
    -0
      .github/workflows/linux-ppc64-cpu-gcc.yml
  2. +2
    -0
      CMakeLists.txt
  3. +5
    -0
      src/layer/interp.cpp
  4. +16
    -0
      toolchains/powerpc64le-linux-gnu.toolchain.cmake

+ 45
- 0
.github/workflows/linux-ppc64-cpu-gcc.yml View File

@@ -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

+ 2
- 0
CMakeLists.txt View File

@@ -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)


+ 5
- 0
src/layer/interp.cpp View File

@@ -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;


+ 16
- 0
toolchains/powerpc64le-linux-gnu.toolchain.cmake View File

@@ -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")

Loading…
Cancel
Save