Skip to content

Commit 5c63de2

Browse files
authored
[SYCL][E2E][Doc] Add info on e2e build-only/run-only modes (#16409)
1 parent 4fd899a commit 5c63de2

File tree

1 file changed

+109
-0
lines changed

1 file changed

+109
-0
lines changed

sycl/test-e2e/README.md

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,3 +372,112 @@ Note: please avoid using `REQUIRES: TEMPORARY_DISABLED` for this purpose, it's
372372
a non-standard mechanism. Use `UNSUPPORTED: true` instead, we track
373373
`UNSUPPORTED` tests using the mechanism described above. Otherwise the test
374374
risks remaining untraceable.
375+
376+
## Compiling and executing tests on separate systems
377+
378+
The execution of e2e tests can be separated into compilation and execution
379+
stages via the `test-mode` lit parameter. This allows us to reduce testing time
380+
by compiling tests on more powerful systems and reusing the binaries on other
381+
machines. By default the `test-mode` parameter is set to `full`, indicating
382+
that both stages will run. This parameter can be set to `build-only`, or
383+
`run-only`, to only run the compilation stage, or the execution stage
384+
respectively.
385+
386+
**NOTE:** This feature is a work-in-progress and current limitations are expected
387+
to be addressed in the near future.
388+
389+
The modes work as follow:
390+
### `--param test-mode=full`
391+
This is the default mode tests run in. Tests are marked as unsupported if no
392+
device on the machine can fulfill the `REQUIRES`/`UNSUPPORTED` statements. In
393+
this mode all `RUN:` lines are executed normally, and two extra features are
394+
added: the `build-and-run-mode` and `run-mode`.
395+
396+
To make a test only run in `full` mode add a `REQUIRES: build-and-run-mode` line.
397+
398+
### `--param test-mode=build-only`
399+
This mode can be used to compile all test binaries. To do this all `UNSUPPORTED`
400+
and `REQUIRES` statements are ignored unless they contain `UNSUPPORTED: true` or
401+
`REQUIRES: build-and-run-mode`. All `RUN:` lines within a test are ran in this
402+
mode unless they contain the following expansions: `%{run}`,
403+
`%{run-unfiltered-devices}`, or `%if run-mode`.
404+
405+
Currently, the only triple supported for `build-only` mode is `spir64`.
406+
407+
#### `build-only` future work
408+
Note, the fact that `build-only` ignores general `UNSUPPORTED`/`REQUIRES`
409+
statements is a current limitation. The logic for taking into account the
410+
features that affect compilation, and ignoring those that are only relevant to
411+
the execution of the program is currently being worked on.
412+
413+
### `--param test-mode=run-only`
414+
In this mode, tests will not be compiled, they will only run. To do this only the
415+
`RUN:` lines that contain `%{run}`, `%{run-unfiltered-devices}` or `%if run-mode`
416+
are executed. Tests are marked as unsupported in the same manner as `full` mode.
417+
Since tests are not compiled in this mode, for any test to pass the test
418+
binaries should already be in the `test_exec_root` directory, either by having
419+
ran `full` or `build-only` modes previously on the system, or having
420+
transferred the test binaries into that directory. The `run-mode` feature is
421+
added when in this mode.
422+
423+
### Resolving common Issues with separate compilation and execution:
424+
A number of extra considerations need to be taken to write tests that are able
425+
to be compiled and executed on separate machines.
426+
427+
- Tests that build and execute multiple binaries need to be written such that
428+
the output of each compilation has a different name. This way no files are
429+
overwritten, and all the necessary binaries can be transferred to the running
430+
system.
431+
432+
- Two scenarios need to be considered for tests that expectedly fail:
433+
- Tests that are expected to fail on compilation, and thus also during
434+
execution, need to be marked as `XFAIL` with a feature that is device
435+
agnostic, or with `XFAIL: *`. Device agnostic features are those which are
436+
added added through a method other than processing the output of sycl-ls, for
437+
example the OS, or the presence of a library. This needs to be done because
438+
sycl-ls is not ran in `build-only` mode.
439+
- If the expected failure occurs during run-time we will need to mark the test
440+
with `XFAIL` on a device specific feature (A feature that we add through
441+
processing sycl-ls output), or if its expected to always fail on run-time we
442+
can use `XFAIL: run-mode`. This is because otherwise the test would compile
443+
and pass on `build-only` mode and be reported as an `XPASS`.
444+
445+
- To separate compilation and execution of tests, we classify `RUN:` directives
446+
as being either build or run lines. If a line contains `%{run}`,
447+
`%{run-unfiltered-devices}` or `%if run-mode` it is classified as a run line,
448+
otherwise it is classified as a build line.
449+
- All `RUN:` lines that execute test binaries should be marked with either
450+
`%{run}` or `%{run-unfiltered-devices}`. Otherwise they will be incorrectly
451+
marked as a build line, likely causing a failure at the `build-only` stage as
452+
we try to execute the program without having the appropriate devices.
453+
- The vast majority of `RUN:` lines that do not execute the test binaries are
454+
needed to either set up files prior to compilation, or to compile the binary,
455+
as such `RUN:` lines are by default considered as build lines. In the case
456+
that we need to run a line on the `run-only` system, and it does not make
457+
sense to mark them with `%{run}` or `%{run-unfiltered-devices}`, we can mark
458+
a line with `%if run-mode` to specifically make the line a run line. This
459+
situation usually appears when we need to run a command in response to the
460+
execution of the test binary.
461+
462+
- Currently the `build-only` mode does not support logic to properly assess the
463+
features in `REQUIRES`/`UNSUPPORTED` to know if a test can be built in the
464+
system environment, or for `spir64`. Only tests that are marked with
465+
`REQUIRES: build-and-run-mode` or `UNSUPPORTED: true` are skipped. Thus if a
466+
test will fail building for the build environment we have on CI or for `spir64`
467+
we will need to mark this as `REQUIRES: build-and-run-mode`. This is only
468+
temporary solution, until further work is done to properly mark tests as
469+
unsupported on `build-only` based on features.
470+
471+
- CPU and FPGA AOT tests are currently expected to fail when compiling and
472+
executing on separate machines. These failures occur on the `run-only` side,
473+
because during compilation the host machine's CPU architecture is targeted,
474+
which may be different than that of the running machine. These tests are marked
475+
as `REQUIRES: build-and-run-mode` as a result, until they can be refactored to
476+
compile for the architectures that will be used on the run side.
477+
478+
### Falling back to `full` testing mode on `run-only`
479+
To not lose coverage of tests marked as `REQUIRES: build-and-run-mode` when
480+
using `run-only` mode, lit can be called using
481+
`--param fallback-to-build-if-requires-build-and-run=True`. When this option is
482+
enabled in `run-only` mode, tests marked as requiring `build-and-run-mode` will
483+
fallback to running on `full` mode, instead of being reported as unsupported.

0 commit comments

Comments
 (0)