[llvm] [Offload] Add skeleton for offload conformance tests (PR #146391)
Joseph Huber via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 30 10:14:42 PDT 2025
https://github.com/jhuber6 created https://github.com/llvm/llvm-project/pull/146391
Summary:
This adds a basic outline for adding 'conformance' tests. These are
tests that are intended to check device code against a standard. In this
case, we will expect this to be filled with math conformance tests to
make sure their results are within the ULP requirements we demand.
Right now this just *assumes* the GPU libc is there, meaning you'll
likely need to do a manual `ninja` before doing `ninja -C
runtimes/runtimes-bins offload.conformance`.
>From 6229404a6bbd1b7c43bfc86dcb829b964df84606 Mon Sep 17 00:00:00 2001
From: Joseph Huber <huberjn at outlook.com>
Date: Mon, 30 Jun 2025 12:12:26 -0500
Subject: [PATCH] [Offload] Add skeleton for offload conformance tests
Summary:
This adds a basic outline for adding 'conformance' tests. These are
tests that are intended to check device code against a standard. In this
case, we will expect this to be filled with math conformance tests to
make sure their results are within the ULP requirements we demand.
Right now this just *assumes* the GPU libc is there, meaning you'll
likely need to do a manual `ninja` before doing `ninja -C
runtimes/runtimes-bins offload.conformance`.
---
offload/unittests/CMakeLists.txt | 25 +++++++++++++++++++
offload/unittests/Conformance/CMakeLists.txt | 8 ++++++
.../Conformance/device_code/CMakeLists.txt | 4 +++
.../unittests/Conformance/device_code/sin.c | 4 +++
offload/unittests/Conformance/sin.cpp | 8 ++++++
5 files changed, 49 insertions(+)
create mode 100644 offload/unittests/Conformance/CMakeLists.txt
create mode 100644 offload/unittests/Conformance/device_code/CMakeLists.txt
create mode 100644 offload/unittests/Conformance/device_code/sin.c
create mode 100644 offload/unittests/Conformance/sin.cpp
diff --git a/offload/unittests/CMakeLists.txt b/offload/unittests/CMakeLists.txt
index 7cd41e1dcdafd..1eae785b8765f 100644
--- a/offload/unittests/CMakeLists.txt
+++ b/offload/unittests/CMakeLists.txt
@@ -81,9 +81,34 @@ function(add_offload_unittest test_dirname)
target_include_directories(${target_name} PRIVATE ${PLUGINS_TEST_INCLUDE})
endfunction()
+function(add_conformance_test test_name)
+ set(target_name "${test_name}.conformance")
+
+ list(TRANSFORM ARGN PREPEND "${CMAKE_CURRENT_SOURCE_DIR}/" OUTPUT_VARIABLE files)
+
+ if(NOT TARGET libc)
+ message(WARNING "Cannot run conformance tests without the LLVM C library")
+ return()
+ endif()
+
+ add_executable(${target_name} ${files})
+ add_dependencies(${target_name} ${PLUGINS_TEST_COMMON} ${test_name}.bin)
+ target_compile_definitions(${target_name} PRIVATE DEVICE_CODE_PATH="${CONFORMANCE_TEST_DEVICE_CODE_PATH}")
+ target_link_libraries(${target_name} PRIVATE ${PLUGINS_TEST_COMMON} libc)
+ target_include_directories(${target_name} PRIVATE ${PLUGINS_TEST_INCLUDE})
+ set_target_properties(${target_name} PROPERTIES EXCLUDE_FROM_ALL TRUE)
+
+ add_custom_target(offload.conformance.${test_name}
+ COMMAND $<TARGET_FILE:${target_name}>
+ DEPENDS ${target_name}
+ COMMENT "Running conformance test ${test_name}")
+ add_dependencies(offload.conformance offload.conformance.${test_name})
+endfunction()
+
set(OFFLOAD_TESTS_FORCE_NVPTX_ARCH "" CACHE STRING
"Force building of NVPTX device code for Offload unit tests with the given arch, e.g. sm_61")
set(OFFLOAD_TESTS_FORCE_AMDGPU_ARCH "" CACHE STRING
"Force building of AMDGPU device code for Offload unit tests with the given arch, e.g. gfx1030")
add_subdirectory(OffloadAPI)
+add_subdirectory(Conformance)
diff --git a/offload/unittests/Conformance/CMakeLists.txt b/offload/unittests/Conformance/CMakeLists.txt
new file mode 100644
index 0000000000000..bc3141757372a
--- /dev/null
+++ b/offload/unittests/Conformance/CMakeLists.txt
@@ -0,0 +1,8 @@
+add_custom_target(offload.conformance)
+
+set(PLUGINS_TEST_COMMON LLVMOffload LLVMSupport)
+set(PLUGINS_TEST_INCLUDE ${LIBOMPTARGET_INCLUDE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/common)
+
+add_subdirectory(device_code)
+
+add_conformance_test(sin sin.cpp)
diff --git a/offload/unittests/Conformance/device_code/CMakeLists.txt b/offload/unittests/Conformance/device_code/CMakeLists.txt
new file mode 100644
index 0000000000000..223f04ccfb698
--- /dev/null
+++ b/offload/unittests/Conformance/device_code/CMakeLists.txt
@@ -0,0 +1,4 @@
+# FIXME: Currently missing dependencies to build GPU portion automatically.
+add_offload_test_device_code(sin.c sin)
+
+set(OFFLOAD_TEST_DEVICE_CODE_PATH ${CMAKE_CURRENT_BINARY_DIR} PARENT_SCOPE)
diff --git a/offload/unittests/Conformance/device_code/sin.c b/offload/unittests/Conformance/device_code/sin.c
new file mode 100644
index 0000000000000..e969e60f352a2
--- /dev/null
+++ b/offload/unittests/Conformance/device_code/sin.c
@@ -0,0 +1,4 @@
+#include <gpuintrin.h>
+#include <math.h>
+
+__gpu_kernel void kernel(double *out) { *out = sin(*out); }
diff --git a/offload/unittests/Conformance/sin.cpp b/offload/unittests/Conformance/sin.cpp
new file mode 100644
index 0000000000000..9e15690a9e9d7
--- /dev/null
+++ b/offload/unittests/Conformance/sin.cpp
@@ -0,0 +1,8 @@
+#include "llvm/Support/MemoryBuffer.h"
+#include "llvm/Support/raw_ostream.h"
+#include <OffloadAPI.h>
+#include <math.h>
+
+llvm::StringRef DeviceBinsDirectory = DEVICE_CODE_PATH;
+
+int main() { llvm::errs() << sin(0.0) << "\n"; }
More information about the llvm-commits
mailing list