Skip to content

[SYCL] Enable kernel and program cache unit tests #2191

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 11 commits into from
Aug 6, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 24 additions & 4 deletions sycl/cmake/modules/AddSYCLExecutable.cmake
Original file line number Diff line number Diff line change
@@ -1,22 +1,42 @@
macro(add_sycl_executable ARG_TARGET_NAME)
cmake_parse_arguments(ARG
""
"OPTIONS"
"SOURCES"
""
"OPTIONS;SOURCES;LIBRARIES;DEPENDANTS"
${ARGN})

set(CXX_COMPILER clang++)
if(MSVC)
set(CXX_COMPILER clang-cl.exe)
set(LIB_POSTFIX ".lib")
else()
set(LIB_PREFIX "-l")
endif()
set(DEVICE_COMPILER_EXECUTABLE ${LLVM_RUNTIME_OUTPUT_INTDIR}/${CXX_COMPILER})

# TODO add support for target_link_libraries(... PUBLIC ...)
foreach(_lib ${ARG_LIBRARIES})
list(APPEND LINKED_LIBS "${LIB_PREFIX}${_lib}${LIB_POSTFIX}")
endforeach()

add_custom_target(${ARG_TARGET_NAME}_exec ALL
COMMAND ${DEVICE_COMPILER_EXECUTABLE} -fsycl ${ARG_OPTIONS} ${ARG_SOURCES}
COMMAND ${DEVICE_COMPILER_EXECUTABLE} -fsycl ${ARG_SOURCES}
-o ${CMAKE_CURRENT_BINARY_DIR}/${ARG_TARGET_NAME}
${LINKED_LIBS} ${ARG_OPTIONS}
BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/${ARG_TARGET_NAME}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMAND_EXPAND_LISTS)
add_dependencies(${ARG_TARGET_NAME}_exec sycl clang)
foreach(_lib in ${ARG_LIBRARIES})
if (TARGET _lib)
add_dependencies(${ARG_TARGET_NAME}_exec _lib)
endif()
endforeach()

foreach(_dep ${ARG_DEPENDANTS})
add_dependencies(${_dep} ${ARG_TARGET_NAME}_exec)
endforeach()


add_executable(${ARG_TARGET_NAME} IMPORTED GLOBAL)
set_target_properties(${ARG_TARGET_NAME} PROPERTIES
Expand Down
101 changes: 101 additions & 0 deletions sycl/cmake/modules/AddSYCLUnitTest.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
# add_sycl_unittest(test_dirname SHARED|OBJECT file1.cpp, file2.cpp ...)
#
# Will compile the list of files together and link against SYCL.
# Produces a binary names `basename(test_dirname)`.
macro(add_sycl_unittest test_dirname link_variant)
# Enable exception handling for these unit tests
set(LLVM_REQUIRES_EH 1)

if (MSVC AND CMAKE_BUILD_TYPE MATCHES "Debug")
set(sycl_obj_target "sycld_object")
set(sycl_so_target "sycld")
else()
set(sycl_obj_target "sycl_object")
set(sycl_so_target "sycl")
endif()

if ("${link_variant}" MATCHES "SHARED")
set(SYCL_LINK_LIBS ${sycl_so_target})
add_unittest(SYCLUnitTests ${test_dirname} ${ARGN})
else()
add_unittest(SYCLUnitTests ${test_dirname}
$<TARGET_OBJECTS:${sycl_obj_target}> ${ARGN})
target_compile_definitions(${test_dirname} PRIVATE __SYCL_BUILD_SYCL_DLL)

get_target_property(SYCL_LINK_LIBS ${sycl_so_target} LINK_LIBRARIES)
endif()

target_link_libraries(${test_dirname}
PRIVATE
LLVMTestingSupport
OpenCL-Headers
${SYCL_LINK_LIBS}
)
target_include_directories(${test_dirname} PRIVATE SYSTEM
${sycl_inc_dir}
${SYCL_SOURCE_DIR}/source/
${SYCL_SOURCE_DIR}/unittests/
)
# LLVM gtest uses LLVM utilities that require C++-14
# CXX_STANDARD_REQUIRED makes CXX_STANDARD a hard requirement.
set_target_properties(${test_dirname}
PROPERTIES
CXX_STANDARD 14
CXX_STANDARD_REQUIRED ON
)
endmacro()

macro(add_sycl_unittest_with_device test_dirname link_variant)
set(LLVM_REQUIRES_EH 1)

if (MSVC AND CMAKE_BUILD_TYPE MATCHES "Debug")
set(sycl_obj_target "sycld_object")
set(sycl_so_target "sycld")
set(XPTI_LIB xptid)
set(WIN_CRT /MDd)
else()
set(sycl_obj_target "sycl_object")
set(sycl_so_target "sycl")
set(XPTI_LIB xpti)
set(WIN_CRT /MD)
endif()

set(COMMON_OPTS
-DGTEST_LANG_CXX11=1
-DGTEST_HAS_TR1_TUPLE=0
-D__SYCL_BUILD_SYCL_DLL
-I${LLVM_MAIN_SRC_DIR}/utils/unittest/googletest/include
-I${LLVM_MAIN_SRC_DIR}/utils/unittest/googlemock/include
-I${LLVM_BINARY_DIR}/include
-I${LLVM_MAIN_SRC_DIR}/include
-I${PROJECT_SOURCE_DIR}/source
-I${PROJECT_SOURCE_DIR}/unittests
)

if (MSVC)
list(APPEND COMMON_OPTS ${WIN_CRT})
list(APPEND COMMON_OPTS /EHsc)
list(APPEND COMMON_OPTS /link)
list(APPEND COMMON_OPTS /LIBPATH:${LLVM_BINARY_DIR}/lib)
list(APPEND COMMON_OPTS /subsystem:console)
list(APPEND COMMON_OPTS /INCREMENTAL:NO)

list(APPEND EXTRA_LIBS shlwapi)
else()
list(APPEND EXTRA_LIBS dl)
endif()

if (SYCL_ENABLE_XPTI_TRACING)
list(APPEND EXTRA_LIBS ${XPTI_LIB})
endif()

if ("${link_variant}" MATCHES "OBJECT")
add_sycl_executable(${test_dirname}
OPTIONS -nolibsycl ${COMMON_OPTS} ${LLVM_PTHREAD_LIB}
SOURCES ${ARGN} $<TARGET_OBJECTS:${sycl_obj_target}>
LIBRARIES gtest_main gtest LLVMSupport LLVMTestingSupport OpenCL ${EXTRA_LIBS} ${TERMINFO_LIBS}
DEPENDANTS SYCLUnitTests)
else()
# TODO support shared library case.
endif()
endmacro()
4 changes: 3 additions & 1 deletion sycl/doc/EnvironmentVariables.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Environment Variables

This document describes environment variables that are having effect on DPC++
This document describes environment variables that are having effect on DPC++
compiler and runtime.

## Controlling DPC++ RT
Expand All @@ -24,6 +24,8 @@ subject to change. Do not rely on these variables in production code.
| 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. |
| 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. |
| SYCL_QUEUE_THREAD_POOL_SIZE | Positive integer | Number of threads in thread pool of queue. |
| SYCL_DEVICELIB_NO_FALLBACK | Any(\*) | Disable loading and linking of device library images |

`(*) Note: Any means this environment variable is effective when set to any non-null value.`

### SYCL_PRINT_EXECUTION_GRAPH Options
Expand Down
1 change: 1 addition & 0 deletions sycl/source/detail/config.def
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,4 @@ CONFIG(SYCL_DISABLE_EXECUTION_GRAPH_CLEANUP, 1, __SYCL_DISABLE_EXECUTION_GRAPH_C
CONFIG(SYCL_DEVICE_ALLOWLIST, 1024, __SYCL_DEVICE_ALLOWLIST)
CONFIG(SYCL_BE, 16, __SYCL_BE)
CONFIG(SYCL_PI_TRACE, 16, __SYCL_PI_TRACE)
CONFIG(SYCL_DEVICELIB_NO_FALLBACK, 1, __SYCL_DEVICELIB_NO_FALLBACK)
4 changes: 3 additions & 1 deletion sycl/source/detail/program_manager/program_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include <CL/sycl/exception.hpp>
#include <CL/sycl/experimental/spec_constant.hpp>
#include <CL/sycl/stl.hpp>
#include <detail/config.hpp>
#include <detail/context_impl.hpp>
#include <detail/device_impl.hpp>
#include <detail/program_impl.hpp>
Expand Down Expand Up @@ -380,7 +381,8 @@ RT::PiProgram ProgramManager::getBuiltPIProgram(OSModuleHandle M,
// If device image is not SPIRV, DeviceLibReqMask will be 0 which means
// no fallback device library will be linked.
uint32_t DeviceLibReqMask = 0;
if (Img.getFormat() == PI_DEVICE_BINARY_TYPE_SPIRV)
if (Img.getFormat() == PI_DEVICE_BINARY_TYPE_SPIRV &&
!SYCLConfig<SYCL_DEVICELIB_NO_FALLBACK>::get())
DeviceLibReqMask = getDeviceLibReqMask(Img);

const std::vector<device> &Devices = ContextImpl->getDevices();
Expand Down
6 changes: 6 additions & 0 deletions sycl/test/Unit/lit.cfg.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,12 @@
# force it load the default configuration.
config.environment['SYCL_CONFIG_FILE_NAME'] = "null.cfg"

if 'SYCL_DEVICELIB_NO_FALLBACK' in os.environ:
config.environment['SYCL_DEVICELIB_NO_FALLBACK'] = os.environ['SYCL_DEVICELIB_NO_FALLBACK']
else:
# Disable device library fallback for unit tests by default.
config.environment['SYCL_DEVICELIB_NO_FALLBACK'] = "1"

# Propagate path to symbolizer for ASan/MSan.
for symbolizer in ['ASAN_SYMBOLIZER_PATH', 'MSAN_SYMBOLIZER_PATH']:
if symbolizer in os.environ:
Expand Down
Loading