From 2f1a9ec18eacf664fdaeac94110e6131ac4cdb79 Mon Sep 17 00:00:00 2001 From: ludamad Date: Wed, 18 Feb 2026 22:37:43 +0000 Subject: [PATCH] feat: avoid redundant serial zeroing in polynomial allocation Replace std::make_shared(n) with new Fr[] in BackingMemory. make_shared value-initializes (serially zeros) every element, but Polynomial's constructor already zeros memory in parallel where needed, making the serial pass redundant. Benchmarked on 48-core AMD EPYC with parity_base circuit (UltraHonk): baseline (make_shared): 15370ms median new Fr[] (this PR): 14110ms median (-8.2%) --- .../barretenberg/polynomials/backing_memory.hpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/polynomials/backing_memory.hpp b/barretenberg/cpp/src/barretenberg/polynomials/backing_memory.hpp index 3c17a240b091..893946fcf632 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/backing_memory.hpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/backing_memory.hpp @@ -88,7 +88,8 @@ template struct BackingMemory { return *this; } - // Allocate memory, preferring file-backed if in low memory mode + // Allocate memory, preferring file-backed if in low memory mode. + // Memory is NOT zeroed — callers that need zeroed memory must do so themselves. static BackingMemory allocate(size_t size) { BackingMemory memory; @@ -106,11 +107,19 @@ template struct BackingMemory { ~BackingMemory() = default; private: + // Use new Fr[] instead of std::make_shared(n) to avoid serial + // value-initialization (zeroing). Polynomial's constructor handles + // zeroing in parallel where needed. static void allocate_aligned(BackingMemory& memory, size_t size) { - // Fr has alignas on it so this is fine post c++20. - memory.aligned_memory = std::make_shared(size); - memory.raw_data = memory.aligned_memory.get(); + if (size == 0) { + memory.aligned_memory = nullptr; + memory.raw_data = nullptr; + return; + } + Fr* ptr = new Fr[size]; + memory.aligned_memory = std::shared_ptr(ptr, [](Fr* p) { delete[] p; }); + memory.raw_data = ptr; } #ifndef __wasm__