CANN/runtime Device模块架构 Device 模块架构【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime1. 模块概述功能介绍Device 模块负责管理昇腾 AI 处理器的设备资源包括设备初始化、启动、停止、状态管理、任务提交、资源池管理等功能。采用三层继承结构Device接口→ GroupDevice设备组→ RawDevice实际设备。设计目标提供统一的设备管理接口管理设备生命周期初始化、运行、停止提供任务提交和回收机制管理设备资源池Event、Memory、SQ/CQ 等支持设备错误处理和状态回调2. 使用场景与对外接口2.1 使用场景场景一设置当前计算设备rtError_t err rtSetDevice(0); // Runtime::DeviceRetain(0) → Device::Init() → Device::Start()rtSetDevice()用于设置当前线程的设备 ID。由于大多数rt/aclrt接口不携带设备 ID 参数设置后当前线程将默认在该设备上执行后续操作实现线程级设备上下文的绑定。场景二获取设备能力信息获取设备能力特性int32_t val; rtError_t ret rtGetDeviceCapability(0, RT_MODULE_TYPE_AICORE, FEATURE_TYPE_SCHE, val); if (ret ! RT_ERROR_NONE) { // 获取失败 } // val 包含 AI Core 的调度能力信息参数说明moduleType模块类型如RT_MODULE_TYPE_AICORE、RT_MODULE_TYPE_AICPU、RT_MODULE_TYPE_TSCPU等featureType特性类型如FEATURE_TYPE_SCHE调度能力、FEATURE_TYPE_BLOCKING_OPERATOR阻塞算子等场景三设备状态监控与异常处理设备状态查询rtDeviceStatus deviceStatus; rtError_t ret rtDeviceStatusQuery(0, deviceStatus); if (ret ! RT_ERROR_NONE || deviceStatus ! RT_DEVICE_STATUS_NORMAL) { // 设备异常需进一步排查故障原因 }rtDeviceStatus状态值 | 状态值 | 含义 | |--------|------| |RT_DEVICE_STATUS_NORMAL| 设备正常运行 | |RT_DEVICE_STATUS_ABNORMAL| 设备异常需排查故障 |设备同步与错误捕获rtError_t ret rtDeviceSynchronize(); if (ret ! RT_ERROR_NONE) { // 任务执行失败同步接口返回错误码 // 上层可根据错误码类型进行针对性处理 } // 设备上所有任务成功完成2.2 对外接口接口文件位置说明rtSetDevice()src/runtime/api/api_c_device.cc设置当前设备rtDeviceReset()src/runtime/api/api_c_device.cc重置设备rtGetDevice()src/runtime/api/api_c_device.cc获取当前设备 IDrtGetDeviceCapability()src/runtime/api/api_c_device.cc获取设备能力rtsDeviceGetInfo()src/runtime/api/api_c_device.cc获取设备信息rtsGetDeviceResLimit()src/runtime/api/api_c_device.cc获取设备资源限制值rtsSetDeviceResLimit()src/runtime/api/api_c_device.cc设置设备资源限制rtsResetDeviceResLimit()src/runtime/api/api_c_device.cc重置设备资源限制rtSetDeviceFailureMode()src/runtime/api/api_c_device.cc设置设备故障模式rtDeviceSynchronize()src/runtime/api/api_c_device.cc设备同步rtDeviceStatusQuery()src/runtime/api/api_c_device.cc查询设备状态3. 架构总览整体设计思路Device 采用三层继承结构实现设备管理抽象接口层Device定义所有核心方法中间层GroupDevice处理设备组管理底层RawDevice实现具体设备操作。每个 Device 包含 Engine调度引擎、Driver驱动、Stream主流、DeviceSqCqPoolSQ/CQ池、SqAddrMemoryOrderSQ地址内存池等核心组件。架构分层图核心模块交互图4. 详细设计4.1 设备初始化流程设备初始化交互rtSetDevice/rtDeviceReset 引用计数机制设计思想使用RefObject类实现线程安全的引用计数支持多线程并发访问。引用计数管理 Device 和 Context 对象的生命周期只有当引用计数降为 0 时才真正销毁对象。引用计数流程线程局部变量设置设计思想使用InnerThreadLocalContainer管理线程级设备上下文确保多线程环境下每个线程有独立的设备绑定。rtSetDevice 设置的线程变量// 文件位置src/runtime/core/inc/common/inner_thread_local.hpp class InnerThreadLocalContainer { private: static __THREAD_LOCAL__ Context *curCtx_; // 当前 Context static __THREAD_LOCAL__ RefObjectContext * *curRef_; // Context 引用对象 static __THREAD_LOCAL__ Device *device_; // 当前 Device static __THREAD_LOCAL__ uint32_t lastTaskId_; // 最近任务 ID static __THREAD_LOCAL__ uint32_t lastStreamId_; // 最近流 ID static __THREAD_LOCAL__ rtError_t globalError_; // 全局错误码 };多线程并发安全每个线程有独立的设备上下文互不干扰引用计数使用原子操作保证多线程安全4.2 设备能力信息获取设备能力信息获取接口提供多种查询能力包括硬件能力特性查询、设备资源配置等为上层应用提供设备特性感知和配置能力。设备能力查询流程rtGetDeviceCapability 入参类型枚举// 文件位置pkg_inc/runtime/runtime/dev.h typedef enum tagRtDeviceModuleType { RT_MODULE_TYPE_SYSTEM 0, // 系统信息 RT_MODULE_TYPE_AICPU, // AICPU 信息 RT_MODULE_TYPE_CCPU, // CCPU 信息 RT_MODULE_TYPE_DCPU, // DCPU 信息 RT_MODULE_TYPE_AICORE, // AI Core 信息 RT_MODULE_TYPE_TSCPU, // TSCPU 信息 RT_MODULE_TYPE_PCIE, // PCIe 信息 RT_MODULE_TYPE_VECTOR_CORE, // Vector Core 信息 RT_MODULE_TYPE_HOST_AICPU, // Host AICPU 信息 RT_MODULE_TYPE_QOS, // QoS 信息 RT_MODULE_TYPE_MEMORY // 内存信息 } rtModuleType_t; typedef enum tagRtDeviceFeatureType { FEATURE_TYPE_SCHE, // 调度能力 FEATURE_TYPE_BLOCKING_OPERATOR, // 阻塞算子支持 FEATURE_TYPE_FFTS_MODE, // FFTS 工作模式 FEATURE_TYPE_MEMQ_EVENT_CROSS_DEV, // 跨设备事件支持 FEATURE_TYPE_MODEL_TASK_UPDATE, // 模型任务更新支持 FEATURE_TYPE_END, } rtDeviceFeatureType_t;rtsDeviceGetInfo 入参类型枚举// 文件位置pkg_inc/runtime/runtime/rts/rts_device.h typedef enum { RT_DEV_ATTR_AICPU_CORE_NUM 1U, // AICPU 核心数量 RT_DEV_ATTR_AICORE_CORE_NUM 101U, // AI Core 核心数量 RT_DEV_ATTR_CUBE_CORE_NUM 102U, // Cube Core 核心数量 RT_DEV_ATTR_VECTOR_CORE_NUM 201U, // Vector Core 核心数量 RT_DEV_ATTR_WARP_SIZE 202U, // Warp 大小 RT_DEV_ATTR_MAX_THREAD_PER_VECTOR_CORE 203U, // 每个 Vector Core 最大线程数 RT_DEV_ATTR_UBUF_PER_VECTOR_CORE 204U, // 每个 Vector Core 的 UB 缓存大小 RT_DEV_ATTR_TOTAL_GLOBAL_MEM_SIZE 301U, // 全局内存总大小 RT_DEV_ATTR_L2_CACHE_SIZE 302U, // L2 缓存大小 RT_DEV_ATTR_SMP_ID 401U, // SMP ID设备是否在同一 OS RT_DEV_ATTR_PHY_CHIP_ID 402U, // 物理芯片 ID RT_DEV_ATTR_IS_VIRTUAL 501U, // 是否为虚拟设备 RT_DEV_ATTR_NPU_ARCH 601U, // NPU 架构类型 RT_DEV_ATTR_MAX } rtDevAttr;设备资源限制管理流程目前支持配置和获 取Cube Core 和 Vector Core 两种资源类型资源的限制// 文件位置pkg_inc/runtime/runtime/base.h typedef enum { RT_DEV_RES_CUBE_CORE 0, // Cube Core 资源限制 RT_DEV_RES_VECTOR_CORE, // Vector Core 资源限制 RT_DEV_RES_TYPE_MAX } rtDevResLimitType_t;4.3 设备同步rtDeviceSynchronize 调用流程设计思想设备同步接口通过等待设备上所有任务完成实现阻塞式同步同时捕获任务执行过程中的错误状态。同步过程中会对所有 Stream 进行任务回收、状态检查和等待确保上层应用能及时感知设备执行异常。4.4 异常处理设计思想Runtime 提供多层次的错误捕获机制从任务执行、流同步、设备同步到应用程序接口调用每个层级都能捕获并传递错误信息。异常处理采用分支分发模式根据错误类型路由到专门的处理函数。维测信息通过 RingBuffer 从设备传递到主机包含详细的错误上下文、任务信息、硬件状态等通过日志系统输出供问题定位。错误捕获机制四种错误捕获机制对比特性Monitor线程-设备状态Monitor线程-RingBufferRAS线程-RAS告警同步流程主动检查检查方式定期轮询1秒定期读取RingBuffer1秒定期轮询10ms同步时主动调用错误来源HDC连接、心跳、OOMRingBuffer上报硬件RAS告警设备/Stream状态传递路径SetDevStatus → 外部接口SetWatchDogDevStatus → ContextSetGlobalFailureErr → 外部接口GetError → 直接返回适用场景设备离线、通信中断、OOM任务执行失败硬件故障HBM ECC、UB内存错误任务执行异常捕获异常分支处理流程DeviceErrorProc 从 RingBuffer 读取错误信息根据不同的errorType和寄存器维测信息如Error Bitmap、PC值、Channel ID等路由到对应的错误处理函数分支打印详细维测日志后设置故障类型并返回对应的错误码。异常分支处理时序图不同类型的错误处理函数映射表如下// 文件位置src/runtime/core/src/device/v100/device_error_proc.cc static const std::mapuint64_t, DeviceErrorProc::StarsErrorInfoProc starsFuncMap { {AICORE_ERROR, DeviceErrorProc::ProcessStarsCoreErrorInfo}, {AIVECTOR_ERROR, DeviceErrorProc::ProcessStarsCoreErrorInfo}, {FFTS_PLUS_AICORE_ERROR, DeviceErrorProc::ProcessStarsCoreErrorInfo}, {FFTS_PLUS_AIVECTOR_ERROR, DeviceErrorProc::ProcessStarsCoreErrorInfo}, {WAIT_TIMEOUT_ERROR, DeviceErrorProc::ProcessStarsWaitTimeoutErrorInfo}, {SDMA_ERROR, DeviceErrorProc::ProcessStarsSdmaErrorInfo}, {AICPU_ERROR, ProcessStarsAicpuErrorInfo}, {FFTS_PLUS_SDMA_ERROR, DeviceErrorProc::ProcessStarsSdmaErrorInfo}, {FFTS_PLUS_AICPU_ERROR, ProcessStarsAicpuErrorInfo}, {DVPP_ERROR, DeviceErrorProc::ProcessStarsDvppErrorInfo}, {DSA_ERROR, DeviceErrorProc::ProcessStarsDsaErrorInfo}, {FFTS_PLUS_DSA_ERROR, DeviceErrorProc::ProcessStarsDsaErrorInfo}, {SQE_ERROR, DeviceErrorProc::ProcessStarsSqeErrorInfo}, {HCCL_FFTSPLUS_TIMEOUT_ERROR, DeviceErrorProc::ProcessStarsHcclFftsPlusTimeoutErrorInfo}, {AICORE_TIMEOUT_DFX, DeviceErrorProc::ProcessStarsCoreTimeoutDfxInfo} };任务异常快照维测当任务执行异常时Runtime 会通过PrintStreamTimeoutSnapshotInfo从设备内存读取超时任务的快照信息打印详细的维测日志帮助定位任务卡住或超时的原因。快照打印流程快照信息内容基础信息stream_id、task_id、taskType任务类型任务特定信息EVENT_RECORD 任务EventIdSTREAM_WAIT_EVENT 任务EventIdNOTIFY_RECORD 任务NotifyIdNOTIFY_WAIT 任务NotifyId、waitTypeKERNEL 任务kernel_name本模块文档基于源码src/runtime/core/src/device/分析。【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考