Skip to content

Commit 74fb240

Browse files
authored
Merge pull request #251 from ldorau/Build_libumf_pool_scalable_on_Windows
Enable pool scalable on Windows
2 parents 822250e + 948f131 commit 74fb240

21 files changed

+300
-67
lines changed

.github/workflows/basic.yml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ jobs:
178178
windows-build:
179179
name: Windows
180180
env:
181-
HWLOC_PATH: "${{github.workspace}}/build/vcpkg/packages/hwloc_x64-windows"
181+
VCPKG_PATH: "${{github.workspace}}/build/vcpkg/packages/hwloc_x64-windows;${{github.workspace}}/build/vcpkg/packages/tbb_x64-windows"
182182
strategy:
183183
matrix:
184184
os: ['windows-2019', 'windows-2022']
@@ -229,14 +229,15 @@ jobs:
229229
cmake
230230
-B ${{env.BUILD_DIR}}
231231
${{matrix.toolset}}
232-
-DCMAKE_PREFIX_PATH=${{env.HWLOC_PATH}}
232+
-DCMAKE_PREFIX_PATH="${{env.VCPKG_PATH}}"
233233
-DCMAKE_C_COMPILER=${{matrix.compiler.c}}
234234
-DCMAKE_CXX_COMPILER=${{matrix.compiler.cxx}}
235235
-DUMF_BUILD_SHARED_LIBRARY=${{matrix.shared_library}}
236236
-DUMF_ENABLE_POOL_TRACKING=${{matrix.pool_tracking}}
237237
-DUMF_FORMAT_CODE_STYLE=OFF
238238
-DUMF_DEVELOPER_MODE=ON
239239
-DUMF_BUILD_LIBUMF_POOL_DISJOINT=ON
240+
-DUMF_BUILD_LIBUMF_POOL_SCALABLE=ON
240241
-DUMF_BUILD_OS_MEMORY_PROVIDER=${{matrix.os_provider}}
241242
-DUMF_BUILD_LEVEL_ZERO_PROVIDER=OFF
242243
@@ -270,6 +271,8 @@ jobs:
270271
-DUMF_DEVELOPER_MODE=ON
271272
-DUMF_ENABLE_POOL_TRACKING=ON
272273
-DUMF_BUILD_LEVEL_ZERO_PROVIDER=OFF
274+
-DUMF_BUILD_OS_MEMORY_PROVIDER=OFF
275+
-DUMF_BUILD_LIBUMF_POOL_SCALABLE=OFF
273276
274277
- name: Build UMF
275278
run: cmake --build ${{env.BUILD_DIR}} -j $(sysctl -n hw.logicalcpu)

.github/workflows/benchmarks.yml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,8 @@ jobs:
7474
name: Windows
7575
env:
7676
BUILD_DIR : "${{github.workspace}}/build/"
77-
HWLOC_PATH: "${{github.workspace}}/build/vcpkg/packages/hwloc_x64-windows"
77+
VCPKG_PATH: "${{github.workspace}}/build/vcpkg/packages/hwloc_x64-windows;${{github.workspace}}/build/vcpkg/packages/tbb_x64-windows"
78+
VCPKG_PATH_BIN: "${{github.workspace}}/build/vcpkg/packages/hwloc_x64-windows/bin;${{github.workspace}}/build/vcpkg/packages/tbb_x64-windows/bin"
7879
strategy:
7980
fail-fast: false
8081
matrix:
@@ -104,7 +105,7 @@ jobs:
104105
-B ${{env.BUILD_DIR}}
105106
-DCMAKE_C_COMPILER=${{matrix.compiler.c}}
106107
-DCMAKE_CXX_COMPILER=${{matrix.compiler.cxx}}
107-
-DCMAKE_PREFIX_PATH=${{env.HWLOC_PATH}}
108+
-DCMAKE_PREFIX_PATH="${{env.VCPKG_PATH}}"
108109
-DUMF_BUILD_SHARED_LIBRARY=${{matrix.shared_library}}
109110
-DUMF_BUILD_BENCHMARKS=ON
110111
-DUMF_BUILD_BENCHMARKS_MT=OFF
@@ -126,6 +127,6 @@ jobs:
126127
run: |
127128
# add path to umf.dll
128129
$env:PATH += ";${{env.BUILD_DIR}}\bin\${{matrix.build_type}}"
129-
# add path to hwloc-15.dll
130-
$env:PATH += ";${{env.HWLOC_PATH}}\bin"
130+
# add path to DLL directories
131+
$env:PATH += ";${{env.VCPKG_PATH_BIN}}"
131132
.\benchmark\${{matrix.build_type}}\ubench.exe

.github/workflows/codeql.yml

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,16 @@ jobs:
2020
permissions:
2121
security-events: write
2222
env:
23-
HWLOC_PATH: "${{github.workspace}}/build/vcpkg/packages/hwloc_x64-windows"
23+
VCPKG_PATH: "${{github.workspace}}/build/vcpkg/packages/hwloc_x64-windows;${{github.workspace}}/build/vcpkg/packages/tbb_x64-windows"
2424
strategy:
2525
fail-fast: false
2626
matrix:
2727
os: [ubuntu-latest, windows-latest]
2828
include:
2929
- os: ubuntu-latest
30-
pool_scalable: 'ON'
3130
# Windows doesn't recognize 'CMAKE_BUILD_TYPE', it uses '--config' param in build command
32-
extra_build_option: ['-DCMAKE_BUILD_TYPE=Release']
31+
extra_build_option: '-DCMAKE_BUILD_TYPE=Release'
3332
- os: windows-latest
34-
pool_scalable: 'OFF'
3533
runs-on: ${{matrix.os}}
3634

3735
steps:
@@ -70,11 +68,11 @@ jobs:
7068
cmake
7169
-B ${{github.workspace}}/build
7270
${{matrix.extra_build_option}}
73-
-DCMAKE_PREFIX_PATH=${{env.HWLOC_PATH}}
71+
-DCMAKE_PREFIX_PATH="${{env.VCPKG_PATH}}"
7472
-DUMF_FORMAT_CODE_STYLE=OFF
7573
-DUMF_DEVELOPER_MODE=ON
7674
-DUMF_ENABLE_POOL_TRACKING=ON
77-
-DUMF_BUILD_LIBUMF_POOL_SCALABLE=${{matrix.pool_scalable}}
75+
-DUMF_BUILD_LIBUMF_POOL_SCALABLE=ON
7876
-DUMF_BUILD_LEVEL_ZERO_PROVIDER=OFF
7977
8078
- name: Build

.github/workflows/pr_push.yml

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,30 +14,26 @@ jobs:
1414
FastBuild:
1515
name: Fast build
1616
env:
17-
HWLOC_PATH: "${{github.workspace}}/build/vcpkg/packages/hwloc_x64-windows"
17+
VCPKG_PATH: "${{github.workspace}}/build/vcpkg/packages/hwloc_x64-windows;${{github.workspace}}/build/vcpkg/packages/tbb_x64-windows"
1818
strategy:
1919
matrix:
2020
include:
2121
- os: windows-latest
22-
pool_scalable: 'OFF'
2322
disjoint: 'OFF'
2423
jemalloc: 'OFF'
2524
# pure C build (Windows)
2625
- os: windows-latest
27-
pool_scalable: 'OFF'
2826
disjoint: 'OFF'
2927
jemalloc: 'OFF'
3028
# Tests' building is off for a pure C build
3129
extra_build_options: '-DUMF_BUILD_TESTS=OFF'
3230
- os: ubuntu-latest
33-
pool_scalable: 'ON'
3431
disjoint: 'ON'
3532
jemalloc: 'ON'
3633
# Windows doesn't recognize 'CMAKE_BUILD_TYPE', it uses '--config' param in build command
3734
extra_build_options: '-DCMAKE_BUILD_TYPE=Release -DUMF_BUILD_BENCHMARKS=ON -DUMF_BUILD_BENCHMARKS_MT=ON'
3835
# pure C build (Linux)
3936
- os: ubuntu-latest
40-
pool_scalable: 'ON'
4137
disjoint: 'OFF'
4238
jemalloc: 'ON'
4339
# Windows doesn't recognize 'CMAKE_BUILD_TYPE', it uses '--config' param in build command
@@ -72,11 +68,11 @@ jobs:
7268
run: >
7369
cmake
7470
-B ${{github.workspace}}/build
75-
-DCMAKE_PREFIX_PATH=${{env.HWLOC_PATH}}
71+
-DCMAKE_PREFIX_PATH="${{env.VCPKG_PATH}}"
7672
-DUMF_FORMAT_CODE_STYLE=OFF
7773
-DUMF_DEVELOPER_MODE=ON
7874
-DUMF_ENABLE_POOL_TRACKING=ON
79-
-DUMF_BUILD_LIBUMF_POOL_SCALABLE=${{matrix.pool_scalable}}
75+
-DUMF_BUILD_LIBUMF_POOL_SCALABLE=ON
8076
-DUMF_BUILD_LIBUMF_POOL_DISJOINT=${{matrix.disjoint}}
8177
-DUMF_BUILD_LIBUMF_POOL_JEMALLOC=${{matrix.jemalloc}}
8278
-DUMF_BUILD_TESTS=ON
@@ -89,7 +85,7 @@ jobs:
8985

9086
- name: Run examples
9187
working-directory: ${{github.workspace}}/build
92-
run: ctest --output-on-failure --test-dir examples
88+
run: ctest --output-on-failure --test-dir examples -C Release
9389

9490
CodeStyle:
9591
name: Coding style
@@ -112,6 +108,7 @@ jobs:
112108
-DUMF_BUILD_OS_MEMORY_PROVIDER=OFF
113109
-DUMF_BUILD_TESTS=OFF
114110
-DUMF_BUILD_LEVEL_ZERO_PROVIDER=OFF
111+
-DUMF_BUILD_LIBUMF_POOL_SCALABLE=OFF
115112
116113
- name: Check clang-format
117114
run: cmake --build build --target clang-format-check

.github/workflows/sanitizers.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ jobs:
111111
windows-build:
112112
name: cl and clang-cl on Windows
113113
env:
114-
HWLOC_PATH: "${{github.workspace}}/build/vcpkg/packages/hwloc_x64-windows"
114+
VCPKG_PATH: "${{github.workspace}}/build/vcpkg/packages/hwloc_x64-windows;${{github.workspace}}/build/vcpkg/packages/tbb_x64-windows"
115115
strategy:
116116
matrix:
117117
compiler: [{c: cl, cxx: cl}, {c: clang-cl, cxx: clang-cl}]
@@ -152,7 +152,7 @@ jobs:
152152
-B ${{env.BUILD_DIR}}
153153
-DCMAKE_C_COMPILER=${{matrix.compiler.c}}
154154
-DCMAKE_CXX_COMPILER=${{matrix.compiler.cxx}}
155-
-DCMAKE_PREFIX_PATH=${{env.HWLOC_PATH}}
155+
-DCMAKE_PREFIX_PATH="${{env.VCPKG_PATH}}"
156156
-DUMF_BUILD_SHARED_LIBRARY=OFF
157157
-DUMF_ENABLE_POOL_TRACKING=OFF
158158
-DUMF_FORMAT_CODE_STYLE=OFF

CMakeLists.txt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,17 @@ install(
114114
EXPORT ${PROJECT_NAME}-targets)
115115

116116
if(UMF_BUILD_OS_MEMORY_PROVIDER AND (LINUX OR WINDOWS))
117-
# Do not use pkgconfig, because it sets wrong paths on Windows
118-
find_package(LIBHWLOC REQUIRED hwloc)
117+
pkg_check_modules(LIBHWLOC hwloc)
118+
if(NOT LIBHWLOC_FOUND)
119+
find_package(LIBHWLOC REQUIRED hwloc)
120+
endif()
121+
endif()
122+
123+
if(UMF_BUILD_LIBUMF_POOL_SCALABLE AND (LINUX OR WINDOWS))
124+
pkg_check_modules(TBB tbb)
125+
if(NOT TBB_FOUND)
126+
find_package(TBB REQUIRED tbb)
127+
endif()
119128
endif()
120129

121130
add_subdirectory(src)

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ The `UMF_BUILD_LIBUMF_POOL_JEMALLOC` option has to be turned `ON` to build this
170170
2) Required packages:
171171
- libjemalloc-dev
172172

173-
#### libumf_pool_scalable (Linux-only)
173+
#### libumf_pool_scalable
174174

175175
libumf_pool_scalable is a [oneTBB](https://github.com/oneapi-src/oneTBB)-based memory pool manager built as a separate static library.
176176
The `UMF_BUILD_LIBUMF_POOL_SCALABLE` option has to be turned `ON` to build this library.
@@ -179,7 +179,7 @@ The `UMF_BUILD_LIBUMF_POOL_SCALABLE` option has to be turned `ON` to build this
179179

180180
1) The `UMF_BUILD_LIBUMF_POOL_SCALABLE` option turned `ON`
181181
2) Required packages:
182-
- libtbb-dev (libraries: libtbbmalloc.so.2)
182+
- libtbb-dev (libtbbmalloc.so.2) on Linux or tbb (tbbmalloc.dll) on Windows
183183

184184
### Memspaces (Linux-only)
185185

benchmark/CMakeLists.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,15 @@ add_dependencies(ubench
3030
umf
3131
${LIBS_OPTIONAL})
3232

33+
if(UMF_BUILD_OS_MEMORY_PROVIDER)
34+
set(LIBS_OPTIONAL ${LIBS_OPTIONAL} ${LIBHWLOC_LIBRARIES})
35+
set(LIB_DIRS_OPTIONAL ${LIB_DIRS_OPTIONAL} ${LIBHWLOC_LIBRARY_DIRS})
36+
endif()
37+
3338
target_include_directories(ubench PRIVATE ${UMF_CMAKE_SOURCE_DIR}/include/ ${UMF_CMAKE_SOURCE_DIR}/src/utils/)
3439

40+
target_link_directories(ubench PRIVATE ${LIB_DIRS_OPTIONAL})
41+
3542
target_link_libraries(ubench
3643
umf
3744
${LIBS_OPTIONAL}
@@ -40,6 +47,7 @@ target_link_libraries(ubench
4047

4148
if (UMF_BUILD_BENCHMARKS_MT)
4249
add_executable(multithread_bench multithread.cpp)
50+
target_link_directories(multithread_bench PRIVATE ${LIB_DIRS_OPTIONAL})
4351
target_link_libraries(multithread_bench
4452
umf
4553
${LIBS_OPTIONAL}

cmake/FindLIBHWLOC.cmake

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,15 @@ message(STATUS "Checking for module 'libhwloc' using find_library()")
77
find_library(LIBHWLOC_LIBRARY NAMES libhwloc hwloc)
88
set(LIBHWLOC_LIBRARIES ${LIBHWLOC_LIBRARY})
99

10-
find_file(LIBHWLOC_HEADER NAMES hwloc.h HINTS /usr/include/ ${CMAKE_PREFIX_PATH}/include)
10+
get_filename_component(LIBHWLOC_LIB_DIR ${LIBHWLOC_LIBRARIES} DIRECTORY)
11+
set(LIBHWLOC_LIBRARY_DIRS ${LIBHWLOC_LIB_DIR})
12+
13+
find_file(LIBHWLOC_HEADER NAMES hwloc.h)
1114
get_filename_component(LIBHWLOC_INCLUDE_DIR ${LIBHWLOC_HEADER} DIRECTORY)
1215
set(LIBHWLOC_INCLUDE_DIRS ${LIBHWLOC_INCLUDE_DIR})
1316

1417
if(WINDOWS)
15-
find_file(LIBHWLOC_DLL NAMES hwloc-15.dll libhwloc-15.dll HINTS ${CMAKE_PREFIX_PATH}/bin)
18+
find_file(LIBHWLOC_DLL NAMES "bin/hwloc-15.dll" "bin/libhwloc-15.dll")
1619
get_filename_component(LIBHWLOC_DLL_DIR ${LIBHWLOC_DLL} DIRECTORY)
1720
set(LIBHWLOC_DLL_DIRS ${LIBHWLOC_DLL_DIR})
1821
endif()
@@ -21,6 +24,7 @@ if(LIBHWLOC_LIBRARY)
2124
message(STATUS " Found libhwloc using find_library()")
2225
message(STATUS " LIBHWLOC_LIBRARIES = ${LIBHWLOC_LIBRARIES}")
2326
message(STATUS " LIBHWLOC_INCLUDE_DIRS = ${LIBHWLOC_INCLUDE_DIRS}")
27+
message(STATUS " LIBHWLOC_LIBRARY_DIRS = ${LIBHWLOC_LIBRARY_DIRS}")
2428
if(WINDOWS)
2529
message(STATUS " LIBHWLOC_DLL_DIRS = ${LIBHWLOC_DLL_DIRS}")
2630
endif()

cmake/FindTBB.cmake

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# Copyright (C) 2024 Intel Corporation
2+
# Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
3+
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
4+
5+
message(STATUS "Checking for module 'tbb' using find_library()")
6+
7+
find_library(TBB_LIBRARY NAMES tbbmalloc tbbmalloc)
8+
set(TBB_LIBRARIES ${TBB_LIBRARY})
9+
10+
get_filename_component(TBB_LIB_DIR ${TBB_LIBRARIES} DIRECTORY)
11+
set(TBB_LIBRARY_DIRS ${TBB_LIB_DIR})
12+
13+
find_file(TBB_HEADER NAMES "tbb/scalable_allocator.h")
14+
if(TBB_HEADER)
15+
get_filename_component(TBB_INCLUDE_DIR_TBB ${TBB_HEADER} DIRECTORY)
16+
get_filename_component(TBB_INCLUDE_DIR ${TBB_INCLUDE_DIR_TBB} DIRECTORY)
17+
set(TBB_INCLUDE_DIRS ${TBB_INCLUDE_DIR})
18+
else()
19+
set(MSG_NOT_FOUND "<tbb/scalable_allocator.h> header NOT found (set CMAKE_PREFIX_PATH to point the location)")
20+
if(TBB_FIND_REQUIRED)
21+
message(FATAL_ERROR ${MSG_NOT_FOUND})
22+
else()
23+
message(WARNING ${MSG_NOT_FOUND})
24+
endif()
25+
endif()
26+
27+
if(WINDOWS)
28+
find_file(TBB_DLL NAMES "bin/tbbmalloc.dll")
29+
get_filename_component(TBB_DLL_DIR ${TBB_DLL} DIRECTORY)
30+
set(TBB_DLL_DIRS ${TBB_DLL_DIR})
31+
endif()
32+
33+
if(TBB_LIBRARY)
34+
message(STATUS " Found tbb using find_library()")
35+
message(STATUS " TBB_LIBRARIES = ${TBB_LIBRARIES}")
36+
message(STATUS " TBB_INCLUDE_DIRS = ${TBB_INCLUDE_DIRS}")
37+
message(STATUS " TBB_LIBRARY_DIRS = ${TBB_LIBRARY_DIRS}")
38+
if(WINDOWS)
39+
message(STATUS " TBB_DLL_DIRS = ${TBB_DLL_DIRS}")
40+
endif()
41+
else()
42+
set(MSG_NOT_FOUND "tbb NOT found (set CMAKE_PREFIX_PATH to point the location)")
43+
if(TBB_FIND_REQUIRED)
44+
message(FATAL_ERROR ${MSG_NOT_FOUND})
45+
else()
46+
message(WARNING ${MSG_NOT_FOUND})
47+
endif()
48+
endif()

examples/CMakeLists.txt

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,39 @@
22
# Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
33
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
44

5-
if(UMF_BUILD_OS_MEMORY_PROVIDER
6-
AND UMF_BUILD_LIBUMF_POOL_SCALABLE
7-
AND UMF_ENABLE_POOL_TRACKING)
5+
if(UMF_BUILD_OS_MEMORY_PROVIDER AND UMF_BUILD_LIBUMF_POOL_SCALABLE AND UMF_ENABLE_POOL_TRACKING)
86
set(EXAMPLE_NAME umf_example_basic)
7+
98
add_umf_executable(NAME ${EXAMPLE_NAME}
109
SRCS basic/basic.c
1110
LIBS umf
11+
${LIBHWLOC_LIBRARIES}
1212
scalable_pool)
13+
1314
target_include_directories(${EXAMPLE_NAME} PRIVATE
15+
${UMF_CMAKE_SOURCE_DIR}/src/utils
1416
${UMF_CMAKE_SOURCE_DIR}/include)
1517

18+
target_link_directories(${EXAMPLE_NAME} PRIVATE ${LIBHWLOC_LIBRARY_DIRS})
19+
1620
add_test(NAME ${EXAMPLE_NAME}
1721
COMMAND ${EXAMPLE_NAME}
1822
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
1923

2024
set_tests_properties(${EXAMPLE_NAME} PROPERTIES LABELS "example")
2125

26+
if(WINDOWS)
27+
# append PATH to DLLs
28+
set(DLL_PATH_LIST "PATH=path_list_append:../bin/$<CONFIG>")
29+
if(LIBHWLOC_LIBRARY_DIRS)
30+
set(DLL_PATH_LIST "${DLL_PATH_LIST};PATH=path_list_append:${LIBHWLOC_LIBRARY_DIRS}/../bin")
31+
endif()
32+
if(TBB_LIBRARY_DIRS)
33+
set(DLL_PATH_LIST "${DLL_PATH_LIST};PATH=path_list_append:${TBB_LIBRARY_DIRS}/../bin")
34+
endif()
35+
set_property(TEST ${EXAMPLE_NAME} PROPERTY ENVIRONMENT_MODIFICATION "${DLL_PATH_LIST}")
36+
endif()
37+
2238
install(FILES basic/basic.c
2339
DESTINATION "${CMAKE_INSTALL_DOCDIR}/examples")
2440

examples/basic/basic.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
#include <stdio.h>
1414
#include <string.h>
1515

16+
#include "utils_common.h"
17+
1618
int main(void) {
1719
// A result object for storing UMF API result status
1820
umf_result_t res;
@@ -45,9 +47,11 @@ int main(void) {
4547
goto memory_provider_destroy;
4648
}
4749

50+
const char *strSource = "Allocated memory at";
51+
4852
// Write to the allocated memory
4953
memset(ptr_provider, '\0', alloc_size);
50-
strcpy(ptr_provider, "Allocated memory at");
54+
util_strncpy(ptr_provider, alloc_size, strSource, strlen(strSource) + 1);
5155
printf("%s %p with the memory provider at %p\n", (char *)ptr_provider,
5256
(void *)ptr_provider, (void *)provider);
5357

@@ -83,7 +87,7 @@ int main(void) {
8387
}
8488

8589
// Write a string to allocated memory
86-
strcpy(ptr, "Allocated memory at");
90+
util_strncpy(ptr, alloc_size, strSource, strlen(strSource) + 1);
8791
printf("%s %p\n", ptr, (void *)ptr);
8892

8993
// Retrieve a memory pool from a pointer, available with memory tracking

0 commit comments

Comments
 (0)