From 6af0a0821eb211a1484c69e5213cdd943023efeb Mon Sep 17 00:00:00 2001 From: Dmitriy Zaytsev Date: Tue, 13 Oct 2026 10:37:19 +0300 Subject: [PATCH] Add bazel to project --- .github/workflows/bazel.yaml | 41 ++++++++++++++++++++++++++ .gitignore | 12 ++++++++ README.md | 32 +++++++++++++++++++++ src/.bazelrc | 1 + src/.bazelversion | 1 + src/MODULE.bazel | 8 ++++++ src/lib/BUILD | 14 +++++++++ src/lib/memcpy_bench.cc | 54 +++++++++++++++++++++++++++++++++++ src/lib/memcpy_bench.h | 13 +++++++++ src/main/BUILD | 9 ++++++ src/main/main.cc | 6 ++++ src/test/BUILD | 11 +++++++ src/test/memcpy_bench_test.cc | 15 ++++++++++ 13 files changed, 217 insertions(+) create mode 100644 .github/workflows/bazel.yaml create mode 100644 .gitignore create mode 100644 src/.bazelrc create mode 100644 src/.bazelversion create mode 100644 src/MODULE.bazel create mode 100644 src/lib/BUILD create mode 100644 src/lib/memcpy_bench.cc create mode 100644 src/lib/memcpy_bench.h create mode 100644 src/main/BUILD create mode 100644 src/main/main.cc create mode 100644 src/test/BUILD create mode 100644 src/test/memcpy_bench_test.cc diff --git a/.github/workflows/bazel.yaml b/.github/workflows/bazel.yaml new file mode 100644 index 0000000..50f2d12 --- /dev/null +++ b/.github/workflows/bazel.yaml @@ -0,0 +1,41 @@ +name: Bazel + +on: + pull_request: + branches: + - main + push: + branches: + - main + +jobs: + test: + runs-on: ubuntu-latest + + defaults: + run: + # MODULE.bazel and .bazelversion live in src/ + working-directory: src + + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + + - uses: bazel-contrib/setup-bazel@c5acdfb288317d0b5c0bbd7a396a3dc868bb0f86 # 0.19.0 + with: + bazelisk-cache: true + disk-cache: ${{ github.workflow }} + repository-cache: true + # Pull requests only restore caches, pushes to main refresh them + cache-save: ${{ github.event_name == 'push' }} + bazelrc: | + common --announce_rc + common --color=yes + + - name: Bazel version + run: bazel version + + - name: Build + run: bazel build //... + + - name: Test + run: bazel test //... --test_output=errors diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7db0bd7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +# Bazel +*~ +bazel-* +*MODULE.bazel.lock +/.ijwb/ +/.aswb/ +/.clwb/ + +# IDEs +.idea +.vscode +.vs diff --git a/README.md b/README.md index 9dfa274..99b5b71 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,34 @@ # memcopy-bench DevTools 2026 Research Project. Violet Team + +# Setup + +We use [Bazel](https://bazel.build/install) to build, run and test our project. +The Bazel version is pinned in `src/.bazelversion`, use +[Bazelisk](https://github.com/bazelbuild/bazelisk) to get the right one. + +All commands below are run from `src/`: +```bash +cd src/ +``` + +Optimized build mode (`-c opt`) is enabled by default in `src/.bazelrc`. + +**Build:** +```bash +bazel build //lib:memcpy_bench # build benchmark lib only +bazel build //main:main # build main binary and library +``` + +**Test:** +```bash +bazel test //test:memcpy_bench_test +``` + +**Run benchmarks:** +```bash +bazel run //main:main + +# Google Benchmark flags are passed after `--` +bazel run //main:main -- --benchmark_filter='BM_Memcpy/4096' --benchmark_format=json +``` diff --git a/src/.bazelrc b/src/.bazelrc new file mode 100644 index 0000000..f67d8fc --- /dev/null +++ b/src/.bazelrc @@ -0,0 +1 @@ +build -c opt diff --git a/src/.bazelversion b/src/.bazelversion new file mode 100644 index 0000000..b13d146 --- /dev/null +++ b/src/.bazelversion @@ -0,0 +1 @@ +9.3.0 diff --git a/src/MODULE.bazel b/src/MODULE.bazel new file mode 100644 index 0000000..009a936 --- /dev/null +++ b/src/MODULE.bazel @@ -0,0 +1,8 @@ +# https://registry.bazel.build/modules/rules_cc +bazel_dep(name = "rules_cc", version = "0.2.26") + +# https://registry.bazel.build/modules/googletest +bazel_dep(name = "googletest", version = "1.18.0.bcr.1", dev_dependency = True) + +# https://registry.bazel.build/modules/google_benchmark +bazel_dep(name = "google_benchmark", version = "1.9.5") diff --git a/src/lib/BUILD b/src/lib/BUILD new file mode 100644 index 0000000..32723ad --- /dev/null +++ b/src/lib/BUILD @@ -0,0 +1,14 @@ +load("@rules_cc//cc:cc_library.bzl", "cc_library") + +cc_library( + name = "memcpy_bench", + srcs = ["memcpy_bench.cc"], + hdrs = ["memcpy_bench.h"], + deps = [ + "@google_benchmark//:benchmark", + ], + visibility = [ + "//main:__pkg__", + "//test:__pkg__", + ], +) diff --git a/src/lib/memcpy_bench.cc b/src/lib/memcpy_bench.cc new file mode 100644 index 0000000..46585bd --- /dev/null +++ b/src/lib/memcpy_bench.cc @@ -0,0 +1,54 @@ +#include "lib/memcpy_bench.h" + +#include +#include + +#include + +namespace memcpy_bench { + +namespace { + +void BM_Memcpy(benchmark::State& state) { + const auto size = static_cast(state.range(0)); + + const std::vector src = RandomBytes(size); + std::vector dst(size); + + for (auto _ : state) { + std::memcpy(dst.data(), src.data(), size); + benchmark::DoNotOptimize(dst.data()); + benchmark::ClobberMemory(); + } + + state.SetBytesProcessed(static_cast(state.iterations()) * + static_cast(size)); +} + +} + +std::vector RandomBytes(std::size_t size, std::uint32_t seed) { + std::mt19937 gen(seed); + std::uniform_int_distribution dist(0, 255); + std::vector bytes(size); + for (auto& byte : bytes) { + byte = static_cast(dist(gen)); + } + return bytes; +} + +int Run(int argc, char** argv) { + benchmark::RegisterBenchmark("BM_Memcpy", BM_Memcpy) + ->RangeMultiplier(4) + ->Range(64, 64 << 20); + + benchmark::Initialize(&argc, argv); + if (benchmark::ReportUnrecognizedArguments(argc, argv)) { + return 1; + } + benchmark::RunSpecifiedBenchmarks(); + benchmark::Shutdown(); + return 0; +} + +} diff --git a/src/lib/memcpy_bench.h b/src/lib/memcpy_bench.h new file mode 100644 index 0000000..bd827d5 --- /dev/null +++ b/src/lib/memcpy_bench.h @@ -0,0 +1,13 @@ +#pragma once + +#include +#include +#include + +namespace memcpy_bench { + +std::vector RandomBytes(std::size_t size, std::uint32_t seed = 42); + +int Run(int argc, char** argv); + +} diff --git a/src/main/BUILD b/src/main/BUILD new file mode 100644 index 0000000..89b4608 --- /dev/null +++ b/src/main/BUILD @@ -0,0 +1,9 @@ +load("@rules_cc//cc:cc_binary.bzl", "cc_binary") + +cc_binary( + name = "main", + srcs = glob(["*.cc"]), + deps = [ + "//lib:memcpy_bench", + ], +) diff --git a/src/main/main.cc b/src/main/main.cc new file mode 100644 index 0000000..0bcf91d --- /dev/null +++ b/src/main/main.cc @@ -0,0 +1,6 @@ +#include "lib/memcpy_bench.h" + +int main(int argc, char **argv) +{ + return memcpy_bench::Run(argc, argv); +} diff --git a/src/test/BUILD b/src/test/BUILD new file mode 100644 index 0000000..750aa32 --- /dev/null +++ b/src/test/BUILD @@ -0,0 +1,11 @@ +load("@rules_cc//cc:cc_test.bzl", "cc_test") + + +cc_test( + name = "memcpy_bench_test", + srcs = glob(["*.cc"]), + deps = [ + "@googletest//:gtest_main", + "//lib:memcpy_bench", + ], +) diff --git a/src/test/memcpy_bench_test.cc b/src/test/memcpy_bench_test.cc new file mode 100644 index 0000000..c7ab159 --- /dev/null +++ b/src/test/memcpy_bench_test.cc @@ -0,0 +1,15 @@ +#include "gtest/gtest.h" +#include "lib/memcpy_bench.h" + +TEST(RandomBytesTest, ReturnsRequestedSize) { + EXPECT_EQ(memcpy_bench::RandomBytes(0).size(), 0u); + EXPECT_EQ(memcpy_bench::RandomBytes(1024).size(), 1024u); +} + +TEST(RandomBytesTest, SameSeedGivesSameBytes) { + EXPECT_EQ(memcpy_bench::RandomBytes(256, 7), memcpy_bench::RandomBytes(256, 7)); +} + +TEST(RandomBytesTest, DifferentSeedsGiveDifferentBytes) { + EXPECT_NE(memcpy_bench::RandomBytes(256, 1), memcpy_bench::RandomBytes(256, 2)); +}