[Mlir-commits] [mlir] 7b52552 - [mlir][test] Make SME e2e tests require an emulator (#86489)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Thu Apr 4 05:40:11 PDT 2024
Author: Andrzej WarzyĆski
Date: 2024-04-04T13:40:08+01:00
New Revision: 7b5255297dca377a37c8df066e9d9749ab96cfad
URL: https://github.com/llvm/llvm-project/commit/7b5255297dca377a37c8df066e9d9749ab96cfad
DIFF: https://github.com/llvm/llvm-project/commit/7b5255297dca377a37c8df066e9d9749ab96cfad.diff
LOG: [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.
Added:
mlir/cmake/modules/MLIRCheckHardwareFeatures.cmake
Modified:
mlir/docs/Dialects/ArmSME.md
mlir/test/CMakeLists.txt
Removed:
################################################################################
diff --git a/mlir/cmake/modules/MLIRCheckHardwareFeatures.cmake b/mlir/cmake/modules/MLIRCheckHardwareFeatures.cmake
new file mode 100644
index 00000000000000..fff0424593fb9a
--- /dev/null
+++ b/mlir/cmake/modules/MLIRCheckHardwareFeatures.cmake
@@ -0,0 +1,101 @@
+# A collection of helper CMake functions to detect hardware capabilities. At
+# the moment these are used when configuring MLIR integration tests.
+
+# Checks whether the specified hardware capability is supported by the host
+# Linux system. This is implemented by checking auxiliary vector feature
+# provided by the Linux kernel.
+#
+# check_hwcap(
+# hwcap_spec
+# output_var
+# )
+#
+# hwcap_spec - HWCAP value to check - these are defined in hwcap.h in the Linux
+# kernel.
+#
+# output_var - Output variable to use to save the results (TRUE for supported,
+# FALSE for not supported).
+#
+# EXAMPLES:
+#
+# check_hwcap("HWCAP2_SME" SME_EMULATOR_REQUIRED)
+#
+function(check_hwcap hwcap_spec output)
+ set(hwcap_test_src
+ [====[
+ #include <asm/hwcap.h>
+ #include <sys/auxv.h>
+
+ int main(void)
+ {
+ long hwcaps = getauxval(AT_<HWCAP_VEC>);
+ return (hwcaps & <HWCAP_SPEC>) != 0;
+ }
+ ]====]
+ )
+
+ # Extract from $hwcap_spec whether this is AT_HWCAP or AT_HWCAP2
+ string(FIND ${hwcap_spec} "_" wsloc)
+ string(SUBSTRING ${hwcap_spec} 0 ${wsloc} hwcap_vec)
+
+ string(REPLACE "<HWCAP_VEC>" ${hwcap_vec} hwcap_test_src "${hwcap_test_src}")
+ string(REPLACE "<HWCAP_SPEC>" ${hwcap_spec} hwcap_test_src "${hwcap_test_src}")
+
+ set(hwcap_test_file ${CMAKE_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/hwcap_check.c)
+ file(WRITE ${hwcap_test_file} "${hwcap_test_src}")
+
+ # Compile _and_ run
+ try_run(
+ test_run_result test_compile_result
+ ${CMAKE_BINARY_DIR}
+ ${hwcap_test_file}
+ )
+ # Compilation will fail if hwcap_spec is not defined - this usually means
+ # that your Linux kernel is too old.
+ if(${test_compile_result} AND (DEFINED test_run_result))
+ message(${test_run_result})
+ message(STATUS "Checking whether ${hwcap_spec} is supported by the host system: ${test_run_result}")
+ set(${output} ${test_run_result} PARENT_SCOPE)
+ else()
+ message(STATUS "Checking whether ${hwcap_spec} is supported by the host system: FALSE")
+ endif()
+endfunction(check_hwcap)
+
+# For the given group of e2e tests (defined by the `mlir_e2e_tests` flag),
+# checks whether an emulator is required. If yes, verifies that the
+# corresponding CMake var pointing to an emulator (`emulator_exec`) has been
+# set.
+#
+# check_emulator(
+# mlir_e2e_tests
+# hwcap_spec
+# emulator_exec
+# )
+#
+# mlir_e2e_tests - MLIR CMake variables corresponding to the group of e2e tests
+# to check
+# hwcap_spec - HWCAP value to check. This should correspond to the hardware
+# capabilities required by the tests to be checked. Possible
+# values are defined in hwcap.h in the Linux kernel.
+# emulator_exec - variable the defines the emulator (ought to be set if
+# required, can be empty otherwise).
+#
+# EXAMPLES:
+#
+# check_emulator(MLIR_RUN_ARM_SVE_TESTS "HWCAP_SVE" ARM_EMULATOR_EXECUTABLE)
+#
+function(check_emulator mlir_e2e_tests hwcap_spec emulator_exec)
+ if (NOT ${mlir_e2e_tests})
+ return()
+ endif()
+
+ check_hwcap(${hwcap_spec} emulator_not_required)
+ if (${emulator_not_required})
+ return()
+ endif()
+
+ if (${emulator_exec} STREQUAL "")
+ message(FATAL_ERROR "${mlir_e2e_tests} requires an emulator, but ${emulator_exec} is not set")
+ endif()
+
+endfunction()
diff --git a/mlir/docs/Dialects/ArmSME.md b/mlir/docs/Dialects/ArmSME.md
index 7326150bcd1156..ce0a76ed60f19c 100644
--- a/mlir/docs/Dialects/ArmSME.md
+++ b/mlir/docs/Dialects/ArmSME.md
@@ -6,7 +6,7 @@ This dialect defines custom and LLVM IR intrinsic operations that are used to
target Arm Scalable Matrix Extension. Through the available conversion and
ArmSME passes you can, for example, lower a
[linalg.matmul](https://mlir.llvm.org/docs/Dialects/Linalg/#linalgmatmul-linalgmatmulop)
-opereation to Arm SME
+operation to Arm SME
[FMOPA](https://developer.arm.com/documentation/ddi0602/2023-03/SME-Instructions/FMOPA--widening---Half-precision-floating-point-sum-of-outer-products-and-accumulate-)
(floating-point outer product) operations. See one of the in-tree end-to-end
integration tests for reference:
@@ -14,6 +14,14 @@ integration tests for reference:
* [Linalg/CPU/ArmSME/matmul.mlir](https://github.com/llvm/llvm-project/blob/main/mlir/test/Integration/Dialect/Linalg/CPU/ArmSME/matmul.mlir)
* [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)
+In order to run ArmSME integration tests, include these flags in the CMake
+invocation when configuring LLVM and MLIR:
+```bash
+ -DMLIR_INCLUDE_INTEGRATION_TESTS=On
+ -DMLIR_RUN_ARM_SME_TESTS=On
+ -DARM_EMULATOR_EXECUTABLE=<path-to-emulator>
+```
+
These tests are run "post-commit" by the
[clang-aarch64-sve-vla](https://lab.llvm.org/buildbot/#/builders/197) LLVM
BuildBot worker.
diff --git a/mlir/test/CMakeLists.txt b/mlir/test/CMakeLists.txt
index baf07ea1f010ac..5319a9cb33e000 100644
--- a/mlir/test/CMakeLists.txt
+++ b/mlir/test/CMakeLists.txt
@@ -1,3 +1,5 @@
+include(MLIRCheckHardwareFeatures)
+
add_subdirectory(CAPI)
add_subdirectory(lib)
@@ -39,6 +41,10 @@ if (MLIR_INCLUDE_INTEGRATION_TESTS)
option(MLIR_RUN_ARM_SVE_TESTS "Run Arm SVE tests.")
option(MLIR_RUN_ARM_SME_TESTS "Run Arm SME tests.")
+ # Check whether an emulator is required - if yes then make sure that it's
+ # been set.
+ check_emulator(MLIR_RUN_ARM_SVE_TESTS "HWCAP_SVE" ARM_EMULATOR_EXECUTABLE)
+ check_emulator(MLIR_RUN_ARM_SME_TESTS "HWCAP2_SME" ARM_EMULATOR_EXECUTABLE)
# The native target may not be enabled when cross compiling, raise an error.
if(NOT MLIR_ENABLE_EXECUTION_ENGINE)
More information about the Mlir-commits
mailing list