diff --git a/.github/actions/bench/action.yml b/.github/actions/bench/action.yml new file mode 100644 index 000000000..248e72b26 --- /dev/null +++ b/.github/actions/bench/action.yml @@ -0,0 +1,55 @@ +# SPDX-License-Identifier: Apache-2.0 + +name: Bench MLKEM-C-AArch64 +description: Run benchmarking script + +inputs: + name: + description: Name for the benchmarking run + required: true + perf: + description: Method of obtaining PMU metrics + required: true + default: 'PERF' + type: choice + options: + - NO + - PERF + - PMU + - M1 + cflags: + description: CFLAGS to pass to compilation + default: '' + archflags: + description: ARCHFLAGS to pass to compilation + default: '' + bench_extra_args: + description: Further arguments to be appended to command line for `bench` script + default: '' + store_results: + description: Whether to push results to GH pages + default: 'false' + gh_token: + description: GitHub access token + required: true +runs: + using: composite + steps: + - name: Run benchmark + shell: nix develop .#ci -c bash -e {0} + run: | + tests bench -c ${{ inputs.perf }} --cflags "${{ inputs.cflags }}" --arch-flags "${{ inputs.archflags }}" -v --output output.json ${{ inputs.bench_extra_args }} + - name: Dump benchmark + shell: bash + if: ${{ inputs.store_results != 'true' }} + run: | + cat output.json + - name: Store benchmark result + if: ${{ inputs.store_results == 'true' }} + uses: benchmark-action/github-action-benchmark@v1 + with: + name: ${{ inputs.name }} + tool: 'customSmallerIsBetter' + output-file-path: output.json + github-token: ${{ inputs.gh_token }} + auto-push: true diff --git a/.github/workflows/bench.yml b/.github/workflows/bench.yml index 70b87e3d0..a477a027f 100644 --- a/.github/workflows/bench.yml +++ b/.github/workflows/bench.yml @@ -16,13 +16,22 @@ jobs: target: - system: rpi4 name: Arm Cortex-A72 (Raspberry Pi 4) benchmarks - cmd: tests bench -c PMU --arch-flags -mcpu=cortex-a72 -v --output output.json + bench_pmu: PMU + archflags: -mcpu=cortex-a72 + cflags: + bench_extra_args: - system: rpi5 name: Arm Cortex-A76 (Raspberry Pi 5) benchmarks - cmd: tests bench -c PERF --arch-flags "-mcpu=cortex-a76 -march=armv8.2-a" -v --output output.json + bench_pmu: PERF + archflags: "-mcpu=cortex-a76 -march=armv8.2-a" + cflags: + bench_extra_args: - system: a55 name: Arm Cortex-A55 (Snapdragon 888) benchmarks - cmd: tests bench -c PERF --cflags -static --arch-flags "-mcpu=cortex-a55 -march=armv8.2-a" -w exec-on-a55 -v --output output.json + bench_pmu: PERF + archflags: "-mcpu=cortex-a55 -march=armv8.2-a" + cflags: -static + bench_extra_args: -w exec-on-a55 runs-on: self-hosted-${{ matrix.target.system }} defaults: run: @@ -51,14 +60,12 @@ jobs: $(cat /proc/cpuinfo) EOF - name: Run benchmark - run: | - ${{ matrix.target.cmd }} - - name: Store benchmark result - if: github.repository_owner == 'pq-code-package' && github.ref == 'refs/heads/main' - uses: benchmark-action/github-action-benchmark@v1 + uses: ./.github/actions/bench with: name: ${{ matrix.target.name }} - tool: 'customSmallerIsBetter' - output-file-path: output.json - github-token: ${{ secrets.GITHUB_TOKEN }} - auto-push: true + cflags: ${{ matrix.target.cflags }} + archflags: ${{ matrix.target.archflags }} + perf: ${{ matrix.target.bench_pmu }} + store_results: ${{ github.repository_owner == 'pq-code-package' && github.ref == 'refs/heads/main' }} + bench_extra_args: ${{ matrix.target.bench_extra_args }} + gh_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/bench_ec2_any.yml b/.github/workflows/bench_ec2_any.yml index 20c8ccc52..82fac8a49 100644 --- a/.github/workflows/bench_ec2_any.yml +++ b/.github/workflows/bench_ec2_any.yml @@ -23,6 +23,9 @@ on: always_terminate: description: Indicates if EC2 instance should always be terminated default: true + bench_extra_args: + description: Additional command line to be appended to `tests bench` script + default: '' jobs: bench-ec2-any: name: Ad-hoc benchmark on $${{ github.event.inputs.ec2_instance_type }} @@ -35,4 +38,5 @@ jobs: name: ${{ github.event.inputs.name }} store_results: ${{ github.event.inputs.store_results }} always_terminate: ${{ github.event.inputs.always_terminate }} + bench_extra_args: ${{ github.event.inputs.bench_extra_args }} secrets: inherit diff --git a/.github/workflows/bench_ec2_reusable.yml b/.github/workflows/bench_ec2_reusable.yml index a42b51f1b..1be2955a2 100644 --- a/.github/workflows/bench_ec2_reusable.yml +++ b/.github/workflows/bench_ec2_reusable.yml @@ -30,6 +30,10 @@ on: type: string description: Indicates if instance should always be terminated, even on failure default: 'true' + bench_extra_args: + type: string + description: Additional command line to be appended to `bench` script + default: '' env: AWS_ROLE: arn:aws:iam::559050233797:role/mlkem-c-aarch64-gh-action AWS_REGION: us-east-1 @@ -91,19 +95,15 @@ jobs: $(cat /proc/cpuinfo) EOF - name: Run benchmark - shell: nix develop .#ci -c bash -e {0} - run: | - tests bench -c PERF --cflags "${{ inputs.cflags }}" --arch-flags "${{ inputs.archflags }}" -v --output output.json - - name: Store benchmark result - if: ${{ inputs.store_results == 'true' }} - uses: benchmark-action/github-action-benchmark@v1 + uses: ./.github/actions/bench with: name: ${{ inputs.name }} - tool: 'customSmallerIsBetter' - output-file-path: output.json - github-token: ${{ secrets.AWS_GITHUB_TOKEN }} - auto-push: true - + cflags: ${{ inputs.cflags }} + archflags: ${{ inputs.archflags }} + perf: PERF + store_results: ${{ inputs.store_results }} + bench_extra_args: ${{ inputs.bench_extra_args }} + gh_token: ${{ secrets.AWS_GITHUB_TOKEN }} stop-ec2-runner: name: Stop ${{ github.event.inputs.name }} (${{ github.event.inputs.ec2_instance_type }}) permissions: