Skip to content

Commit 67fa39c

Browse files
lyuCompute-Runtime-Automation
authored andcommitted
fix: get right page size when malloc uses 0 alignment
Related-To: GSD-7103 Signed-off-by: Lu, Wenbin <[email protected]>
1 parent 739d181 commit 67fa39c

File tree

5 files changed

+39
-12
lines changed

5 files changed

+39
-12
lines changed

level_zero/core/test/unit_tests/sources/memory/test_memory.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1695,7 +1695,7 @@ TEST_F(MemoryTest, whenAllocatingDeviceMemoryThenAlignmentIsPassedCorrectlyAndMe
16951695
do {
16961696
alignment >>= 1;
16971697
memoryManager->validateAllocateProperties = [alignment](const AllocationProperties &properties) {
1698-
EXPECT_EQ(properties.alignment, alignUp<size_t>(alignment, MemoryConstants::pageSize64k));
1698+
EXPECT_EQ(properties.alignment, alignUpNonZero<size_t>(alignment, MemoryConstants::pageSize64k));
16991699
};
17001700
void *ptr = nullptr;
17011701
ze_result_t result = context->allocDeviceMem(device->toHandle(), &deviceDesc, size, alignment, &ptr);
@@ -1722,7 +1722,7 @@ TEST_F(MemoryTest, whenAllocatingHostMemoryThenAlignmentIsPassedCorrectlyAndMemo
17221722
do {
17231723
alignment >>= 1;
17241724
memoryManager->validateAllocateProperties = [alignment](const AllocationProperties &properties) {
1725-
EXPECT_EQ(properties.alignment, alignUp<size_t>(alignment, MemoryConstants::pageSize));
1725+
EXPECT_EQ(properties.alignment, alignUpNonZero<size_t>(alignment, MemoryConstants::pageSize));
17261726
};
17271727
void *ptr = nullptr;
17281728
ze_result_t result = context->allocHostMem(&hostDesc, size, alignment, &ptr);
@@ -1753,7 +1753,7 @@ TEST_F(MemoryTest, whenAllocatingSharedMemoryThenAlignmentIsPassedCorrectlyAndMe
17531753
do {
17541754
alignment >>= 1;
17551755
memoryManager->validateAllocateProperties = [alignment](const AllocationProperties &properties) {
1756-
EXPECT_EQ(properties.alignment, alignUp<size_t>(alignment, MemoryConstants::pageSize64k));
1756+
EXPECT_EQ(properties.alignment, alignUpNonZero<size_t>(alignment, MemoryConstants::pageSize64k));
17571757
};
17581758
void *ptr = nullptr;
17591759
ze_result_t result = context->allocSharedMem(device->toHandle(), &deviceDesc, &hostDesc, size, alignment, &ptr);

shared/source/helpers/aligned_memory.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2018-2022 Intel Corporation
2+
* Copyright (C) 2018-2023 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -25,6 +25,15 @@ constexpr inline TNoRef alignUp(T before, size_t alignment) {
2525
return (before + mask) & ~mask;
2626
}
2727

28+
template <typename T, typename TNoRef = typename std::remove_reference<T>::type>
29+
constexpr inline TNoRef alignUpNonZero(T before, size_t alignment) {
30+
if (before == 0) {
31+
return alignment;
32+
} else {
33+
return alignUp(before, alignment);
34+
}
35+
}
36+
2837
template <typename T>
2938
constexpr inline T *alignUp(T *ptrBefore, size_t alignment) {
3039
return reinterpret_cast<T *>(alignUp(reinterpret_cast<uintptr_t>(ptrBefore), alignment));

shared/source/memory_manager/unified_memory_manager.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ void *SVMAllocsManager::createSVMAlloc(size_t size, const SvmAllocationPropertie
196196

197197
void *SVMAllocsManager::createHostUnifiedMemoryAllocation(size_t size,
198198
const UnifiedMemoryProperties &memoryProperties) {
199-
size_t pageSizeForAlignment = alignUp<size_t>(memoryProperties.alignment, MemoryConstants::pageSize);
199+
size_t pageSizeForAlignment = alignUpNonZero<size_t>(memoryProperties.alignment, MemoryConstants::pageSize);
200200
size_t alignedSize = alignUp<size_t>(size, MemoryConstants::pageSize);
201201

202202
bool compressionEnabled = false;
@@ -248,7 +248,7 @@ void *SVMAllocsManager::createUnifiedMemoryAllocation(size_t size,
248248
const UnifiedMemoryProperties &memoryProperties) {
249249
auto rootDeviceIndex = memoryProperties.getRootDeviceIndex();
250250
DeviceBitfield deviceBitfield = memoryProperties.subdeviceBitfields.at(rootDeviceIndex);
251-
size_t pageSizeForAlignment = alignUp<size_t>(memoryProperties.alignment, MemoryConstants::pageSize64k);
251+
size_t pageSizeForAlignment = alignUpNonZero<size_t>(memoryProperties.alignment, MemoryConstants::pageSize64k);
252252
size_t alignedSize = alignUp<size_t>(size, MemoryConstants::pageSize64k);
253253

254254
auto externalPtr = reinterpret_cast<void *>(memoryProperties.allocationFlags.hostptr);
@@ -377,7 +377,7 @@ void *SVMAllocsManager::createUnifiedKmdMigratedAllocation(size_t size, const Sv
377377

378378
auto rootDeviceIndex = unifiedMemoryProperties.getRootDeviceIndex();
379379
auto &deviceBitfield = unifiedMemoryProperties.subdeviceBitfields.at(rootDeviceIndex);
380-
size_t pageSizeForAlignment = std::max(alignUp<size_t>(unifiedMemoryProperties.alignment, MemoryConstants::pageSize2M), MemoryConstants::pageSize2M);
380+
size_t pageSizeForAlignment = std::max(alignUpNonZero<size_t>(unifiedMemoryProperties.alignment, MemoryConstants::pageSize2M), MemoryConstants::pageSize2M);
381381
size_t alignedSize = alignUp<size_t>(size, MemoryConstants::pageSize2M);
382382
AllocationProperties gpuProperties{rootDeviceIndex,
383383
true,
@@ -570,7 +570,7 @@ void *SVMAllocsManager::createUnifiedAllocationWithDeviceStorage(size_t size, co
570570
auto rootDeviceIndex = unifiedMemoryProperties.getRootDeviceIndex();
571571
auto externalPtr = reinterpret_cast<void *>(unifiedMemoryProperties.allocationFlags.hostptr);
572572
bool useExternalHostPtrForCpu = externalPtr != nullptr;
573-
const auto pageSizeForAlignment = alignUp<size_t>(unifiedMemoryProperties.alignment, MemoryConstants::pageSize64k);
573+
const auto pageSizeForAlignment = alignUpNonZero<size_t>(unifiedMemoryProperties.alignment, MemoryConstants::pageSize64k);
574574
size_t alignedSize = alignUp<size_t>(size, MemoryConstants::pageSize64k);
575575
DeviceBitfield subDevices = unifiedMemoryProperties.subdeviceBitfields.at(rootDeviceIndex);
576576
auto cpuAlignment = std::max(pageSizeForAlignment, memoryManager->peekExecutionEnvironment().rootDeviceEnvironments[rootDeviceIndex]->getProductHelper().getSvmCpuAlignment());

shared/test/unit_test/helpers/aligned_memory_tests.cpp

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2018-2022 Intel Corporation
2+
* Copyright (C) 2018-2023 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -119,6 +119,24 @@ INSTANTIATE_TEST_CASE_P(
119119
256,
120120
4096));
121121

122+
struct AlignUpNonZero : public ::testing::TestWithParam<std::tuple<size_t, size_t>> {
123+
};
124+
125+
TEST_P(AlignUpNonZero, GivenSizeAndAlignmentThenAlignedResultIsNonZero) {
126+
size_t size = std::get<0>(GetParam());
127+
size_t alignment = std::get<1>(GetParam());
128+
const size_t result = alignUpNonZero(size, alignment);
129+
EXPECT_TRUE(0 < result);
130+
EXPECT_TRUE(0 == result % alignment);
131+
}
132+
133+
INSTANTIATE_TEST_CASE_P(
134+
AlignUpNonZeroParameterized,
135+
AlignUpNonZero,
136+
testing::Combine(
137+
testing::Values(0, 1),
138+
testing::Values(1, 4, 8, 32, 64, 256, 4096)));
139+
122140
TEST(AlignWholeSize, GivenSizeLessThanPageSizeWhenAligningWholeSizeToPageThenAlignedSizeIsPageSize) {
123141
int size = 1;
124142
auto retSize = alignSizeWholePage(ptrAlignedToPage, size);

shared/test/unit_test/memory_manager/unified_memory_manager_tests.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ TEST_F(SVMLocalMemoryAllocatorTest, givenAlignmentThenUnifiedMemoryAllocationsAr
337337
do {
338338
alignment >>= 1;
339339
memoryManager->validateAllocateProperties = [alignment](const AllocationProperties &properties) {
340-
EXPECT_EQ(properties.alignment, alignUp<size_t>(alignment, MemoryConstants::pageSize64k));
340+
EXPECT_EQ(properties.alignment, alignUpNonZero<size_t>(alignment, MemoryConstants::pageSize64k));
341341
};
342342
SVMAllocsManager::UnifiedMemoryProperties unifiedMemoryProperties(InternalMemoryType::DEVICE_UNIFIED_MEMORY, alignment, rootDeviceIndices, deviceBitfields);
343343
unifiedMemoryProperties.device = device;
@@ -362,7 +362,7 @@ TEST_F(SVMLocalMemoryAllocatorTest, givenAlignmentThenHostUnifiedMemoryAllocatio
362362
do {
363363
alignment >>= 1;
364364
memoryManager->validateAllocateProperties = [alignment](const AllocationProperties &properties) {
365-
EXPECT_EQ(properties.alignment, alignUp<size_t>(alignment, MemoryConstants::pageSize));
365+
EXPECT_EQ(properties.alignment, alignUpNonZero<size_t>(alignment, MemoryConstants::pageSize));
366366
};
367367
SVMAllocsManager::UnifiedMemoryProperties unifiedMemoryProperties(InternalMemoryType::HOST_UNIFIED_MEMORY, alignment, rootDeviceIndices, deviceBitfields);
368368
unifiedMemoryProperties.device = device;
@@ -391,7 +391,7 @@ TEST_F(SVMLocalMemoryAllocatorTest, givenAlignmentThenSharedUnifiedMemoryAllocat
391391
do {
392392
alignment >>= 1;
393393
memoryManager->validateAllocateProperties = [alignment](const AllocationProperties &properties) {
394-
EXPECT_EQ(properties.alignment, alignUp<size_t>(alignment, MemoryConstants::pageSize64k));
394+
EXPECT_EQ(properties.alignment, alignUpNonZero<size_t>(alignment, MemoryConstants::pageSize64k));
395395
};
396396
SVMAllocsManager::UnifiedMemoryProperties unifiedMemoryProperties(InternalMemoryType::SHARED_UNIFIED_MEMORY, alignment, rootDeviceIndices, deviceBitfields);
397397
unifiedMemoryProperties.device = device;

0 commit comments

Comments
 (0)