Skip to content

Commit e5399d2

Browse files
committed
Adapt project to work on windows with L0 and GPU
1 parent 0b3ef5a commit e5399d2

17 files changed

+240
-132
lines changed

.github/workflows/codeql.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ jobs:
6363
- name: Install pip packages
6464
run: python3 -m pip install -r third_party/requirements.txt
6565

66-
# TODO enable Level Zero provider
6766
- name: Configure CMake
6867
run: >
6968
cmake

.github/workflows/gpu.yml

Lines changed: 44 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,51 +9,82 @@ permissions:
99
contents: read
1010

1111
jobs:
12-
# TODO: add support for tests on Windows
1312
gpu:
1413
name: Build
14+
env:
15+
BUILD_TYPE: Release
16+
VCPKG_PATH: "${{github.workspace}}/../../../../vcpkg/packages/hwloc_x64-windows;${{github.workspace}}/../../../../vcpkg/packages/tbb_x64-windows;${{github.workspace}}/../../../../vcpkg/packages/jemalloc_x64-windows"
1517
# run only on upstream; forks will not have the HW
1618
if: github.repository == 'oneapi-src/unified-memory-framework'
17-
1819
strategy:
1920
matrix:
20-
build_type: [Release]
21-
compiler: [{c: gcc, cxx: g++}]
2221
shared_library: ['ON', 'OFF']
23-
# TODO enable testing on DSS-WINDOWS
24-
runs-on: [ "DSS-LEVEL_ZERO", "DSS-UBUNTU" ]
22+
os: ['Ubuntu', 'Windows']
23+
include:
24+
- os: 'Ubuntu'
25+
compiler: {c: gcc, cxx: g++}
26+
number_of_processors: '$(nproc)'
27+
- os: 'Windows'
28+
compiler: {c: cl, cxx: cl}
29+
number_of_processors: '$Env:NUMBER_OF_PROCESSORS'
2530

31+
runs-on: ["DSS-LEVEL_ZERO", "DSS-${{matrix.os}}"]
2632
steps:
2733
- name: Checkout
2834
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
2935

3036
- name: Get information about platform
37+
if: matrix.os == 'Ubuntu'
3138
run: .github/scripts/get_system_info.sh
3239

33-
- name: Configure build
40+
- name: Configure build for Win
41+
if: matrix.os == 'Windows'
42+
run: >
43+
cmake
44+
-DCMAKE_PREFIX_PATH="${{env.VCPKG_PATH}}"
45+
-B ${{github.workspace}}/build
46+
-DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}
47+
-DCMAKE_C_COMPILER=${{matrix.compiler.c}}
48+
-DCMAKE_CXX_COMPILER=${{matrix.compiler.cxx}}
49+
-DUMF_BUILD_SHARED_LIBRARY=${{matrix.shared_library}}
50+
-DUMF_BUILD_BENCHMARKS=ON
51+
-DUMF_BUILD_TESTS=ON
52+
-DUMF_BUILD_GPU_TESTS=ON
53+
-DUMF_BUILD_GPU_EXAMPLES=ON
54+
-DUMF_FORMAT_CODE_STYLE=OFF
55+
-DUMF_DEVELOPER_MODE=ON
56+
-DUMF_BUILD_LIBUMF_POOL_DISJOINT=ON
57+
-DUMF_BUILD_LIBUMF_POOL_SCALABLE=ON
58+
-DUMF_BUILD_LIBUMF_POOL_JEMALLOC=ON
59+
-DUMF_BUILD_LEVEL_ZERO_PROVIDER=ON
60+
61+
- name: Configure build for Ubuntu
62+
if: matrix.os == 'Ubuntu'
3463
run: >
3564
cmake
3665
-B ${{github.workspace}}/build
37-
-DCMAKE_BUILD_TYPE=${{matrix.build_type}}
66+
-DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}
3867
-DCMAKE_C_COMPILER=${{matrix.compiler.c}}
3968
-DCMAKE_CXX_COMPILER=${{matrix.compiler.cxx}}
4069
-DUMF_BUILD_SHARED_LIBRARY=${{matrix.shared_library}}
4170
-DUMF_BUILD_BENCHMARKS=ON
4271
-DUMF_BUILD_TESTS=ON
4372
-DUMF_BUILD_GPU_TESTS=ON
4473
-DUMF_BUILD_GPU_EXAMPLES=ON
45-
-DUMF_FORMAT_CODE_STYLE=ON
74+
-DUMF_FORMAT_CODE_STYLE=OFF
4675
-DUMF_DEVELOPER_MODE=ON
4776
-DUMF_BUILD_LIBUMF_POOL_DISJOINT=ON
77+
-DUMF_BUILD_LIBUMF_POOL_SCALABLE=ON
78+
-DUMF_BUILD_LIBUMF_POOL_JEMALLOC=ON
79+
-DUMF_BUILD_LEVEL_ZERO_PROVIDER=ON
4880
4981
- name: Build UMF
50-
run: cmake --build ${{github.workspace}}/build -j $(nproc)
82+
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} -j ${{matrix.number_of_processors}}
5183

5284
- name: Run tests
5385
working-directory: ${{github.workspace}}/build
54-
run: ctest --output-on-failure --test-dir test
86+
run: ctest -C ${{env.BUILD_TYPE}} --output-on-failure --test-dir test
5587

5688
- name: Run examples
5789
working-directory: ${{github.workspace}}/build
58-
run: ctest --output-on-failure --test-dir examples -C ${{matrix.build_type}}
59-
90+
run: ctest --output-on-failure --test-dir examples -C ${{env.BUILD_TYPE}}

.github/workflows/pr_push.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,4 +168,4 @@ jobs:
168168
uses: ./.github/workflows/valgrind.yml
169169
MultiNuma:
170170
needs: [Build]
171-
uses: ./.github/workflows/multi_numa.yml
171+
uses: ./.github/workflows/multi_numa.yml

CMakeLists.txt

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ if(UMF_PROXY_LIB_BASED_ON_POOL STREQUAL SCALABLE)
224224
if(UMF_BUILD_LIBUMF_POOL_SCALABLE)
225225
set(UMF_PROXY_LIB_ENABLED ON)
226226
set(PROXY_LIB_USES_SCALABLE_POOL ON)
227-
set(PROXY_LIBS umf scalable_pool)
227+
set(PROXY_LIBS scalable_pool umf)
228228
else()
229229
message(
230230
STATUS
@@ -235,7 +235,7 @@ elseif(UMF_PROXY_LIB_BASED_ON_POOL STREQUAL JEMALLOC)
235235
if(UMF_BUILD_LIBUMF_POOL_JEMALLOC)
236236
set(UMF_PROXY_LIB_ENABLED ON)
237237
set(PROXY_LIB_USES_JEMALLOC_POOL ON)
238-
set(PROXY_LIBS umf jemalloc_pool)
238+
set(PROXY_LIBS jemalloc_pool umf)
239239
else()
240240
message(
241241
STATUS
@@ -263,6 +263,17 @@ if(UMF_BUILD_EXAMPLES)
263263
add_subdirectory(examples)
264264
endif()
265265

266+
# Conditional configuration for Level Zero provider
267+
if(UMF_BUILD_LEVEL_ZERO_PROVIDER)
268+
set(OPTIONAL_SYMBOLS "umfLevelZeroMemoryProviderOps")
269+
else()
270+
set(OPTIONAL_SYMBOLS "")
271+
endif()
272+
273+
# Configure the DEF file based on whether Level Zero provider is built
274+
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/src/libumf.def.in"
275+
"${CMAKE_CURRENT_BINARY_DIR}/src/libumf.def" @ONLY)
276+
266277
if(UMF_FORMAT_CODE_STYLE)
267278
find_program(CLANG_FORMAT NAMES clang-format-15 clang-format-15.0
268279
clang-format)

README.md

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ If the shared memory mapping is used then an anonymous file descriptor for memor
151151
Required packages for tests (Linux-only yet):
152152
- libnuma-dev
153153

154-
#### Level Zero memory provider (Linux-only yet)
154+
#### Level Zero memory provider
155155

156156
A memory provider that provides memory from L0 device.
157157

@@ -162,11 +162,10 @@ A memory provider that provides memory from L0 device.
162162

163163
Additionally, required for tests:
164164

165-
3) Linux OS
166-
4) The `UMF_BUILD_GPU_TESTS` option turned `ON`
167-
5) System with Level Zero compatible GPU
168-
6) Required packages:
169-
- liblevel-zero-dev
165+
3) The `UMF_BUILD_GPU_TESTS` option turned `ON`
166+
4) System with Level Zero compatible GPU
167+
5) Required packages:
168+
- liblevel-zero-dev (Linux) or level-zero-sdk (Windows)
170169

171170
### Memory pool managers
172171

benchmark/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ function(add_umf_benchmark)
3434

3535
set(BENCH_NAME umf-bench-${ARG_NAME})
3636

37-
set(BENCH_LIBS umf ${ARG_LIBS})
37+
set(BENCH_LIBS ${ARG_LIBS} umf)
3838

3939
add_umf_executable(
4040
NAME ${BENCH_NAME}

examples/CMakeLists.txt

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ if(UMF_BUILD_LIBUMF_POOL_SCALABLE)
88
add_umf_executable(
99
NAME ${EXAMPLE_NAME}
1010
SRCS basic/basic.c
11-
LIBS umf scalable_pool)
11+
LIBS scalable_pool umf)
1212

1313
target_include_directories(
1414
${EXAMPLE_NAME} PRIVATE ${UMF_CMAKE_SOURCE_DIR}/src/utils
@@ -37,14 +37,13 @@ endif()
3737

3838
if(UMF_BUILD_GPU_EXAMPLES
3939
AND UMF_BUILD_LIBUMF_POOL_DISJOINT
40-
AND UMF_BUILD_LEVEL_ZERO_PROVIDER
41-
AND LINUX)
40+
AND UMF_BUILD_LEVEL_ZERO_PROVIDER)
4241
set(EXAMPLE_NAME umf_example_gpu_shared_memory)
4342

4443
add_umf_executable(
4544
NAME ${EXAMPLE_NAME}
4645
SRCS basic/gpu_shared_memory.c
47-
LIBS umf disjoint_pool ze_loader)
46+
LIBS disjoint_pool ze_loader umf)
4847

4948
target_include_directories(
5049
${EXAMPLE_NAME}
@@ -73,15 +72,17 @@ else()
7372
"to be turned ON - skipping")
7473
endif()
7574

75+
# TODO: it looks like there is some problem with IPC implementation in Level
76+
# Zero on windows
7677
if(UMF_BUILD_GPU_EXAMPLES
7778
AND UMF_BUILD_LIBUMF_POOL_DISJOINT
78-
AND UMF_BUILD_LEVEL_ZERO_PROVIDER)
79+
AND LINUX)
7980
set(EXAMPLE_NAME umf_example_ipc_level_zero)
8081

8182
add_umf_executable(
8283
NAME ${EXAMPLE_NAME}
8384
SRCS basic/ipc_level_zero.c
84-
LIBS umf disjoint_pool ze_loader)
85+
LIBS disjoint_pool ze_loader umf)
8586

8687
target_include_directories(
8788
${EXAMPLE_NAME}
@@ -118,7 +119,7 @@ if(LINUX AND UMF_BUILD_LIBUMF_POOL_SCALABLE)
118119
add_umf_executable(
119120
NAME ${EX_NAME}
120121
SRCS basic/${BASE_NAME}_${loop_var}.c
121-
LIBS umf scalable_pool)
122+
LIBS scalable_pool umf)
122123

123124
target_include_directories(
124125
${EX_NAME} PRIVATE ${UMF_CMAKE_SOURCE_DIR}/src/utils

examples/basic/utils_level_zero.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,11 @@
1010
#include <stdio.h>
1111
#include <stdlib.h>
1212

13+
#ifdef _WIN32
14+
#include <ze_api.h>
15+
#else
1316
#include <level_zero/ze_api.h>
17+
#endif
1418

1519
static int init_level_zero() {
1620
ze_init_flag_t flags = ZE_INIT_FLAG_GPU_ONLY;

src/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ if(UMF_BUILD_SHARED_LIBRARY)
111111
SRCS ${UMF_SOURCES}
112112
LIBS ${UMF_LIBS}
113113
LINUX_MAP_FILE ${CMAKE_CURRENT_SOURCE_DIR}/libumf.map
114-
WINDOWS_DEF_FILE ${CMAKE_CURRENT_SOURCE_DIR}/libumf.def)
114+
WINDOWS_DEF_FILE ${CMAKE_CURRENT_BINARY_DIR}/libumf.def)
115115
set(UMF_PRIVATE_COMPILE_DEFINITIONS ${UMF_PRIVATE_COMPILE_DEFINITIONS}
116116
"UMF_SHARED_LIBRARY")
117117
set_target_properties(

src/libumf.def renamed to src/libumf.def.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,4 @@ EXPORTS
5050
umfProxyPoolOps
5151
umfPutIPCHandle
5252
umfOsMemoryProviderOps
53+
@OPTIONAL_SYMBOLS@

src/pool/pool_scalable.c

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -108,28 +108,29 @@ static int init_tbb_callbacks(tbb_callbacks_t *tbb_callbacks) {
108108
assert(tbb_callbacks);
109109

110110
const char *lib_name = tbb_symbol[TBB_LIB_NAME];
111-
tbb_callbacks->lib_handle = util_open_library(lib_name);
111+
tbb_callbacks->lib_handle = util_open_library(lib_name, 0);
112112
if (!tbb_callbacks->lib_handle) {
113113
LOG_ERR("%s not found.", lib_name);
114114
return -1;
115115
}
116116

117117
*(void **)&tbb_callbacks->pool_malloc = util_get_symbol_addr(
118-
tbb_callbacks->lib_handle, tbb_symbol[TBB_POOL_MALLOC]);
118+
tbb_callbacks->lib_handle, tbb_symbol[TBB_POOL_MALLOC], lib_name);
119119
*(void **)&tbb_callbacks->pool_realloc = util_get_symbol_addr(
120-
tbb_callbacks->lib_handle, tbb_symbol[TBB_POOL_REALLOC]);
121-
*(void **)&tbb_callbacks->pool_aligned_malloc = util_get_symbol_addr(
122-
tbb_callbacks->lib_handle, tbb_symbol[TBB_POOL_ALIGNED_MALLOC]);
120+
tbb_callbacks->lib_handle, tbb_symbol[TBB_POOL_REALLOC], lib_name);
121+
*(void **)&tbb_callbacks->pool_aligned_malloc =
122+
util_get_symbol_addr(tbb_callbacks->lib_handle,
123+
tbb_symbol[TBB_POOL_ALIGNED_MALLOC], lib_name);
123124
*(void **)&tbb_callbacks->pool_free = util_get_symbol_addr(
124-
tbb_callbacks->lib_handle, tbb_symbol[TBB_POOL_FREE]);
125+
tbb_callbacks->lib_handle, tbb_symbol[TBB_POOL_FREE], lib_name);
125126
*(void **)&tbb_callbacks->pool_create_v1 = util_get_symbol_addr(
126-
tbb_callbacks->lib_handle, tbb_symbol[TBB_POOL_CREATE_V1]);
127+
tbb_callbacks->lib_handle, tbb_symbol[TBB_POOL_CREATE_V1], lib_name);
127128
*(void **)&tbb_callbacks->pool_destroy = util_get_symbol_addr(
128-
tbb_callbacks->lib_handle, tbb_symbol[TBB_POOL_DESTROY]);
129+
tbb_callbacks->lib_handle, tbb_symbol[TBB_POOL_DESTROY], lib_name);
129130
*(void **)&tbb_callbacks->pool_identify = util_get_symbol_addr(
130-
tbb_callbacks->lib_handle, tbb_symbol[TBB_POOL_IDENTIFY]);
131+
tbb_callbacks->lib_handle, tbb_symbol[TBB_POOL_IDENTIFY], lib_name);
131132
*(void **)&tbb_callbacks->pool_msize = util_get_symbol_addr(
132-
tbb_callbacks->lib_handle, tbb_symbol[TBB_POOL_MSIZE]);
133+
tbb_callbacks->lib_handle, tbb_symbol[TBB_POOL_MSIZE], lib_name);
133134

134135
if (!tbb_callbacks->pool_malloc || !tbb_callbacks->pool_realloc ||
135136
!tbb_callbacks->pool_aligned_malloc || !tbb_callbacks->pool_free ||

src/provider/provider_level_zero.c

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,23 +57,29 @@ static UTIL_ONCE_FLAG ze_is_initialized = UTIL_ONCE_FLAG_INIT;
5757
static bool Init_ze_global_state_failed;
5858

5959
static void init_ze_global_state(void) {
60+
#ifdef _WIN32
61+
const char *lib_name = "ze_loader.dll";
62+
#else
63+
const char *lib_name = "libze_loader.so";
64+
#endif
6065
// check if Level Zero shared library is already loaded
6166
// we pass 0 as a handle to search the global symbol table
6267
*(void **)&g_ze_ops.zeMemAllocHost =
63-
util_get_symbol_addr(0, "zeMemAllocHost");
68+
util_get_symbol_addr(0, "zeMemAllocHost", lib_name);
6469
*(void **)&g_ze_ops.zeMemAllocDevice =
65-
util_get_symbol_addr(0, "zeMemAllocDevice");
70+
util_get_symbol_addr(0, "zeMemAllocDevice", lib_name);
6671
*(void **)&g_ze_ops.zeMemAllocShared =
67-
util_get_symbol_addr(0, "zeMemAllocShared");
68-
*(void **)&g_ze_ops.zeMemFree = util_get_symbol_addr(0, "zeMemFree");
72+
util_get_symbol_addr(0, "zeMemAllocShared", lib_name);
73+
*(void **)&g_ze_ops.zeMemFree =
74+
util_get_symbol_addr(0, "zeMemFree", lib_name);
6975
*(void **)&g_ze_ops.zeMemGetIpcHandle =
70-
util_get_symbol_addr(0, "zeMemGetIpcHandle");
76+
util_get_symbol_addr(0, "zeMemGetIpcHandle", lib_name);
7177
*(void **)&g_ze_ops.zeMemPutIpcHandle =
72-
util_get_symbol_addr(0, "zeMemPutIpcHandle");
78+
util_get_symbol_addr(0, "zeMemPutIpcHandle", lib_name);
7379
*(void **)&g_ze_ops.zeMemOpenIpcHandle =
74-
util_get_symbol_addr(0, "zeMemOpenIpcHandle");
80+
util_get_symbol_addr(0, "zeMemOpenIpcHandle", lib_name);
7581
*(void **)&g_ze_ops.zeMemCloseIpcHandle =
76-
util_get_symbol_addr(0, "zeMemCloseIpcHandle");
82+
util_get_symbol_addr(0, "zeMemCloseIpcHandle", lib_name);
7783

7884
if (!g_ze_ops.zeMemAllocHost || !g_ze_ops.zeMemAllocDevice ||
7985
!g_ze_ops.zeMemAllocShared || !g_ze_ops.zeMemFree ||

src/utils/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
include(${UMF_CMAKE_SOURCE_DIR}/cmake/helpers.cmake)
66
include(FindThreads)
77

8-
set(UMF_UTILS_SOURCES_COMMON utils_common.c utils_log.c)
8+
set(UMF_UTILS_SOURCES_COMMON utils_common.c utils_log.c utils_load_library.c)
99

1010
set(UMF_UTILS_SOURCES_POSIX utils_posix_common.c utils_posix_concurrency.c
1111
utils_posix_math.c)

0 commit comments

Comments
 (0)