Skip to content

Commit f97d4cf

Browse files
committed
Add new benchmarks
1 parent 508162e commit f97d4cf

File tree

4 files changed

+437
-10
lines changed

4 files changed

+437
-10
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ endif()
313313
# compiler is required. Moreover, if these options are not set, CMake will set
314314
# up a strict C build, without C++ support.
315315
set(OPTIONS_REQUIRING_CXX "UMF_BUILD_TESTS" "UMF_BUILD_LIBUMF_POOL_DISJOINT"
316-
"UMF_BUILD_BENCHMARKS_MT")
316+
"UMF_BUILD_BENCHMARKS_MT" "UMF_BUILD_BENCHMARKS")
317317
foreach(option_name ${OPTIONS_REQUIRING_CXX})
318318
if(${option_name})
319319
enable_language(CXX)

benchmark/CMakeLists.txt

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,25 @@
1-
# Copyright (C) 2023 Intel Corporation
1+
# Copyright (C) 2023-2024 Intel Corporation
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+
include(FetchContent)
6+
FetchContent_Declare(
7+
googlebenchmark
8+
GIT_REPOSITORY https://github.com/google/benchmark.git
9+
GIT_TAG v1.9.0
10+
EXCLUDE_FROM_ALL)
11+
12+
set(BENCHMARK_ENABLE_GTEST_TESTS
13+
OFF
14+
CACHE BOOL "" FORCE)
15+
set(BENCHMARK_ENABLE_TESTING
16+
OFF
17+
CACHE BOOL "" FORCE)
18+
set(BENCHMARK_ENABLE_INSTALL
19+
OFF
20+
CACHE BOOL "" FORCE)
21+
FetchContent_MakeAvailable(googlebenchmark)
22+
523
# In MSVC builds, there is no way to determine the actual build type during the
624
# CMake configuration step. Therefore, this message is printed in all MSVC
725
# builds.
@@ -32,7 +50,7 @@ function(add_umf_benchmark)
3250
"${multiValueArgs}"
3351
${ARGN})
3452

35-
set(BENCH_NAME umf-bench-${ARG_NAME})
53+
set(BENCH_NAME umf-${ARG_NAME})
3654

3755
set(BENCH_LIBS ${ARG_LIBS} umf)
3856

@@ -55,13 +73,21 @@ function(add_umf_benchmark)
5573
COMMAND ${BENCH_NAME}
5674
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
5775

58-
# Benchmark passes if it prints "PASSED" in the output, because ubench of
59-
# scalable pool fails if the confidence interval exceeds maximum permitted
60-
# 2.5%.
61-
set_tests_properties(
62-
${BENCH_NAME} PROPERTIES
63-
LABELS "benchmark"
64-
PASS_REGULAR_EXPRESSION "PASSED")
76+
if("${BENCH_NAME}" STREQUAL "umf-ubench")
77+
# Benchmark passes if it prints "PASSED" in the output, because ubench of
78+
# scalable pool fails if the confidence interval exceeds maximum permitted
79+
# 2.5%.
80+
set_tests_properties(${BENCH_NAME}
81+
PROPERTIES
82+
LABELS "benchmark"
83+
PASS_REGULAR_EXPRESSION "PASSED"
84+
)
85+
else()
86+
set_tests_properties(${BENCH_NAME}
87+
PROPERTIES
88+
LABELS "benchmark"
89+
)
90+
endif()
6591

6692
if(WINDOWS)
6793
# append PATH to DLLs
@@ -120,6 +146,12 @@ add_umf_benchmark(
120146
LIBS ${LIBS_OPTIONAL}
121147
LIBDIRS ${LIB_DIRS})
122148

149+
add_umf_benchmark(
150+
NAME benchmark
151+
SRCS benchmark.cpp
152+
LIBS ${LIBS_OPTIONAL} benchmark::benchmark
153+
LIBDIRS ${LIB_DIRS})
154+
123155
if(UMF_BUILD_BENCHMARKS_MT)
124156
add_umf_benchmark(
125157
NAME multithreaded

benchmark/benchmark.cpp

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
/*
2+
* Copyright (C) 2024 Intel Corporation
3+
*
4+
* Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
5+
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
*
7+
*/
8+
9+
#include <benchmark/benchmark.h>
10+
#include <umf/pools/pool_proxy.h>
11+
#include <umf/pools/pool_scalable.h>
12+
#include <umf/providers/provider_level_zero.h>
13+
#include <umf/providers/provider_os_memory.h>
14+
15+
#ifdef UMF_BUILD_LIBUMF_POOL_DISJOINT
16+
#include <umf/pools/pool_disjoint.h>
17+
#endif
18+
19+
#ifdef UMF_BUILD_LIBUMF_POOL_JEMALLOC
20+
#include <umf/pools/pool_jemalloc.h>
21+
#endif
22+
23+
#include "benchmark.hpp"
24+
25+
struct os_provider : public provider_interface {
26+
umf_os_memory_provider_params_t params = umfOsMemoryProviderParamsDefault();
27+
virtual void *getParams() override { return &params; }
28+
virtual umf_memory_provider_ops_t *getOps() override {
29+
return umfOsMemoryProviderOps();
30+
}
31+
};
32+
33+
template <typename T> class proxy_pool : public pool_interface<T> {
34+
private:
35+
virtual umf_memory_pool_ops_t *
36+
getOps([[maybe_unused]] ::benchmark::State &state) override {
37+
return umfProxyPoolOps();
38+
}
39+
virtual void *
40+
getParams([[maybe_unused]] ::benchmark::State &state) override {
41+
return nullptr;
42+
}
43+
};
44+
45+
#ifdef UMF_BUILD_LIBUMF_POOL_DISJOINT
46+
template <typename T> class disjoint_pool : public pool_interface<T> {
47+
umf_disjoint_pool_params_t disjoint_memory_pool_params;
48+
virtual umf_memory_pool_ops_t *
49+
getOps([[maybe_unused]] ::benchmark::State &state) override {
50+
return umfDisjointPoolOps();
51+
}
52+
virtual void *
53+
getParams([[maybe_unused]] ::benchmark::State &state) override {
54+
size_t page_size;
55+
if (umfMemoryProviderGetMinPageSize(
56+
pool_interface<T>::provider.provider, NULL, &page_size) !=
57+
UMF_RESULT_SUCCESS) {
58+
return NULL;
59+
}
60+
disjoint_memory_pool_params.SlabMinSize = page_size;
61+
disjoint_memory_pool_params.MaxPoolableSize = page_size * 2;
62+
disjoint_memory_pool_params.Capacity = state.range(0);
63+
64+
disjoint_memory_pool_params.MinBucketSize = page_size;
65+
return &disjoint_memory_pool_params;
66+
}
67+
};
68+
#endif
69+
70+
#ifdef UMF_BUILD_LIBUMF_POOL_JEMALLOC
71+
template <typename T> class jemalloc_pool : public pool_interface<T> {
72+
private:
73+
virtual umf_memory_pool_ops_t *
74+
getOps([[maybe_unused]] ::benchmark::State &state) {
75+
return umfJemallocPoolOps();
76+
}
77+
virtual void *getParams([[maybe_unused]] ::benchmark::State &state) {
78+
return NULL;
79+
}
80+
};
81+
#endif
82+
83+
template <typename T> class scalable_pool : public pool_interface<T> {
84+
private:
85+
virtual umf_memory_pool_ops_t *
86+
getOps([[maybe_unused]] ::benchmark::State &state) {
87+
return umfScalablePoolOps();
88+
}
89+
virtual void *getParams([[maybe_unused]] ::benchmark::State &state) {
90+
return NULL;
91+
}
92+
};
93+
94+
// Benchmarks scenarios:
95+
96+
ALLOC_BENCHMARK_TEMPLATE_DEFINE(alloc_benchmark, stdmalloc, fix_alloc_size);
97+
BENCHMARK_REGISTER_F(alloc_benchmark, stdmalloc)->Args({1000, 4096});
98+
BENCHMARK_REGISTER_F(alloc_benchmark, stdmalloc)->Args({1000, 10 * 4096});
99+
100+
ALLOC_BENCHMARK_TEMPLATE_DEFINE(provider_benchmark, bench, os_provider,
101+
fix_alloc_size);
102+
BENCHMARK_REGISTER_F(provider_benchmark, bench)
103+
->Args({1000, 4096})
104+
->Args({1000, 100 * 4096});
105+
106+
ALLOC_BENCHMARK_TEMPLATE_DEFINE(pool_benchmark, bench, proxy_pool<os_provider>,
107+
fix_alloc_size);
108+
109+
BENCHMARK_REGISTER_F(pool_benchmark, bench)->Args({1000, 4096});
110+
111+
#ifdef UMF_BUILD_LIBUMF_POOL_DISJOINT
112+
ALLOC_BENCHMARK_TEMPLATE_DEFINE(pool_benchmark, disjoint_pool,
113+
disjoint_pool<os_provider>, fix_alloc_size);
114+
BENCHMARK_REGISTER_F(pool_benchmark, disjoint_pool)->Args({1000, 4096});
115+
#endif
116+
117+
#ifdef UMF_BUILD_LIBUMF_POOL_JEMALLOC
118+
ALLOC_BENCHMARK_TEMPLATE_DEFINE(pool_benchmark, jemalloc_pool,
119+
jemalloc_pool<os_provider>, fix_alloc_size);
120+
BENCHMARK_REGISTER_F(pool_benchmark, jemalloc_pool)->Args({1000, 4096});
121+
122+
ALLOC_BENCHMARK_TEMPLATE_DEFINE(pool_benchmark, jemalloc_pool_size,
123+
jemalloc_pool<os_provider>, uniform_alloc_size);
124+
125+
BENCHMARK_REGISTER_F(pool_benchmark, jemalloc_pool_size)
126+
->Args({1000, 1, 5, 4096});
127+
#endif
128+
129+
ALLOC_BENCHMARK_TEMPLATE_DEFINE(pool_benchmark, scalable_pool_size,
130+
scalable_pool<os_provider>, uniform_alloc_size);
131+
132+
BENCHMARK_REGISTER_F(pool_benchmark, scalable_pool_size)
133+
->Args({1000, 1, 5, 4096});
134+
135+
BENCHMARK_MAIN();

0 commit comments

Comments
 (0)