| // Copyright 2023 The IREE Authors | |
| // | |
| // Licensed under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| #include "experimental/cuda2/cuda_status_util.h" | |
| #include <stddef.h> | |
| #include "experimental/cuda2/cuda_dynamic_symbols.h" | |
| #include "iree/base/status.h" | |
| // The list of CUDA error strings with their corresponding IREE error state | |
| // classification. | |
| // | |
| // Note that the list of errors is taken from `cudaError_enum` in cuda.h. | |
| // This is not an exhaustive list; we are just listing common ones here. | |
| #define IREE_CUDA_ERROR_LIST(IREE_CUDA_MAP_ERROR) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_INVALID_VALUE", \ | |
| IREE_STATUS_INVALID_ARGUMENT) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_OUT_OF_MEMORY", \ | |
| IREE_STATUS_RESOURCE_EXHAUSTED) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_NOT_INITIALIZED", IREE_STATUS_INTERNAL) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_DEINITIALIZED", IREE_STATUS_INTERNAL) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_STUB_LIBRARY", \ | |
| IREE_STATUS_FAILED_PRECONDITION) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_NO_DEVICE", IREE_STATUS_FAILED_PRECONDITION) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_INVALID_DEVICE", \ | |
| IREE_STATUS_FAILED_PRECONDITION) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_DEVICE_NOT_LICENSED", \ | |
| IREE_STATUS_FAILED_PRECONDITION) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_INVALID_IMAGE", \ | |
| IREE_STATUS_FAILED_PRECONDITION) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_INVALID_CONTEXT", IREE_STATUS_INTERNAL) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_MAP_FAILED", IREE_STATUS_INTERNAL) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_UNMAP_FAILED", IREE_STATUS_INTERNAL) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_ALREADY_MAPPED", IREE_STATUS_ALREADY_EXISTS) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_NO_BINARY_FOR_GPU", \ | |
| IREE_STATUS_FAILED_PRECONDITION) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_ALREADY_ACQUIRED", \ | |
| IREE_STATUS_ALREADY_EXISTS) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_NOT_MAPPED", IREE_STATUS_INTERNAL) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_NOT_MAPPED_AS_ARRAY", IREE_STATUS_INTERNAL) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_NOT_MAPPED_AS_POINTER", \ | |
| IREE_STATUS_INTERNAL) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_UNSUPPORTED_LIMIT", \ | |
| IREE_STATUS_OUT_OF_RANGE) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_CONTEXT_ALREADY_IN_USE", \ | |
| IREE_STATUS_INTERNAL) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_INVALID_PTX", \ | |
| IREE_STATUS_FAILED_PRECONDITION) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_NVLINK_UNCORRECTABLE", \ | |
| IREE_STATUS_DATA_LOSS) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_JIT_COMPILER_NOT_FOUND", \ | |
| IREE_STATUS_FAILED_PRECONDITION) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_UNSUPPORTED_PTX_VERSION", \ | |
| IREE_STATUS_FAILED_PRECONDITION) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_JIT_COMPILATION_DISABLED", \ | |
| IREE_STATUS_FAILED_PRECONDITION) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_UNSUPPORTED_EXEC_AFFINITY", \ | |
| IREE_STATUS_FAILED_PRECONDITION) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_INVALID_SOURCE", \ | |
| IREE_STATUS_FAILED_PRECONDITION) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_FILE_NOT_FOUND", IREE_STATUS_NOT_FOUND) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND", \ | |
| IREE_STATUS_NOT_FOUND) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_SHARED_OBJECT_INIT_FAILED", \ | |
| IREE_STATUS_INTERNAL) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_OPERATING_SYSTEM", IREE_STATUS_INTERNAL) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_INVALID_HANDLE", \ | |
| IREE_STATUS_INVALID_ARGUMENT) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_ILLEGAL_STATE", IREE_STATUS_INTERNAL) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_NOT_FOUND", IREE_STATUS_NOT_FOUND) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_NOT_READY", IREE_STATUS_UNAVAILABLE) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_ILLEGAL_ADDRESS", IREE_STATUS_ABORTED) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES", \ | |
| IREE_STATUS_RESOURCE_EXHAUSTED) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_LAUNCH_TIMEOUT", \ | |
| IREE_STATUS_DEADLINE_EXCEEDED) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_PRIMARY_CONTEXT_ACTIVE", \ | |
| IREE_STATUS_INTERNAL) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_CONTEXT_IS_DESTROYED", IREE_STATUS_INTERNAL) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_ASSERT", IREE_STATUS_ABORTED) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_HOST_MEMORY_ALREADY_REGISTERED", \ | |
| IREE_STATUS_INTERNAL) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_HOST_MEMORY_NOT_REGISTERED", \ | |
| IREE_STATUS_INTERNAL) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_HARDWARE_STACK_ERROR", IREE_STATUS_ABORTED) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_ILLEGAL_INSTRUCTION", IREE_STATUS_ABORTED) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_MISALIGNED_ADDRESS", IREE_STATUS_ABORTED) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_INVALID_ADDRESS_SPACE", IREE_STATUS_ABORTED) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_INVALID_PC", IREE_STATUS_ABORTED) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_LAUNCH_FAILED", IREE_STATUS_ABORTED) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_COOPERATIVE_LAUNCH_TOO_LARGE", \ | |
| IREE_STATUS_OUT_OF_RANGE) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_NOT_PERMITTED", \ | |
| IREE_STATUS_PERMISSION_DENIED) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_NOT_SUPPORTED", \ | |
| IREE_STATUS_FAILED_PRECONDITION) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_SYSTEM_NOT_READY", IREE_STATUS_UNAVAILABLE) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_SYSTEM_DRIVER_MISMATCH", \ | |
| IREE_STATUS_FAILED_PRECONDITION) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_TIMEOUT", IREE_STATUS_DEADLINE_EXCEEDED) \ | |
| IREE_CUDA_MAP_ERROR("CUDA_ERROR_UNKNOWN", IREE_STATUS_UNKNOWN) | |
| // Converts CUDA |error_name| to the corresponding IREE status code. | |
| static iree_status_code_t iree_hal_cuda2_error_name_to_status_code( | |
| const char* error_name) { | |
| #define IREE_CUDA_ERROR_TO_IREE_STATUS(cuda_error, iree_status) \ | |
| if (strncmp(error_name, cuda_error, strlen(cuda_error)) == 0) { \ | |
| return iree_status; \ | |
| } | |
| IREE_CUDA_ERROR_LIST(IREE_CUDA_ERROR_TO_IREE_STATUS) | |
| #undef IREE_CUDA_ERROR_TO_IREE_STATUS | |
| return IREE_STATUS_UNKNOWN; | |
| } | |
| #undef IREE_CUDA_ERROR_LIST | |
| iree_status_t iree_hal_cuda2_result_to_status( | |
| const iree_hal_cuda2_dynamic_symbols_t* syms, CUresult result, | |
| const char* file, uint32_t line) { | |
| if (IREE_LIKELY(result == CUDA_SUCCESS)) return iree_ok_status(); | |
| const char* error_name = NULL; | |
| if (!syms->cuGetErrorName || | |
| syms->cuGetErrorName(result, &error_name) != CUDA_SUCCESS) { | |
| error_name = "CUDA_ERROR_UNKNOWN"; | |
| } | |
| const char* error_string = NULL; | |
| if (!syms->cuGetErrorString || | |
| syms->cuGetErrorString(result, &error_string) != CUDA_SUCCESS) { | |
| error_string = "unknown error"; | |
| } | |
| return iree_make_status_with_location( | |
| file, line, iree_hal_cuda2_error_name_to_status_code(error_name), | |
| "CUDA error '%s' (%d): %s", error_name, result, error_string); | |
| } |