| @@ -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 | |||||
| @@ -79,6 +79,8 @@ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(mips)") | |||||
| set(NCNN_TARGET_ARCH mips) | set(NCNN_TARGET_ARCH mips) | ||||
| elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(riscv)") | elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(riscv)") | ||||
| set(NCNN_TARGET_ARCH riscv) | set(NCNN_TARGET_ARCH riscv) | ||||
| elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc)") | |||||
| set(NCNN_TARGET_ARCH powerpc) | |||||
| else() | else() | ||||
| set(NCNN_TARGET_ARCH x86) | set(NCNN_TARGET_ARCH x86) | ||||
| option(NCNN_AVX2 "optimize x86 platform with avx2" ON) | option(NCNN_AVX2 "optimize x86 platform with avx2" ON) | ||||
| @@ -45,6 +45,11 @@ int Interp::load_param(const ParamDict& pd) | |||||
| return 0; | 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) | static void linear_coeffs(int w, int outw, int* xofs, float* alpha) | ||||
| { | { | ||||
| double scale = (double)w / outw; | double scale = (double)w / outw; | ||||
| @@ -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") | |||||