From 5e091fd05b2705015fda4ba1c70b2ea7b8efe535 Mon Sep 17 00:00:00 2001 From: Colin Davidson Date: Wed, 23 Oct 2024 16:55:23 +0100 Subject: [PATCH] Add ock artefact building --- .github/actions/calc_vars/action.yml | 47 ++++++++ .github/actions/do_build_icd/action.yml | 70 +++++++++++ .../actions/do_build_ock_artefact/action.yml | 71 +++++++++++ .github/actions/do_build_tornado/action.yml | 69 +++++++++++ .github/actions/run_tornado/action.yml | 35 ++++++ .github/actions/setup_build/action.yml | 33 ++++-- .github/workflows/codeql.yml | 2 + .github/workflows/planned_testing.yml | 111 ++++++++++++++++++ .github/workflows/planned_testing_caller.yml | 26 ++++ .github/workflows/run_pr_tests.yml | 7 -- 10 files changed, 454 insertions(+), 17 deletions(-) create mode 100644 .github/actions/calc_vars/action.yml create mode 100644 .github/actions/do_build_icd/action.yml create mode 100644 .github/actions/do_build_ock_artefact/action.yml create mode 100644 .github/actions/do_build_tornado/action.yml create mode 100644 .github/actions/run_tornado/action.yml create mode 100644 .github/workflows/planned_testing.yml create mode 100644 .github/workflows/planned_testing_caller.yml diff --git a/.github/actions/calc_vars/action.yml b/.github/actions/calc_vars/action.yml new file mode 100644 index 000000000..16ed61272 --- /dev/null +++ b/.github/actions/calc_vars/action.yml @@ -0,0 +1,47 @@ +name: calc vars +description: calculate variables based off the target name that may be useful in other steps + +inputs: + target: + description: 'target architecture' + +outputs: + arch: + description: "base architecture - one of x86, x86_64, arm, aarch64 or riscv64" + value: ${{ steps.calc_vars_action.outputs.arch }} + toolchain: + description: "path to toolchain file for architecture" + value: ${{ steps.calc_vars_action.outputs.toolchain }} + cmake_toolchain: + description: "cmake argument to pass to " + value: ${{ steps.calc_vars_action.outputs.cmake_toolchain }} +runs: + # We don't want a new docker just a list of steps, so mark as composite + using: "composite" + steps: + - shell: bash + id: calc_vars_action + run: | + export ARCH= + export TOOLCHAIN= + export CMAKE_TOOLCHAIN= + if [[ "${{inputs.target}}" = "host_x86_64_linux" ]]; then + export ARCH=x86_64 >> $GITHUB_OUTPUT + elif [[ "${{inputs.target}}" = "host_x86_64_windows" ]]; then + export ARCH=x86_64 >> $GITHUB_OUTPUT + elif [[ "${{inputs.target}}" = "host_aarch64_linux" ]]; then + export ARCH=aarch64 >> $GITHUB_OUTPUT; + export TOOLCHAIN=$GITHUB_WORKSPACE/platform/arm-linux/aarch64-toolchain.cmake + export CMAKE_TOOLCHAIN="--toolchain $TOOLCHAIN" + elif [[ "${{inputs.target}}" = "host_riscv64_linux" ]]; then + export ARCH=riscv64 >> $GITHUB_OUTPUT; + export TOOLCHAIN=$GITHUB_WORKSPACE/platform/riscv64-linux/riscv64-toolchain.cmake + export CMAKE_TOOLCHAIN="--toolchain $TOOLCHAIN" + else + echo Unknown target ${{inputs.target}} + exit 1 + fi + echo "arch=$ARCH" >> $GITHUB_OUTPUT + echo "toolchain=$TOOLCHAIN" >> $GITHUB_OUTPUT + echo "cmake_toolchain=$CMAKE_TOOLCHAIN" >> $GITHUB_OUTPUT + cat $GITHUB_OUTPUT diff --git a/.github/actions/do_build_icd/action.yml b/.github/actions/do_build_icd/action.yml new file mode 100644 index 000000000..939a49d5d --- /dev/null +++ b/.github/actions/do_build_icd/action.yml @@ -0,0 +1,70 @@ +name: pull and build opencl icd loader +description: pull icd loader and build with a particular toolchain, uploading opencl header and icd artefacts + +inputs: + target: + description: 'target architecture' + +runs: + # We don't want a new docker just a list of steps, so mark as composite + using: "composite" + steps: + - name: calc vars + id: calc_vars + uses: ./.github/actions/calc_vars + with: + target: ${{ inputs.target }} + + - name: Install Ninja + uses: llvm/actions/install-ninja@main + + - name: clone headers + uses: actions/checkout@v4 + with: + repository: KhronosGroup/OpenCL-Headers + path: headers + + - name: build headers + shell: bash + run: | + pwd + ls -d * + cmake headers -Bheaders/build_${{steps.calc_vars.outputs.arch}} -DCMAKE_TOOLCHAIN_FILE=${{ steps.calc_vars.outputs.toolchain }} -DCMAKE_INSTALL_PREFIX=$PWD/headers_install_${{steps.calc_vars.outputs.arch}} -GNinja + ninja -v -C headers/build_${{steps.calc_vars.outputs.arch}} + ninja -v -C headers/build_${{steps.calc_vars.outputs.arch}} install + + - name: upload header artifact + uses: actions/upload-artifact@v4 + with: + name: header_${{inputs.target}} + path: headers_install_${{steps.calc_vars.outputs.arch}} + retention-days: 1 + + - name: clone icd + uses: actions/checkout@v4 + with: + repository: KhronosGroup/OpenCL-ICD-Loader + path: icd + + - name: icd cmake + shell: bash + run: + cmake icd -B icd/build_${{steps.calc_vars.outputs.arch}} -DCMAKE_TOOLCHAIN_FILE=${{ steps.calc_vars.outputs.toolchain }} + -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DCMAKE_INSTALL_PREFIX=$PWD/install_icd_${{steps.calc_vars.outputs.arch}} + -DOpenCLHeaders_DIR=$PWD/headers_install_${{steps.calc_vars.outputs.arch}}/share/cmake/OpenCLHeaders -GNinja + + - name: icd build + shell: bash + run: | + ninja -v -C icd/build_${{steps.calc_vars.outputs.arch}} + ninja -v -C icd/build_${{steps.calc_vars.outputs.arch}} install + pwd + ls icd/ + + - name: upload icd artifact + uses: actions/upload-artifact@v4 + with: + name: icd_${{inputs.target}} + path: install_icd_${{steps.calc_vars.outputs.arch}} + retention-days: 1 + diff --git a/.github/actions/do_build_ock_artefact/action.yml b/.github/actions/do_build_ock_artefact/action.yml new file mode 100644 index 000000000..3a994a8bf --- /dev/null +++ b/.github/actions/do_build_ock_artefact/action.yml @@ -0,0 +1,71 @@ +name: build-ock-artefacts +description: Action to build the oneapi-construction-kit as an artefact + +# Note we need to support tip at some point + +inputs: + llvm_version: + description: 'llvm version we want to use (18-19)' + default: '19' + target: + description: 'target architecture' + +# TODO: This has not been tested yet on windows so would likely need some updating. +runs: + # We don't want a new docker just a list of steps, so mark as composite + using: "composite" + steps: + - name: calc vars + id: calc_vars + uses: ./.github/actions/calc_vars + with: + target: ${{ inputs.target }} + + - name: print vars + shell: bash + run: | + echo arch = ${{steps.calc_vars.outputs.arch}} + echo toolchain = ${{steps.calc_vars.outputs.toolchain}} + + # installs tools, ninja, installs llvm and sets up sccache + - name: setup + uses: ./.github/actions/setup_build + with: + llvm_version: 19 + llvm_build_type: RelAssert + cross_arch: ${{ steps.calc_vars.outputs.arch == 'x86_64' && '' || steps.calc_vars.outputs.arch }} + + - name: build ock x86 + if: steps.calc_vars.outputs.arch == 'x86_64' + uses: ./.github/actions/do_build_ock + with: + build_targets: install + offline_kernel_tests: OFF + extra_flags: -DCA_ENABLE_TESTS=OFF -DCA_ENABLE_EXAMPLES=OFF -DCA_ENABLE_DOCUMENTATION=OFF + + - name: build ock other ${{ matrix.target }} + if: steps.calc_vars.outputs.arch != 'x86_64' + uses: ./.github/actions/do_build_ock + with: + build_targets: install + toolchain_file: ${{ steps.calc_vars.outputs.toolchain }} + extra_flags: -DCA_BUILTINS_TOOLS_DIR=${{ github.workspace }}/llvm_install_native/bin -DCA_ENABLE_TESTS=OFF -DCA_ENABLE_EXAMPLES=OFF -DCA_ENABLE_DOCUMENTATION=OFF + # Do we need the offline kernel as an artefact? If so currently this requires an external clc or qemu to be installed. + offline_kernel_tests: OFF + host_fp16: ON + + # Prune it as there is too much things in there we don't want to use + # We may want to extend this a bit as time goes on such as clc or UnitCL + - name: prune ock artefact + shell: bash + run: | + # delete all but city runner and the python associated file under bin + find install/bin -maxdepth 1 -type f ! -name "*.py" -delete + rm -rf install/share + + - name: upload ock artefact + uses: actions/upload-artifact@v4 + with: + name: ock_${{ inputs.target }} + path: install + retention-days: 1 diff --git a/.github/actions/do_build_tornado/action.yml b/.github/actions/do_build_tornado/action.yml new file mode 100644 index 000000000..6979be231 --- /dev/null +++ b/.github/actions/do_build_tornado/action.yml @@ -0,0 +1,69 @@ +name: build tornado +description: build tornado + +inputs: + target: + description: 'target architecture' + +runs: + # We don't want a new docker just a list of steps, so mark as composite + using: "composite" + steps: + - name: calc vars + id: calc_vars + uses: ./.github/actions/calc_vars + with: + target: ${{ inputs.target }} + + - name: Install Ninja + uses: llvm/actions/install-ninja@main + + - name: download icd artifact + uses: actions/download-artifact@v4 + with: + name: icd_${{inputs.target}} + path: install_icd + + # Get maven + - name: fetch maven + shell: bash + run: | + wget https://archive.apache.org/dist/maven/maven-3/3.9.3/binaries/apache-maven-3.9.3-bin.tar.gz + tar xf apache-maven-3.9.3-bin.tar.gz + + # TODO: setup correctly for our aarch64 runner + - name: select jdk21 + if: steps.calc_vars.outputs.arch == 'x86_64' + shell: bash + run: | + sudo update-java-alternatives -s temurin-21-jdk-amd64 + pip install tqdm + + - name: clone TornadoVM + uses: actions/checkout@v4 + with: + repository: beehive-lab/TornadoVM + path: TornadoVM_build + ref: develop + + - name: build tornadovm + shell: bash + run: | + export JAVA_HOME=`readlink -f $(command -v java) | sed 's/\/bin\/java//'` + export TORNADO_SDK=$GITHUB_WORKSPACE/TornadoVM_build/bin/sdk + export PATH=$PWD/apache-maven-3.9.3/bin:$PATH + mvn -v + java --version + cd TornadoVM_build + # The tornado build system links in OpenCL assuming it's in a known place. This gets around + # this by pass CXX as an environment variable as it's difficult to change the build system + # even if we don't use this script. + CXX="g++ -L$GITHUB_WORKSPACE/install_icd/lib" make -j8 jdk21 BACKEND=opencl + cp -r -L $TORNADO_SDK $GITHUB_WORKSPACE/TornadoVM_SDK + + - name: upload tornado artifact + uses: actions/upload-artifact@v4 + with: + name: tornado_${{inputs.target}} + path: TornadoVM_SDK + retention-days: 1 diff --git a/.github/actions/run_tornado/action.yml b/.github/actions/run_tornado/action.yml new file mode 100644 index 000000000..a15a98d32 --- /dev/null +++ b/.github/actions/run_tornado/action.yml @@ -0,0 +1,35 @@ +name: run tornado +description: run tornado + +# This action is not standalone and assumes it has been run after the build_tornado action +# and that the icd is already installed at install_icd +inputs: + target: + description: 'target architecture' + +runs: + # We don't want a new docker just a list of steps, so mark as composite + using: "composite" + steps: + - name: Download ock artefact + uses: actions/download-artifact@v4 + with: + name: ock_${{inputs.target}} + path: install_ock + + - name: Run tornado example + shell: bash + run: | + export ARTEFACT_CHECKOUT_PATH=$GITHUB_WORKSPACE/install_ock + export ICD_LOADER_INSTALL_PATH=$GITHUB_WORKSPACE/install_icd + + export LD_LIBRARY_PATH=$ICD_LOADER_INSTALL_PATH/lib:$LD_LIBRARY_PATH + echo $LD_LIBRARY_PATH + export OCL_ICD_FILENAMES=$ARTEFACT_CHECKOUT_PATH/lib/libCL.so + export JAVA_HOME=`readlink -f $(command -v java) | sed 's/\/bin\/java//'` + export TORNADO_SDK=$GITHUB_WORKSPACE/TornadoVM_build/bin/sdk + export PATH=$TORNADO_SDK/bin:$PATH + + git clone https://github.com/beehive-lab/TornadoVM.git -b develop --depth 1 + cd TornadoVM + CA_HOST_DUMP_ASM=1 tornado --printKernel --threadInfo -m tornado.examples/uk.ac.manchester.tornado.examples.compute.MatrixMultiplication2D 256 diff --git a/.github/actions/setup_build/action.yml b/.github/actions/setup_build/action.yml index 53d9b9ac1..daf94e0b9 100644 --- a/.github/actions/setup_build/action.yml +++ b/.github/actions/setup_build/action.yml @@ -21,9 +21,8 @@ inputs: description: 'Save the build cache at the end - not for PR testing' default: false cross_arch: - description: 'Cross compilation architecture from: x86, arm, aarch64, riscv64. Default: "" (no cross compile)' + description: 'Cross compilation architecture from: x86, arm, aarch64, riscv64. Default: "" (no cross compile), will auto fetch native arch' default: "" - # Note: runner architectures from: x86_64 (aka runner.arch: X64), aarch64 (aka runner.arch: ARM64) clang_tidy: description: 'Enable installing of clang-tidy (currently 19)' type: boolean @@ -91,20 +90,34 @@ runs: shell: bash run: | KEY_VERSION="${{ inputs.ubuntu_version }}" - if [ "${{ inputs.os }}" = "windows" ]; then \ - KEY_VERSION="${{ inputs.windows_version }}" ; \ + if [ "${{ inputs.os }}" = "windows" ]; then + KEY_VERSION="${{ inputs.windows_version }}" fi echo "key_version=$KEY_VERSION" >> "$GITHUB_OUTPUT" KEY_ARCH="x86_64" - if [ "${{ runner.arch }}" = "ARM64" ]; then \ - KEY_ARCH="aarch64" ; \ + KEY_NATIVE_ARCH="x86_64" + if [ "${{ runner.arch }}" = "ARM64" ]; then + KEY_ARCH="aarch64" ; + KEY_NATIVE_ARCH="aarch64" fi - if [ "${{ inputs.cross_arch }}" != "" ]; then \ - KEY_ARCH="${{ inputs.cross_arch }}" ; \ + if [ "${{ inputs.cross_arch }}" != "" ]; then + KEY_ARCH="${{ inputs.cross_arch }}" fi + echo "key_arch=$KEY_ARCH" >> "$GITHUB_OUTPUT" - echo "key_version=$KEY_VERSION" - echo "key_arch=$KEY_ARCH" + echo "key_native_arch=$KEY_NATIVE_ARCH" >> "$GITHUB_OUTPUT" + cat $GITHUB_OUTPUT + + - name: load llvm native + if: inputs.cross_arch != '' + uses: actions/cache/restore@v4 + with: + path: llvm_install/** + key: llvm-${{ inputs.os }}-${{ steps.set_llvm_key.outputs.key_version }}-${{ steps.set_llvm_key.outputs.key_native_arch }}-v${{ inputs.llvm_version }}-${{ inputs.llvm_build_type }} + fail-on-cache-miss: true + - shell: bash + if: inputs.cross_arch != '' + run: mv llvm_install llvm_install_native - name: load llvm uses: actions/cache/restore@v4 diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 969248aa1..7369867af 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -25,6 +25,7 @@ permissions: {} jobs: analyze-host-x86_64-release: + if: false name: Analyze host x86_64 release permissions: # required for all workflows @@ -72,6 +73,7 @@ jobs: category: "/language:c-cpp" analyze-riscv-m1: + if: false name: Analyze riscv m1 permissions: # required for all workflows diff --git a/.github/workflows/planned_testing.yml b/.github/workflows/planned_testing.yml new file mode 100644 index 000000000..2c77a0a72 --- /dev/null +++ b/.github/workflows/planned_testing.yml @@ -0,0 +1,111 @@ +# Simple workflow for running non-documentation PR testing +name: Run ock tests for PR testing +on: + workflow_call: + inputs: + ock: + required: false + type: boolean + default: true + test_tornado: + required: false + type: boolean + default: true + target_list: + required: false + type: string + llvm_version: + required: false + type: string + default: 19 + pull_request: + required: false + type: boolean + default: false + +jobs: + + # Calculate some useful variables that can be used through the workflow + # Currently this can be used to exclude all but certain targets in matrices + workflow_vars: + runs-on: ubuntu-22.04 + outputs: + matrix_only_linux_x86_64_aarch64: ${{ steps.vars.outputs.matrix_only_linux_x86_64_aarch64 }} + matrix_only_linux_x86_64: ${{ steps.vars.outputs.matrix_only_linux_x86_64 }} + steps: + - id: vars + run: | + echo matrix_only_linux_x86_64_aarch64="[ {\"target\": \"host_arm_linux\"}, {\"target\": \"host_riscv64_linux\"}, {\"target\": \"host_refsi_linux\"}, {\"target\": \"host_i686_linux\"}, {\"target\": \"host_x86_64_windows\"}]" >> $GITHUB_OUTPUT + echo matrix_only_linux_x86_64="[ {\"target\": \"host_aarch64_linux\"}, {\"target\": \"host_riscv64_linux\"}, {\"target\": \"host_arm_linux\"}, {\"target\": \"host_refsi_linux\"}, {\"target\": \"host_i686_linux\"}, {\"target\": \"host_x86_64_windows\"}]" >> $GITHUB_OUTPUT + cat $GITHUB_OUTPUT + + + create_ock_artefacts: + needs: [workflow_vars] + strategy: + matrix: + target: ${{ fromJson(inputs.target_list) }} + exclude: ${{ fromJson(needs.workflow_vars.outputs.matrix_only_linux_x86_64_aarch64) }} + + runs-on: ${{ (contains(matrix.target, 'host_riscv') && 'ubuntu-24.04') || (contains(matrix.target, 'windows') && 'windows-2019' || 'ubuntu-22.04' ) }} + if : inputs.ock + steps: + - name: Checkout repo + uses: actions/checkout@v4 + - name: build ock artefact + uses: ./.github/actions/do_build_ock_artefact + with: + target: ${{ matrix.target }} + llvm_version: ${{ inputs.llvm_version }} + + build_icd: + # Will also be required for opencl + if: inputs.test_tornado + needs: [workflow_vars] + strategy: + matrix: + target: ${{ fromJson(inputs.target_list) }} + exclude: ${{ fromJson(needs.workflow_vars.outputs.matrix_only_linux_x86_64_aarch64) }} + + runs-on: ubuntu-22.04 + steps: + - name: clone ock platform + uses: actions/checkout@v4 + with: + sparse-checkout: | + platform + .github + # The following can also be done with the matrix with exclude: to limit the targets to what we want + - name : build and upload icd ${{matrix.target}} + uses: ./.github/actions/do_build_icd + with: + target: ${{matrix.target}} + + + # Currently only builds and runs on x86_64 linux + build_run_tornado: + if: inputs.test_tornado + needs: [ workflow_vars, build_icd, create_ock_artefacts ] + strategy: + matrix: + target: ${{ fromJson(inputs.target_list) }} + exclude: ${{ fromJson(needs.workflow_vars.outputs.matrix_only_linux_x86_64) }} + + # Todo: expand for aarch64 + runs-on: ubuntu-22.04 + steps: + - name: clone ock platform + uses: actions/checkout@v4 + with: + sparse-checkout: | + platform + .github + # TODO: Consider separating out tornado build and run in the future + - name : build and upload tornado + uses: ./.github/actions/do_build_tornado + with: + target: ${{ matrix.target }} + - name : run tornado + uses: ./.github/actions/run_tornado + with: + target: ${{ matrix.target }} diff --git a/.github/workflows/planned_testing_caller.yml b/.github/workflows/planned_testing_caller.yml new file mode 100644 index 000000000..c5e8fe1ce --- /dev/null +++ b/.github/workflows/planned_testing_caller.yml @@ -0,0 +1,26 @@ +# Calling workflow for running planned style tests +name: Run planned testing +on: + pull_request: + paths: + - '.github/workflows/planned_testing.yml' + - '.github/workflows/planned_testing_caller.yml' + branches: + - main + schedule: + # Run Mon-Fri at 7pm + - cron: '00 19 * * 1-5' + +jobs: + call_planned: + # This makes the diagram too big if we post much here so P_ for pull request. + name: P_ + if: ${{ github.event_name == 'pull_request' }} + uses: ./.github/workflows/planned_testing.yml + with: + target_list: '["host_x86_64_linux", "host_aarch64_linux", "host_riscv64_linux", "host_i686_linux", "host_refsi_linux", "host_x86_64_windows" ]' + test_tornado: true + ock: true + # Have a pull request setting which can be used to test the flow as best as possible + # in a reasonable time + pull_request: ${{ github.event_name == 'pull_request' && true || false }} diff --git a/.github/workflows/run_pr_tests.yml b/.github/workflows/run_pr_tests.yml index 000b5419d..645da99b0 100644 --- a/.github/workflows/run_pr_tests.yml +++ b/.github/workflows/run_pr_tests.yml @@ -363,13 +363,6 @@ jobs: steps: - name: Checkout repo uses: actions/checkout@v4.1.0 - - name: load native llvm - uses: actions/cache/restore@v4 - with: - path: llvm_install/** - key: llvm-ubuntu-22.04-x86_64-v19-RelAssert - fail-on-cache-miss: true - - run: mv llvm_install llvm_install_native - name: setup-ubuntu uses: ./.github/actions/setup_build with: