Task 模块架构
1. 模块概述
- 功能介绍:Task 模块负责管理各类任务的创建、执行和回收。支持多种任务类型(核函数执行、内存操作、事件同步、模型执行等),通过 TaskInfo 结构体承载任务信息。Stream::taskResMang_ 和 TaskFatory 共同负责任务对象分配和回收。
- 设计目标:
- 提供统一的任务管理接口
- 支持多种任务类型扩展
- 实现高效的任务分配和回收机制
- 支持任务状态管理和错误处理
2. 使用场景与对外接口
2.1 使用场景示意
-
场景一:内核执行任务
// 下发单算子任务 aclrtLaunchKernel(funcHandle, numBlocks, argsData, argsSize, stream); aclrtLaunchKernelXXX(); -
场景二:事件同步任务
// 下发event 同步任务,并流同步结果 aclrtRecordEvent(event, stream1); // 在 stream1 记录事件 aclrtStreamWaitEvent(stream2, event); // stream2 等待事件 aclrtSynchronizeStream(stream1); // stream1 流同步,触发回收 aclrtSynchronizeStream(stream2); // stream2 流同步,触发回收
2.2 任务类型
| 任务分类 | 任务类型 | 头文件 | 说明 |
|---|---|---|---|
| 计算类任务 | TS_TASK_TYPE_KERNEL_AICORE TS_TASK_TYPE_KERNEL_AICPU TS_TASK_TYPE_KERNEL_AIVEC |
davinci_kernel_task.h |
算子核执行 |
| 内存类任务 | TS_TASK_TYPE_MEMCPY |
memory_task.h |
H2D、D2D、D2H等异步拷贝任务执行 |
| 事件同步类任务 | TS_TASK_TYPE_EVENT_RECORD TS_TASK_TYPE_STREAM_WAIT_EVENT TS_TASK_TYPE_NOTIFY_RECORD TS_TASK_TYPE_NOTIFY_WAIT TS_TASK_TYPE_DAVID_EVENT_* TS_TASK_TYPE_MEM_WRITE/WAIT_VALUE |
event_task.h notify_task.h common_task.h |
流间同步、卡间同步等事件等待执行 |
| 条件类任务 | TS_TASK_TYPE_LABEL_* TS_TASK_TYPE_STREAM_SWITCH TS_TASK_TYPE_STREAM_ACTIVE |
cond_op_label_task.h |
标签控制类 |
| 管理类任务 | TS_TASK_TYPE_MAINTENANCE TS_TASK_TYPE_MODEL_MAINTAINCE TS_TASK_TYPE_MODEL_EXECUTE |
maintenance_task.h model_maintaince_task.h model_execute_task.h |
维护操作(流/事件销毁) 模型绑定/解绑流 模型执行 |
3. 架构总览
整体设计思路 Task 管理整理分为三部分:
- Task 资源管理: Task 资源分为两部分,Device 粒度的Task资源和Stream粒度的资源。
- Task 处理函数: Task 处理函数主要是针对不同类型的Task进行任务初始化、SQE封装、Task回收后处理、Task 异常后处理等流程进行统一注册管理。
- Task 下发流程: 配合API接口通过task资源申请、任务组装、任务下发的等接口组合完成运行时调度。
3.1 Task 资源管理架构
graph TB
classDef apiStyle fill:#E3F2FD,stroke:#1565C0,stroke-width:2px,color:#0D47A1
classDef rtStyle fill:#FFF3E0,stroke:#FF9800,stroke-width:2px,color:#E65100
classDef objStyle fill:#E8F5E9,stroke:#4CAF50,stroke-width:2px,color:#1B5E20
classDef resStyle fill:#FCE4EC,stroke:#E91E63,stroke-width:2px,color:#880E4F
subgraph ACL_API1["ACL 接口层"]
aclrtCreateStream["aclrtCreateStream()"]:::apiStyle
end
subgraph RT_API1["RT 接口层"]
rtStreamCreate["rtStreamCreate()"]:::rtStyle
end
subgraph Object1["对象层"]
Stream["Stream <br/> 流管理"]:::objStyle
end
subgraph StreamResource["资源管理层"]
TaskResManage["TaskResManage<br/>Stream Task资源管理"]:::resStyle
end
ACL_API1 --> RT_API1
RT_API1 --> Object1
Object1 --> StreamResource
subgraph ACL_API["ACL 接口层"]
aclrtSetDevice["aclrtSetDevice()"]:::apiStyle
end
subgraph RT_API["RT 接口层"]
rtSetDevice["rtSetDevice()"]:::rtStyle
end
subgraph Object["对象层"]
Device["Device <br/> 管理"]:::objStyle
end
subgraph DeviceResource["资源管理层"]
TaskAllocator["TaskFactory->TaskAllocator<br/>Device Task资源管理"]:::resStyle
end
ACL_API --> RT_API
RT_API --> Object
Object --> DeviceResource
3.2 Task 处理函数注册架构
flowchart TD
classDef entryStyle fill:#E3F2FD,stroke:#1565C0,stroke-width:2px,color:#0D47A1
classDef branchStyle fill:#FFF8E1,stroke:#F57F17,stroke-width:2px,color:#F57F17
classDef v100Style fill:#F3E5F5,stroke:#7B1FA2,stroke-width:2px,color:#4A148C
classDef v200baseStyle fill:#E8F5E9,stroke:#2E7D32,stroke-width:2px,color:#1B5E20
classDef v200Style fill:#C8E6C9,stroke:#388E3C,stroke-width:2px,color:#1B5E20
classDef v201Style fill:#E0F2F1,stroke:#00695C,stroke-width:2px,color:#004D40
A["Runtime::Init() RegTaskFunc()"]:::entryStyle --> B{"路径选择"}:::branchStyle
B -->|v100| C["TaskFuncReg()"]:::v100Style
B -->|v200_base| D["RegDavidTaskFunc()"]:::v200baseStyle
D -->|v200| E["RegDavidTaskFunc() <br/> RegXpuTaskFunc()"]:::v200Style
D -->|v201| F["RegDavidTaskFunc() <br/> 更新DQS钩子"]:::v201Style
3.3 David Task下发流程
sequenceDiagram
autonumber
participant User as 用户API
participant Stream as Stream
participant TaskResMang as TaskResManageDavid
participant PublicQueue as PublicTaskBuff
participant Driver as HAL驱动
participant HWTS as 硬件
User->>Stream: aclrtLaunchKernel
Stream->>Stream: StreamLock() <br/> 允许单流多线程下发任务,taskId严格保序
Stream->>TaskResMang: AllocTaskInfoAndPos(sqeNum, pos, taskInfo)
TaskResMang-->>Stream: task指针 TaskInfo* + pos
Stream->>Stream: SaveTaskCommonInfo(taskInfo, stm, pos, sqeNum) <br/> taskInfo 公共头信息保存
Stream->>Stream: 根据任务类型填充 TaskInfo.u.xxx
rect rgba(245, 237, 244, 0.62)
alt DavidSendTask
Stream->>Stream: ToConstructDavidSqe(taskInfo, sqeAddr) <br/> 构建 SQE
Stream->>PublicQueue: AddTaskToPublicQueue(taskInfo, sqeNum) <br/> 加入Task 队列
Stream->>Driver: halSqTaskSend(devId, &sendInfo) <br/> 发送 SQE 到硬件
Driver-->>HWTS: SQE 写入执行地址
end
end
Stream->>Stream: StreamUnLock()
Stream->>Stream: SubmitTaskPostProc — 触发回收或唤醒回收线程
HWTS->>HWTS: 执行任务
4. 详细设计
4.1 核心流程
4.1.1 单算子流上 Task 资源申请和下发流程
flowchart TD
classDef userStyle fill:#E3F2FD,stroke:#1565C0,stroke-width:2px,color:#0D47A1
classDef lockStyle fill:#FFF3E0,stroke:#FF9800,stroke-width:2px,color:#E65100
classDef allocStyle fill:#E8F5E9,stroke:#4CAF50,stroke-width:2px,color:#1B5E20
classDef decisionStyle fill:#FFF8E1,stroke:#F57F17,stroke-width:2px,color:#F57F17
classDef errorStyle fill:#FFEBEE,stroke:#D32F2F,stroke-width:2px,color:#B71C1C
classDef retryStyle fill:#F3E5F5,stroke:#7B1FA2,stroke-width:2px,color:#4A148C
classDef successStyle fill:#E0F7FA,stroke:#00838F,stroke-width:2px,color:#004D40
A["用户 API 调用"]:::userStyle --> B["Stream::StreamLock"]:::lockStyle
B --> C["AllocTaskInfoForCapture"]:::allocStyle
C --> D["AllocTaskInfo(taskInfo, stm, pos, sqeNum)"]:::allocStyle
D --> E["TaskResManageDavid::AllocTaskInfoAndPos(sqeNum, pos, taskInfo)"]:::allocStyle
E --> F{"taskResMang_ 队列已满?"}:::decisionStyle
F -->|是| G["返回 RT_ERROR_TASKRES_QUEUE_FULL"]:::errorStyle
G --> I["Stream::StreamUnLock"]:::lockStyle
I --> J["TryToReclaimTask(stm)<br>尝试回收任务"]:::retryStyle
J --> K["Stream::StreamLock"]:::lockStyle
K --> E
F -->|否| H["分配 taskInfo <br> 更新 taskResATail_"]:::successStyle
H --> L["Runtime::AllocTaskSn(taskSn)<br>分配全局唯一序列号"]:::successStyle
L --> M["SaveTaskCommonInfo(taskInfo, stm, pos, sqeNum)"]:::successStyle
M --> N["InitByStream + 设置 id/flipNum/sqeNum"]:::successStyle
N --> O["组装SQE,并发送"]:::successStyle
O --> P["Stream::StreamUnLock"]:::lockStyle
P --> Q["返回 RT_ERROR_NONE"]:::successStyle
4.1.2 模型流 Task 资源申请和下发流程
flowchart TD
classDef userStyle fill:#E3F2FD,stroke:#1565C0,stroke-width:2px,color:#0D47A1
classDef lockStyle fill:#FFF3E0,stroke:#FF9800,stroke-width:2px,color:#E65100
classDef allocStyle fill:#E8F5E9,stroke:#4CAF50,stroke-width:2px,color:#1B5E20
classDef successStyle fill:#E0F7FA,stroke:#00838F,stroke-width:2px,color:#004D40
A["User"]:::userStyle --> B["aclmdlRIBuildBegin <br/>aclrtCreateStreamWithConfig <br/> aclmdlRIBindStream <br/> aclrtLaunchKernel"]:::userStyle
B --> F["Stream::StreamLock"]:::lockStyle
F --> G["TaskFactory::Alloc()"]:::allocStyle
G --> H["TaskAllocator::AllocId() ->全局 device级TaskId"]:::allocStyle
H --> I["TaskAllocator::GetItemById -> 获取TaskInfo 指针"]:::allocStyle
I --> L["Runtime::AllocTaskSn() -> 获取全局 taskSn 保序ID"]:::allocStyle
L --> M["SaveTaskCommonInfo(taskInfo, stm, pos, sqeNum)"]:::allocStyle
M --> O["组装SQE,并发送"]:::allocStyle
O --> P["Stream::StreamUnLock"]:::lockStyle
P --> Q["返回 RT_ERROR_NONE"]:::successStyle
4.2 核心机制详解
4.2.1 TaskInfo 结构设计
设计思想:TaskInfo 作为任务的统一载体,包含任务类型、参数、状态、位域标记等信息。通过 union 存储不同任务类型的专用信息结构。
// 文件位置:core/inc/task/task_info.hpp
typedef struct tagTaskInfoStru {
Stream *stream; // 所属流
tsTaskType_t type; // 任务类型枚举
uint32_t errorCode; // 错误码
uint32_t taskSn; // 流水号(profiling 用)
uint32_t pos; // SQ 位置(David 用)
uint16_t id; // 任务 ID
uint16_t flipNum; // 翻转计数(taskId 回卷)
uint8_t profEn; // Profiling 启用标志
...
uint8_t serial : 1; // 串行 ID 模式
uint8_t bindFlag : 1; // 模型绑定流标志
uint8_t isCqeNeedConcern : 1; // CQE 需关注
uint8_t isNeedStreamSync : 1; // 需流同步
uint8_t sqeNum : 7; // SQE 数量(David 多 SQE)
...
union {
AicTaskInfo aicTaskInfo;
AicpuTaskInfo aicpuTaskInfo;
DavinciMultiTaskInfo davinciMultiTaskInfo;
MemcpyAsyncTaskInfo memcpyAsyncTaskInfo;
...
} u; // 各任务类型专用信息
...
} TaskInfo;
4.2.2 TaskRes资源分配核心逻辑
TaskResManageDavid 核心分配代码:Stream上的TaskId需要严格保序,从TaskInfo指针申请到sqe组组装下发到硬件,整个过程要和TaskId行为一致。因此整个过程有StreamLock进行控制。
多 SQE 设计:一个任务可能占用多个 SQE(如 sqeNum=2), taskInfo.id 都指向首位置 pos。回收时按 sqeNum 刷新 taskResAHead_。
// task_res_da.cc
rtError_t TaskResManageDavid::AllocTaskInfoAndPos(uint32_t sqeNum, uint32_t &pos, TaskInfo **task, bool needLog) {
const uint16_t head = taskResAHead_.Value();
uint16_t tail = taskResATail_.Value();
const uint32_t taskDesTailIdx = (tail + sqeNum) % taskPoolNum_;
// 满判断:考虑环形队列翻转
if (((tail < head) && ((tail + sqeNum) >= head)) ||
((tail > head) && ((tail + sqeNum) >= taskPoolNum_) && (taskDesTailIdx >= head))) {
return RT_ERROR_TASKRES_QUEUE_FULL;
}
pos = tail;
*task = &taskRes_[pos].taskInfo;
(void)memset_s(*task, sizeof(TaskInfo), 0, sizeof(TaskInfo));
// 多 SQE 任务:所有 sqeNum 共享同一个 id(= pos)
while (tail != taskDesTailIdx) {
taskRes_[tail].taskInfo.id = pos;
tail = (tail + 1U) % taskPoolNum_;
}
taskResATail_.Set(tail); // 更新 tail
allocNum_++; // 累计分配计数(用于周期回收触发)
return RT_ERROR_NONE;
}
队列满时的回收重试:
// task_david.cc
rtError_t AllocTaskInfo(TaskInfo **taskInfo, Stream *stm, uint32_t &pos, uint32_t sqeNum) {
TaskResManageDavid *taskResMang = ...;
rtError_t error = taskResMang->AllocTaskInfoAndPos(sqeNum, pos, taskInfo);
while (error == RT_ERROR_TASKRES_QUEUE_FULL) {
// 释放 StreamLock,尝试回收
stm->StreamUnLock();
TryToReclaimTask(stm, needLog); // 调用 TaskReclaimByStream 或唤醒回收线程
stm->StreamLock();
// 重试分配
error = taskResMang->AllocTaskInfoAndPos(sqeNum, pos, taskInfo, needLog);
}
if (error == RT_ERROR_NONE) {
Runtime::Instance()->AllocTaskSn((*taskInfo)->taskSn);
}
return error;
}
4.2.3 Task处理函数的回调框架
1. TaskFuncSingle 结构体
不同 TASK_TYPE 的任务回调函数结构体,针对不同 CHIP_TYPE 和 taskType 单独处理,调用函数 rtError_t RegTaskFunc(rtChipType_t chipType, tsTaskType_t taskType, const TaskFuncSingle& funcs) 进行全局注册。
// task_manager.h:61-70
struct TaskFuncSingle {
PfnTaskToCmd toCommandFunc;
PfnTaskToSqe toSqeFunc;
PfnDoCompleteSucc doCompleteSuccFunc;
PfnTaskUnInit taskUnInitFunc;
PfnWaitAsyncCpCompleteFunc waitAsyncCpCompleteFunc;
PfnPrintErrorInfo printErrorInfoFunc;
PfnTaskSetResult setResultFunc;
PfnTaskSetStarsResult setStarsResultFunc;
};
2. TaskFuncArrays 结构体
TaskFuncArrays g_taskFuncArrays[CHIP_END] runtime初始化的时候根据 CHIP_TYPE 保存对应 TaskFunc。
// task_manager.h
struct TaskFuncArrays {
PfnTaskToCmd toCommandFunc[TS_TASK_TYPE_RESERVED]; // [0] TaskCommand 构建
PfnTaskToSqe toSqeFunc[TS_TASK_TYPE_RESERVED]; // [1] SQE 构建
PfnDoCompleteSucc doCompleteSuccFunc[TS_TASK_TYPE_RESERVED]; // [2] Task完成后处理
PfnTaskUnInit taskUnInitFunc[TS_TASK_TYPE_RESERVED]; // [3] Task指针清空
PfnWaitAsyncCpCompleteFunc waitAsyncCpCompleteFunc[TS_TASK_TYPE_RESERVED]; // [4] 异步等待
PfnPrintErrorInfo printErrorInfoFunc[TS_TASK_TYPE_RESERVED]; // [5] 错误打印
PfnTaskSetResult setResultFunc[TS_TASK_TYPE_RESERVED]; // [6] Task异常结果设置(v100)
PfnTaskSetStarsResult setStarsResultFunc[TS_TASK_TYPE_RESERVED]; // [7] Task异常结果设置(v100)
};
3. Task处理时使用的全局变量
业务代码中通过 g_XXX 对 taskType 进行回调处理。
static PfnTaskToCmd *g_toCommandFunc = g_taskFuncArrays[CHIP_BEGIN].toCommandFunc;
static PfnTaskToSqe *g_toSqeFunc = g_taskFuncArrays[CHIP_BEGIN].toSqeFunc;
static PfnDoCompleteSucc *g_doCompleteSuccFunc = g_taskFuncArrays[CHIP_BEGIN].doCompleteSuccFunc;
static PfnWaitAsyncCpCompleteFunc *g_waitAsyncCpCompleteFunc = g_taskFuncArrays[CHIP_BEGIN].waitAsyncCpCompleteFunc;
static PfnPrintErrorInfo *g_printErrorInfoFunc = g_taskFuncArrays[CHIP_BEGIN].printErrorInfoFunc;
static PfnTaskSetResult *g_setResultFunc = g_taskFuncArrays[CHIP_BEGIN].setResultFunc;
static PfnTaskSetStarsResult *g_setStarsResultFunc = g_taskFuncArrays[CHIP_BEGIN].setStarsResultFunc;
PfnTaskUnInit *g_taskUnInitFunc = g_taskFuncArrays[CHIP_BEGIN].taskUnInitFunc;
4.2.4 任务回收流程
4.2.4.1 David 任务回收触发时机
| 触发条件 | 调用方式 | 说明 |
|---|---|---|
| 每 64 个任务下发后 | WakeUpRecycleThread |
周期性回收,allocNum_ % 64 == 0 时触发 |
| 下发任务队列满 | TryToReclaimTask |
分配队列满时触发主动回收 |
| 流同步(Synchronize) | WakeUpRecycleThread |
出发回收线程,等待所有任务完成 |
| 流销毁(TearDown) | TaskReclaimByStream |
清空所有任务 |
| 独立回收线程 | RecycleThreadDoForStarsV2 |
IsSeparateSendAndRecycle() 模式 |
4.2.4.2 独立回收线程
// task_recycle.cc:310-341
void RecycleThreadDoForStarsV2(Device *deviceInfo) {
// 遍历设备上所有 stream
for (const auto &id : streamIdList) {
stream->StreamRecycleLock();
stream->ProcArgRecycleList(); // 处理 arg 回收列表
// 跳过空队列 / DVPP 绑定 / 非独立回收模式
if (taskResMang->IsEmpty() || stream->IsBindDvppGrp() || !stream->IsSeparateSendAndRecycle()) {
continue;
}
TaskReclaimForSeparatedStm(stream);
// → ProcLogicCqUntilEmpty(stm) // 先收 CQE
// → RecycleTaskBySqHeadForRecyleThread(stm) // 再根据 drv sqHead 回收
stream->StreamRecycleUnlock();
}
}
4.3 模块职责划分
| 模块 | 职责 | 位置 |
|---|---|---|
| TaskInfo | 任务信息结构体 | task/inc/task_info.h |
| TaskFactory | 任务对象工厂类 Device对象持有,Task 对象分配和回收 | task/task_factory.hpp |
| TaskAllocator | 任务对象分配器,管理任务池,属于TaskFactory | task/task_allocator.hpp |
| TaskResManage | 任务资源管理,Stream持有 | task/task_res_manage/ |
| DavidSendTask SubmitTask |
任务提交模块 | task/task_submit/v200/task_david.cc engine/engine.cc |
| RecycleThreadDoForStarsV2 | 任务回收模块 | task/task_recycle/ stars_engine.cc |
4.4 核心数据结构
4.4.1 Device TaskFactory 类图
classDiagram
classDef deviceStyle fill:#E3F2FD,stroke:#1565C0,stroke-width:2px,color:#0D47A1
classDef factoryStyle fill:#E8F5E9,stroke:#2E7D32,stroke-width:2px,color:#1B5E20
classDef allocatorStyle fill:#FFF3E0,stroke:#FF9800,stroke-width:2px,color:#E65100
classDef managerStyle fill:#F3E5F5,stroke:#7B1FA2,stroke-width:2px,color:#4A148C
classDef infoStyle fill:#E0F2F1,stroke:#00695C,stroke-width:2px,color:#004D40
class Device:::deviceStyle {
+GetTaskFactory()
+SubmitTask()
+TaskReclaim()
}
class RawDevice:::deviceStyle {
-TaskFactory taskFactory_
+SubmitTask()
}
class TaskFactory:::factoryStyle {
-TaskAllocator allocator_ // task 分配器
-Device device_
+Init() // 初始化
+Alloc() // 分配Task 指针 + 全局TaskId
+Recycle() // 回收Task 指针
+GetTask() // 获取Task指针
+SetSerialId() // 序列化流上的TaskId
+TryAgainAlloc()
+TryTaskReclaim()
}
class TaskAllocator:::allocatorStyle {
-BufferAllocator allocator_
-vector~TaskIdManager~ vecIdManager_
-map~streamId, SerialTaskId~ serialManager_
-uint32 usedCntSink_
-uint32 usedCntUnSink_
+AllocId()
+GetItemById()
+FreeById()
+SetSerialId()
+GetItemBySerial()
+FreeStreamRes()
}
class TaskIdManager:::managerStyle {
+mapTaskIds[MAX_UINT16_NUM]
+lastId
+taskIdManagerLock
}
class SerialTaskId:::managerStyle {
+serialIds
+lastId
}
class TaskInfo:::infoStyle {
+id
+type
+stream
+serial
+bindFlag
+flipNum
}
RawDevice --|> Device
RawDevice o-- TaskFactory
TaskFactory --> TaskAllocator
TaskAllocator --> TaskIdManager
TaskIdManager -- SerialTaskId
TaskFactory ..> TaskInfo
4.4.2 Stream TaskRes 类图
classDiagram
classDef baseStyle fill:#E3F2FD,stroke:#1565C0,stroke-width:2px,color:#0D47A1
classDef davidStyle fill:#E8F5E9,stroke:#2E7D32,stroke-width:2px,color:#1B5E20
classDef streamStyle fill:#FFF3E0,stroke:#FF9800,stroke-width:2px,color:#E65100
class TaskResManage:::baseStyle {
+TaskRes* taskRes_
+uint16_t taskResHead_
+uint16_t taskResTail_
+uint16_t taskPoolNum_
+int32_t streamId_
+uint32_t deviceId_
-void* taskResBaseAddr_
-void* pcieBaseAddr_
-mutex taskHeadMutex_
-mutex taskTailMutex_
+AllocTaskInfoByTaskResId()
+RecycleTaskInfoO1()
+RecycleTaskInfoOn()
+GetTaskInfo() // 获取task 指针
+CreateTaskRes() // 创建 StreamTaskRes 资源
+ReleaseTaskResource() // 释放 StreamTaskRes 资源
+Load()
}
class TaskResManageDavid:::davidStyle {
+Atomic~uint16_t~ taskResAHead_ // 下一个待回收的位置
+Atomic~uint16_t~ taskResATail_ // 下一个待分配的位置
+uint64_t allocNum_
+AllocTaskInfoAndPos() // 分配Task 指针
+RecycleTaskInfo() // 回收Task 指针
+RollbackTail()
+GetHeadTail()
+GetTaskPosHead()
+GetTaskPosTail()
+IsEmpty()
+GetAllocNum()
+GetPendingNum()
+IsRecyclePosValid()
+ResetTaskRes()
+ShowDfxInfo()
}
class Stream:::streamStyle {
+TaskResManage* taskResMang_
}
class DavidStream:::streamStyle {
+CreateStreamTaskRes()
}
DavidStream --|> Stream
TaskResManageDavid --|> TaskResManage
DavidStream o-- TaskResManageDavid : taskResMang_
5. 关键文件索引
| 功能模块 | 文件路径 | 核心内容 |
|---|---|---|
| Stream 声明 | core/src/stream/stream.hpp |
taskResMang_ 字段 |
| DavidStream | core/src/stream/stream_david.cc |
CreateStreamTaskRes TearDown |
| TaskInfo 定义 | core/inc/task/task_info.hpp |
TaskInfo 结构体 |
| TaskRes 基类 | core/inc/task/task_res.hpp |
TaskRes 结构 TaskResManage 类声明 |
| TaskResManageDavid | core/inc/task/task_res_da.hpp |
原子 head/tail AllocTaskInfoAndPos |
| TaskResManage 实现 | core/src/task/task_res_manage/task_res.cc |
v100 分配/回收/Load |
| TaskResManageDavid 实现 | core/src/task/task_res_manage/v200/task_res_da.cc |
David 分配/回收/回滚 |
| David 任务下发 | core/src/task/task_submit/v200/task_david.cc |
AllocTaskInfo DavidSendTask |
| David 任务回收 | core/src/task/task_recycle/v200/task_recycle.cc |
TryRecycleTask 回收线程 |
| 回收公共逻辑 | core/src/task/task_recycle/v200/task_recycle_common_base.cc |
TaskReclaimForSeparatedStm 回收CQE、回收Task |
本模块文档基于源码 src/runtime/core/src/task/ 分析。