1. 模块
以下是所有模块的列表
1.1. cuDLA 驱动程序使用的数据类型
类
类型定义
- typedef cudlaDevHandle_t * cudlaDevHandle
- typedef cudlaModule_t * cudlaModule
枚举
- enum cudlaAccessPermissionFlags
- enum cudlaDevAttributeType
- enum cudlaFenceType
- enum cudlaMode
- enum cudlaModuleAttributeType
- enum cudlaModuleLoadFlags
- enum cudlaNvSciSyncAttributes
- enum cudlaStatus
- enum cudlaSubmissionFlags
类型定义
枚举
- enum cudlaAccessPermissionFlags
-
导入 NvSciBuffers 的访问权限标志
值
- CUDLA_READ_WRITE_PERM = 0
- 使用读写权限导入内存的标志
- CUDLA_READ_ONLY_PERM = 1
- 使用只读权限导入内存的标志
- CUDLA_TASK_STATISTICS = 1<<1
- 将缓冲区指示为分层统计信息缓冲区的标志。
- enum cudlaDevAttributeType
-
设备属性类型。
值
- CUDLA_UNIFIED_ADDRESSING = 0
- 检查是否支持 UVA 的标志。
- CUDLA_DEVICE_VERSION = 1
- 检查 DLA HW 版本的标志。
- enum cudlaFenceType
-
支持的 Fence 类型。
值
- CUDLA_NVSCISYNC_FENCE = 1
- EOF 的 NvSciSync fence 类型。
- CUDLA_NVSCISYNC_FENCE_SOF = 2
- enum cudlaMode
-
设备创建模式。
值
- CUDLA_CUDA_DLA = 0
- 混合模式。
- CUDLA_STANDALONE = 1
- 独立模式。
- enum cudlaModuleAttributeType
-
模块属性类型。
值
- CUDLA_NUM_INPUT_TENSORS = 0
- 检索输入张量数量的标志。
- CUDLA_NUM_OUTPUT_TENSORS = 1
- 检索输出张量数量的标志。
- CUDLA_INPUT_TENSOR_DESCRIPTORS = 2
- 检索所有输入张量描述符的标志。
- CUDLA_OUTPUT_TENSOR_DESCRIPTORS = 3
- 检索所有输出张量描述符的标志。
- CUDLA_NUM_OUTPUT_TASK_STATISTICS = 4
- 检索输出任务统计信息缓冲区总数的标志。
- CUDLA_OUTPUT_TASK_STATISTICS_DESCRIPTORS = 5
- 检索所有输出任务统计信息描述符的标志。
- enum cudlaModuleLoadFlags
-
用于 cudlaModuleLoadFromMemory 的模块加载标志。
值
- CUDLA_MODULE_DEFAULT = 0
- 默认标志。
- CUDLA_MODULE_ENABLE_FAULT_DIAGNOSTICS = 1
- 用于加载执行 DLA HW 永久性故障诊断的模块的标志。
- enum cudlaNvSciSyncAttributes
-
cuDLA NvSciSync 属性。
值
- CUDLA_NVSCISYNC_ATTR_WAIT = 1
- 等待属性。
- CUDLA_NVSCISYNC_ATTR_SIGNAL = 2
- 信号属性。
- enum cudlaStatus
-
错误代码。
值
- cudlaSuccess = 0
- API 调用返回,没有错误。
- cudlaErrorInvalidParam = 1
- 表示传递给 API 的一个或多个参数不正确。
- cudlaErrorOutOfResources = 2
- 表示 API 调用因缺少底层资源而失败。
- cudlaErrorCreationFailed = 3
- 表示在创建设备句柄期间发生内部错误。
- cudlaErrorInvalidAddress = 4
- 表示 API 调用中传递的内存对象之前未注册。
- cudlaErrorOs = 5
- 表示发生操作系统错误。
- cudlaErrorCuda = 6
- 表示作为 API 调用的一部分,CUDA 操作中存在错误。
- cudlaErrorUmd = 7
- 表示 API 调用的 DLA 运行时中存在错误。
- cudlaErrorInvalidDevice = 8
- 表示传递给 API 调用的设备句柄无效。
- cudlaErrorInvalidAttribute = 9
- 表示正在请求无效属性。
- cudlaErrorIncompatibleDlaSWVersion = 10
- 表示底层 DLA 运行时与当前的 cuDLA 版本不兼容。
- cudlaErrorMemoryRegistered = 11
- 表示内存对象已注册。
- cudlaErrorInvalidModule = 12
- 表示传递的模块无效。
- cudlaErrorUnsupportedOperation = 13
- 表示 API 调用请求的操作不受支持。
- cudlaErrorNvSci = 14
- 表示 API 调用请求的 NvSci 操作失败。
- cudlaErrorDlaErrInvalidInput = 0x40000001
- DLA HW 错误。
- cudlaErrorDlaErrInvalidPreAction = 0x40000002
- DLA HW 错误。
- cudlaErrorDlaErrNoMem = 0x40000003
- DLA HW 错误。
- cudlaErrorDlaErrProcessorBusy = 0x40000004
- DLA HW 错误。
- cudlaErrorDlaErrTaskStatusMismatch = 0x40000005
- DLA HW 错误。
- cudlaErrorDlaErrEngineTimeout = 0x40000006
- DLA HW 错误。
- cudlaErrorDlaErrDataMismatch = 0x40000007
- DLA HW 错误。
- cudlaErrorUnknown = 0x7fffffff
- 表示发生未知错误。
- enum cudlaSubmissionFlags
-
用于 cudlaSubmitTask 的任务提交标志。
值
- CUDLA_SUBMIT_NOOP = 1
- 指定提交的任务必须绕过执行的标志。
- CUDLA_SUBMIT_SKIP_LOCK_ACQUIRE = 1<<1
- 指定必须跳过全局锁获取的标志。
- CUDLA_SUBMIT_DIAGNOSTICS_TASK = 1<<2
- 指定提交的任务是为 DLA HW 运行永久性故障诊断的标志。
1.2. cuDLA API
本节介绍 cuDLA 驱动程序的应用程序编程接口。
函数
- cudlaStatus cudlaCreateDevice ( const uint64_t device, const cudlaDevHandle* devHandle, const uint32_t flags )
- 创建设备句柄。
- cudlaStatus cudlaDestroyDevice ( const cudlaDevHandle devHandle )
- 销毁设备句柄。
- cudlaStatus cudlaDeviceGetAttribute ( const cudlaDevHandle devHandle, const cudlaDevAttributeType attrib, const cudlaDevAttribute* pAttribute )
- 获取 cuDLA 设备属性。
- cudlaStatus cudlaDeviceGetCount ( const uint64_t* pNumDevices )
- 获取设备计数。
- cudlaStatus cudlaGetLastError ( const cudlaDevHandle devHandle )
- 获取任务执行中的最后一个异步错误。
- cudlaStatus cudlaGetNvSciSyncAttributes ( uint64_t* attrList, const uint32_t flags )
- 获取 cuDLA 的 NvSciSync 属性。
- cudlaStatus cudlaGetVersion ( const uint64_t* version )
- 返回库的版本号。
- cudlaStatus cudlaImportExternalMemory ( const cudlaDevHandle devHandle, const cudlaExternalMemoryHandleDesc* desc, const uint64_t** devPtr, const uint32_t flags )
- 将外部内存导入到 cuDLA 中。
- cudlaStatus cudlaImportExternalSemaphore ( const cudlaDevHandle devHandle, const cudlaExternalSemaphoreHandleDesc* desc, const uint64_t** devPtr, const uint32_t flags )
- 将外部信号量导入到 cuDLA 中。
- cudlaStatus cudlaMemRegister ( const cudlaDevHandle devHandle, const uint64_t* ptr, const size_t size, const uint64_t** devPtr, const uint32_t flags )
- 向 DLA 引擎注册 CUDA 内存。
- cudlaStatus cudlaMemUnregister ( const cudlaDevHandle devHandle, const uint64_t* devPtr )
- 从 DLA 引擎注销输入内存。
- cudlaStatus cudlaModuleGetAttributes ( const cudlaModule hModule, const cudlaModuleAttributeType attrType, const cudlaModuleAttribute* attribute )
- 获取 DLA 模块属性。
- cudlaStatus cudlaModuleLoadFromMemory ( const cudlaDevHandle devHandle, const uint8_t* pModule, const size_t moduleSize, const cudlaModule* hModule, const uint32_t flags )
- 加载 DLA 模块。
- cudlaStatus cudlaModuleUnload ( const cudlaModule hModule, const uint32_t flags )
- 卸载 DLA 模块。
- cudlaStatus cudlaSetTaskTimeoutInMs ( const cudlaDevHandle devHandle, const uint32_t timeout )
- 设置任务超时时间(毫秒)。
- cudlaStatus cudlaSubmitTask ( const cudlaDevHandle devHandle, const cudlaTask* ptrToTasks, const uint32_t numTasks, const void* stream, const uint32_t flags )
- 在 DLA 上提交推理操作。
函数
- cudlaStatus cudlaCreateDevice ( const uint64_t device, const cudlaDevHandle* devHandle, const uint32_t flags )
-
创建设备句柄。
参数
- device
- - 设备编号(可以是 0 或 1)。
- devHandle
- - 用于保存创建的 cuDLA 设备句柄的指针。
- flags
- - 控制设备创建的标志。有效值为flags是
- CUDLA_CUDA_DLA - 在此模式下,cuDLA 充当 CUDA 的编程模型扩展,其中可以使用 CUDA 构造提交 DLA 工作。
- CUDLA_STANDALONE - 在此模式下,cuDLA 独立工作,不与 CUDA 交互。
返回值
cudlaSuccess, cudlaErrorOutOfResources, cudlaErrorInvalidParam, cudlaErrorIncompatibleDlaSWVersion, cudlaErrorCreationFailed, cudlaErrorCuda, cudlaErrorUmd, cudlaErrorUnsupportedOperation
描述
创建 cuDLA 设备的实例,该实例可用于提交 DLA 操作。应用程序可以在混合模式或独立模式下创建句柄。在混合模式下,此 API 使用当前设置的 GPU 设备来决定创建的 DLA 设备句柄的关联。如果当前设置的 GPU 设备是 dGPU,则此函数返回 cudlaErrorUnsupportedOperation,因为 cuDLA 目前在 dGPU 上不受支持。cuDLA 每个 DLA HW 实例支持 16 个 cuDLA 设备句柄。
- cudlaStatus cudlaDestroyDevice ( const cudlaDevHandle devHandle )
-
销毁设备句柄。
参数
- devHandle
- - 有效的设备句柄。
描述
销毁使用 cudlaCreateDevice 创建的 cuDLA 设备的实例。在销毁句柄之前,务必确保先前提交给设备的所有任务均已完成。否则可能会导致应用程序崩溃。
在混合模式下,cuDLA 在内部使用 CUDA 和主上下文执行内存分配。因此,在销毁或重置 CUDA 主上下文之前,必须销毁所有 cuDLA 设备初始化。
注意此 API 可能会返回先前 DLA 任务提交的任务执行错误。
- cudlaStatus cudlaDeviceGetAttribute ( const cudlaDevHandle devHandle, const cudlaDevAttributeType attrib, const cudlaDevAttribute* pAttribute )
-
获取 cuDLA 设备属性。
参数
- devHandle
- - 输入 cuDLA 设备句柄。
- attrib
- - 正在请求的属性。
- pAttribute
- - 属性将在其中可用的输出指针。
返回值
cudlaSuccess, cudlaErrorInvalidParam, cudlaErrorInvalidDevice, cudlaErrorUmd, cudlaErrorInvalidAttribute
描述
CUDA 和 DLA 之间的 UVA 寻址需要在底层内核模式驱动程序中提供特殊支持。应用程序应查询 cuDLA 运行时以检查当前版本的 cuDLA 是否支持 UVA 寻址。
注意此 API 可能会返回先前 DLA 任务提交的任务执行错误。
- cudlaStatus cudlaDeviceGetCount ( const uint64_t* pNumDevices )
-
获取设备计数。
参数
- pNumDevices
- - 成功完成后,DLA 设备的数量将在此变量中可用。
描述
获取可用的 DLA 设备数量。
- cudlaStatus cudlaGetLastError ( const cudlaDevHandle devHandle )
-
获取任务执行中的最后一个异步错误。
参数
- devHandle
- - 有效的设备句柄。
返回值
cudlaSuccess, cudlaErrorInvalidDevice, cudlaErrorDlaErrInvalidInput, cudlaErrorDlaErrInvalidPreAction, cudlaErrorDlaErrNoMem, cudlaErrorDlaErrProcessorBusy, cudlaErrorDlaErrTaskStatusMismatch, cudlaErrorDlaErrEngineTimeout, cudlaErrorDlaErrDataMismatch, cudlaErrorUnknown
描述
DLA 任务在 DLA HW 上异步执行。因此,任务执行的状态在任务提交时未知。可以使用此接口查询最近为特定设备句柄执行的 DLA HW 执行的任务状态。
请注意,从此函数返回 cudlaSuccess 返回代码不一定意味着最近的任务执行成功。由于此函数立即返回,因此它只能报告调用时的时间快照的任务状态。为了保证任务完成,应用程序必须在混合模式或独立模式下同步提交的任务,然后调用此 API 以检查错误。
- cudlaStatus cudlaGetNvSciSyncAttributes ( uint64_t* attrList, const uint32_t flags )
-
获取 cuDLA 的 NvSciSync 属性。
参数
- attrList
- - 应用程序创建的属性列表。
- flags
- - 应用程序可以使用此标志来指定他们打算如何使用从attrList. 创建的 NvSciSync 对象。 的有效值flags可以是以下值之一(或这些值的 OR 运算)
- CUDLA_NVSCISYNC_ATTR_WAIT,指定应用程序打算使用使用此属性列表创建的 NvSciSync 对象作为 cuDLA 中的等待器,因此需要 cuDLA 填充等待器特定的 NvSciSyncAttr。
- CUDLA_NVSCISYNC_ATTR_SIGNAL,指定应用程序打算使用使用此属性列表创建的 NvSciSync 对象作为 cuDLA 中的信号器,因此需要 cuDLA 填充信号器特定的 NvSciSyncAttr。
返回值
- cudlaSuccess, API 调用返回,没有错误。
- cudlaErrorInvalidParam, 此 API 调用失败,因为传递了无效参数 attrList。
- cudlaErrorUnsupportedOperation, 此错误代码表示 API 调用失败,因为混合模式不支持该操作。
- cudlaErrorInvalidAttribute, API 调用失败,因为参数 attrList 包含无效值。
- cudlaErrorNvSci, 此错误代码表示 API 调用中作为一部分的 NvSci 操作发生错误。
- cudlaErrorNotPermittedOperation, 此错误代码表示当 DRIVE OS 处于 Operational 状态时,不允许进行 API 调用。
- cudlaErrorUnknown, 此错误代码表示发生了未知错误。
描述
获取应用程序创建的属性列表中 NvSciSync 的属性。
cuDLA 支持两种类型的 NvSciSync 对象原语 -
-
同步点
-
确定性信号量。默认情况下,cuDLA 优先考虑同步点原语而不是确定性信号量原语,并在 NvSciSync 属性列表中设置这些优先级。
对于确定性信号量,用于创建 NvSciSync 对象的 NvSciSync 属性列表必须将 NvSciSyncAttrKey_RequireDeterministicFences 键值设置为 true。
cuDLA 还支持 NvSciSync 对象上的时间戳功能。等待者可以通过将 NvSciSync 属性 “NvSciSyncAttrKey_WaiterRequireTimestamps” 设置为 true 来请求此功能。
如果 NvSci 初始化失败,此函数将返回 cudlaErrorUnsupportedOperation。在某些情况下,当底层 NvSci 操作失败时,此函数可以返回 cudlaErrorNvSci 或 cudlaErrorInvalidAttribute。
此 API 使用等效于以下公共属性键值的值更新输入 nvSciSyncAttrList
NvSciSyncAttrKey_RequiredPerm 设置为
-
如果标志值设置为 CUDLA_NVSCISYNC_ATTR_WAIT,则为 NvSciSyncAccessPerm_SignalOnly。
-
如果标志值设置为 CUDLA_NVSCISYNC_ATTR_SIGNAL,则为 NvSciSyncAccessPerm_WaitOnly。
-
如果标志值设置为 CUDLA_NVSCISYNC_ATTR_SIGNAL | CUDLA_NVSCISYNC_ATTR_WAIT,则为 NvSciSyncAccessPerm_WaitSignal。
由于 NvSciSyncAttrKey_RequiredPerm 由 cuDLA 内部设置,因此不允许应用程序设置此值。
注意cuDLA 的用户只能将属性附加到输出attrList使用 NvSci API,修改输出的已填充值attrList可能会导致未定义的行为。
- cudlaStatus cudlaGetVersion ( const uint64_t* version )
-
返回库的版本号。
参数
- version
- - 成功执行后,此变量中将提供 cuDLA 库版本。
描述
cuDLA 是语义化版本控制的。此函数将返回版本,格式为 1000000*主版本号 + 1000*次版本号 + 补丁版本号。
- cudlaStatus cudlaImportExternalMemory ( const cudlaDevHandle devHandle, const cudlaExternalMemoryHandleDesc* desc, const uint64_t** devPtr, const uint32_t flags )
-
将外部内存导入到 cuDLA 中。
参数
- devHandle
- - 有效的设备句柄。
- desc
- - 包含有关已分配外部内存的描述。
- devPtr
- - 映射可用的输出指针。
- flags
- - 应用程序可以使用此标志来指定需要向 DLA 注册的内存的内存访问权限。 的有效值flags可以是以下之一
- CUDLA_READ_WRITE_PERM,指定需要将外部内存注册为 DLA 的读写内存。
- CUDLA_READ_ONLY_PERM,指定需要将外部内存注册为 DLA 的只读内存。
- CUDLA_TASK_STATISTICS,指定需要将外部内存注册到 DLA 以进行逐层统计。
返回值
cudlaSuccess, cudlaErrorInvalidParam, cudlaErrorInvalidDevice, cudlaErrorUnsupportedOperation, cudlaErrorNvSci, cudlaErrorInvalidAttribute, cudlaErrorMemoryRegistered, cudlaErrorUmd
描述
通过向 DLA 注册来导入已分配的外部内存。成功注册后,返回的指针可用于任务提交。
在 Tegra 上,cuDLA 仅在独立模式下支持导入 NvSciBuf 对象。如果 NvSci 初始化失败(由于在混合模式下使用此 API 或 NvSci 库初始化中存在问题),此函数将返回 cudlaErrorUnsupportedOperation。在某些情况下,当底层 NvSci 操作失败时,此函数可以返回 cudlaErrorNvSci 或 cudlaErrorInvalidAttribute。
注意cuDLA 仅支持导入类型为 NvSciBufType_RawBuffer 或 NvSciBufType_Tensor 的 NvSciBuf 对象。导入任何其他类型的 NvSciBuf 对象可能会导致未定义的行为。
注意此 API 可能会返回先前 DLA 任务提交的任务执行错误。
- cudlaStatus cudlaImportExternalSemaphore ( const cudlaDevHandle devHandle, const cudlaExternalSemaphoreHandleDesc* desc, const uint64_t** devPtr, const uint32_t flags )
-
将外部信号量导入到 cuDLA 中。
参数
- devHandle
- - 有效的设备句柄。
- desc
- - 包含信号量对象。
- devPtr
- - 映射可用的输出指针。
- flags
- - 保留供将来使用。必须设置为 0。
返回值
cudlaSuccess, cudlaErrorInvalidParam, cudlaErrorInvalidDevice, cudlaErrorUnsupportedOperation, cudlaErrorNvSci, cudlaErrorInvalidAttribute, cudlaErrorMemoryRegistered
描述
通过向 DLA 注册来导入已分配的外部信号量。成功注册后,返回的指针可用于任务提交以发出同步对象信号。
在 Tegra 上,cuDLA 仅在独立模式下支持导入 NvSciSync 对象。cuDLA 支持的 NvSciSync 对象原语是同步点和确定性信号量。
cuDLA 还支持 NvSciSync 对象上的时间戳功能,用户可以使用该功能获取 DLA 时钟的快照,该时钟指示特定栅栏被发出信号的时间。在任何时间点,只有 512 个有效的可以与栅栏关联的时间戳缓冲区。例如,如果用户从启用了时间戳的单个 NvSciSync 对象创建了 513 个栅栏,则与第 1 个栅栏关联的时间戳缓冲区与第 513 个栅栏的时间戳缓冲区相同。
如果 NvSci 初始化失败(由于在混合模式下使用此 API 或 NvSci 库初始化中存在问题),此函数将返回 cudlaErrorUnsupportedOperation。在某些情况下,当底层 NvSci 操作失败时,此函数可以返回 cudlaErrorNvSci 或 cudlaErrorInvalidAttribute。
注意此 API 可能会返回先前 DLA 任务提交的任务执行错误。
- cudlaStatus cudlaMemRegister ( const cudlaDevHandle devHandle, const uint64_t* ptr, const size_t size, const uint64_t** devPtr, const uint32_t flags )
-
将 CUDA 内存注册到 DLA 引擎。
参数
- devHandle
- - 通过先前调用 cudlaCreateDevice 创建的有效 cuDLA 设备句柄。
- ptr
- - 要注册的 CUDA 指针。
- size
- - 映射的大小,即必须映射的 ptr 中的字节数。
- devPtr
- - 映射可用的输出指针。
- flags
- - 应用程序可以使用此标志来控制注册过程的多个方面。 的有效值flags可以是以下值之一(或这些值的 OR 运算)
- 0, 默认值
- CUDLA_TASK_STATISTICS,指定需要将外部内存注册到 DLA 以进行逐层统计。
返回值
cudlaSuccess, cudlaErrorInvalidDevice, cudlaErrorInvalidParam, cudlaErrorInvalidAddress, cudlaErrorCuda, cudlaErrorUmd, cudlaErrorOutOfResources, cudlaErrorMemoryRegistered, cudlaErrorUnsupportedOperation
描述
作为注册的一部分,将创建一个系统映射,DLA HW 可以通过该映射访问底层的 CUDA 内存。生成的映射在 devPtr 中可用,应用程序在提交操作中引用此内存时必须使用此映射。
如果指针或要注册的大小无效,此函数将返回 cudlaErrorInvalidAddress。此外,如果输入指针已注册,则此函数将返回 cudlaErrorMemoryRegistered。尝试重新注册内存不会在 cuDLA 中引起任何不可恢复的错误,即使发生此错误,应用程序也可以继续使用 cuDLA API。
注意此 API 可能会返回先前 DLA 任务提交的任务执行错误。
- cudlaStatus cudlaMemUnregister ( const cudlaDevHandle devHandle, const uint64_t* devPtr )
-
从 DLA 引擎注销输入内存。
参数
- devHandle
- - 通过先前调用 cudlaCreateDevice 创建的有效 cuDLA 设备句柄。
- devPtr
- - 要注销的指针。
描述
删除使 DLA HW 能够访问内存的系统映射。此映射可能是通过先前调用 cudlaMemRegister 、 cudlaImportExternalMemory 或 cudlaImportExternalSemaphore 创建的。
注意此 API 可能会返回先前 DLA 任务提交的任务执行错误。
- cudlaStatus cudlaModuleGetAttributes ( const cudlaModule hModule, const cudlaModuleAttributeType attrType, const cudlaModuleAttribute* attribute )
-
获取 DLA 模块属性。
参数
- hModule
- - 输入 DLA 模块。
- attrType
- - 正在请求的属性类型。
- attribute
- - 属性将在其中可用的输出指针。
- cudlaStatus cudlaModuleLoadFromMemory ( const cudlaDevHandle devHandle, const uint8_t* pModule, const size_t moduleSize, const cudlaModule* hModule, const uint32_t flags )
-
加载 DLA 模块。
参数
- devHandle
- - 输入 cuDLA 设备句柄。模块将在此句柄的上下文中加载。
- pModule
- - 指向内存中模块的指针。
- moduleSize
- - 模块的大小。
- hModule
- - 加载的模块句柄将在成功执行后在此地址中可用。
- flags
- - 应用程序可以使用此标志来指定模块的使用方式。 的有效值flags可以是以下之一
- CUDLA_MODULE_DEFAULT, 默认值,为 0。
- CUDLA_MODULE_ENABLE_FAULT_DIAGNOSTICS, 应用程序可以指定此标志来加载用于对 DLA HW 执行故障诊断的模块。设置此标志后,pModule和moduleSize参数应为 NULL 和 0,因为诊断模块在内部加载。
返回值
cudlaSuccess, cudlaErrorInvalidDevice, cudlaErrorInvalidParam, cudlaErrorOutOfResources, cudlaErrorUnsupportedOperation, cudlaErrorUmd
描述
将模块加载到当前设备句柄中。
-
不允许将多个可加载项加载到单个 cuDLA 设备句柄上。
-
可加载项在 cuDLA 设备句柄生命周期中只能加载一次。
注意此 API 可能会返回先前 DLA 任务提交的任务执行错误。
- cudlaStatus cudlaModuleUnload ( const cudlaModule hModule, const uint32_t flags )
-
卸载 DLA 模块。
参数
- hModule
- - 加载模块的句柄。
- flags
- - 保留供将来使用。必须设置为 0。
返回值
cudlaSuccess, cudlaErrorInvalidParam, cudlaErrorInvalidDevice, cudlaErrorInvalidModule, cudlaErrorUmd
描述
从加载模块的设备句柄中卸载模块。如果模块未加载到有效的设备中,此 API 将返回 cudlaErrorInvalidDevice。
注意此 API 可能会返回先前 DLA 任务提交的任务执行错误。
- cudlaStatus cudlaSetTaskTimeoutInMs ( const cudlaDevHandle devHandle, const uint32_t timeout )
-
设置任务超时时间,单位为毫秒。
参数
- devHandle
- - 有效的设备句柄。
- timeout
- - 任务超时值,单位为毫秒。
描述
为每个设备句柄设置任务超时时间,单位为毫秒。如果用户未显式设置超时时间,cuDLA 会将默认超时值设置为 30 秒。
如果设备句柄无效或超时时间为 0 或超时时间大于 1000 秒,此函数将返回 cudlaErrorInvalidParam,否则返回 cudlaSuccess。
注意此 API 可能会返回先前 DLA 任务提交的任务执行错误。
- cudlaStatus cudlaSubmitTask ( const cudlaDevHandle devHandle, const cudlaTask* ptrToTasks, const uint32_t numTasks, const void* stream, const uint32_t flags )
-
在 DLA 上提交推理操作。
参数
- devHandle
- - 有效的 cuDLA 设备句柄。
- ptrToTasks
- - 推理任务列表。
- numTasks
- - 任务数。
- stream
- - 必须在哪个流上提交 DLA 任务。
- flags
- - 应用程序可以使用此标志来控制提交过程的多个方面。 的有效值flags可以是以下值之一(或这些值的 OR 运算)
- 0, 默认值
- CUDLA_SUBMIT_NOOP,指定提交的任务在 DLA 上执行期间必须跳过。但是,所有 waitEvents 和 signalEvents 依赖项都必须满足。当执行 NULL 数据提交时,此标志将被忽略,因为在这种情况下,仅内部存储 wait 和 signal 事件以供下一次任务提交使用。
- CUDLA_SUBMIT_SKIP_LOCK_ACQUIRE,指定提交的任务正在设备句柄中排队,并且在任何其他线程中,此时没有其他任务在该设备句柄中排队。这是一个应用程序可以用作优化的标志。通常,cuDLA API 在内部获取全局锁以保证线程安全。但是,在应用程序将任务提交到不同的设备句柄的情况下,此锁会导致不必要的序列化。如果应用程序在多个线程中提交一个或多个任务,并且这些提交是针对不同的设备句柄,并且在各自的提交中作为任务信息的一部分没有提供共享数据,则应用程序可以在提交期间指定此标志,以便跳过内部锁的获取。共享数据还包括混合模式操作中的输入流。因此,如果使用相同的流来提交两个不同的任务,即使两个设备句柄不同,此标志的用法也是无效的。
- CUDLA_SUBMIT_DIAGNOSTICS_TASK,指定提交的任务是为 DLA HW 运行永久性故障诊断。用户可以使用此任务来探测 DLA HW 的状态。设置此标志后,在独立模式下,不允许用户执行仅事件提交,即张量信息为 NULL 且任务中仅存在事件(wait/signal 或两者)。这是因为任务始终在内部加载的诊断模块上运行。此诊断模块不期望任何输入张量,因此不需要输入张量内存,但是用户需要查询输出张量的数量,分配输出张量内存,并在使用提交任务时传递相同的内存。
返回值
cudlaSuccess, cudlaErrorInvalidParam, cudlaErrorInvalidDevice, cudlaErrorInvalidModule, cudlaErrorCuda, cudlaErrorUmd, cudlaErrorOutOfResources, cudlaErrorInvalidAddress, cudlaErrorUnsupportedOperation, cudlaErrorInvalidAttribute, cudlaErrorNvScicudlaErrorOs
描述
此操作接受一系列任务,并将它们提交到 DLA HW 以按照它们在输入任务数组中出现的相同顺序执行。输入和输出张量(以及统计缓冲区,如果使用)假定已使用 cudlaMemRegister (在混合模式下)或 cudlaImportExternalMemory (在独立模式下)预先注册。否则可能会导致此函数返回 cudlaErrorInvalidAddress。
参数stream必须指定为 CUDA 流,DLA 任务在该流上提交以在混合模式下执行。在独立模式下,此参数必须作为 NULL 传递,否则将导致此函数返回 cudlaErrorInvalidParam。
cudlaTask 结构提供了一个规定,用于指定 cuDLA 必须等待和发出信号的 wait 和 signal 事件,作为 cudlaSubmitTask() 的一部分。每个提交的任务都将等待其所有 wait 事件发出信号后才开始执行,并将提供一个信号事件(如果在 cudlaSubmitTask 期间请求了一个信号事件),应用程序(或任何其他实体)可以等待该信号事件,以确保提交的任务已完成执行。在 cuDLA 1.0 中,仅支持 NvSciSync 栅栏作为 wait 事件的一部分。此外,只有 NvSciSync 对象(注册为 cudlaImportExternalSemaphore 的一部分)可以作为 signal 事件的一部分发出信号,并且与信号事件对应的栅栏作为 cudlaSubmitTask 的一部分返回。
在独立模式下,如果在 cudlaTask 结构中将 inputTensor 和 outputTensor 字段设置为 NULL,则任务提交被解释为必须为后续任务提交考虑的 wait 和 signal 事件的入队。不执行实际的任务提交。多个此类后续任务提交(输入/输出张量字段中具有 NULL 字段)将覆盖要考虑的 wait 和 signal 事件列表。换句话说,在非 NULL 提交之前的最新非 NULL wait 事件和/或最新非 NULL signal 事件将被考虑用于后续实际任务提交。在独立模式下的实际任务提交期间,将要考虑的有效 wait 事件和 signal 事件是应用程序使用 NULL 数据提交设置的事件,以及在该特定任务提交中为 waitEvents 和 signalEvents 字段设置的事件。作为 NULL 数据提交一部分设置的 wait 事件仅被视为第一个任务的依赖项,并且当任务列表中的最后一个任务完成时,作为 NULL 数据提交一部分设置的 signal 事件将发出信号。适用于 waitEvents 和 signalEvents 的所有约束(如下所述)也适用于组合列表。
cuDLA 支持 3 种栅栏 - preFence、SOF 栅栏和 EOF 栅栏。
-
preFence 是 DLA 等待以开始任务执行的栅栏类型。使用 cudlaFenceType 作为 CUDLA_NVSCISYNC_FENCE 将栅栏标记为 preFence。
-
SOF(帧开始)栅栏是在 DLA 上开始任务执行之前发出信号的栅栏类型。使用 cudlaFenceType 作为 CUDLA_NVSCISYNC_FENCE_SOF 将栅栏标记为 SOF 栅栏。
-
EOF(帧结束)栅栏是在 DLA 上完成任务执行后发出信号的栅栏类型。使用 cudlaFenceType 作为 CUDLA_NVSCISYNC_FENCE 将栅栏标记为 EOF 栅栏。
对于 wait 事件,应用程序应
-
使用 cudlaImportExternalSemaphore 注册其同步对象。
-
使用 CudlaFence 创建所需数量的 preFence 占位符。
-
使用应用程序中的相关栅栏填充占位符。
-
在 cudlaWaitEvents 中列出所有栅栏。
对于 signal 事件,应用程序应
-
使用 cudlaImportExternalSemaphore 注册其同步对象。
-
使用 CudlaFence 创建所需数量的 SOF 和 EOF 栅栏占位符栅栏。
-
将注册的对象和相应的栅栏放置在 cudlaSignalEvents 中。在确定性信号量的情况下,不需要在 cudlaSignalEvents 中传递栅栏。
当 cudlaSubmitTask 成功返回时,cudlaSignalEvents 中存在的栅栏可用于等待特定任务完成。cuDLA 支持 1 个同步点和任意数量的信号量作为 cudlaSignalEvents 的一部分。如果指定了多个同步点,则返回 cudlaErrorInvalidParam。
cuDLA 遵循 DLA 的限制,每个 DLA 任务支持总共 29 个 preFence 和 SOF 栅栏,以及 29 个 EOF 栅栏。
在提交期间,用户可以选择为网络的各个层启用逐层统计分析。此选项需要通过指定额外的输出缓冲区来实现,这些输出缓冲区将包含分析信息。具体来说,
-
“cudlaTask::numOutputTensors” 应为 cudlaModuleGetAttributes(...,CUDLA_NUM_OUTPUT_TENSORS,...) 和 cudlaModuleGetAttributes(...,CUDLA_NUM_OUTPUT_TASK_STATISTICS,...) 返回值的总和
-
“cudlaTask::outputTensor” 应包含输出张量数组,后跟统计输出缓冲区数组。
如果发生以下情况,此函数可以返回 cudlaErrorUnsupportedOperation
-
混合模式下使用的流处于捕获状态。
-
应用程序尝试在混合模式下使用 NvSci 功能。
-
特定平台的 NvSci 库加载失败。
-
指定了 CUDLA_NVSCISYNC_FENCE 以外的栅栏类型。
-
waitEvents 或 signaEvents 在混合模式下不为 NULL。
-
inputTensor 或 outputTensor 在混合模式下为 NULL,并且标志不是 CUDLA_SUBMIT_DIAGNOSTICS_TASK。
-
inputTensor 为 NULL 而 outputTensor 不为 NULL,反之亦然,在独立模式下,标志不是 CUDLA_SUBMIT_DIAGNOSTICS_TASK。
-
inputTensor 和 outputTensor 为 NULL,并且在独立模式下任务数不等于 1,并且标志不是 CUDLA_SUBMIT_DIAGNOSTICS_TASK。
-
inputTensor 不为 NULL 或 output tensor 为 NULL,并且标志是 CUDLA_SUBMIT_DIAGNOSTICS_TASK。
-
有效的 signal 事件列表具有多个要发出信号的同步点。
-
如果不支持逐层功能。
-
如果每个任务的 preFences、SOF 栅栏和 EOF 栅栏限制未满足。
在某些情况下,当底层 NvSci 操作失败时,此函数可以返回 cudlaErrorNvSci 或 cudlaErrorInvalidAttribute。
如果内部系统操作失败,此函数可以返回 cudlaErrorOs。
注意此 API 可能会返回先前 DLA 任务提交的任务执行错误。
2. 数据结构
2.1. cudlaDevAttribute 联合引用
[cuDLA 驱动程序使用的数据类型]
设备属性。
公共变量
- uint32_t deviceVersion
- uint8_t unifiedAddressingSupported
变量
- uint32_t cudlaDevAttribute::deviceVersion [继承]
-
DLA 设备版本。Xavier 为 1.0,Orin 为 2.0。
- uint8_t cudlaDevAttribute::unifiedAddressingSupported [继承]
-
如果不支持统一寻址,则返回 0。
2.2. cudlaExternalMemoryHandleDesc_t 结构体引用
[cuDLA 驱动程序使用的数据类型]
外部内存句柄描述符。
公共变量
- const void * extBufObject
- unsigned long long size
变量
- const void * cudlaExternalMemoryHandleDesc_t::extBufObject [继承]
-
表示外部内存对象的句柄。
- unsigned long long cudlaExternalMemoryHandleDesc_t::size [inherited]
-
内存分配的大小
2.3. cudlaExternalSemaphoreHandleDesc_t 结构体参考
[cuDLA 驱动程序使用的数据类型]
外部信号量句柄描述符。
公共变量
- const void * extSyncObject
变量
- const void * cudlaExternalSemaphoreHandleDesc_t::extSyncObject [inherited]
-
表示外部同步对象的句柄。
2.4. CudlaFence 结构体参考
[cuDLA 驱动程序使用的数据类型]
栅栏描述。
公共变量
- void * fence
- cudlaFenceType type
变量
- void * CudlaFence::fence [inherited]
-
栅栏。
- cudlaFenceTypeCudlaFence::type [inherited]
-
栅栏类型。
2.5. cudlaModuleAttribute 联合体参考
[cuDLA 驱动程序使用的数据类型]
模块属性。
公共变量
- cudlaModuleTensorDescriptor * inputTensorDesc
- uint32_t numInputTensors
- uint32_t numOutputTensors
- cudlaModuleTensorDescriptor * outputTensorDesc
变量
- cudlaModuleTensorDescriptor * cudlaModuleAttribute::inputTensorDesc [inherited]
-
返回输入张量描述符数组。
- uint32_t cudlaModuleAttribute::numInputTensors [inherited]
-
返回输入张量的数量。
- uint32_t cudlaModuleAttribute::numOutputTensors [inherited]
-
返回输出张量的数量。
- cudlaModuleTensorDescriptor * cudlaModuleAttribute::outputTensorDesc [inherited]
-
返回输出张量描述符数组。
2.7. cudlaSignalEvents 结构体参考
[cuDLA 驱动程序使用的数据类型]
用于 cudlaSubmitTask 的信号事件
公共变量
- const * devPtrs
- CudlaFence * eofFences
- uint32_t numEvents
变量
- const * cudlaSignalEvents::devPtrs [inherited]
-
已注册的同步对象数组 (通过 cudlaImportExternalSemaphore)。
- CudlaFence * cudlaSignalEvents::eofFences [inherited]
-
与同步对象对应的所有信号事件的栅栏指针数组。
- uint32_t cudlaSignalEvents::numEvents [inherited]
-
信号事件总数。
2.8. cudlaTask 结构体参考
[cuDLA 驱动程序使用的数据类型]
任务的结构。
公共变量
- const * inputTensor
- cudlaModule moduleHandle
- uint32_t numInputTensors
- uint32_t numOutputTensors
- const * outputTensor
- cudlaSignalEvents * signalEvents
- const cudlaWaitEvents * waitEvents
变量
- const * cudlaTask::inputTensor [inherited]
-
输入张量数组。
- cudlaModulecudlaTask::moduleHandle [inherited]
-
cuDLA 模块句柄。
- uint32_t cudlaTask::numInputTensors [inherited]
-
输入张量的数量。
- uint32_t cudlaTask::numOutputTensors [inherited]
-
输出张量的数量。
- const * cudlaTask::outputTensor [inherited]
-
输出张量数组。
- cudlaSignalEvents * cudlaTask::signalEvents [inherited]
-
信号事件。
- const cudlaWaitEvents * cudlaTask::waitEvents [inherited]
-
等待事件。
2.9. cudlaWaitEvents 结构体参考
[cuDLA 驱动程序使用的数据类型]
用于 cudlaSubmitTask 的等待事件。
公共变量
- uint32_t numEvents
- const CudlaFence * preFences
变量
- uint32_t cudlaWaitEvents::numEvents [inherited]
-
等待事件总数。
- const CudlaFence * cudlaWaitEvents::preFences [inherited]
-
所有等待事件的栅栏指针数组。
3. 数据字段
以下是所有已记录的结构体和联合体字段的列表,其中包含指向每个字段的结构体/联合体文档的链接
- deviceVersion
- cudlaDevAttribute
- devPtrs
- cudlaSignalEvents
- eofFences
- cudlaSignalEvents
- extBufObject
- cudlaExternalMemoryHandleDesc
- extSyncObject
- cudlaExternalSemaphoreHandleDesc
- fence
- CudlaFence
- inputTensor
- cudlaTask
- inputTensorDesc
- cudlaModuleAttribute
- moduleHandle
- cudlaTask
- numEvents
- cudlaWaitEvents
- cudlaSignalEvents
- numInputTensors
- cudlaTask
- cudlaModuleAttribute
- numOutputTensors
- cudlaTask
- cudlaModuleAttribute
- outputTensor
- cudlaTask
- outputTensorDesc
- cudlaModuleAttribute
- preFences
- cudlaWaitEvents
- signalEvents
- cudlaTask
- size
- cudlaExternalMemoryHandleDesc
- type
- CudlaFence
- unifiedAddressingSupported
- cudlaDevAttribute
- waitEvents
- cudlaTask
声明
声明
本文档仅供参考,不应被视为对产品的特定功能、条件或质量的保证。NVIDIA Corporation (“NVIDIA”) 对本文档中包含信息的准确性或完整性不作任何明示或暗示的陈述或保证,并且对本文档中包含的任何错误不承担任何责任。NVIDIA 对使用此类信息造成的后果或使用,或因使用此类信息而可能导致的侵犯第三方专利或其他权利的行为不承担任何责任。本文档不构成对开发、发布或交付任何材料(下文定义)、代码或功能的承诺。
NVIDIA 保留随时对本文档进行更正、修改、增强、改进和任何其他更改的权利,恕不另行通知。
客户在下订单前应获取最新的相关信息,并应验证此类信息是否为最新且完整。
NVIDIA 产品按照订单确认时提供的 NVIDIA 标准销售条款和条件进行销售,除非 NVIDIA 和客户的授权代表签署的单独销售协议(“销售条款”)另有约定。NVIDIA 在此明确反对将任何客户通用条款和条件应用于购买本文档中引用的 NVIDIA 产品。本文档不直接或间接地形成任何合同义务。
NVIDIA 产品并非设计、授权或保证适用于医疗、军事、航空、航天或生命支持设备,也不适用于 NVIDIA 产品发生故障或故障可能合理预期会导致人身伤害、死亡或财产或环境损害的应用。NVIDIA 对在上述设备或应用中包含和/或使用 NVIDIA 产品不承担任何责任,因此,此类包含和/或使用由客户自行承担风险。
NVIDIA 不保证或声明基于本文档的产品将适用于任何特定用途。NVIDIA 不一定执行每个产品所有参数的测试。客户有责任评估和确定本文档中包含的任何信息的适用性,确保产品适合并满足客户计划的应用,并为应用执行必要的测试,以避免应用或产品的默认设置。客户产品设计的缺陷可能会影响 NVIDIA 产品的质量和可靠性,并可能导致超出本文档中包含的附加或不同的条件和/或要求。NVIDIA 对可能基于或归因于以下原因的任何默认设置、损坏、成本或问题不承担任何责任:(i) 以任何违反本文档的方式使用 NVIDIA 产品;或 (ii) 客户产品设计。
本文档未授予 NVIDIA 专利权、版权或其他 NVIDIA 知识产权下的任何明示或暗示的许可。NVIDIA 发布的有关第三方产品或服务的信息不构成 NVIDIA 授予的使用此类产品或服务的许可,也不构成对其的保证或认可。使用此类信息可能需要获得第三方在第三方的专利或其他知识产权下的许可,或获得 NVIDIA 在 NVIDIA 的专利或其他知识产权下的许可。
只有在事先获得 NVIDIA 书面批准的情况下,才允许复制本文档中的信息,并且复制时不得进行修改,必须完全遵守所有适用的出口法律和法规,并附带所有相关的条件、限制和声明。
本文档和所有 NVIDIA 设计规范、参考板、文件、图纸、诊断程序、列表和其他文档(统称为“材料”)均“按原样”提供。NVIDIA 对这些材料不作任何明示、暗示、法定或其他方面的保证,并且明确否认所有关于不侵权、适销性和特定用途适用性的暗示保证。在法律未禁止的范围内,在任何情况下,NVIDIA 均不对因使用本文档而引起的任何损害(包括但不限于任何直接、间接、特殊、附带、惩罚性或后果性损害,无论因何种原因造成,也无论责任理论如何)承担责任,即使 NVIDIA 已被告知可能发生此类损害。尽管客户可能因任何原因而遭受任何损害,但 NVIDIA 对本文所述产品的总累积责任应根据产品的销售条款进行限制。