Skip to content

Commit cda0cd9

Browse files
authored
Merge pull request #1213 from fabiomestre/fabio/imagegetinfo_cuda
[CUDA] Implement urMemImageGetInfo
2 parents e27528a + 46604be commit cda0cd9

File tree

2 files changed

+107
-19
lines changed

2 files changed

+107
-19
lines changed

source/adapters/cuda/memory.cpp

Lines changed: 105 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -398,11 +398,111 @@ UR_APIEXPORT ur_result_t UR_APICALL urMemImageCreate(
398398
return Result;
399399
}
400400

401-
/// \TODO Not implemented
402-
UR_APIEXPORT ur_result_t UR_APICALL urMemImageGetInfo(ur_mem_handle_t,
403-
ur_image_info_t, size_t,
404-
void *, size_t *) {
405-
return UR_RESULT_ERROR_UNSUPPORTED_FEATURE;
401+
UR_APIEXPORT ur_result_t UR_APICALL urMemImageGetInfo(ur_mem_handle_t hMemory,
402+
ur_image_info_t propName,
403+
size_t propSize,
404+
void *pPropValue,
405+
size_t *pPropSizeRet) {
406+
UR_ASSERT(hMemory->isImage(), UR_RESULT_ERROR_INVALID_MEM_OBJECT);
407+
408+
auto Context = hMemory->getContext();
409+
410+
ScopedContext Active(Context);
411+
UrReturnHelper ReturnValue(propSize, pPropValue, pPropSizeRet);
412+
413+
try {
414+
CUDA_ARRAY3D_DESCRIPTOR ArrayInfo;
415+
416+
UR_CHECK_ERROR(cuArray3DGetDescriptor(
417+
&ArrayInfo, std::get<SurfaceMem>(hMemory->Mem).getArray()));
418+
419+
const auto cuda2urFormat = [](CUarray_format CUFormat,
420+
ur_image_channel_type_t *ChannelType) {
421+
switch (CUFormat) {
422+
case CU_AD_FORMAT_UNSIGNED_INT8:
423+
*ChannelType = UR_IMAGE_CHANNEL_TYPE_UNSIGNED_INT8;
424+
break;
425+
case CU_AD_FORMAT_UNSIGNED_INT16:
426+
*ChannelType = UR_IMAGE_CHANNEL_TYPE_UNSIGNED_INT16;
427+
break;
428+
case CU_AD_FORMAT_UNSIGNED_INT32:
429+
*ChannelType = UR_IMAGE_CHANNEL_TYPE_UNSIGNED_INT32;
430+
break;
431+
case CU_AD_FORMAT_SIGNED_INT8:
432+
*ChannelType = UR_IMAGE_CHANNEL_TYPE_SIGNED_INT8;
433+
break;
434+
case CU_AD_FORMAT_SIGNED_INT16:
435+
*ChannelType = UR_IMAGE_CHANNEL_TYPE_SIGNED_INT16;
436+
break;
437+
case CU_AD_FORMAT_SIGNED_INT32:
438+
*ChannelType = UR_IMAGE_CHANNEL_TYPE_SIGNED_INT32;
439+
break;
440+
case CU_AD_FORMAT_HALF:
441+
*ChannelType = UR_IMAGE_CHANNEL_TYPE_HALF_FLOAT;
442+
break;
443+
case CU_AD_FORMAT_FLOAT:
444+
*ChannelType = UR_IMAGE_CHANNEL_TYPE_FLOAT;
445+
break;
446+
default:
447+
return UR_RESULT_ERROR_UNSUPPORTED_IMAGE_FORMAT;
448+
}
449+
return UR_RESULT_SUCCESS;
450+
};
451+
452+
const auto cudaFormatToElementSize = [](CUarray_format CUFormat,
453+
size_t *Size) {
454+
switch (CUFormat) {
455+
case CU_AD_FORMAT_UNSIGNED_INT8:
456+
case CU_AD_FORMAT_SIGNED_INT8:
457+
*Size = 1;
458+
break;
459+
case CU_AD_FORMAT_UNSIGNED_INT16:
460+
case CU_AD_FORMAT_SIGNED_INT16:
461+
case CU_AD_FORMAT_HALF:
462+
*Size = 2;
463+
break;
464+
case CU_AD_FORMAT_UNSIGNED_INT32:
465+
case CU_AD_FORMAT_SIGNED_INT32:
466+
case CU_AD_FORMAT_FLOAT:
467+
*Size = 4;
468+
break;
469+
default:
470+
return UR_RESULT_ERROR_UNSUPPORTED_IMAGE_FORMAT;
471+
}
472+
return UR_RESULT_SUCCESS;
473+
};
474+
475+
switch (propName) {
476+
case UR_IMAGE_INFO_FORMAT: {
477+
ur_image_channel_type_t ChannelType{};
478+
UR_CHECK_ERROR(cuda2urFormat(ArrayInfo.Format, &ChannelType));
479+
return ReturnValue(
480+
ur_image_format_t{UR_IMAGE_CHANNEL_ORDER_RGBA, ChannelType});
481+
}
482+
case UR_IMAGE_INFO_WIDTH:
483+
return ReturnValue(ArrayInfo.Width);
484+
case UR_IMAGE_INFO_HEIGHT:
485+
return ReturnValue(ArrayInfo.Height);
486+
case UR_IMAGE_INFO_DEPTH:
487+
return ReturnValue(ArrayInfo.Depth);
488+
case UR_IMAGE_INFO_ELEMENT_SIZE: {
489+
size_t Size = 0;
490+
UR_CHECK_ERROR(cudaFormatToElementSize(ArrayInfo.Format, &Size));
491+
return ReturnValue(Size);
492+
}
493+
case UR_IMAGE_INFO_ROW_PITCH:
494+
case UR_IMAGE_INFO_SLICE_PITCH:
495+
return UR_RESULT_ERROR_UNSUPPORTED_ENUMERATION;
496+
497+
default:
498+
return UR_RESULT_ERROR_INVALID_ENUMERATION;
499+
}
500+
501+
} catch (ur_result_t Err) {
502+
return Err;
503+
} catch (...) {
504+
return UR_RESULT_ERROR_UNKNOWN;
505+
}
406506
}
407507

408508
/// Implements a buffer partition in the CUDA backend.
Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,5 @@
11
urMemBufferCreateWithNativeHandleTest.Success/NVIDIA_CUDA_BACKEND___{{.*}}_
22
{{OPT}}urMemGetInfoImageTest.Success/NVIDIA_CUDA_BACKEND___{{.*}}___UR_MEM_INFO_SIZE
33
{{OPT}}urMemGetInfoImageTest.Success/NVIDIA_CUDA_BACKEND___{{.*}}___UR_MEM_INFO_CONTEXT
4-
{{OPT}}urMemImageGetInfoTest.Success/NVIDIA_CUDA_BACKEND___{{.*}}___UR_IMAGE_INFO_FORMAT
5-
{{OPT}}urMemImageGetInfoTest.Success/NVIDIA_CUDA_BACKEND___{{.*}}___UR_IMAGE_INFO_ELEMENT_SIZE
6-
{{OPT}}urMemImageGetInfoTest.Success/NVIDIA_CUDA_BACKEND___{{.*}}___UR_IMAGE_INFO_ROW_PITCH
7-
{{OPT}}urMemImageGetInfoTest.Success/NVIDIA_CUDA_BACKEND___{{.*}}___UR_IMAGE_INFO_SLICE_PITCH
8-
{{OPT}}urMemImageGetInfoTest.Success/NVIDIA_CUDA_BACKEND___{{.*}}___UR_IMAGE_INFO_WIDTH
9-
{{OPT}}urMemImageGetInfoTest.Success/NVIDIA_CUDA_BACKEND___{{.*}}___UR_IMAGE_INFO_HEIGHT
10-
{{OPT}}urMemImageGetInfoTest.Success/NVIDIA_CUDA_BACKEND___{{.*}}___UR_IMAGE_INFO_DEPTH
11-
{{OPT}}urMemImageGetInfoTest.InvalidSizeSmall/NVIDIA_CUDA_BACKEND___{{.*}}___UR_IMAGE_INFO_FORMAT
12-
{{OPT}}urMemImageGetInfoTest.InvalidSizeSmall/NVIDIA_CUDA_BACKEND___{{.*}}___UR_IMAGE_INFO_ELEMENT_SIZE
13-
{{OPT}}urMemImageGetInfoTest.InvalidSizeSmall/NVIDIA_CUDA_BACKEND___{{.*}}___UR_IMAGE_INFO_ROW_PITCH
14-
{{OPT}}urMemImageGetInfoTest.InvalidSizeSmall/NVIDIA_CUDA_BACKEND___{{.*}}___UR_IMAGE_INFO_SLICE_PITCH
15-
{{OPT}}urMemImageGetInfoTest.InvalidSizeSmall/NVIDIA_CUDA_BACKEND___{{.*}}___UR_IMAGE_INFO_WIDTH
16-
{{OPT}}urMemImageGetInfoTest.InvalidSizeSmall/NVIDIA_CUDA_BACKEND___{{.*}}___UR_IMAGE_INFO_HEIGHT
17-
{{OPT}}urMemImageGetInfoTest.InvalidSizeSmall/NVIDIA_CUDA_BACKEND___{{.*}}___UR_IMAGE_INFO_DEPTH
4+
urMemImageGetInfoTest.Success/NVIDIA_CUDA_BACKEND___{{.*}}___UR_IMAGE_INFO_ROW_PITCH
5+
urMemImageGetInfoTest.Success/NVIDIA_CUDA_BACKEND___{{.*}}___UR_IMAGE_INFO_SLICE_PITCH

0 commit comments

Comments
 (0)