Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Integrate RISC-V support #477

Merged
merged 26 commits into from
Nov 20, 2023
Merged
Show file tree
Hide file tree
Changes from 22 commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
d747f61
Extend FMA support to RISC-V
GlassOfWhiskey Oct 19, 2022
a7f1d93
Add support for the RISC-V Vector ISA
ericlove Jan 13, 2023
77465b3
Merge pull request #448 of github.com:shibatch/sleef into upstream-riscv
luhenry Nov 4, 2023
fa7b14d
Merge pull request #449 of github.com:shibatch/sleef into upstream-riscv
luhenry Nov 4, 2023
46230a3
RIVOS: update rvv support to latest intrinsics
luhenry Nov 2, 2023
55fd453
Add riscv64 CI on GitHub Actions
luhenry Nov 4, 2023
8339480
Add gcc and llvm builds
luhenry Nov 13, 2023
3b905a6
Enable bitmanip extensions on RISC-V
luhenry Nov 13, 2023
798b14f
Enable LLVM build for s390x and ppc64el
luhenry Nov 13, 2023
3bcec26
Nit: Reorder build-cross targets to group gcc/llvm per-arch together
luhenry Nov 13, 2023
24278a0
Remove unused riscv-gnu-toolchain installation step
luhenry Nov 14, 2023
35be378
Use same compiler versions across all builds
luhenry Nov 14, 2023
abd492f
fixup! Use same compiler versions across all builds
luhenry Nov 14, 2023
b117645
fixup! Use same compiler versions across all builds
luhenry Nov 14, 2023
1c097ca
Downgrade version to GCC 11
luhenry Nov 15, 2023
395a6f6
Add rvvm*nofma configuration
luhenry Nov 15, 2023
ce3f65a
Fix CONFIG for RVV in helperrvv
luhenry Nov 15, 2023
549d212
fixup! Fix CONFIG for RVV in helperrvv
luhenry Nov 15, 2023
e1b59d3
fixup! Fix CONFIG for RVV in helperrvv
luhenry Nov 15, 2023
105ff56
Add tester3 for RISC-V
luhenry Nov 16, 2023
562a69c
Add sysroot for dependencies
luhenry Nov 16, 2023
7de9fd4
Fix rounding functions
luhenry Nov 17, 2023
6a3551c
Use correct rounding mode
luhenry Nov 17, 2023
ca8e731
Use __riscv_vlenb
luhenry Nov 18, 2023
12a174b
fixup! Use __riscv_vlenb
luhenry Nov 18, 2023
19ee07e
Fix indent
luhenry Nov 20, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
222 changes: 183 additions & 39 deletions .github/workflows/build_and_test.yml
luhenry marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
Expand Up @@ -7,46 +7,76 @@ on:
push:
pull_request:

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read

env:
GCC_VERSION: "11"
LLVM_VERSION: "17"
COMMON_CMAKE_FLAGS: |
-DSLEEF_SHOW_CONFIG=1
-DDISABLE_SSL=ON
-DBUILD_GNUABI_LIBS=ON
-DBUILD_INLINE_HEADERS=ON
-DBUILD_DFT=ON
-DBUILD_QUAD=ON
-DBUILD_SCALAR_LIB=ON
-DBUILD_STATIC_TEST_BINS=ON
-DENFORCE_TESTER=ON
-DENFORCE_TESTER3=ON

jobs:
build-native:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
compiler: [gcc, llvm]

name: build-native-${{ matrix.compiler }}
steps:
- uses: actions/[email protected]
with:
persist-credentials: false

- name: Install dependencies
run: sudo apt-get update -y -qq && sudo apt-get install -y -qq build-essential clang curl ninja-build libgmp-dev libmpfr-dev
run: |
sudo apt-get update -y -qq
sudo apt-get install -y -qq build-essential curl ninja-build libgmp-dev libmpfr-dev

# Needed for llvm builds as well for target libraries
- name: Install gcc
run: |
sudo apt-get install -y -qq gcc-${GCC_VERSION}

- name: Install llvm
run: |
curl -o llvm.sh https://apt.llvm.org/llvm.sh
chmod u+x llvm.sh
sudo ./llvm.sh ${LLVM_VERSION}
sudo ln -srf $(which clang-${LLVM_VERSION}) /usr/bin/clang
rm llvm.sh
if: ${{ matrix.compiler == 'llvm' }}

- name: Build native
shell: bash -ex -o pipefail {0}
run: |
set -x
EXTRA_CMAKE_FLAGS="-DENFORCE_SSE2=ON -DENFORCE_SSE4=ON -DENFORCE_AVX=ON -DENFORCE_AVX=ON -DENFORCE_AVX2=ON -DENFORCE_AVX512F=ON -DENFORCE_FMA4=ON"
cmake -S . -B _build-native -GNinja \
-DCMAKE_INSTALL_PREFIX=$(pwd)/_install-native \
-DCMAKE_TOOLCHAIN_FILE=$(pwd)/travis/toolchain-native-${{ matrix.compiler }}.cmake \
${COMMON_CMAKE_FLAGS} \
${EXTRA_CMAKE_FLAGS}
cmake --build _build-native
cmake --install _build-native

- name: Upload build-native artifacts
- name: Upload build-native-${{ matrix.compiler }} artifacts
uses: actions/upload-artifact@v3
with:
name: build-native
name: build-native-${{ matrix.compiler }}
path: |
_build-*
_install-*
Expand All @@ -55,6 +85,12 @@ jobs:
test-native:
runs-on: ubuntu-latest
needs: [build-native]
strategy:
fail-fast: false
matrix:
compiler: [gcc, llvm]

name: test-native-${{ matrix.compiler }}
steps:
- uses: actions/[email protected]
with:
Expand All @@ -67,12 +103,12 @@ jobs:
run: |
cat /proc/cpuinfo

- name: Download build-native artifacts
- name: Download build-native-${{ matrix.compiler }} artifacts
uses: actions/download-artifact@v3
with:
name: build-native
name: build-native-${{ matrix.compiler }}

- name: Fix build-native permissions
- name: Fix _build-native permissions
run: |
chmod +x _build-native/bin/*

Expand All @@ -97,19 +133,24 @@ jobs:
strategy:
fail-fast: false
matrix:
arch: [aarch64, armhf, ppc64el, s390x, riscv64]
compiler: [gcc, llvm]
include:
# AArch64
- arch: aarch64
# Aarch32
- arch: armhf
package: -arm-linux-gnueabihf
# PPC64
binfmt: arm
gnupkg: -arm-linux-gnueabihf
- arch: ppc64el
package: -powerpc64le-linux-gnu
# IBM Z
- arch: s390x

name: build-${{ matrix.arch }}
binfmt: ppc64le
gnupkg: -powerpc64le-linux-gnu
- arch: aarch64
debarch: arm64
exclude:
# Only GCC trunk supports the RISC-V V intrinsics and https://github.com/riscv-collab/riscv-gnu-toolchain
# doesn't track a recent enough version yet
- arch: riscv64
compiler: gcc

name: build-${{ matrix.arch }}-${{ matrix.compiler }}
steps:
- uses: actions/[email protected]
with:
Expand All @@ -118,20 +159,58 @@ jobs:
- name: Install dependencies
run: |
sudo apt-get update -y -qq
sudo apt-get install -y -qq build-essential clang curl ninja-build libgmp-dev libmpfr-dev gcc${{ matrix.package || format('-{0}-linux-gnu', matrix.arch) }}
sudo apt-get install -y -qq build-essential curl ninja-build libgmp-dev libmpfr-dev debootstrap

# Needed for llvm builds as well for target libraries
- name: Install gcc
run: |
sudo apt-get install -y -qq gcc-${GCC_VERSION}${{ matrix.gnupkg || format('-{0}-linux-gnu', matrix.arch) }}

- name: Download build-native artifacts
- name: Install llvm
run: |
curl -o llvm.sh https://apt.llvm.org/llvm.sh
chmod u+x llvm.sh
sudo ./llvm.sh ${LLVM_VERSION}
sudo ln -srf $(which clang-${LLVM_VERSION}) /usr/bin/clang
rm llvm.sh
if: ${{ matrix.compiler == 'llvm' }}

- name: Setup QEMU
uses: docker/[email protected]
with:
platforms: ${{ matrix.binfmt || matrix.arch }}

- name: Check sysroot cache
id: check-sysroot-cache
uses: actions/cache@v3
with:
path: sysroot
key: sysroot-${{ matrix.arch }}-${{ hashFiles('./.github/workflows/build_and_test.yml') }}

- name: Create sysroot
run: |
sudo debootstrap --arch=${{ matrix.debarch || matrix.arch }} --verbose --include=fakeroot,symlinks,libmpfr-dev,libssl-dev --resolve-deps --variant=minbase --components=main,universe focal sysroot
# Remove unused files to minimize cache
sudo chroot sysroot symlinks -cr .
sudo chown ${USER} -R sysroot
rm -rf sysroot/{dev,proc,run,sys,var}
rm -rf sysroot/usr/{sbin,bin,share}
rm -rf sysroot/usr/lib/{apt,gcc,udev,systemd}
rm -rf sysroot/usr/libexec/gcc
if: steps.check-sysroot-cache.outputs.cache-hit != 'true'

- name: Download build-native-${{ matrix.compiler }} artifacts
uses: actions/download-artifact@v3
with:
name: build-native
name: build-native-${{ matrix.compiler }}

- name: Fix build-native permissions
- name: Fix _build-native permissions
run: |
chmod +x _build-native/bin/*

- name: Build ${{ matrix.arch }}
shell: bash -ex -o pipefail {0}
run: |
set -x
EXTRA_CMAKE_FLAGS=""
if [[ ${{ matrix.arch }} = "aarch64" ]]; then
EXTRA_CMAKE_FLAGS="${EXTRA_CMAKE_FLAGS} -DENFORCE_SVE=ON"
Expand All @@ -142,22 +221,32 @@ jobs:
EXTRA_CMAKE_FLAGS="${EXTRA_CMAKE_FLAGS} -DENFORCE_VSX=ON -DENFORCE_VSX3=ON"
elif [[ ${{ matrix.arch }} = "s390x" ]]; then
EXTRA_CMAKE_FLAGS="${EXTRA_CMAKE_FLAGS} -DENFORCE_VXE=ON"
# Disable VXE2 support, QEMU doesn't support it
# Disable VXE2 support, QEMU doesn't support some instructions generated by gcc or llvm
EXTRA_CMAKE_FLAGS="${EXTRA_CMAKE_FLAGS} -DDISABLE_VXE2=ON"
elif [[ ${{ matrix.arch }} = "riscv64" ]]; then
EXTRA_CMAKE_FLAGS="${EXTRA_CMAKE_FLAGS} -DENFORCE_RVVM1=ON -DENFORCE_RVVM2=ON"
# Disable inline headers, they just don't compile on riscv64
EXTRA_CMAKE_FLAGS="${EXTRA_CMAKE_FLAGS} -DBUILD_INLINE_HEADERS=OFF"
# Disable dft, it fails with linker error to `cexp`
EXTRA_CMAKE_FLAGS="${EXTRA_CMAKE_FLAGS} -DBUILD_DFT=OFF"
# Disable quad, it's missing the `Sleef_quad` function
EXTRA_CMAKE_FLAGS="${EXTRA_CMAKE_FLAGS} -DBUILD_QUAD=OFF"
fi

cmake -S . -B _build-${{ matrix.arch }} -GNinja \
-DCMAKE_INSTALL_PREFIX="$(pwd)/_install-${{ matrix.arch }}" \
-DCMAKE_TOOLCHAIN_FILE=$(pwd)/travis/toolchain-${{ matrix.arch }}.cmake \
-DCMAKE_TOOLCHAIN_FILE=$(pwd)/travis/toolchain-${{ matrix.arch }}-${{ matrix.compiler }}.cmake \
-DCMAKE_SYSROOT=$(pwd)/sysroot \
-DNATIVE_BUILD_DIR="$(pwd)/_build-native" \
${COMMON_CMAKE_FLAGS} \
${EXTRA_CMAKE_FLAGS}
cmake --build _build-${{ matrix.arch }}
cmake --install _build-${{ matrix.arch }}

- name: Upload build-${{ matrix.arch }} artifacts
- name: Upload build-${{ matrix.arch }}-${{ matrix.compiler }} artifacts
uses: actions/upload-artifact@v3
with:
name: build-${{ matrix.arch }}
name: build-${{ matrix.arch }}-${{ matrix.compiler }}
path: |
_build-${{ matrix.arch }}
_install-${{ matrix.arch }}
Expand All @@ -172,32 +261,88 @@ jobs:
include:
# AArch64
- arch: aarch64
compiler: gcc
qemu_cpu: "max,sve=off"
- arch: aarch64
compiler: gcc
qemu_cpu: "max,sve=on,sve128=on"
- arch: aarch64
compiler: gcc
qemu_cpu: "max,sve=on,sve256=on"
- arch: aarch64
compiler: gcc
qemu_cpu: "max,sve=on,sve512=on"
# Some tests fail when compiled with LLVM only
# - arch: aarch64
# compiler: llvm
# qemu_cpu: "max,sve=off"
# - arch: aarch64
# compiler: llvm
# qemu_cpu: "max,sve=on,sve128=on"
# - arch: aarch64
# compiler: llvm
# qemu_cpu: "max,sve=on,sve256=on"
# - arch: aarch64
# compiler: llvm
# qemu_cpu: "max,sve=on,sve512=on"
# Aarch32
- arch: armhf
compiler: gcc
binfmt: arm
luhenry marked this conversation as resolved.
Show resolved Hide resolved
qemu_cpu: "max"
- arch: armhf
compiler: llvm
binfmt: arm
qemu_cpu: "max"
# PPC64
- arch: ppc64el
compiler: gcc
binfmt: ppc64le
qemu_cpu: "power10"
- arch: ppc64el
compiler: llvm
binfmt: ppc64le
qemu_cpu: "power10"
# IBM Z
# TODO: figure out qemu_cpu variable to make tests pass on QEMU
- arch: s390x

name: "test-${{ matrix.arch }} (qemu_cpu: \"${{ matrix.qemu_cpu }}\")"
compiler: gcc
- arch: s390x
compiler: llvm
# RISC-V
# - arch: riscv64
# compiler: gcc
# qemu_cpu: "rv64,zba=true,zbb=true,zbs=true,v=false"
# - arch: riscv64
# compiler: gcc
# qemu_cpu: "rv64,zba=true,zbb=true,zbs=true,v=true,vlen=128,elen=64,vext_spec=v1.0"
# - arch: riscv64
# compiler: gcc
# qemu_cpu: "rv64,zba=true,zbb=true,zbs=true,v=true,vlen=256,elen=64,vext_spec=v1.0"
# - arch: riscv64
# compiler: gcc
# qemu_cpu: "rv64,zba=true,zbb=true,zbs=true,v=true,vlen=512,elen=64,vext_spec=v1.0"
- arch: riscv64
compiler: llvm
qemu_cpu: "rv64,zba=true,zbb=true,zbs=true,v=false"
- arch: riscv64
compiler: llvm
qemu_cpu: "rv64,zba=true,zbb=true,zbs=true,v=true,vlen=128,elen=64,vext_spec=v1.0"
- arch: riscv64
compiler: llvm
qemu_cpu: "rv64,zba=true,zbb=true,zbs=true,v=true,vlen=256,elen=64,vext_spec=v1.0"
- arch: riscv64
compiler: llvm
qemu_cpu: "rv64,zba=true,zbb=true,zbs=true,v=true,vlen=512,elen=64,vext_spec=v1.0"

name: "test-${{ matrix.arch }}-${{ matrix.compiler }} (qemu_cpu: \"${{ matrix.qemu_cpu }}\")"
steps:
- uses: actions/[email protected]
with:
persist-credentials: false

- uses: docker/[email protected]
- name: Setup QEMU
uses: docker/[email protected]
with:
platforms: ${{ matrix.binfmt || matrix.arch }}

Expand All @@ -208,20 +353,19 @@ jobs:
run: |
cat /proc/cpuinfo

- name: Download build-native artifacts
- name: Download build-native-${{ matrix.compiler }} artifacts
uses: actions/download-artifact@v3
with:
name: build-native
name: build-native-${{ matrix.compiler }}

- name: Download build-${{ matrix.arch }} artifacts
- name: Download build-${{ matrix.arch }}-${{ matrix.compiler }} artifacts
uses: actions/download-artifact@v3
with:
name: build-${{ matrix.arch }}
name: build-${{ matrix.arch }}-${{ matrix.compiler }}

- name: Fix build-native and _build-${{ matrix.arch }} permissions
- name: Fix _build-native and _build-${{ matrix.arch }} permissions
run: |
chmod +x _build-native/bin/*
chmod +x _build-${{ matrix.arch }}/bin/*
chmod +x _build-native/bin/* _build-${{ matrix.arch }}/bin/*

- name: Test ${{ matrix.arch }}
env:
Expand All @@ -233,10 +377,10 @@ jobs:
cd _build-${{ matrix.arch }}
ctest -j$(nproc)

- name: Upload test-${{ matrix.arch }}-${{ strategy.job-index }} artifacts
- name: Upload test-${{ matrix.arch }}-${{ matrix.compiler }}-${{ strategy.job-index }} artifacts
uses: actions/upload-artifact@v3
with:
name: test-${{ matrix.arch }}-${{ strategy.job-index }}
name: test-${{ matrix.arch }}-${{ matrix.compiler }}-${{ strategy.job-index }}
path: |
_build-${{ matrix.arch }}/Testing
if: always()
Loading