Skip to content

Commit fa7183a

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

File tree

4 files changed

+419
-10
lines changed

4 files changed

+419
-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: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,19 @@
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 OFF CACHE BOOL "" FORCE)
13+
set(BENCHMARK_ENABLE_TESTING OFF CACHE BOOL "" FORCE)
14+
set(BENCHMARK_ENABLE_INSTALL OFF CACHE BOOL "" FORCE)
15+
FetchContent_MakeAvailable(googlebenchmark)
16+
517
# In MSVC builds, there is no way to determine the actual build type during the
618
# CMake configuration step. Therefore, this message is printed in all MSVC
719
# builds.
@@ -32,7 +44,7 @@ function(add_umf_benchmark)
3244
"${multiValueArgs}"
3345
${ARGN})
3446

35-
set(BENCH_NAME umf-bench-${ARG_NAME})
47+
set(BENCH_NAME umf-${ARG_NAME})
3648

3749
set(BENCH_LIBS ${ARG_LIBS} umf)
3850

@@ -55,13 +67,7 @@ function(add_umf_benchmark)
5567
COMMAND ${BENCH_NAME}
5668
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
5769

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")
70+
set_tests_properties(${BENCH_NAME} PROPERTIES LABELS "benchmark")
6571

6672
if(WINDOWS)
6773
# append PATH to DLLs
@@ -120,6 +126,12 @@ add_umf_benchmark(
120126
LIBS ${LIBS_OPTIONAL}
121127
LIBDIRS ${LIB_DIRS})
122128

129+
add_umf_benchmark(
130+
NAME benchmark
131+
SRCS benchmark.cpp
132+
LIBS ${LIBS_OPTIONAL} benchmark::benchmark
133+
LIBDIRS ${LIB_DIRS})
134+
123135
if(UMF_BUILD_BENCHMARKS_MT)
124136
add_umf_benchmark(
125137
NAME multithreaded

benchmark/benchmark.cpp

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
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+
#if (defined UMF_BUILD_LIBUMF_POOL_DISJOINT)
46+
47+
template <typename T> class disjoint_pool : public pool_interface<T> {
48+
umf_disjoint_pool_params_t disjoint_memory_pool_params;
49+
virtual umf_memory_pool_ops_t *
50+
getOps([[maybe_unused]] ::benchmark::State &state) override {
51+
return umfDisjointPoolOps();
52+
}
53+
virtual void *
54+
getParams([[maybe_unused]] ::benchmark::State &state) override {
55+
size_t page_size;
56+
if (umfMemoryProviderGetMinPageSize(
57+
pool_interface<T>::provider.provider, NULL, &page_size) !=
58+
UMF_RESULT_SUCCESS) {
59+
return NULL;
60+
}
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+
70+
#endif
71+
72+
#if (defined UMF_BUILD_LIBUMF_POOL_JEMALLOC)
73+
template <typename T> class jemalloc_pool : public pool_interface<T> {
74+
private:
75+
virtual umf_memory_pool_ops_t *
76+
getOps([[maybe_unused]] ::benchmark::State &state) {
77+
return umfJemallocPoolOps();
78+
}
79+
virtual void *getParams([[maybe_unused]] ::benchmark::State &state) {
80+
return NULL;
81+
}
82+
};
83+
#endif
84+
85+
template <typename T> class scalable_pool : public pool_interface<T> {
86+
private:
87+
virtual umf_memory_pool_ops_t *
88+
getOps([[maybe_unused]] ::benchmark::State &state) {
89+
return umfScalablePoolOps();
90+
}
91+
virtual void *getParams([[maybe_unused]] ::benchmark::State &state) {
92+
return NULL;
93+
}
94+
};
95+
96+
// Benchmarks scenarios:
97+
98+
ALLOC_BENCHMARK_TEMPLATE_DEFINE(alloc_benchmark, stdmalloc, fix_alloc_size);
99+
BENCHMARK_REGISTER_F(alloc_benchmark, stdmalloc)->Args({1000, 4096});
100+
BENCHMARK_REGISTER_F(alloc_benchmark, stdmalloc)->Args({1000, 10 * 4096});
101+
102+
ALLOC_BENCHMARK_TEMPLATE_DEFINE(provider_benchmark, bench, os_provider,
103+
fix_alloc_size);
104+
BENCHMARK_REGISTER_F(provider_benchmark, bench)
105+
->Args({1000, 4096})
106+
->Args({1000, 100 * 4096});
107+
108+
ALLOC_BENCHMARK_TEMPLATE_DEFINE(pool_benchmark, bench, proxy_pool<os_provider>,
109+
fix_alloc_size);
110+
111+
BENCHMARK_REGISTER_F(pool_benchmark, bench)->Args({1000, 4096});
112+
113+
#if (defined UMF_BUILD_LIBUMF_POOL_DISJOINT)
114+
ALLOC_BENCHMARK_TEMPLATE_DEFINE(pool_benchmark, disjoint_pool,
115+
disjoint_pool<os_provider>, fix_alloc_size);
116+
BENCHMARK_REGISTER_F(pool_benchmark, disjoint_pool)->Args({1000, 4096});
117+
#endif
118+
119+
#if (defined UMF_BUILD_LIBUMF_POOL_JEMALLOC)
120+
ALLOC_BENCHMARK_TEMPLATE_DEFINE(pool_benchmark, jemalloc_pool,
121+
jemalloc_pool<os_provider>, fix_alloc_size);
122+
BENCHMARK_REGISTER_F(pool_benchmark, jemalloc_pool)->Args({1000, 4096});
123+
124+
ALLOC_BENCHMARK_TEMPLATE_DEFINE(pool_benchmark, jemalloc_pool_size,
125+
jemalloc_pool<os_provider>, uniform_alloc_size);
126+
127+
BENCHMARK_REGISTER_F(pool_benchmark, jemalloc_pool_size)
128+
->Args({1000, 1, 5, 4096});
129+
#endif
130+
131+
ALLOC_BENCHMARK_TEMPLATE_DEFINE(pool_benchmark, scalable_pool_size,
132+
scalable_pool<os_provider>, uniform_alloc_size);
133+
134+
BENCHMARK_REGISTER_F(pool_benchmark, scalable_pool_size)
135+
->Args({1000, 1, 5, 4096});
136+
137+
BENCHMARK_MAIN();

0 commit comments

Comments
 (0)