Skip to content

Commit dc1d0d8

Browse files
fix: split hostptr into aligned and misaligned
Split hostptr allocation types into aligned to 4KB and misaligned (offset by 4 bytes). Should reduce test noise from hostptrs sometimes being aligned by chance. Signed-off-by: Dominik Dabek <[email protected]>
1 parent 230a3db commit dc1d0d8

19 files changed

+199
-103
lines changed

TESTS.md

Lines changed: 26 additions & 26 deletions
Large diffs are not rendered by default.

source/benchmarks/api_overhead_benchmark/gtest/reset_command_list.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2022-2023 Intel Corporation
2+
* Copyright (C) 2022-2025 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -31,7 +31,7 @@ INSTANTIATE_TEST_SUITE_P(
3131
ResetCommandListTest,
3232
ResetCommandListTest,
3333
::testing::Combine(
34-
::testing::Values(UsmMemoryPlacement::Host, UsmMemoryPlacement::Device, UsmMemoryPlacement::Shared, UsmMemoryPlacement::NonUsm),
34+
::testing::Values(UsmMemoryPlacement::Host, UsmMemoryPlacement::Device, UsmMemoryPlacement::Shared, UsmMemoryPlacement::NonUsm4KBAligned),
3535
::testing::Values(4,
3636
1 * MemoryConstants::megaByte,
3737
128 * MemoryConstants::megaByte),

source/benchmarks/memory_benchmark/implementations/ocl/write_buffer_ocl.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,7 @@ static TestResult run(const WriteBufferArguments &arguments, Statistics &statist
5050
// Create hostptr
5151
HostptrReuseHelper::Alloc hostptrAlloc{};
5252
ASSERT_CL_SUCCESS(HostptrReuseHelper::allocateBufferHostptr(opencl, arguments.reuse, arguments.size, hostptrAlloc));
53-
auto placement = arguments.reuse == HostptrReuseMode::Usm ? UsmMemoryPlacement::Host : UsmMemoryPlacement::NonUsm;
54-
ASSERT_CL_SUCCESS(BufferContentsHelperOcl::fillUsmBufferOrHostPtr(opencl.commandQueue, hostptrAlloc.ptr, arguments.size, placement, arguments.contents));
53+
ASSERT_CL_SUCCESS(BufferContentsHelperOcl::fillUsmBufferOrHostPtr(opencl.commandQueue, hostptrAlloc.ptr, arguments.size, arguments.reuse, arguments.contents));
5554

5655
// Warmup
5756
ASSERT_CL_SUCCESS(clEnqueueWriteBuffer(opencl.commandQueue, buffer, CL_BLOCKING, 0, arguments.size, hostptrAlloc.ptr, 0, nullptr, nullptr));

source/benchmarks/memory_benchmark/implementations/ocl/write_image_ocl.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,7 @@ static TestResult run(const WriteImageArguments &arguments, Statistics &statisti
6161
// Create hostptr
6262
HostptrReuseHelper::Alloc hostptrAlloc{};
6363
ASSERT_CL_SUCCESS(HostptrReuseHelper::allocateBufferHostptr(opencl, arguments.hostPtrPlacement, imageSizeInBytes, hostptrAlloc));
64-
auto placement = arguments.hostPtrPlacement == HostptrReuseMode::Usm ? UsmMemoryPlacement::Host : UsmMemoryPlacement::NonUsm;
65-
ASSERT_CL_SUCCESS(BufferContentsHelperOcl::fillUsmBufferOrHostPtr(opencl.commandQueue, hostptrAlloc.ptr, imageSizeInBytes, placement, BufferContents::Random));
64+
ASSERT_CL_SUCCESS(BufferContentsHelperOcl::fillUsmBufferOrHostPtr(opencl.commandQueue, hostptrAlloc.ptr, imageSizeInBytes, arguments.hostPtrPlacement, BufferContents::Random));
6665

6766
// Warmup
6867
const size_t origin[] = {0, 0, 0};

source/framework/argument/enum/hostptr_reuse_mode_argument.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2022 Intel Corporation
2+
* Copyright (C) 2022-2025 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -20,8 +20,8 @@ struct HostptrBufferReuseModeArgument : EnumArgument<HostptrBufferReuseModeArgum
2020

2121
const static inline std::string enumName = "Buffer hostptr reuse mode";
2222
const static inline EnumType invalidEnumValue = EnumType::Unknown;
23-
const static inline EnumType enumValues[3] = {EnumType::None, EnumType::Usm, EnumType::Map};
24-
const static inline std::string enumValuesNames[3] = {"None", "Usm", "Map"};
23+
const static inline EnumType enumValues[4] = {EnumType::Aligned4KB, EnumType::Misaligned, EnumType::Usm, EnumType::Map};
24+
const static inline std::string enumValuesNames[4] = {"Aligned4KB", "Misaligned", "Usm", "Map"};
2525
};
2626

2727
struct HostptrImageReuseModeArgument : EnumArgument<HostptrImageReuseModeArgument, HostptrReuseMode> {
@@ -34,6 +34,6 @@ struct HostptrImageReuseModeArgument : EnumArgument<HostptrImageReuseModeArgumen
3434

3535
const static inline std::string enumName = "Image hostptr reuse mode";
3636
const static inline EnumType invalidEnumValue = EnumType::Unknown;
37-
const static inline EnumType enumValues[2] = {EnumType::None, EnumType::Map};
38-
const static inline std::string enumValuesNames[2] = {"None", "Map"};
37+
const static inline EnumType enumValues[3] = {EnumType::Aligned4KB, EnumType::Misaligned, EnumType::Map};
38+
const static inline std::string enumValuesNames[3] = {"Aligned4KB", "Misaligned", "Map"};
3939
};

source/framework/argument/enum/usm_memory_placement_argument.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2022-2024 Intel Corporation
2+
* Copyright (C) 2022-2025 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -20,8 +20,8 @@ struct UsmMemoryPlacementArgument : EnumArgument<UsmMemoryPlacementArgument, Usm
2020

2121
const static inline std::string enumName = "memory placement";
2222
const static inline EnumType invalidEnumValue = EnumType::Unknown;
23-
const static inline EnumType enumValues[8] = {EnumType::Device, EnumType::Host, EnumType::Shared, EnumType::NonUsm, EnumType::NonUsmImported, EnumType::NonUsmMapped, EnumType::NonUsm2MBAligned, EnumType::NonUsmImported2MBAligned};
24-
const static inline EnumType limitedTargets[3] = {EnumType::Device, EnumType::Host, EnumType::NonUsm};
23+
const static inline EnumType enumValues[10] = {EnumType::Device, EnumType::Host, EnumType::Shared, EnumType::NonUsmMapped, EnumType::NonUsmMisaligned, EnumType::NonUsm4KBAligned, EnumType::NonUsm2MBAligned, EnumType::NonUsmImportedMisaligned, EnumType::NonUsmImported4KBAligned, EnumType::NonUsmImported2MBAligned};
24+
const static inline EnumType limitedTargets[3] = {EnumType::Device, EnumType::Host, EnumType::NonUsm4KBAligned};
2525
const static inline EnumType deviceAndHost[2] = {EnumType::Device, EnumType::Host};
26-
const static inline std::string enumValuesNames[8] = {"Device", "Host", "Shared", "non-USM", "non-USM-imported", "non-USM-mapped", "non-usm2MBAligned", "non-USM2MBAligned-imported"};
26+
const static inline std::string enumValuesNames[10] = {"Device", "Host", "Shared", "non-USM-mapped", "non-USMmisaligned", "non-USM4KBAligned", "non-USM2MBAligned", "non-USMmisaligned-imported", "non-USM4KBAligned-imported", "non-USM2MBAligned-imported"};
2727
};

source/framework/enum/hostptr_reuse_mode.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2022 Intel Corporation
2+
* Copyright (C) 2022-2025 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -10,7 +10,8 @@
1010
enum class HostptrReuseMode {
1111
Unknown,
1212

13-
None,
13+
Aligned4KB,
14+
Misaligned,
1415
Usm,
1516
Map,
1617
};

source/framework/enum/usm_memory_placement.h

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2022-2024 Intel Corporation
2+
* Copyright (C) 2022-2025 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -14,15 +14,19 @@ enum class UsmMemoryPlacement {
1414
Host,
1515
Device,
1616
Shared,
17-
NonUsm,
18-
NonUsmImported,
1917
NonUsmMapped,
18+
NonUsmMisaligned,
19+
NonUsm4KBAligned,
2020
NonUsm2MBAligned,
21-
NonUsmImported2MBAligned
21+
NonUsmImportedMisaligned,
22+
NonUsmImported4KBAligned,
23+
NonUsmImported2MBAligned,
2224
};
2325

2426
inline constexpr bool requiresImport(UsmMemoryPlacement inputType) {
25-
if (inputType == UsmMemoryPlacement::NonUsmImported || inputType == UsmMemoryPlacement::NonUsmImported2MBAligned) {
27+
if (inputType == UsmMemoryPlacement::NonUsmImportedMisaligned ||
28+
inputType == UsmMemoryPlacement::NonUsmImported4KBAligned ||
29+
inputType == UsmMemoryPlacement::NonUsmImported2MBAligned) {
2630
return true;
2731
}
2832
return false;
@@ -33,7 +37,8 @@ inline constexpr bool isUsmMemoryType(UsmMemoryPlacement inputType) {
3337
case UsmMemoryPlacement::Host:
3438
case UsmMemoryPlacement::Device:
3539
case UsmMemoryPlacement::Shared:
36-
case UsmMemoryPlacement::NonUsmImported:
40+
case UsmMemoryPlacement::NonUsmImportedMisaligned:
41+
case UsmMemoryPlacement::NonUsmImported4KBAligned:
3742
case UsmMemoryPlacement::NonUsmImported2MBAligned:
3843
return true;
3944
default:

source/framework/l0/utility/usm_helper.cpp

Lines changed: 42 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2022-2024 Intel Corporation
2+
* Copyright (C) 2022-2025 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -21,27 +21,33 @@ ze_result_t allocate(UsmMemoryPlacement placement, LevelZero &levelZero, size_t
2121
return zeMemAllocHost(levelZero.context, &hostAllocDesc, size, 0, buffer);
2222
case UsmMemoryPlacement::Shared:
2323
return zeMemAllocShared(levelZero.context, &deviceAllocDesc, &hostAllocDesc, size, 0, levelZero.device, buffer);
24-
case UsmMemoryPlacement::NonUsmImported:
25-
case UsmMemoryPlacement::NonUsmImported2MBAligned: {
26-
if (placement == UsmMemoryPlacement::NonUsmImported2MBAligned) {
27-
*buffer = alloc2MBAligned(size);
28-
} else {
29-
*buffer = malloc(size);
30-
}
31-
return levelZero.importHostPointer.importExternalPointer(levelZero.driver, *buffer, size);
32-
}
33-
case UsmMemoryPlacement::NonUsm:
24+
case UsmMemoryPlacement::NonUsm4KBAligned:
25+
*buffer = Allocator::alloc4KBAligned(size);
26+
return ZE_RESULT_SUCCESS;
3427
case UsmMemoryPlacement::NonUsm2MBAligned: {
35-
if (placement == UsmMemoryPlacement::NonUsm2MBAligned) {
36-
*buffer = alloc2MBAligned(size);
37-
} else {
38-
*buffer = malloc(size);
39-
}
28+
*buffer = Allocator::alloc2MBAligned(size);
4029
return ZE_RESULT_SUCCESS;
4130
}
31+
case UsmMemoryPlacement::NonUsmMisaligned: {
32+
*buffer = Allocator::allocMisaligned(size, misalignedOffset);
33+
return ZE_RESULT_SUCCESS;
34+
}
35+
case UsmMemoryPlacement::NonUsmImportedMisaligned:
36+
*buffer = Allocator::allocMisaligned(size, misalignedOffset);
37+
break;
38+
case UsmMemoryPlacement::NonUsmImported4KBAligned:
39+
*buffer = Allocator::alloc4KBAligned(size);
40+
break;
41+
case UsmMemoryPlacement::NonUsmImported2MBAligned:
42+
*buffer = Allocator::alloc2MBAligned(size);
43+
break;
4244
default:
4345
FATAL_ERROR("Unknown placement");
4446
}
47+
if (requiresImport(placement)) {
48+
return levelZero.importHostPointer.importExternalPointer(levelZero.driver, *buffer, size);
49+
}
50+
return ZE_RESULT_ERROR_UNKNOWN;
4551
}
4652

4753
ze_result_t allocate(UsmRuntimeMemoryPlacement runtimePlacement, LevelZero &levelZero, size_t size, void **buffer) {
@@ -78,15 +84,27 @@ ze_result_t allocate(UsmRuntimeMemoryPlacement runtimePlacement, LevelZero &leve
7884
}
7985

8086
ze_result_t deallocate(UsmMemoryPlacement placement, LevelZero &levelZero, void *buffer) {
81-
if (placement == UsmMemoryPlacement::NonUsm || placement == UsmMemoryPlacement::NonUsm2MBAligned) {
82-
free(buffer);
83-
return ZE_RESULT_SUCCESS;
84-
} else if (requiresImport(placement)) {
85-
auto ret = levelZero.importHostPointer.releaseExternalPointer(levelZero.driver, buffer);
86-
free(buffer);
87-
return ret;
88-
} else {
87+
ze_result_t ret = ZE_RESULT_SUCCESS;
88+
if (requiresImport(placement)) {
89+
ret = levelZero.importHostPointer.releaseExternalPointer(levelZero.driver, buffer);
90+
}
91+
switch (placement) {
92+
case UsmMemoryPlacement::Device:
93+
case UsmMemoryPlacement::Host:
94+
case UsmMemoryPlacement::Shared:
8995
return zeMemFree(levelZero.context, buffer);
96+
case UsmMemoryPlacement::NonUsm4KBAligned:
97+
case UsmMemoryPlacement::NonUsm2MBAligned:
98+
case UsmMemoryPlacement::NonUsmImported4KBAligned:
99+
case UsmMemoryPlacement::NonUsmImported2MBAligned:
100+
Allocator::alignedFree(buffer);
101+
return ret;
102+
case UsmMemoryPlacement::NonUsmMisaligned:
103+
case UsmMemoryPlacement::NonUsmImportedMisaligned:
104+
Allocator::misalignedFree(buffer, misalignedOffset);
105+
return ret;
106+
default:
107+
FATAL_ERROR("Unknown placement");
90108
}
91109
}
92110

source/framework/l0/utility/usm_helper.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2022 Intel Corporation
2+
* Copyright (C) 2022-2025 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -14,6 +14,8 @@
1414

1515
namespace L0::UsmHelper {
1616

17+
static constexpr auto misalignedOffset = 4u;
18+
1719
ze_result_t allocate(UsmMemoryPlacement placement, LevelZero &levelZero, size_t size, void **buffer);
1820

1921
ze_result_t allocate(UsmRuntimeMemoryPlacement runtimePlacement, LevelZero &levelZero, size_t size, void **buffer);

0 commit comments

Comments
 (0)