Skip to content

Commit

Permalink
Integrate RISC-V support (#477)
Browse files Browse the repository at this point in the history
* Add support for the RISC-V Vector ISA
- RISC-V V 1.0 with (latest) intrinsics >=0.12.
- Enable bit manip extensions on RISC-V.
- Add RVVM*NOFMA configurations for determinism/bit-reproducibility across all architectures.

* Not supported yet
- DFT, QUAD, and GNUABI.
- Only upcoming versions of gcc (14+) have support for latest intrinsics. Will be supported when available in release version of gcc.

* CI Updates
- Add riscv64 CI on GitHub Actions.
- Add gcc (11 - #483) and llvm (17) builds on all architectures.
- Disable a few failing test variants, tracked in #484 and #485.
- Use same compiler versions across all builds.
- Add sysroot for dependencies.
- Nit: Reorder build-cross targets to group gcc/llvm per-arch together.

---------

Co-authored-by: GlassOfWhiskey <[email protected]>
Co-authored-by: Eric Love <[email protected]>
  • Loading branch information
3 people authored Nov 20, 2023
1 parent 69cfa71 commit cea4434
Show file tree
Hide file tree
Showing 32 changed files with 1,690 additions and 56 deletions.
222 changes: 183 additions & 39 deletions .github/workflows/build_and_test.yml
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
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

0 comments on commit cea4434

Please sign in to comment.