performance: improve pool handling

Related-To: NEO-11731
Signed-off-by: Michal Mrozek <michal.mrozek@intel.com>
This commit is contained in:
Michal Mrozek
2024-06-25 15:46:05 +00:00
committed by Compute-Runtime-Automation
parent 6d70304e7b
commit a3c3b6533a
8 changed files with 20 additions and 8 deletions

View File

@@ -89,7 +89,7 @@ TEST_F(AllocUsmHostDisabledMemoryTest, givenDriverHandleWhenCallingAllocHostMemT
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
}
using AllocUsmHostEnabledMemoryTest = AllocUsmPoolMemoryTest<1, -1>;
using AllocUsmHostEnabledMemoryTest = AllocUsmPoolMemoryTest<16, -1>;
TEST_F(AllocUsmHostEnabledMemoryTest, givenDriverHandleWhenCallingAllocHostMemWithVariousParametersThenUsePoolIfAllowed) {
auto mockHostMemAllocPool = reinterpret_cast<MockUsmMemAllocPool *>(&driverHandle->usmHostMemAllocPool);

View File

@@ -503,7 +503,8 @@ void Context::initializeUsmAllocationPools() {
}
auto &productHelper = getDevices()[0]->getProductHelper();
bool enabled = ApiSpecificConfig::isDeviceUsmPoolingEnabled() && productHelper.isUsmPoolAllocatorSupported();
size_t poolSize = 2 * MemoryConstants::megaByte;
size_t poolSize = NEO::defaultPoolSize;
if (debugManager.flags.EnableDeviceUsmAllocationPool.get() != -1) {
enabled = debugManager.flags.EnableDeviceUsmAllocationPool.get() > 0;
poolSize = debugManager.flags.EnableDeviceUsmAllocationPool.get() * MemoryConstants::megaByte;
@@ -519,7 +520,7 @@ void Context::initializeUsmAllocationPools() {
}
enabled = ApiSpecificConfig::isHostUsmPoolingEnabled() && productHelper.isUsmPoolAllocatorSupported();
poolSize = 2 * MemoryConstants::megaByte;
poolSize = NEO::defaultPoolSize;
if (debugManager.flags.EnableHostUsmAllocationPool.get() != -1) {
enabled = debugManager.flags.EnableHostUsmAllocationPool.get() > 0;
poolSize = debugManager.flags.EnableHostUsmAllocationPool.get() * MemoryConstants::megaByte;

View File

@@ -53,12 +53,12 @@ HWTEST2_F(ContextUsmPoolDefaultFlagsTest, givenDefaultDebugFlagsWhenCreatingCont
HWTEST2_F(ContextUsmPoolDefaultFlagsTest, givenDefaultDebugFlagsWhenCreatingContextThenPoolsAreInitialized, IsXeHpgCore) {
EXPECT_TRUE(mockDeviceUsmMemAllocPool->isInitialized());
EXPECT_EQ(2 * MemoryConstants::megaByte, mockDeviceUsmMemAllocPool->poolSize);
EXPECT_EQ(1 * MemoryConstants::megaByte, mockDeviceUsmMemAllocPool->poolSize);
EXPECT_NE(nullptr, mockDeviceUsmMemAllocPool->pool);
EXPECT_EQ(InternalMemoryType::deviceUnifiedMemory, mockDeviceUsmMemAllocPool->poolMemoryType);
EXPECT_TRUE(mockHostUsmMemAllocPool->isInitialized());
EXPECT_EQ(2 * MemoryConstants::megaByte, mockHostUsmMemAllocPool->poolSize);
EXPECT_EQ(1 * MemoryConstants::megaByte, mockHostUsmMemAllocPool->poolSize);
EXPECT_NE(nullptr, mockHostUsmMemAllocPool->pool);
EXPECT_EQ(InternalMemoryType::hostUnifiedMemory, mockHostUsmMemAllocPool->poolMemoryType);
}

View File

@@ -6,6 +6,7 @@
*/
#include <cstdint>
#include <stddef.h>
namespace NEO {
// AUB file folder location
@@ -13,4 +14,7 @@ const char *folderAUB = ".";
// Initial value for HW tag
uint32_t initialHardwareTag = 0;
size_t defaultPoolSize = 16777216u;
} // namespace NEO

View File

@@ -7,6 +7,7 @@
#pragma once
#include <cstdint>
#include <stddef.h>
namespace NEO {
enum class CommandStreamReceiverType {
@@ -38,4 +39,7 @@ extern const char *folderAUB;
// Initial value for HW tag
// Set to 0 if using HW or simulator, otherwise 0xFFFFFF00, needs to be lower then CompletionStamp::notReady.
extern uint32_t initialHardwareTag;
// default size of memory pools
extern size_t defaultPoolSize;
} // namespace NEO

View File

@@ -24,7 +24,7 @@ bool UsmMemAllocPool::initialize(SVMAllocsManager *svmMemoryManager, const Unifi
this->chunkAllocator.reset(new HeapAllocator(castToUint64(this->pool),
poolSize,
chunkAlignment,
allocationThreshold / 2));
2 * MemoryConstants::megaByte));
this->poolSize = poolSize;
this->poolMemoryType = memoryProperties.memoryType;
return true;

View File

@@ -35,9 +35,9 @@ class UsmMemAllocPool {
void *getPooledAllocationBasePtr(const void *ptr);
size_t getOffsetInPool(const void *ptr);
static constexpr auto allocationThreshold = 1 * MemoryConstants::megaByte;
static constexpr auto allocationThreshold = 2 * MemoryConstants::megaByte;
static constexpr auto chunkAlignment = 512u;
static constexpr auto startingOffset = 2 * allocationThreshold;
static constexpr auto startingOffset = chunkAlignment;
protected:
size_t poolSize{};

View File

@@ -6,9 +6,12 @@
*/
#include <cstdint>
#include <stddef.h>
namespace NEO {
const char *folderAUB = "aub_out";
uint32_t initialHardwareTag = static_cast<uint32_t>(0xFFFFFF00);
size_t defaultPoolSize = 1048576u;
} // namespace NEO