Skip to content

Commit

Permalink
[build] Disable WebGPU for Windows non-release builds
Browse files Browse the repository at this point in the history
The Windows build is currently much slower than the macOS/Linux builds on CI,
especially on mostly cached builds.
Based on profiling on #2981, this is caused by the repo mapping stage for dawn
taking several minutes of Windows. Disable the experimental WebGPU feature on
Windows to better meet compile time constraints. Release builds remain
unaffected.
Fetching WPT also contributes here. Only fetch/use WPT on Unix and only
configure targets based on globs as we start using them, Bazel configures
90,000 targets for it otherwise.
  • Loading branch information
fhanau committed Nov 8, 2024
1 parent df6d46c commit eae12ea
Show file tree
Hide file tree
Showing 10 changed files with 44 additions and 80 deletions.
29 changes: 17 additions & 12 deletions .bazelrc
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,13 @@ import %workspace%/build/ci.bazelrc

import %workspace%/build/lint.bazelrc

# Enable webgpu
build --//src/workerd/io:enable_experimental_webgpu=True
# Enable webgpu. Merely fetching the required Dawn library and computing the repo mapping based on
# it slows down the Windows build significantly, so only enable this on Unix and for Windows release
# builds. This is mostly motivated by compile time constraints, we hope to lift this limitation
# again if this Windows performance bottleneck gets fixed within Bazel.
build:unix --config=webgpu
build:release_windows --config=webgpu
build:webgpu --//src/workerd/io:enable_experimental_webgpu=True

# Avoid generating duplicate runfile trees. This will become the default in a future bazel version.
build --nolegacy_external_runfiles
Expand All @@ -38,16 +43,16 @@ build --incompatible_disallow_empty_glob
# Prevents bazel cache invalidation when switching terminals
build --incompatible_strict_action_env

# Dawn tint build flags
build --@dawn//src/tint:tint_build_glsl_writer=False
build --@dawn//src/tint:tint_build_glsl_validator=False
build --@dawn//src/tint:tint_build_hlsl_writer=True
build --@dawn//src/tint:tint_build_ir=False
build --@dawn//src/tint:tint_build_msl_writer=True
build --@dawn//src/tint:tint_build_spv_reader=False
build --@dawn//src/tint:tint_build_spv_writer=True
build --@dawn//src/tint:tint_build_wgsl_reader=True
build --@dawn//src/tint:tint_build_wgsl_writer=True
# Dawn tint build flags. Only enable when building with webgpu support
build:webgpu --@dawn//src/tint:tint_build_glsl_writer=False
build:webgpu --@dawn//src/tint:tint_build_glsl_validator=False
build:webgpu --@dawn//src/tint:tint_build_hlsl_writer=True
build:webgpu --@dawn//src/tint:tint_build_ir=False
build:webgpu --@dawn//src/tint:tint_build_msl_writer=True
build:webgpu --@dawn//src/tint:tint_build_spv_reader=False
build:webgpu --@dawn//src/tint:tint_build_spv_writer=True
build:webgpu --@dawn//src/tint:tint_build_wgsl_reader=True
build:webgpu --@dawn//src/tint:tint_build_wgsl_writer=True

# Our dependencies (ICU, zlib, etc.) produce a lot of these warnings, so we disable them. Depending
# on the clang version, zlib either produces warnings for -Wdeprecated-non-prototype or does not
Expand Down
27 changes: 1 addition & 26 deletions .github/workflows/_bazel.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,15 +35,6 @@ jobs:
- uses: actions/checkout@v4
with:
show-progress: false
- name: Cache
id: cache
uses: actions/cache@v4
with:
path: ~/bazel-disk-cache
key: bazel-disk-cache-${{ inputs.os_name }}-${{ runner.arch }}${{ inputs.suffix }}-${{ hashFiles('.bazelversion', '.bazelrc', 'WORKSPACE') }}
# Intentionally not reusing an older cache entry using a key prefix, bazel frequently
# ends up with a larger cache at the end when starting with an available cache entry,
# resulting in a snowballing cache size and cache download/upload times.
- name: Setup Linux
if: inputs.os_name == 'linux'
# Install dependencies, including clang through the LLVM APT repository. We drop the
Expand Down Expand Up @@ -94,27 +85,11 @@ jobs:
BAZEL_OUTPUT_BASE=$(bazel info output_base)
BAZEL_REPOSITORY_CACHE=$(bazel info repository_cache)
echo "Bazel cache usage statistics"
du -ms -t 1 ~/bazel-disk-cache/* $BAZEL_REPOSITORY_CACHE
du -ms -t 1 $BAZEL_REPOSITORY_CACHE
echo "Bazel output usage statistics"
du -ms -t 1 $BAZEL_OUTPUT_BASE
echo "Workspace usage statistics"
du -ms -t 1 $GITHUB_WORKSPACE
- name: Drop large Bazel cache files
if: always()
# Github has a nominal 10GB of storage for all cached builds associated with a project.
# Drop large files (>100MB) in our cache to improve shared build cache efficiency. This is
# particularly helpful for asan and debug builds that produce larger executables. Also
# the process of saving the Bazel disk cache generates a tarball on the runners disk, and
# it is possible to run out of storage in that process (does not fail the workflow).
shell: bash
run: |
if [ -d ~/bazel-disk-cache ]; then
find ~/bazel-disk-cache -size +100M -type f -exec rm {} \;
echo "Trimmed Bazel cache usage statistics"
du -ms -t 1 ~/bazel-disk-cache/*
else
echo "Disk cache does not exist: ~/bazel-disk-cache"
fi
- name: Bazel shutdown
# Check that there are no .bazelrc issues that prevent shutdown.
run: bazel shutdown
10 changes: 1 addition & 9 deletions .github/workflows/npm-types.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,6 @@ jobs:
- uses: actions/checkout@v4
with:
show-progress: false
- name: Cache
id: cache
uses: actions/cache@v4
# Use same cache and build configuration as release build, this allows us to keep download
# sizes small and generate types with optimization enabled, should be slightly faster.
with:
path: ~/bazel-disk-cache
key: bazel-disk-cache-release-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.bazelversion', '.bazelrc', 'WORKSPACE') }}
- name: Setup Linux
run: |
export DEBIAN_FRONTEND=noninteractive
Expand All @@ -56,7 +48,7 @@ jobs:
echo "build:linux --host_action_env=CC=/usr/lib/llvm-16/bin/clang --host_action_env=CXX=/usr/lib/llvm-16/bin/clang++" >> .bazelrc
- name: build types
run: |
bazel build --disk_cache=~/bazel-disk-cache --strip=always --remote_cache=https://bazel:${{ secrets.BAZEL_CACHE_KEY }}@bazel-remote-cache.devprod.cloudflare.dev --config=ci --config=release_linux //types:types
bazel build --strip=always --remote_cache=https://bazel:${{ secrets.BAZEL_CACHE_KEY }}@bazel-remote-cache.devprod.cloudflare.dev --config=ci --config=release_linux //types:types
- name: Build package
run: node npm/scripts/build-types-package.mjs
env:
Expand Down
10 changes: 1 addition & 9 deletions .github/workflows/npm.yml
Original file line number Diff line number Diff line change
Expand Up @@ -87,14 +87,6 @@ jobs:
with:
node-version: 18

- name: Cache
id: cache
uses: actions/cache@v4
# Use same cache and build configuration as release build, this allows us to keep download
# sizes small and generate types with optimization enabled, should be slightly faster.
with:
path: ~/bazel-disk-cache
key: bazel-disk-cache-release-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.bazelversion', '.bazelrc', 'WORKSPACE') }}
- name: Setup Linux
run: |
export DEBIAN_FRONTEND=noninteractive
Expand All @@ -107,7 +99,7 @@ jobs:
echo "build:linux --host_action_env=CC=/usr/lib/llvm-16/bin/clang --host_action_env=CXX=/usr/lib/llvm-16/bin/clang++" >> .bazelrc
- name: Build type generating Worker
run: |
bazel build --disk_cache=~/bazel-disk-cache --strip=always --remote_cache=https://bazel:${{ secrets.BAZEL_CACHE_KEY }}@bazel-remote-cache.devprod.cloudflare.dev --config=ci --config=release_linux //types:types_worker
bazel build --strip=always --remote_cache=https://bazel:${{ secrets.BAZEL_CACHE_KEY }}@bazel-remote-cache.devprod.cloudflare.dev --config=ci --config=release_linux //types:types_worker
- name: Modify package.json version
run: node npm/scripts/bump-version.mjs npm/workerd/package.json
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release-python-runtime.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ jobs:
fi
- name: Bazel build
run: |
bazel build //src/pyodide:pyodide.capnp.bin@rule --disk_cache=~/bazel-disk-cache --strip=always --remote_cache=https://bazel:${{ secrets.BAZEL_CACHE_KEY }}@bazel-remote-cache.devprod.cloudflare.dev --config=ci --config=release_linux
bazel build //src/pyodide:pyodide.capnp.bin@rule --strip=always --remote_cache=https://bazel:${{ secrets.BAZEL_CACHE_KEY }}@bazel-remote-cache.devprod.cloudflare.dev --config=ci --config=release_linux
cp bazel-bin/src/pyodide/pyodide.capnp.bin .
- name: Upload Pyodide capnproto bundle
env:
Expand Down
10 changes: 1 addition & 9 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -78,14 +78,6 @@ jobs:
- uses: actions/checkout@v4
with:
show-progress: false
- name: Cache
id: cache
uses: actions/cache@v4
with:
path: ~/bazel-disk-cache
# Use a different cache key than for tests here, otherwise the release cache could end up
# being used for test builds, where it provides little benefit.
key: bazel-disk-cache-release-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.bazelversion', '.bazelrc', 'WORKSPACE') }}
- name: Setup Linux
if: runner.os == 'Linux'
run: |
Expand Down Expand Up @@ -127,7 +119,7 @@ jobs:
# static libraries, for example the Rust STL. This is equivalent to the -Wl,-S linker
# option, symbols will not be removed.
run: |
bazel build --disk_cache=~/bazel-disk-cache --strip=always --remote_cache=https://bazel:${{ secrets.BAZEL_CACHE_KEY }}@bazel-remote-cache.devprod.cloudflare.dev --config=ci --config=${{ matrix.bazel-config }} //src/workerd/server:workerd
bazel build --strip=always --remote_cache=https://bazel:${{ secrets.BAZEL_CACHE_KEY }}@bazel-remote-cache.devprod.cloudflare.dev --config=ci --config=${{ matrix.bazel-config }} //src/workerd/server:workerd
- name: Upload binary
uses: actions/upload-artifact@v4
with:
Expand Down
15 changes: 5 additions & 10 deletions build/BUILD.wpt
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,11 @@
# Licensed under the Apache 2.0 license found in the LICENSE file or at:
# https://opensource.org/licenses/Apache-2.0

directories = glob(
["*"],
exclude = glob(
["*"],
exclude_directories = 1,
) + [
".*",
],
exclude_directories = 0,
)
# successively enable wpt targets
directories = [
"url",
"urlpattern",
]

[filegroup(
name = dir,
Expand Down
9 changes: 7 additions & 2 deletions build/ci.bazelrc
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ build:ci --verbose_failures
# increasing this closer towards the suggested value of 200. Note the number of maximum build jobs
# is controlled by the --local_resources=cpu flag and still limited to the number of cores by
# default.
build:ci --jobs=32
build:ci --jobs=48
# Do not check for changes in external repository files, should speed up bazel invocations after the first one
build:ci --noexperimental_check_external_repository_files
# Rate limit progress updates for smaller logs, default is 0.2 which leads to very frequent updates.
Expand All @@ -19,9 +19,14 @@ build:ci --color=yes
# Indicate support for more terminal columns, 100 is the line length recommended by KJ style.
build:ci --terminal_columns=100

# Only build runfile trees when needed/lazily, so that they are not built for disabled tests
build:ci --nobuild_runfile_links
# Speeds up CI build by making action output uploads non-blocking so Bazel can e.g. run a test
# before it finishes uploading the test binary. On-by-default in Bazel 8.
build:ci --experimental_remote_cache_async

build:ci --config=v8-codegen-opt
test:ci --test_output=errors
build:ci --disk_cache=~/bazel-disk-cache

# test CI jobs don't need any top-level artifacts and just verify things
build:ci-test --remote_download_outputs=minimal
Expand Down
9 changes: 9 additions & 0 deletions build/wpt_test.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ def wpt_test(name, wpt_directory, test_js):
test_name = name,
wpt_directory = wpt_directory,
test_js = test_js,
target_compatible_with = select({
"@platforms//os:windows": ["@platforms//:incompatible"],
"//conditions:default": [],
}),
)

wd_test(
Expand All @@ -28,6 +32,11 @@ def wpt_test(name, wpt_directory, test_js):
wpt_directory,
"//src/workerd/io:trimmed-supported-compatibility-date.txt",
],
# Even generating WPT tests is prohibitively expensive on Windows, disable it there
target_compatible_with = select({
"@platforms//os:windows": ["@platforms//:incompatible"],
"//conditions:default": [],
}),
)

def _wpt_test_gen_impl(ctx):
Expand Down
3 changes: 1 addition & 2 deletions src/wpt/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
filegroup(
name = "wpt-test-harness",
srcs = glob(
include = ["**/*"],
allow_empty = True,
include = ["*.js"],
),
visibility = ["//visibility:public"],
)

0 comments on commit eae12ea

Please sign in to comment.