Skip to content

Commit 57edb2d

Browse files
committed
Add new benchmarks
1 parent 508162e commit 57edb2d

File tree

3 files changed

+413
-10
lines changed

3 files changed

+413
-10
lines changed

benchmark/CMakeLists.txt

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,22 @@
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

55
# In MSVC builds, there is no way to determine the actual build type during the
66
# CMake configuration step. Therefore, this message is printed in all MSVC
77
# builds.
8+
9+
set(CMAKE_CXX_STANDARD 17)
10+
set(CMAKE_CXX_STANDARD_REQUIRED YES)
11+
12+
include(FetchContent)
13+
FetchContent_Declare(
14+
googlebenchmark
15+
GIT_REPOSITORY https://github.com/google/benchmark.git
16+
GIT_TAG v1.9.0
17+
EXCLUDE_FROM_ALL)
18+
FetchContent_MakeAvailable(googlebenchmark)
19+
820
if(WINDOWS OR NOT CMAKE_BUILD_TYPE STREQUAL "Release")
921
message(
1022
STATUS
@@ -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
@@ -117,7 +123,12 @@ endif()
117123
add_umf_benchmark(
118124
NAME ubench
119125
SRCS ubench.c
120-
LIBS ${LIBS_OPTIONAL}
126+
LIBDIRS ${LIB_DIRS})
127+
128+
add_umf_benchmark(
129+
NAME benchmark
130+
SRCS benchmark.cpp
131+
LIBS ${LIBS_OPTIONAL} benchmark::benchmark
121132
LIBDIRS ${LIB_DIRS})
122133

123134
if(UMF_BUILD_BENCHMARKS_MT)

benchmark/benchmark.cpp

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
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+
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+
ALLOC_BENCHMARK_TEMPLATE_DEFINE(pool_benchmark, disjoint_pool,
112+
disjoint_pool<os_provider>, fix_alloc_size);
113+
BENCHMARK_REGISTER_F(pool_benchmark, disjoint_pool)->Args({1000, 4096});
114+
115+
ALLOC_BENCHMARK_TEMPLATE_DEFINE(pool_benchmark, jemalloc_pool,
116+
jemalloc_pool<os_provider>, fix_alloc_size);
117+
BENCHMARK_REGISTER_F(pool_benchmark, jemalloc_pool)->Args({1000, 4096});
118+
119+
ALLOC_BENCHMARK_TEMPLATE_DEFINE(pool_benchmark, jemalloc_pool_size,
120+
jemalloc_pool<os_provider>, uniform_alloc_size);
121+
122+
BENCHMARK_REGISTER_F(pool_benchmark, jemalloc_pool_size)
123+
->Args({1000, 1, 5, 4096});
124+
125+
ALLOC_BENCHMARK_TEMPLATE_DEFINE(pool_benchmark, scalable_pool_size,
126+
scalable_pool<os_provider>, uniform_alloc_size);
127+
128+
BENCHMARK_REGISTER_F(pool_benchmark, scalable_pool_size)
129+
->Args({1000, 1, 5, 4096})
130+
->Name("scalable_pool<os_provider>");
131+
132+
BENCHMARK_MAIN();

0 commit comments

Comments
 (0)