Skip to content

Commit 7b52552

Browse files
authored
[mlir][test] Make SME e2e tests require an emulator (#86489)
Integration tests for ArmSME require an emulator (there's no hardware available). Make sure that CMake complains if `MLIR_RUN_ARM_SME_TESTS` is set while `ARM_EMULATOR_EXECUTABLE` is empty. I'm also adding a note in the docs for future reference.
1 parent bbd259a commit 7b52552

File tree

3 files changed

+116
-1
lines changed

3 files changed

+116
-1
lines changed
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
# A collection of helper CMake functions to detect hardware capabilities. At
2+
# the moment these are used when configuring MLIR integration tests.
3+
4+
# Checks whether the specified hardware capability is supported by the host
5+
# Linux system. This is implemented by checking auxiliary vector feature
6+
# provided by the Linux kernel.
7+
#
8+
# check_hwcap(
9+
# hwcap_spec
10+
# output_var
11+
# )
12+
#
13+
# hwcap_spec - HWCAP value to check - these are defined in hwcap.h in the Linux
14+
# kernel.
15+
#
16+
# output_var - Output variable to use to save the results (TRUE for supported,
17+
# FALSE for not supported).
18+
#
19+
# EXAMPLES:
20+
#
21+
# check_hwcap("HWCAP2_SME" SME_EMULATOR_REQUIRED)
22+
#
23+
function(check_hwcap hwcap_spec output)
24+
set(hwcap_test_src
25+
[====[
26+
#include <asm/hwcap.h>
27+
#include <sys/auxv.h>
28+
29+
int main(void)
30+
{
31+
long hwcaps = getauxval(AT_<HWCAP_VEC>);
32+
return (hwcaps & <HWCAP_SPEC>) != 0;
33+
}
34+
]====]
35+
)
36+
37+
# Extract from $hwcap_spec whether this is AT_HWCAP or AT_HWCAP2
38+
string(FIND ${hwcap_spec} "_" wsloc)
39+
string(SUBSTRING ${hwcap_spec} 0 ${wsloc} hwcap_vec)
40+
41+
string(REPLACE "<HWCAP_VEC>" ${hwcap_vec} hwcap_test_src "${hwcap_test_src}")
42+
string(REPLACE "<HWCAP_SPEC>" ${hwcap_spec} hwcap_test_src "${hwcap_test_src}")
43+
44+
set(hwcap_test_file ${CMAKE_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/hwcap_check.c)
45+
file(WRITE ${hwcap_test_file} "${hwcap_test_src}")
46+
47+
# Compile _and_ run
48+
try_run(
49+
test_run_result test_compile_result
50+
${CMAKE_BINARY_DIR}
51+
${hwcap_test_file}
52+
)
53+
# Compilation will fail if hwcap_spec is not defined - this usually means
54+
# that your Linux kernel is too old.
55+
if(${test_compile_result} AND (DEFINED test_run_result))
56+
message(${test_run_result})
57+
message(STATUS "Checking whether ${hwcap_spec} is supported by the host system: ${test_run_result}")
58+
set(${output} ${test_run_result} PARENT_SCOPE)
59+
else()
60+
message(STATUS "Checking whether ${hwcap_spec} is supported by the host system: FALSE")
61+
endif()
62+
endfunction(check_hwcap)
63+
64+
# For the given group of e2e tests (defined by the `mlir_e2e_tests` flag),
65+
# checks whether an emulator is required. If yes, verifies that the
66+
# corresponding CMake var pointing to an emulator (`emulator_exec`) has been
67+
# set.
68+
#
69+
# check_emulator(
70+
# mlir_e2e_tests
71+
# hwcap_spec
72+
# emulator_exec
73+
# )
74+
#
75+
# mlir_e2e_tests - MLIR CMake variables corresponding to the group of e2e tests
76+
# to check
77+
# hwcap_spec - HWCAP value to check. This should correspond to the hardware
78+
# capabilities required by the tests to be checked. Possible
79+
# values are defined in hwcap.h in the Linux kernel.
80+
# emulator_exec - variable the defines the emulator (ought to be set if
81+
# required, can be empty otherwise).
82+
#
83+
# EXAMPLES:
84+
#
85+
# check_emulator(MLIR_RUN_ARM_SVE_TESTS "HWCAP_SVE" ARM_EMULATOR_EXECUTABLE)
86+
#
87+
function(check_emulator mlir_e2e_tests hwcap_spec emulator_exec)
88+
if (NOT ${mlir_e2e_tests})
89+
return()
90+
endif()
91+
92+
check_hwcap(${hwcap_spec} emulator_not_required)
93+
if (${emulator_not_required})
94+
return()
95+
endif()
96+
97+
if (${emulator_exec} STREQUAL "")
98+
message(FATAL_ERROR "${mlir_e2e_tests} requires an emulator, but ${emulator_exec} is not set")
99+
endif()
100+
101+
endfunction()

mlir/docs/Dialects/ArmSME.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,22 @@ This dialect defines custom and LLVM IR intrinsic operations that are used to
66
target Arm Scalable Matrix Extension. Through the available conversion and
77
ArmSME passes you can, for example, lower a
88
[linalg.matmul](https://mlir.llvm.org/docs/Dialects/Linalg/#linalgmatmul-linalgmatmulop)
9-
opereation to Arm SME
9+
operation to Arm SME
1010
[FMOPA](https://developer.arm.com/documentation/ddi0602/2023-03/SME-Instructions/FMOPA--widening---Half-precision-floating-point-sum-of-outer-products-and-accumulate-)
1111
(floating-point outer product) operations. See one of the in-tree end-to-end
1212
integration tests for reference:
1313

1414
* [Linalg/CPU/ArmSME/matmul.mlir](https://github.com/llvm/llvm-project/blob/main/mlir/test/Integration/Dialect/Linalg/CPU/ArmSME/matmul.mlir)
1515
* [Vector/CPU/ArmSME/test-outerproduct-f64.mlir](https://github.com/llvm/llvm-project/blob/main/mlir/test/Integration/Dialect/Vector/CPU/ArmSME/test-outerproduct-f64.mlir)
1616

17+
In order to run ArmSME integration tests, include these flags in the CMake
18+
invocation when configuring LLVM and MLIR:
19+
```bash
20+
-DMLIR_INCLUDE_INTEGRATION_TESTS=On
21+
-DMLIR_RUN_ARM_SME_TESTS=On
22+
-DARM_EMULATOR_EXECUTABLE=<path-to-emulator>
23+
```
24+
1725
These tests are run "post-commit" by the
1826
[clang-aarch64-sve-vla](https://lab.llvm.org/buildbot/#/builders/197) LLVM
1927
BuildBot worker.

mlir/test/CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
include(MLIRCheckHardwareFeatures)
2+
13
add_subdirectory(CAPI)
24
add_subdirectory(lib)
35

@@ -39,6 +41,10 @@ if (MLIR_INCLUDE_INTEGRATION_TESTS)
3941
option(MLIR_RUN_ARM_SVE_TESTS "Run Arm SVE tests.")
4042
option(MLIR_RUN_ARM_SME_TESTS "Run Arm SME tests.")
4143

44+
# Check whether an emulator is required - if yes then make sure that it's
45+
# been set.
46+
check_emulator(MLIR_RUN_ARM_SVE_TESTS "HWCAP_SVE" ARM_EMULATOR_EXECUTABLE)
47+
check_emulator(MLIR_RUN_ARM_SME_TESTS "HWCAP2_SME" ARM_EMULATOR_EXECUTABLE)
4248

4349
# The native target may not be enabled when cross compiling, raise an error.
4450
if(NOT MLIR_ENABLE_EXECUTION_ENGINE)

0 commit comments

Comments
 (0)