Skip to content

Commit 1a71a4a

Browse files
author
Alexander Batashev
authored
[SYCL] Enable kernel and program cache unit tests (#2191)
After hiding implementation details LIT tests can no longer access SYCL runtime internals. This patch introduces a new framework for creating unit tests with support for device code and re-enables kernel and program cache test suite. There are a few limitations to such tests at the moment: 1) Only static linkage with SYCL runtime is supported at the moment. 2) No support for fallback device library (disabled with new `SYCL_DEVICELIB_NO_FALLBACK` specifically for unit tests). To load SPIR-V images runtime looks for dynamic library location (either libsycl.so or sycl.dll) to build absolute path. Since SYCL runtime is linked statically, this technique doesn't work.
1 parent 5976ff0 commit 1a71a4a

File tree

13 files changed

+542
-545
lines changed

13 files changed

+542
-545
lines changed

sycl/cmake/modules/AddSYCLExecutable.cmake

+24-4
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,42 @@
11
macro(add_sycl_executable ARG_TARGET_NAME)
22
cmake_parse_arguments(ARG
33
""
4-
"OPTIONS"
5-
"SOURCES"
4+
""
5+
"OPTIONS;SOURCES;LIBRARIES;DEPENDANTS"
66
${ARGN})
77

88
set(CXX_COMPILER clang++)
99
if(MSVC)
1010
set(CXX_COMPILER clang-cl.exe)
11+
set(LIB_POSTFIX ".lib")
12+
else()
13+
set(LIB_PREFIX "-l")
1114
endif()
1215
set(DEVICE_COMPILER_EXECUTABLE ${LLVM_RUNTIME_OUTPUT_INTDIR}/${CXX_COMPILER})
1316

17+
# TODO add support for target_link_libraries(... PUBLIC ...)
18+
foreach(_lib ${ARG_LIBRARIES})
19+
list(APPEND LINKED_LIBS "${LIB_PREFIX}${_lib}${LIB_POSTFIX}")
20+
endforeach()
21+
1422
add_custom_target(${ARG_TARGET_NAME}_exec ALL
15-
COMMAND ${DEVICE_COMPILER_EXECUTABLE} -fsycl ${ARG_OPTIONS} ${ARG_SOURCES}
23+
COMMAND ${DEVICE_COMPILER_EXECUTABLE} -fsycl ${ARG_SOURCES}
1624
-o ${CMAKE_CURRENT_BINARY_DIR}/${ARG_TARGET_NAME}
25+
${LINKED_LIBS} ${ARG_OPTIONS}
1726
BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/${ARG_TARGET_NAME}
18-
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
27+
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
28+
COMMAND_EXPAND_LISTS)
1929
add_dependencies(${ARG_TARGET_NAME}_exec sycl clang)
30+
foreach(_lib in ${ARG_LIBRARIES})
31+
if (TARGET _lib)
32+
add_dependencies(${ARG_TARGET_NAME}_exec _lib)
33+
endif()
34+
endforeach()
35+
36+
foreach(_dep ${ARG_DEPENDANTS})
37+
add_dependencies(${_dep} ${ARG_TARGET_NAME}_exec)
38+
endforeach()
39+
2040

2141
add_executable(${ARG_TARGET_NAME} IMPORTED GLOBAL)
2242
set_target_properties(${ARG_TARGET_NAME} PROPERTIES
+101
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
# add_sycl_unittest(test_dirname SHARED|OBJECT file1.cpp, file2.cpp ...)
2+
#
3+
# Will compile the list of files together and link against SYCL.
4+
# Produces a binary names `basename(test_dirname)`.
5+
macro(add_sycl_unittest test_dirname link_variant)
6+
# Enable exception handling for these unit tests
7+
set(LLVM_REQUIRES_EH 1)
8+
9+
if (MSVC AND CMAKE_BUILD_TYPE MATCHES "Debug")
10+
set(sycl_obj_target "sycld_object")
11+
set(sycl_so_target "sycld")
12+
else()
13+
set(sycl_obj_target "sycl_object")
14+
set(sycl_so_target "sycl")
15+
endif()
16+
17+
if ("${link_variant}" MATCHES "SHARED")
18+
set(SYCL_LINK_LIBS ${sycl_so_target})
19+
add_unittest(SYCLUnitTests ${test_dirname} ${ARGN})
20+
else()
21+
add_unittest(SYCLUnitTests ${test_dirname}
22+
$<TARGET_OBJECTS:${sycl_obj_target}> ${ARGN})
23+
target_compile_definitions(${test_dirname} PRIVATE __SYCL_BUILD_SYCL_DLL)
24+
25+
get_target_property(SYCL_LINK_LIBS ${sycl_so_target} LINK_LIBRARIES)
26+
endif()
27+
28+
target_link_libraries(${test_dirname}
29+
PRIVATE
30+
LLVMTestingSupport
31+
OpenCL-Headers
32+
${SYCL_LINK_LIBS}
33+
)
34+
target_include_directories(${test_dirname} PRIVATE SYSTEM
35+
${sycl_inc_dir}
36+
${SYCL_SOURCE_DIR}/source/
37+
${SYCL_SOURCE_DIR}/unittests/
38+
)
39+
# LLVM gtest uses LLVM utilities that require C++-14
40+
# CXX_STANDARD_REQUIRED makes CXX_STANDARD a hard requirement.
41+
set_target_properties(${test_dirname}
42+
PROPERTIES
43+
CXX_STANDARD 14
44+
CXX_STANDARD_REQUIRED ON
45+
)
46+
endmacro()
47+
48+
macro(add_sycl_unittest_with_device test_dirname link_variant)
49+
set(LLVM_REQUIRES_EH 1)
50+
51+
if (MSVC AND CMAKE_BUILD_TYPE MATCHES "Debug")
52+
set(sycl_obj_target "sycld_object")
53+
set(sycl_so_target "sycld")
54+
set(XPTI_LIB xptid)
55+
set(WIN_CRT /MDd)
56+
else()
57+
set(sycl_obj_target "sycl_object")
58+
set(sycl_so_target "sycl")
59+
set(XPTI_LIB xpti)
60+
set(WIN_CRT /MD)
61+
endif()
62+
63+
set(COMMON_OPTS
64+
-DGTEST_LANG_CXX11=1
65+
-DGTEST_HAS_TR1_TUPLE=0
66+
-D__SYCL_BUILD_SYCL_DLL
67+
-I${LLVM_MAIN_SRC_DIR}/utils/unittest/googletest/include
68+
-I${LLVM_MAIN_SRC_DIR}/utils/unittest/googlemock/include
69+
-I${LLVM_BINARY_DIR}/include
70+
-I${LLVM_MAIN_SRC_DIR}/include
71+
-I${PROJECT_SOURCE_DIR}/source
72+
-I${PROJECT_SOURCE_DIR}/unittests
73+
)
74+
75+
if (MSVC)
76+
list(APPEND COMMON_OPTS ${WIN_CRT})
77+
list(APPEND COMMON_OPTS /EHsc)
78+
list(APPEND COMMON_OPTS /link)
79+
list(APPEND COMMON_OPTS /LIBPATH:${LLVM_BINARY_DIR}/lib)
80+
list(APPEND COMMON_OPTS /subsystem:console)
81+
list(APPEND COMMON_OPTS /INCREMENTAL:NO)
82+
83+
list(APPEND EXTRA_LIBS shlwapi)
84+
else()
85+
list(APPEND EXTRA_LIBS dl)
86+
endif()
87+
88+
if (SYCL_ENABLE_XPTI_TRACING)
89+
list(APPEND EXTRA_LIBS ${XPTI_LIB})
90+
endif()
91+
92+
if ("${link_variant}" MATCHES "OBJECT")
93+
add_sycl_executable(${test_dirname}
94+
OPTIONS -nolibsycl ${COMMON_OPTS} ${LLVM_PTHREAD_LIB}
95+
SOURCES ${ARGN} $<TARGET_OBJECTS:${sycl_obj_target}>
96+
LIBRARIES gtest_main gtest LLVMSupport LLVMTestingSupport OpenCL ${EXTRA_LIBS} ${TERMINFO_LIBS}
97+
DEPENDANTS SYCLUnitTests)
98+
else()
99+
# TODO support shared library case.
100+
endif()
101+
endmacro()

sycl/doc/EnvironmentVariables.md

+2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ subject to change. Do not rely on these variables in production code.
2424
| SYCL_DEVICELIB_INHIBIT_NATIVE | String of device library extensions (separated by a whitespace) | Do not rely on device native support for devicelib extensions listed in this option. |
2525
| SYCL_DEVICE_ALLOWLIST | A list of devices and their minimum driver version following the pattern: DeviceName:{{XXX}},DriverVersion:{{X.Y.Z.W}}. Also may contain PlatformName and PlatformVersion | Filter out devices that do not match the pattern specified. Regular expression can be passed and the DPC++ runtime will select only those devices which satisfy the regex. |
2626
| SYCL_QUEUE_THREAD_POOL_SIZE | Positive integer | Number of threads in thread pool of queue. |
27+
| SYCL_DEVICELIB_NO_FALLBACK | Any(\*) | Disable loading and linking of device library images |
28+
2729
`(*) Note: Any means this environment variable is effective when set to any non-null value.`
2830

2931
### SYCL_PRINT_EXECUTION_GRAPH Options

sycl/source/detail/config.def

+1
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,4 @@ CONFIG(SYCL_DISABLE_EXECUTION_GRAPH_CLEANUP, 1, __SYCL_DISABLE_EXECUTION_GRAPH_C
1515
CONFIG(SYCL_DEVICE_ALLOWLIST, 1024, __SYCL_DEVICE_ALLOWLIST)
1616
CONFIG(SYCL_BE, 16, __SYCL_BE)
1717
CONFIG(SYCL_PI_TRACE, 16, __SYCL_PI_TRACE)
18+
CONFIG(SYCL_DEVICELIB_NO_FALLBACK, 1, __SYCL_DEVICELIB_NO_FALLBACK)

sycl/source/detail/program_manager/program_manager.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <CL/sycl/exception.hpp>
1717
#include <CL/sycl/experimental/spec_constant.hpp>
1818
#include <CL/sycl/stl.hpp>
19+
#include <detail/config.hpp>
1920
#include <detail/context_impl.hpp>
2021
#include <detail/device_impl.hpp>
2122
#include <detail/program_impl.hpp>
@@ -380,7 +381,8 @@ RT::PiProgram ProgramManager::getBuiltPIProgram(OSModuleHandle M,
380381
// If device image is not SPIRV, DeviceLibReqMask will be 0 which means
381382
// no fallback device library will be linked.
382383
uint32_t DeviceLibReqMask = 0;
383-
if (Img.getFormat() == PI_DEVICE_BINARY_TYPE_SPIRV)
384+
if (Img.getFormat() == PI_DEVICE_BINARY_TYPE_SPIRV &&
385+
!SYCLConfig<SYCL_DEVICELIB_NO_FALLBACK>::get())
384386
DeviceLibReqMask = getDeviceLibReqMask(Img);
385387

386388
const std::vector<device> &Devices = ContextImpl->getDevices();

sycl/test/Unit/lit.cfg.py

+6
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@
3939
# force it load the default configuration.
4040
config.environment['SYCL_CONFIG_FILE_NAME'] = "null.cfg"
4141

42+
if 'SYCL_DEVICELIB_NO_FALLBACK' in os.environ:
43+
config.environment['SYCL_DEVICELIB_NO_FALLBACK'] = os.environ['SYCL_DEVICELIB_NO_FALLBACK']
44+
else:
45+
# Disable device library fallback for unit tests by default.
46+
config.environment['SYCL_DEVICELIB_NO_FALLBACK'] = "1"
47+
4248
# Propagate path to symbolizer for ASan/MSan.
4349
for symbolizer in ['ASAN_SYMBOLIZER_PATH', 'MSAN_SYMBOLIZER_PATH']:
4450
if symbolizer in os.environ:

0 commit comments

Comments
 (0)