Pool Subzero constant data
Previously each constant would cause new memory to be allocated. This
change makes us search through the existing constants to check if a
suitable one already exists.
Bug: b/178661423
Change-Id: I1315c80f019ff51e96245238100aa672d5e74930
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/52229
Kokoro-Result: kokoro <noreply+kokoro@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
Commit-Queue: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Reactor/SubzeroReactor.cpp b/src/Reactor/SubzeroReactor.cpp
index fe53ad7..9b0e0f1 100644
--- a/src/Reactor/SubzeroReactor.cpp
+++ b/src/Reactor/SubzeroReactor.cpp
@@ -833,6 +833,25 @@
const void *addConstantData(const void *data, size_t size, size_t alignment = 1)
{
+ // Check if we already have a suitable constant.
+ for(const auto &c : constantsPool)
+ {
+ void *ptr = c.data.get();
+ size_t space = c.space;
+
+ void *alignedPtr = std::align(alignment, size, ptr, space);
+
+ if(space < size)
+ {
+ continue;
+ }
+
+ if(memcmp(data, alignedPtr, size) == 0)
+ {
+ return alignedPtr;
+ }
+ }
+
// TODO(b/148086935): Replace with a buffer allocator.
size_t space = size + alignment;
auto buf = std::unique_ptr<uint8_t[]>(new uint8_t[space]);
@@ -840,15 +859,27 @@
void *alignedPtr = std::align(alignment, size, ptr, space);
ASSERT(alignedPtr);
memcpy(alignedPtr, data, size);
- constantData.emplace_back(std::move(buf));
+ constantsPool.emplace_back(std::move(buf), space);
+
return alignedPtr;
}
private:
+ struct Constant
+ {
+ Constant(std::unique_ptr<uint8_t[]> data, size_t space)
+ : data(std::move(data))
+ , space(space)
+ {}
+
+ std::unique_ptr<uint8_t[]> data;
+ size_t space;
+ };
+
std::array<const void *, Nucleus::CoroutineEntryCount> funcs = {};
std::vector<uint8_t, ExecutableAllocator<uint8_t>> buffer;
std::size_t position;
- std::vector<std::unique_ptr<uint8_t[]>> constantData;
+ std::vector<Constant> constantsPool;
};
#ifdef ENABLE_RR_PRINT