Skip to content

Commit 9ae8e2f

Browse files
authored
[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 e707e66 commit 9ae8e2f

File tree

8 files changed

+171
-33
lines changed

8 files changed

+171
-33
lines changed

sycl/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -402,7 +402,7 @@ add_custom_target( sycl-toolchain ALL
402402
)
403403

404404
if (WIN32)
405-
add_dependencies(sycl-toolchain ur_win_proxy_loader)
405+
add_dependencies(sycl-toolchain ur_win_proxy_loader unified-runtimed-build)
406406
endif()
407407

408408
if("cuda" IN_LIST SYCL_ENABLE_BACKENDS)

sycl/cmake/modules/FetchUnifiedRuntime.cmake

+107
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,113 @@ if("native_cpu" IN_LIST SYCL_ENABLE_BACKENDS)
317317
endif()
318318
endif()
319319

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

sycl/ur_win_proxy_loader/CMakeLists.txt

+1
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

+21-23
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

+1
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ set(UR_CONFORMANCE_TARGET_TRIPLES "" CACHE STRING
6666
set(UR_CONFORMANCE_AMD_ARCH "" CACHE STRING "AMD device target ID to build CTS binaries for")
6767
option(UR_CONFORMANCE_ENABLE_MATCH_FILES "Enable CTS match files" ON)
6868
option(UR_CONFORMANCE_TEST_LOADER "Also test the loader in the conformance tests" OFF)
69+
option(UR_USE_DEBUG_POSTFIX "Enable debug postfix 'd' for libraries" OFF)
6970
set(UR_ADAPTER_LEVEL_ZERO_SOURCE_DIR "" CACHE PATH
7071
"Path to external 'level_zero' adapter source dir")
7172
set(UR_ADAPTER_OPENCL_SOURCE_DIR "" CACHE PATH

unified-runtime/cmake/helpers.cmake

+25-1
Original file line numberDiff line numberDiff line change
@@ -197,20 +197,44 @@ function(add_ur_library name)
197197
$<$<STREQUAL:$<TARGET_LINKER_FILE_NAME:${name}>,link.exe>:LINKER:/DEPENDENTLOADFLAG:0x2000>
198198
)
199199
endif()
200+
if(UR_USE_DEBUG_POSTFIX)
201+
set_target_properties(${name} PROPERTIES DEBUG_POSTFIX d)
202+
endif()
200203
if(UR_EXTERNAL_DEPENDENCIES)
201204
add_dependencies(${name} ${UR_EXTERNAL_DEPENDENCIES})
202205
endif()
206+
add_dependencies(unified-runtime-libraries ${name})
203207
endfunction()
204208

209+
if(NOT TARGET unified-runtime-libraries)
210+
add_custom_target(unified-runtime-libraries)
211+
endif()
212+
205213
function(install_ur_library name)
206214
install(TARGETS ${name}
215+
COMPONENT unified-runtime
207216
EXPORT ${PROJECT_NAME}-targets
208217
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
209218
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
210-
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT unified-runtime
219+
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
211220
)
212221
endfunction()
213222

223+
if(UR_USE_DEBUG_POSTFIX AND NOT TARGET install-unified-runtime-libraries)
224+
add_custom_target(install-unified-runtime-libraries
225+
COMMAND ${CMAKE_COMMAND}
226+
-DCOMPONENT=unified-runtime
227+
-P ${CMAKE_BINARY_DIR}/cmake_install.cmake
228+
COMMAND ${CMAKE_COMMAND}
229+
-DCOMPONENT=umfd
230+
-P ${CMAKE_BINARY_DIR}/cmake_install.cmake
231+
DEPENDS unified-runtime-libraries
232+
)
233+
if(TARGET build_umfd)
234+
add_dependencies(install-unified-runtime-libraries build_umfd)
235+
endif()
236+
endif()
237+
214238
include(FetchContent)
215239

216240
function(FetchSource GIT_REPOSITORY GIT_TAG GIT_DIR DEST)

unified-runtime/source/common/ur_util.hpp

+11-3
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

+4-5
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)