Skip to content

Commit 5486149

Browse files
kbenzieKornevNikita
authored andcommitted
[SYCL][UR] Add Windows debug libs to install target (#17512)
1. Add install target for Windows debug libs called `install-unified-runtime-libraries` which installs only the runtime library subset of targets. This can be used to provide `ur_loaderd.dll` and `ur_adatper_<name>d.dll` which link against the multithreaded debug DLL C runtime by using the `DEBUG_POSTFIX` target property to append `d` to the library names. 2. Add `UR_USE_DEBUG_POSTFIX` option to enable adding the `d` suffix to library names. 3. Remove setting redundant `OUTPUT_NAME`s as combining `DEBUG_POSTFIX=d` and then setting `LIBRARY_OUTPUT_NAME`/`RUNTIME_OUTPUT_NAME` exposes a bug in CMake where the `DEBUG_POSTFIX` is ignored for the `ur_loader.dll`. Removing these redundant property setters fixed the previous issue. 4. Add debug UR subbuild on Windows `ExternalProject` compiled in debug mode and with the `UR_USE_DEBUG_POSTFIX` option enabled. * The resulting libraries are then copied to the `<build>/bin`/`<build>/lib` directories so they can be used in testing (not yet implemented). * Additionally, they are also included in the `deploy-sycl-toolchain` install target alongside the normally named runtime libraries. 5. Update `ur_proxy_loaderd.dll` to use Windows debug libs
1 parent 17bf4ef commit 5486149

File tree

8 files changed

+171
-33
lines changed

8 files changed

+171
-33
lines changed

sycl/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,7 @@ add_custom_target( sycl-toolchain ALL
405405
)
406406

407407
if (WIN32)
408-
add_dependencies(sycl-toolchain ur_win_proxy_loader)
408+
add_dependencies(sycl-toolchain ur_win_proxy_loader unified-runtimed-build)
409409
endif()
410410

411411
if("cuda" IN_LIST SYCL_ENABLE_BACKENDS)

sycl/cmake/modules/FetchUnifiedRuntime.cmake

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,113 @@ if("native_cpu" IN_LIST SYCL_ENABLE_BACKENDS)
321321
endif()
322322
endif()
323323

324+
if(CMAKE_SYSTEM_NAME STREQUAL Windows)
325+
# On Windows, also build/install debug libraries with the d suffix that are
326+
# compiled with /MDd so users can link against these in debug builds.
327+
include(ExternalProject)
328+
set(URD_BINARY_DIR ${CMAKE_BINARY_DIR}/unified-runtimed)
329+
set(URD_INSTALL_DIR ${URD_BINARY_DIR}/install)
330+
331+
# This creates a subbuild which can be used in dependencies with the
332+
# unified-runtimed target. It invokes the install-unified-runtime-libraries
333+
# target to install the UR runtime libraries.
334+
ExternalProject_Add(unified-runtimed
335+
SOURCE_DIR ${UNIFIED_RUNTIME_SOURCE_DIR}
336+
BINARY_DIR ${URD_BINARY_DIR}
337+
INSTALL_DIR ${URD_INSTALL_DIR}
338+
INSTALL_COMMAND ${CMAKE_COMMAND}
339+
--build <BINARY_DIR> --config Debug
340+
--target install-unified-runtime-libraries
341+
CMAKE_CACHE_ARGS
342+
-DCMAKE_BUILD_TYPE:STRING=Debug
343+
-DCMAKE_INSTALL_PREFIX:STRING=<INSTALL_DIR>
344+
# Enable d suffix on libraries
345+
-DUR_USE_DEBUG_POSTFIX:BOOL=ON
346+
# Don't build unnecessary targets in subbuild.
347+
-DUR_BUILD_EXAMPLES:BOOL=OFF
348+
-DUR_BUILD_TESTS:BOOL=OFF
349+
-DUR_BUILD_TOOLS:BOOL=OFF
350+
# Sanitizer layer is not supported on Windows.
351+
-DUR_ENABLE_SYMBOLIZER:BOOL=OFF
352+
# Inherit settings from parent build.
353+
-DUR_ENABLE_TRACING:BOOL=${UR_ENABLE_TRACING}
354+
-DUR_ENABLE_COMGR:BOOL=${UR_ENABLE_COMGR}
355+
-DUR_BUILD_ADAPTER_L0:BOOL=${UR_BUILD_ADAPTER_L0}
356+
-DUR_BUILD_ADAPTER_L0_V2:BOOL=${UR_BUILD_ADAPTER_L0_V2}
357+
-DUR_BUILD_ADAPTER_OPENCL:BOOL=${UR_BUILD_ADAPTER_OPENCL}
358+
-DUR_BUILD_ADAPTER_CUDA:BOOL=${UR_BUILD_ADAPTER_CUDA}
359+
-DUR_BUILD_ADAPTER_HIP:BOOL=${UR_BUILD_ADAPTER_HIP}
360+
-DUR_BUILD_ADAPTER_NATIVE_CPU:BOOL=${UR_BUILD_ADAPTER_NATIVE_CPU}
361+
-DUMF_BUILD_EXAMPLES:BOOL=${UMF_BUILD_EXAMPLES}
362+
-DUMF_BUILD_SHARED_LIBRARY:BOOL=${UMF_BUILD_SHARED_LIBRARY}
363+
-DUMF_LINK_HWLOC_STATICALLY:BOOL=${UMF_LINK_HWLOC_STATICALLY}
364+
-DUMF_DISABLE_HWLOC:BOOL=${UMF_DISABLE_HWLOC}
365+
# Enable d suffix in UMF
366+
-DUMF_USE_DEBUG_POSTFIX:BOOL=ON
367+
)
368+
369+
# Copy the debug UR runtime libraries to <build>/bin & <build>/lib for use in
370+
# the parent build, e.g. integration testing.
371+
set(URD_COPY_FILES)
372+
macro(urd_copy_library_to_build library shared)
373+
if(${shared})
374+
list(APPEND URD_COPY_FILES
375+
${LLVM_BINARY_DIR}/bin/${library}.dll
376+
)
377+
add_custom_command(
378+
OUTPUT
379+
${LLVM_BINARY_DIR}/bin/${library}.dll
380+
COMMAND ${CMAKE_COMMAND} -E copy
381+
${URD_INSTALL_DIR}/bin/${library}.dll
382+
${LLVM_BINARY_DIR}/bin/${library}.dll
383+
)
384+
endif()
385+
386+
list(APPEND URD_COPY_FILES
387+
${LLVM_BINARY_DIR}/lib/${library}.lib
388+
)
389+
add_custom_command(
390+
OUTPUT
391+
${LLVM_BINARY_DIR}/lib/${library}.lib
392+
COMMAND ${CMAKE_COMMAND} -E copy
393+
${URD_INSTALL_DIR}/lib/${library}.lib
394+
${LLVM_BINARY_DIR}/lib/${library}.lib
395+
)
396+
endmacro()
397+
398+
urd_copy_library_to_build(ur_loaderd "NOT;${UR_STATIC_LOADER}")
399+
foreach(adatper ${SYCL_ENABLE_BACKENDS})
400+
if(adapter MATCHES "level_zero")
401+
set(shared "NOT;${UR_STATIC_ADAPTER_L0}")
402+
else()
403+
set(shared TRUE)
404+
endif()
405+
urd_copy_library_to_build(ur_adapter_${adatper}d "${shared}")
406+
endforeach()
407+
# Also copy umfd.dll/umfd.lib
408+
urd_copy_library_to_build(umfd ${UMF_BUILD_SHARED_LIBRARY})
409+
410+
add_custom_target(unified-runtimed-build ALL DEPENDS ${URD_COPY_FILES})
411+
add_dependencies(unified-runtimed-build unified-runtimed)
412+
413+
# Add the debug UR runtime libraries to the parent install.
414+
install(
415+
FILES ${URD_INSTALL_DIR}/bin/ur_loaderd.dll
416+
DESTINATION "bin" COMPONENT unified-runtime-loader)
417+
foreach(adapter ${SYCL_ENABLE_BACKENDS})
418+
install(
419+
FILES ${URD_INSTALL_DIR}/bin/ur_adapter_${adapter}d.dll
420+
DESTINATION "bin" COMPONENT ur_adapter_${adapter})
421+
add_dependencies(install-sycl-ur-adapter-${adapter} unified-runtimed)
422+
endforeach()
423+
if(UMF_BUILD_SHARED_LIBRARY)
424+
# Also install umfd.dll
425+
install(
426+
FILES ${URD_INSTALL_DIR}/bin/umfd.dll
427+
DESTINATION "bin" COMPONENT unified-memory-framework)
428+
endif()
429+
endif()
430+
324431
install(TARGETS umf
325432
LIBRARY DESTINATION "lib${LLVM_LIBDIR_SUFFIX}" COMPONENT unified-memory-framework
326433
ARCHIVE DESTINATION "lib${LLVM_LIBDIR_SUFFIX}" COMPONENT unified-memory-framework

sycl/ur_win_proxy_loader/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ if (MSVC)
5757
add_library(ur_win_proxy_loaderd SHARED ur_win_proxy_loader.cpp ${CMAKE_CURRENT_BINARY_DIR}/versioninfo.rc)
5858
target_compile_options(ur_win_proxy_loaderd PRIVATE ${WINUNLOAD_CXX_FLAGS_DEBUG})
5959
target_compile_options(ur_win_proxy_loader PRIVATE ${WINUNLOAD_CXX_FLAGS_RELEASE})
60+
target_compile_definitions(ur_win_proxy_loaderd PRIVATE UR_WIN_PROXY_LOADER_DEBUG)
6061
target_link_libraries(ur_win_proxy_loaderd PRIVATE shlwapi)
6162
target_link_libraries(ur_win_proxy_loader PRIVATE shlwapi)
6263
# 0x2000: LOAD_LIBRARY_SAFE_CURRENT_DIRS flag. Using this flag means that loading dependency DLLs

sycl/ur_win_proxy_loader/ur_win_proxy_loader.cpp

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -82,24 +82,22 @@ static std::wstring getCurrentDSODir() {
8282
return Path;
8383
}
8484

85-
// these are cribbed from include/sycl/detail/ur.hpp
86-
// a new adapter must be added to both places.
8785
#ifdef _MSC_VER
88-
#define __SYCL_UNIFIED_RUNTIME_LOADER_NAME "ur_loader.dll"
89-
#define __SYCL_OPENCL_ADAPTER_NAME "ur_adapter_opencl.dll"
90-
#define __SYCL_LEVEL_ZERO_ADAPTER_NAME "ur_adapter_level_zero.dll"
91-
#define __SYCL_LEVEL_ZERO_V2_ADAPTER_NAME "ur_adapter_level_zero_v2.dll"
92-
#define __SYCL_CUDA_ADAPTER_NAME "ur_adapter_cuda.dll"
93-
#define __SYCL_HIP_ADAPTER_NAME "ur_adapter_hip.dll"
94-
#define __SYCL_NATIVE_CPU_ADAPTER_NAME "ur_adapter_native_cpu.dll"
86+
87+
#ifdef UR_WIN_PROXY_LOADER_DEBUG_POSTFIX
88+
#define UR_LIBRARY_NAME(NAME) "ur_" #NAME "d.dll"
89+
#else
90+
#define UR_LIBRARY_NAME(NAME) "ur_" #NAME ".dll"
91+
#endif
92+
9593
#else // llvm-mingw
96-
#define __SYCL_UNIFIED_RUNTIME_LOADER_NAME "libur_loader.dll"
97-
#define __SYCL_OPENCL_ADAPTER_NAME "libur_adapter_opencl.dll"
98-
#define __SYCL_LEVEL_ZERO_ADAPTER_NAME "libur_adapter_level_zero.dll"
99-
#define __SYCL_LEVEL_ZERO_V2_ADAPTER_NAME "libur_adapter_level_zero_v2.dll"
100-
#define __SYCL_CUDA_ADAPTER_NAME "libur_adapter_cuda.dll"
101-
#define __SYCL_HIP_ADAPTER_NAME "libur_adapter_hip.dll"
102-
#define __SYCL_NATIVE_CPU_ADAPTER_NAME "libur_adapter_native_cpu.dll"
94+
95+
#ifdef UR_WIN_PROXY_LOADER_DEBUG_POSTFIX
96+
#define UR_LIBRARY_NAME(NAME) "libur" #NAME "d.dll"
97+
#else
98+
#define UR_LIBRARY_NAME(NAME) "libur" #NAME ".dll"
99+
#endif
100+
103101
#endif
104102

105103
// ------------------------------------
@@ -141,13 +139,13 @@ void preloadLibraries() {
141139
};
142140
// We keep the UR Loader handle so it can be fetched by the runtime, but the
143141
// adapter libraries themselves won't be used.
144-
getDllHandle() = loadAdapter(__SYCL_UNIFIED_RUNTIME_LOADER_NAME);
145-
loadAdapter(__SYCL_OPENCL_ADAPTER_NAME);
146-
loadAdapter(__SYCL_LEVEL_ZERO_ADAPTER_NAME);
147-
loadAdapter(__SYCL_LEVEL_ZERO_V2_ADAPTER_NAME);
148-
loadAdapter(__SYCL_CUDA_ADAPTER_NAME);
149-
loadAdapter(__SYCL_HIP_ADAPTER_NAME);
150-
loadAdapter(__SYCL_NATIVE_CPU_ADAPTER_NAME);
142+
getDllHandle() = loadAdapter(UR_LIBRARY_NAME(loader));
143+
loadAdapter(UR_LIBRARY_NAME(adapter_opencl));
144+
loadAdapter(UR_LIBRARY_NAME(adapter_level_zero));
145+
loadAdapter(UR_LIBRARY_NAME(adapter_level_zero_v2));
146+
loadAdapter(UR_LIBRARY_NAME(adapter_cuda));
147+
loadAdapter(UR_LIBRARY_NAME(adapter_hip));
148+
loadAdapter(UR_LIBRARY_NAME(adapter_native_cpu));
151149

152150
// Restore system error handling.
153151
(void)SetErrorMode(SavedMode);

unified-runtime/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ set(UR_CONFORMANCE_TARGET_TRIPLES "" CACHE STRING
5959
set(UR_CONFORMANCE_AMD_ARCH "" CACHE STRING "AMD device target ID to build CTS binaries for")
6060
option(UR_CONFORMANCE_ENABLE_MATCH_FILES "Enable CTS match files" ON)
6161
option(UR_CONFORMANCE_TEST_LOADER "Also test the loader in the conformance tests" OFF)
62+
option(UR_USE_DEBUG_POSTFIX "Enable debug postfix 'd' for libraries" OFF)
6263
set(UR_ADAPTER_LEVEL_ZERO_SOURCE_DIR "" CACHE PATH
6364
"Path to external 'level_zero' adapter source dir")
6465
set(UR_ADAPTER_OPENCL_SOURCE_DIR "" CACHE PATH

unified-runtime/cmake/helpers.cmake

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,20 +206,44 @@ function(add_ur_library name)
206206
$<$<STREQUAL:$<TARGET_LINKER_FILE_NAME:${name}>,link.exe>:LINKER:/DEPENDENTLOADFLAG:0x2000>
207207
)
208208
endif()
209+
if(UR_USE_DEBUG_POSTFIX)
210+
set_target_properties(${name} PROPERTIES DEBUG_POSTFIX d)
211+
endif()
209212
if(UR_EXTERNAL_DEPENDENCIES)
210213
add_dependencies(${name} ${UR_EXTERNAL_DEPENDENCIES})
211214
endif()
215+
add_dependencies(unified-runtime-libraries ${name})
212216
endfunction()
213217

218+
if(NOT TARGET unified-runtime-libraries)
219+
add_custom_target(unified-runtime-libraries)
220+
endif()
221+
214222
function(install_ur_library name)
215223
install(TARGETS ${name}
224+
COMPONENT unified-runtime
216225
EXPORT ${PROJECT_NAME}-targets
217226
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
218227
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
219-
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT unified-runtime
228+
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
220229
)
221230
endfunction()
222231

232+
if(UR_USE_DEBUG_POSTFIX AND NOT TARGET install-unified-runtime-libraries)
233+
add_custom_target(install-unified-runtime-libraries
234+
COMMAND ${CMAKE_COMMAND}
235+
-DCOMPONENT=unified-runtime
236+
-P ${CMAKE_BINARY_DIR}/cmake_install.cmake
237+
COMMAND ${CMAKE_COMMAND}
238+
-DCOMPONENT=umfd
239+
-P ${CMAKE_BINARY_DIR}/cmake_install.cmake
240+
DEPENDS unified-runtime-libraries
241+
)
242+
if(TARGET build_umfd)
243+
add_dependencies(install-unified-runtime-libraries build_umfd)
244+
endif()
245+
endif()
246+
223247
include(FetchContent)
224248

225249
function(FetchSource GIT_REPOSITORY GIT_TAG GIT_DIR DEST)

unified-runtime/source/common/ur_util.hpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,15 +59,23 @@ int ur_duplicate_fd(int pid, int fd_in);
5959
defined(SANITIZER_THREAD)
6060
#define SANITIZER_ANY
6161
#endif
62+
6263
///////////////////////////////////////////////////////////////////////////////
64+
#if UR_USE_DEBUG_POSTFIX
65+
#define LIBRARY_NAME(NAME) NAME "d"
66+
#else
67+
#define LIBRARY_NAME(NAME) NAME
68+
#endif
69+
6370
#if defined(_WIN32)
64-
#define MAKE_LIBRARY_NAME(NAME, VERSION) NAME ".dll"
71+
#define MAKE_LIBRARY_NAME(NAME, VERSION) LIBRARY_NAME(NAME) ".dll"
6572
#define STATIC_LIBRARY_EXTENSION ".lib"
6673
#else
6774
#if defined(__APPLE__)
68-
#define MAKE_LIBRARY_NAME(NAME, VERSION) "lib" NAME "." VERSION ".dylib"
75+
#define MAKE_LIBRARY_NAME(NAME, VERSION) \
76+
"lib" LIBRARY_NAME(NAME) "." VERSION ".dylib"
6977
#else
70-
#define MAKE_LIBRARY_NAME(NAME, VERSION) "lib" NAME ".so." VERSION
78+
#define MAKE_LIBRARY_NAME(NAME, VERSION) "lib" LIBRARY_NAME(NAME) ".so." VERSION
7179
#endif
7280
#define STATIC_LIBRARY_EXTENSION ".a"
7381
#endif

unified-runtime/source/loader/CMakeLists.txt

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ add_ur_library(ur_loader
2121
)
2222
install_ur_library(ur_loader)
2323

24+
target_compile_definitions(ur_loader PRIVATE
25+
UR_USE_DEBUG_POSTFIX=$<BOOL:${UR_USE_DEBUG_POSTFIX}>
26+
)
27+
2428
if (MSVC)
2529
set(TARGET_LIBNAME ur_loader)
2630
string(TOUPPER ${TARGET_LIBNAME} TARGET_LIBNAME)
@@ -39,11 +43,6 @@ elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
3943
target_link_options(ur_loader PRIVATE "-Wl,--version-script=${LOADER_VERSION_SCRIPT}")
4044
endif()
4145

42-
set_target_properties(ur_loader PROPERTIES
43-
LIBRARY_OUTPUT_NAME ur_loader
44-
RUNTIME_OUTPUT_NAME ur_loader
45-
)
46-
4746
add_library(${PROJECT_NAME}::loader ALIAS ur_loader)
4847

4948
target_include_directories(ur_loader PRIVATE

0 commit comments

Comments
 (0)