Skip to content

Commit dd1e816

Browse files
committed
Merge branch 'petr/fix-mem-segfault' into benie/hip-cts-fixes-combined
2 parents e0e55b9 + 60c0b81 commit dd1e816

File tree

6 files changed

+108
-7
lines changed

6 files changed

+108
-7
lines changed

source/adapters/hip/memory.cpp

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,29 @@
1111
#include "memory.hpp"
1212
#include "context.hpp"
1313
#include <cassert>
14+
#include <ur_util.hpp>
15+
16+
namespace {
17+
18+
size_t GetHipFormatPixelSize(hipArray_Format Format) {
19+
switch (Format) {
20+
case HIP_AD_FORMAT_UNSIGNED_INT8:
21+
case HIP_AD_FORMAT_SIGNED_INT8:
22+
return 1;
23+
case HIP_AD_FORMAT_UNSIGNED_INT16:
24+
case HIP_AD_FORMAT_SIGNED_INT16:
25+
case HIP_AD_FORMAT_HALF:
26+
return 2;
27+
case HIP_AD_FORMAT_UNSIGNED_INT32:
28+
case HIP_AD_FORMAT_SIGNED_INT32:
29+
case HIP_AD_FORMAT_FLOAT:
30+
return 4;
31+
default:
32+
detail::ur::die("Invalid HIP format specifier");
33+
}
34+
}
35+
36+
} // namespace
1437

1538
/// Decreases the reference count of the Mem object.
1639
/// If this is zero, calls the relevant HIP Free function
@@ -234,7 +257,6 @@ UR_APIEXPORT ur_result_t UR_APICALL urMemGetInfo(ur_mem_handle_t hMemory,
234257

235258
UR_ASSERT(MemInfoType <= UR_MEM_INFO_CONTEXT,
236259
UR_RESULT_ERROR_INVALID_ENUMERATION);
237-
UR_ASSERT(hMemory->isBuffer(), UR_RESULT_ERROR_INVALID_MEM_OBJECT);
238260

239261
UrReturnHelper ReturnValue(propSize, pMemInfo, pPropSizeRet);
240262

@@ -243,9 +265,31 @@ UR_APIEXPORT ur_result_t UR_APICALL urMemGetInfo(ur_mem_handle_t hMemory,
243265
switch (MemInfoType) {
244266
case UR_MEM_INFO_SIZE: {
245267
try {
246-
size_t AllocSize = 0;
247-
UR_CHECK_ERROR(hipMemGetAddressRange(
248-
nullptr, &AllocSize, std::get<BufferMem>(hMemory->Mem).Ptr));
268+
const auto MemVisitor = [](auto &&Mem) -> size_t {
269+
using T = std::decay_t<decltype(Mem)>;
270+
if constexpr (std::is_same_v<T, BufferMem>) {
271+
size_t AllocSize = 0;
272+
hipDeviceptr_t BasePtr = nullptr;
273+
UR_CHECK_ERROR(hipMemGetAddressRange(&BasePtr, &AllocSize, Mem.Ptr));
274+
return AllocSize;
275+
} else if constexpr (std::is_same_v<T, SurfaceMem>) {
276+
HIP_ARRAY3D_DESCRIPTOR ArrayDescriptor;
277+
UR_CHECK_ERROR(hipArray3DGetDescriptor(&ArrayDescriptor, Mem.Array));
278+
const auto PixelSizeBytes =
279+
GetHipFormatPixelSize(ArrayDescriptor.Format) *
280+
ArrayDescriptor.NumChannels;
281+
const auto ImageSizeBytes =
282+
PixelSizeBytes *
283+
(ArrayDescriptor.Width ? ArrayDescriptor.Width : 1) *
284+
(ArrayDescriptor.Height ? ArrayDescriptor.Height : 1) *
285+
(ArrayDescriptor.Depth ? ArrayDescriptor.Depth : 1);
286+
return ImageSizeBytes;
287+
} else {
288+
static_assert(ur_always_false_t<T>, "Not exhaustive visitor!");
289+
}
290+
};
291+
292+
const auto AllocSize = std::visit(MemVisitor, hMemory->Mem);
249293
return ReturnValue(AllocSize);
250294
} catch (ur_result_t Err) {
251295
return Err;

source/common/ur_util.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,4 +293,6 @@ inline ur_result_t exceptionToResult(std::exception_ptr eptr) {
293293
}
294294
}
295295

296+
template <class> inline constexpr bool ur_always_false_t = false;
297+
296298
#endif /* UR_UTIL_H */

test/conformance/memory/memory_adapter_cuda.match

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ urMemGetInfoTest.InvalidNullPointerParamValue/NVIDIA_CUDA_BACKEND___{{.*}}___UR_
33
urMemGetInfoTest.InvalidNullPointerParamValue/NVIDIA_CUDA_BACKEND___{{.*}}___UR_MEM_INFO_CONTEXT
44
urMemGetInfoTest.InvalidNullPointerPropSizeRet/NVIDIA_CUDA_BACKEND___{{.*}}___UR_MEM_INFO_SIZE
55
urMemGetInfoTest.InvalidNullPointerPropSizeRet/NVIDIA_CUDA_BACKEND___{{.*}}___UR_MEM_INFO_CONTEXT
6+
urMemGetInfoImageTest.Success/NVIDIA_CUDA_BACKEND___{{.*}}___UR_MEM_INFO_SIZE
7+
urMemGetInfoImageTest.Success/NVIDIA_CUDA_BACKEND___{{.*}}___UR_MEM_INFO_CONTEXT
68
{{OPT}}urMemImageGetInfoTest.Success/NVIDIA_CUDA_BACKEND___{{.*}}___UR_IMAGE_INFO_FORMAT
79
{{OPT}}urMemImageGetInfoTest.Success/NVIDIA_CUDA_BACKEND___{{.*}}___UR_IMAGE_INFO_ELEMENT_SIZE
810
{{OPT}}urMemImageGetInfoTest.Success/NVIDIA_CUDA_BACKEND___{{.*}}___UR_IMAGE_INFO_ROW_PITCH
Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,20 @@
11
urMemBufferCreateWithNativeHandleTest.Success/AMD_HIP_BACKEND___{{.*}}_
2-
Segmentation fault
2+
urMemGetInfoTest.InvalidNullPointerParamValue/AMD_HIP_BACKEND___{{.*}}___UR_MEM_INFO_SIZE
3+
urMemGetInfoTest.InvalidNullPointerParamValue/AMD_HIP_BACKEND___{{.*}}___UR_MEM_INFO_CONTEXT
4+
urMemGetInfoTest.InvalidNullPointerPropSizeRet/AMD_HIP_BACKEND___{{.*}}___UR_MEM_INFO_SIZE
5+
urMemGetInfoTest.InvalidNullPointerPropSizeRet/AMD_HIP_BACKEND___{{.*}}___UR_MEM_INFO_CONTEXT
6+
urMemImageCreateTest.InvalidSize/AMD_HIP_BACKEND___{{.*}}_
7+
urMemImageGetInfoTest.Success/AMD_HIP_BACKEND___{{.*}}___UR_IMAGE_INFO_FORMAT
8+
urMemImageGetInfoTest.Success/AMD_HIP_BACKEND___{{.*}}___UR_IMAGE_INFO_ELEMENT_SIZE
9+
urMemImageGetInfoTest.Success/AMD_HIP_BACKEND___{{.*}}___UR_IMAGE_INFO_ROW_PITCH
10+
urMemImageGetInfoTest.Success/AMD_HIP_BACKEND___{{.*}}___UR_IMAGE_INFO_SLICE_PITCH
11+
urMemImageGetInfoTest.Success/AMD_HIP_BACKEND___{{.*}}___UR_IMAGE_INFO_WIDTH
12+
urMemImageGetInfoTest.Success/AMD_HIP_BACKEND___{{.*}}___UR_IMAGE_INFO_HEIGHT
13+
urMemImageGetInfoTest.Success/AMD_HIP_BACKEND___{{.*}}___UR_IMAGE_INFO_DEPTH
14+
urMemImageGetInfoTest.InvalidSizeSmall/AMD_HIP_BACKEND___{{.*}}___UR_IMAGE_INFO_FORMAT
15+
urMemImageGetInfoTest.InvalidSizeSmall/AMD_HIP_BACKEND___{{.*}}___UR_IMAGE_INFO_ELEMENT_SIZE
16+
urMemImageGetInfoTest.InvalidSizeSmall/AMD_HIP_BACKEND___{{.*}}___UR_IMAGE_INFO_ROW_PITCH
17+
urMemImageGetInfoTest.InvalidSizeSmall/AMD_HIP_BACKEND___{{.*}}___UR_IMAGE_INFO_SLICE_PITCH
18+
urMemImageGetInfoTest.InvalidSizeSmall/AMD_HIP_BACKEND___{{.*}}___UR_IMAGE_INFO_WIDTH
19+
urMemImageGetInfoTest.InvalidSizeSmall/AMD_HIP_BACKEND___{{.*}}___UR_IMAGE_INFO_HEIGHT
20+
urMemImageGetInfoTest.InvalidSizeSmall/AMD_HIP_BACKEND___{{.*}}___UR_IMAGE_INFO_DEPTH

test/conformance/memory/memory_adapter_level_zero.match

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ urMemGetInfoTest.InvalidNullPointerParamValue/Intel_R__oneAPI_Unified_Runtime_ov
66
urMemGetInfoTest.InvalidNullPointerParamValue/Intel_R__oneAPI_Unified_Runtime_over_Level_Zero___{{.*}}___UR_MEM_INFO_CONTEXT
77
urMemGetInfoTest.InvalidNullPointerPropSizeRet/Intel_R__oneAPI_Unified_Runtime_over_Level_Zero___{{.*}}___UR_MEM_INFO_SIZE
88
urMemGetInfoTest.InvalidNullPointerPropSizeRet/Intel_R__oneAPI_Unified_Runtime_over_Level_Zero___{{.*}}___UR_MEM_INFO_CONTEXT
9+
urMemGetInfoImageTest.Success/Intel_R__oneAPI_Unified_Runtime_over_Level_Zero___{{.*}}___UR_MEM_INFO_SIZE
910
{{Segmentation fault|Aborted}}

test/conformance/memory/urMemGetInfo.cpp

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,20 @@
22
// Part of the Unified-Runtime Project, under the Apache License v2.0 with LLVM Exceptions.
33
// See LICENSE.TXT
44
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
5+
#include <array>
56
#include <map>
67
#include <uur/fixtures.h>
78

89
using urMemGetInfoTest = uur::urMemBufferTestWithParam<ur_mem_info_t>;
910

11+
static constexpr std::array<ur_mem_info_t, 2> mem_info_values{
12+
UR_MEM_INFO_SIZE, UR_MEM_INFO_CONTEXT};
1013
static std::unordered_map<ur_mem_info_t, size_t> mem_info_size_map = {
1114
{UR_MEM_INFO_SIZE, sizeof(size_t)},
1215
{UR_MEM_INFO_CONTEXT, sizeof(ur_context_handle_t)},
1316
};
1417

15-
UUR_TEST_SUITE_P(urMemGetInfoTest,
16-
::testing::Values(UR_MEM_INFO_SIZE, UR_MEM_INFO_CONTEXT),
18+
UUR_TEST_SUITE_P(urMemGetInfoTest, ::testing::ValuesIn(mem_info_values),
1719
uur::deviceTestWithParamPrinter<ur_mem_info_t>);
1820

1921
TEST_P(urMemGetInfoTest, Success) {
@@ -71,3 +73,35 @@ TEST_P(urMemGetInfoTest, InvalidNullPointerPropSizeRet) {
7173
urMemGetInfo(buffer, UR_MEM_INFO_SIZE, 0, nullptr, nullptr),
7274
UR_RESULT_ERROR_INVALID_SIZE);
7375
}
76+
77+
using urMemGetInfoImageTest = uur::urMemImageTestWithParam<ur_mem_info_t>;
78+
UUR_TEST_SUITE_P(urMemGetInfoImageTest, ::testing::ValuesIn(mem_info_values),
79+
uur::deviceTestWithParamPrinter<ur_mem_info_t>);
80+
81+
TEST_P(urMemGetInfoImageTest, Success) {
82+
ur_mem_info_t info = getParam();
83+
size_t size;
84+
ASSERT_SUCCESS(urMemGetInfo(image, info, 0, nullptr, &size));
85+
ASSERT_NE(size, 0);
86+
87+
if (const auto expected_size = mem_info_size_map.find(info);
88+
expected_size != mem_info_size_map.end()) {
89+
ASSERT_EQ(expected_size->second, size);
90+
}
91+
92+
std::vector<uint8_t> info_data(size);
93+
ASSERT_SUCCESS(urMemGetInfo(image, info, size, info_data.data(), nullptr));
94+
95+
if (info == UR_MEM_INFO_SIZE) {
96+
const size_t ExpectedPixelSize = sizeof(float) * 4 /*NumChannels*/;
97+
const size_t ExpectedImageSize = ExpectedPixelSize * desc.arraySize *
98+
desc.width * desc.height * desc.depth;
99+
const size_t ImageSizeBytes =
100+
*reinterpret_cast<const size_t *>(info_data.data());
101+
ASSERT_EQ(ImageSizeBytes, ExpectedImageSize);
102+
} else if (info == UR_MEM_INFO_CONTEXT) {
103+
ur_context_handle_t InfoContext =
104+
*reinterpret_cast<ur_context_handle_t *>(info_data.data());
105+
ASSERT_EQ(InfoContext, context);
106+
}
107+
}

0 commit comments

Comments
 (0)