Skip to content

Commit 91f4ad2

Browse files
committed
Add new benchmarks
1 parent 508162e commit 91f4ad2

File tree

4 files changed

+434
-10
lines changed

4 files changed

+434
-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: 37 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,17 @@ 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
78+
# of scalable pool fails if the confidence interval exceeds maximum
79+
# permitted 2.5%.
80+
set_tests_properties(
81+
${BENCH_NAME} PROPERTIES
82+
LABELS "benchmark"
83+
PASS_REGULAR_EXPRESSION "PASSED")
84+
else()
85+
set_tests_properties(${BENCH_NAME} PROPERTIES LABELS "benchmark")
86+
endif()
6587

6688
if(WINDOWS)
6789
# append PATH to DLLs
@@ -120,6 +142,12 @@ add_umf_benchmark(
120142
LIBS ${LIBS_OPTIONAL}
121143
LIBDIRS ${LIB_DIRS})
122144

145+
add_umf_benchmark(
146+
NAME benchmark
147+
SRCS benchmark.cpp
148+
LIBS ${LIBS_OPTIONAL} benchmark::benchmark
149+
LIBDIRS ${LIB_DIRS})
150+
123151
if(UMF_BUILD_BENCHMARKS_MT)
124152
add_umf_benchmark(
125153
NAME multithreaded

benchmark/benchmark.cpp

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
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 = umfDisjointPoolParamsDefault();
61+
disjoint_memory_pool_params.SlabMinSize = page_size;
62+
disjoint_memory_pool_params.MaxPoolableSize = page_size * 2;
63+
disjoint_memory_pool_params.Capacity = state.range(0);
64+
65+
disjoint_memory_pool_params.MinBucketSize = page_size;
66+
return &disjoint_memory_pool_params;
67+
}
68+
};
69+
#endif
70+
71+
#ifdef UMF_BUILD_LIBUMF_POOL_JEMALLOC
72+
template <typename T> class jemalloc_pool : public pool_interface<T> {
73+
private:
74+
virtual umf_memory_pool_ops_t *
75+
getOps([[maybe_unused]] ::benchmark::State &state) {
76+
return umfJemallocPoolOps();
77+
}
78+
virtual void *getParams([[maybe_unused]] ::benchmark::State &state) {
79+
return NULL;
80+
}
81+
};
82+
#endif
83+
84+
template <typename T> class scalable_pool : public pool_interface<T> {
85+
private:
86+
virtual umf_memory_pool_ops_t *
87+
getOps([[maybe_unused]] ::benchmark::State &state) {
88+
return umfScalablePoolOps();
89+
}
90+
virtual void *getParams([[maybe_unused]] ::benchmark::State &state) {
91+
return NULL;
92+
}
93+
};
94+
95+
// Benchmarks scenarios:
96+
97+
ALLOC_BENCHMARK_TEMPLATE_DEFINE(alloc_benchmark, stdmalloc, fix_alloc_size);
98+
BENCHMARK_REGISTER_F(alloc_benchmark, stdmalloc)->Args({1000, 4096});
99+
BENCHMARK_REGISTER_F(alloc_benchmark, stdmalloc)->Args({1000, 10 * 4096});
100+
101+
ALLOC_BENCHMARK_TEMPLATE_DEFINE(provider_benchmark, bench, os_provider,
102+
fix_alloc_size);
103+
BENCHMARK_REGISTER_F(provider_benchmark, bench)
104+
->Args({1000, 4096})
105+
->Args({1000, 100 * 4096});
106+
107+
ALLOC_BENCHMARK_TEMPLATE_DEFINE(pool_benchmark, bench, proxy_pool<os_provider>,
108+
fix_alloc_size);
109+
110+
BENCHMARK_REGISTER_F(pool_benchmark, bench)->Args({1000, 4096});
111+
112+
#ifdef UMF_BUILD_LIBUMF_POOL_DISJOINT
113+
ALLOC_BENCHMARK_TEMPLATE_DEFINE(pool_benchmark, disjoint_pool,
114+
disjoint_pool<os_provider>, fix_alloc_size);
115+
BENCHMARK_REGISTER_F(pool_benchmark, disjoint_pool)->Args({1000, 4096});
116+
#endif
117+
118+
#ifdef UMF_BUILD_LIBUMF_POOL_JEMALLOC
119+
ALLOC_BENCHMARK_TEMPLATE_DEFINE(pool_benchmark, jemalloc_pool,
120+
jemalloc_pool<os_provider>, fix_alloc_size);
121+
BENCHMARK_REGISTER_F(pool_benchmark, jemalloc_pool)->Args({1000, 4096});
122+
123+
ALLOC_BENCHMARK_TEMPLATE_DEFINE(pool_benchmark, jemalloc_pool_size,
124+
jemalloc_pool<os_provider>, uniform_alloc_size);
125+
126+
BENCHMARK_REGISTER_F(pool_benchmark, jemalloc_pool_size)
127+
->Args({1000, 1, 5, 4096});
128+
#endif
129+
130+
ALLOC_BENCHMARK_TEMPLATE_DEFINE(pool_benchmark, scalable_pool_size,
131+
scalable_pool<os_provider>, uniform_alloc_size);
132+
133+
BENCHMARK_REGISTER_F(pool_benchmark, scalable_pool_size)
134+
->Args({1000, 1, 5, 4096});
135+
136+
BENCHMARK_MAIN();

0 commit comments

Comments
 (0)