From 830902094e2c13e5e2b511266cd41c905898feda Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Thu, 25 Feb 2021 16:29:08 +0000 Subject: Add method the considers elemsize when computing number of elements that will maximize 2^N bytes block --- vespalib/src/tests/alloc/alloc_test.cpp | 15 +++++++++++++++ vespalib/src/vespa/vespalib/util/alloc.h | 6 ++++++ 2 files changed, 21 insertions(+) diff --git a/vespalib/src/tests/alloc/alloc_test.cpp b/vespalib/src/tests/alloc/alloc_test.cpp index c52170fc8ec..d37abb15c2f 100644 --- a/vespalib/src/tests/alloc/alloc_test.cpp +++ b/vespalib/src/tests/alloc/alloc_test.cpp @@ -47,6 +47,21 @@ TEST("test roundUp2inN") { EXPECT_EQUAL(16u, roundUp2inN(9)); } +TEST("test roundUp2inN elems") { + EXPECT_EQUAL(0u, roundUp2inN(0, 17)); + EXPECT_EQUAL(1u, roundUp2inN(1, 17)); + EXPECT_EQUAL(3u, roundUp2inN(2, 17)); + EXPECT_EQUAL(3u, roundUp2inN(3, 17)); + EXPECT_EQUAL(7u, roundUp2inN(4, 17)); + EXPECT_EQUAL(7u, roundUp2inN(5, 17)); + EXPECT_EQUAL(7u, roundUp2inN(6, 17)); + EXPECT_EQUAL(7u, roundUp2inN(7, 17)); + EXPECT_EQUAL(15u, roundUp2inN(8, 17)); + EXPECT_EQUAL(15u, roundUp2inN(9, 17)); + EXPECT_EQUAL(15u, roundUp2inN(15, 17)); + EXPECT_EQUAL(30u, roundUp2inN(16, 17)); +} + TEST("test basics") { { Alloc h = Alloc::allocHeap(100); diff --git a/vespalib/src/vespa/vespalib/util/alloc.h b/vespalib/src/vespa/vespalib/util/alloc.h index 71a3bd2407a..a1bb6af6514 100644 --- a/vespalib/src/vespa/vespalib/util/alloc.h +++ b/vespalib/src/vespa/vespalib/util/alloc.h @@ -80,8 +80,14 @@ private: namespace vespalib { +/// Rounds up to the closest number that is a power of 2 inline size_t roundUp2inN(size_t minimum) { return 2ul << Optimized::msbIdx(minimum - 1); } +/// Rounds minElems up to the closest number where minElems*elemSize is a power of 2 +inline size_t roundUp2inN(size_t minElems, size_t elemSize) { + return roundUp2inN(minElems * elemSize)/elemSize; +} + } -- cgit v1.2.3