LCOV - code coverage report
Current view: top level - legacy/ascend910/pub_inc - aicpu_operator_pub.h (source / functions) Coverage Total Hit
Test: coverage.info Lines: 85.4 % 41 35
Test Date: 2026-07-28 12:11:00 Functions: 100.0 % 3 3

            Line data    Source code
       1              : /**
       2              :  * Copyright (c) 2025 Huawei Technologies Co., Ltd.
       3              :  * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
       4              :  * CANN Open Software License Agreement Version 2.0 (the "License").
       5              :  * Please refer to the License for details. You may not use this file except in compliance with the License.
       6              :  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
       7              :  * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
       8              :  * See LICENSE in the root of the software repository for the full text of the License.
       9              :  */
      10              : 
      11              : #ifndef AICPU_OPERATOR_PUB_H
      12              : #define AICPU_OPERATOR_PUB_H
      13              : #include <stdlib.h>
      14              : #include <chrono>
      15              : #include <hccl/hccl_types.h>
      16              : #include "hccl_common.h"
      17              : #include "common.h"
      18              : #include "hdc_pub.h"
      19              : #include <transport_pub.h>
      20              : #include "dispatcher_task_types.h"
      21              : #include "externalinput_pub.h"
      22              : #include "hccl_mem_defs.h"
      23              : #include "hccl/hccl_res.h"
      24              : 
      25              : using RankId = u32;
      26              : 
      27              : namespace {
      28              : constexpr u32 RANK_NUM = 32;
      29              : 
      30              : constexpr u32 POS_DATA_PLANE_MODE_HOST  = 0;    // HOST调度RoCE模式
      31              : constexpr u32 POS_DATA_PLANE_MODE_AICPU = 1;    // AICPU直调RoCE模式
      32              : constexpr u32 POS_DATA_PLANE_MODE_AIV   = 2;    // AIV直调RoCE模式
      33              : }
      34              : 
      35              : enum class AicpuNotifyMode : u32 {
      36              :     OPBASE_MODE = 0,    // 单算子场景
      37              :     ACLGRAPH_MODE = 1,   // Aclgraph 场景
      38              :     HCOM_MODE = 2  // 图下沉场景
      39              : };
      40              : 
      41              : struct HcclStreamInfo {
      42              :     s32 streamIds;
      43              :     u32 sqIds;
      44              :     u32 cqIds;   // 记录物理cqId
      45              :     u32 logicCqids; // 记录逻辑cqId
      46              : };
      47              : 
      48              : // 记录aicpu-custom共享的stream信息
      49              : struct HcclStreamParam {
      50              :     HcclStreamInfo streamInfo;
      51              :     u64 sqCqContextAddr = 0; // 记录sqeContext地址
      52              :     u64 sqCqContextSize = 0; // 记录sqeContext大小
      53              : };
      54              : 
      55              : struct HcclMC2WorkSpace {
      56              :     u64 workSpace;
      57              :     u64 workSpaceSize;
      58              : };
      59              : 
      60              : struct HcclOpConfig {
      61              :     u8 deterministic; // 确定性计算开关
      62              :     u8 retryEnable;  // 是否重执行
      63              :     u8 highPerfEnable; // deprecate
      64              :     u8 isSupportAtomicWrite = 0;
      65              :     u8 padding[4];  // 大小需要64By对齐,未来添加参数时减小padding
      66              :     std::chrono::milliseconds linkTimeOut; //发送超时时长
      67              :     u32 taskMonitorInterval;
      68              :     u32 notifyWaitTime;  // 超时时长,同HCCL_EXEC_TIMEOUT
      69              :     u32 retryHoldTime;
      70              :     u32 retryIntervalTime;
      71              :     bool interHccsDisable = false;  // 使能rdma开关
      72              :     aclrtFloatOverflowMode floatOverflowMode = ACL_RT_OVERFLOW_MODE_UNDEF;
      73              :     u32 multiQpThreshold{HCCL_MULTI_QP_THRESHOLD_DEFAULT};  // 多QP每个QP分担数据量最小阈值
      74              : };
      75              : 
      76              : // TP8卡
      77              : struct HcclCombinOpSignalParam {
      78              :     HcclSignalInfo noIpcNotifys[RANK_NUM*2];
      79              :     HcclSignalInfo ipcNotifys[RANK_NUM*4];
      80              :     HcclSignalInfo noIpcEvents[RANK_NUM];
      81              :     HcclSignalInfo aicpuNotify;
      82              :     HcclSignalInfo aicpuOpNotify[2]; // 集合通信AICPU展开资源
      83              : };
      84              : 
      85           30 : struct BatchSendRecvInfo {
      86              :     uint8_t bsrTag[128];
      87              :     uint32_t index;
      88              :     uint32_t tpQpn;
      89              :     uint32_t srcRank;
      90              :     uint32_t detRank;
      91              :     uint32_t streamId = ~0u;
      92              : };
      93           39 : using HcclOpIdentifier = struct HcclOpIdentifierDef {
      94              :     uint8_t tag[128];   // 通信算子的标签
      95              :     uint8_t newTag[256];
      96              :     uint32_t index;     // 集合通信算子在通信域内的编号
      97              :     uint32_t srcRank;
      98              :     uint32_t detRank;
      99              :     bool isSendRecv = false;
     100              :     u32 streamId = ~0u;
     101              :     HcclCMDType opType = HcclCMDType::HCCL_CMD_INVALID;
     102              :     BatchSendRecvInfo bsrInfo[2];
     103              :     bool isBsrTaskStart = false; //batchsendrecv 主流start task是否完成
     104              : };
     105              : 
     106              : struct CombinedCapability {
     107              :     u64 dataplaneModeBitmap = 0;
     108              : };
     109              : 
     110              : struct HcclCombinOpParam {
     111              :     HcclMC2WorkSpace mc2WorkSpace;
     112              :     u32 rankId = 0; // 当前卡rankId
     113              :     u32 rankNum = 0;
     114              :     u64 winSize = 0; // 每个win大小
     115              :     u64 windowsIn[RANK_NUM];
     116              :     u64 windowsOut[RANK_NUM];
     117              :     char hcomId[128] = "\0";
     118              :     HcclStreamInfo streamInfo[RANK_NUM];
     119              :     HcclCombinOpSignalParam signalInfo;
     120              :     HcclOpConfig config; // 配置参数
     121              :     u64 overFlowAddr = 0;
     122              :     u8 onlyRead = 0;  // 只使用读模式,不使用写模式
     123              : 
     124              :     // communicate retry
     125              :     hccl::HDCommunicateParams kfcControlTransferH2DParams;
     126              :     hccl::HDCommunicateParams kfcStatusTransferD2HParams;
     127              : 
     128              :     u8 padding[16]; // 大小需要64By对齐,未来添加参数时减小padding
     129              :     u64 winExpSize = 0;
     130              :     u64 windowsExp[RANK_NUM];
     131              : 
     132              :     u8 multiServerFlag = 0;
     133              :     u64 ibverbsData = 0; // TransportDeviceNormalIbverbsData数组的首地址
     134              :     u64 ibverbsDataSize = 0; // TransportDeviceNormalIbverbsData数组的字节长度
     135              : 
     136              :     u64 sizeOfAiRMAInfo = 0; // sizeof(HcclAiRMAInfo), 用于内存校验
     137              :     void* aiRMAInfo = nullptr; // HcclAiRMAInfo* 单个结构体指针
     138              : 
     139              :     u64 capabilityPtr = 0; // 通信能力信息结构体在Device上的地址
     140              :     u64 capabilitySize = 0; // 通信能力信息结构体size
     141              : };
     142              : 
     143              : struct HcclKFCTilingData {
     144              :     u32 preparePosition;  // 任务准备位置:0表示在host完成所有通信任务的准备,1表示在kernel侧完成
     145              :     u64 sendOff;        // 发送数据地址偏移,count * dataTypeSize
     146              :     u64 recvOff;        // 接收数据地址偏移, count * dataTypeSize
     147              :     u64 tailSendOff;    // 尾块发送数据地址偏移,count * dataTypeSize
     148              :     u64 tailRecvOff;    // 尾块发送数据地址偏移,count * dataTypeSize
     149              :     u64 sendCnt;        // 整块发送数据个数
     150              :     u64 recvCnt;        // 整块接收数据个数
     151              :     u64 tailSendCnt;    // 尾块发送数据个数
     152              :     u64 tailRecvCnt;    // 尾块接收数据个数
     153              :     u64 totalCnt;       // 总数据个数
     154              :     u32 turnNum;         // 总轮次
     155              :     u32 tailNum;         // 尾块的轮次
     156              :     u32 stride;          // 跳写间隔
     157              :     u32 workspaceOff;    // 使用workspace作为recvbuf时的workspace偏移
     158              :     u32 notifyOff;       // device notify write/read value偏移
     159              :     u16 notifyBeginCnt;  // notify write value的使用个数
     160              :     u16 notifyEndCnt;    // notify read value的使用个数
     161              :     u8 useBufferType;    // 是否使用workspace作为recvbuf
     162              :     u8 funID;            // function ID
     163              :     u8 dataType;         // hccl 数据类型
     164              :     u8 groupNum;         // groupNum
     165              :     u8 reuseMode;        // tiling,填msgCnt,内存优化选择复用的内存块个数
     166              :     u8 commType;         // 通信类型
     167              :     u8 reduceOp;         // reduce op type
     168              :     u8 commOrder;        // 通信顺序,0表示通信在前,1表示通信在后
     169              :     u8 waitPolicy;       // 等待任务启动的阻塞策略
     170              :     // 2、首轮等待,1、每轮等待。KFC根据此标记在主流任务前面加wait,AIC需要按策略发对应record才能触发执行
     171              :     u8 rspPolicy;  // 任务执行结束时的响应策略, 2、最后通知一次,
     172              :     // 1、每轮通知一次。KFC根据此标记在主流任务后面加record
     173              :     u8 exitPolicy;  // 退出策略,0,一次通信任务下发完成直接退出;1. 通信任务执行完成退出;2.
     174              :     // 等待AIC通知退出(可以多次执行任务)。
     175              :     u8 commAlg;    // 用于指定具体通信算法。
     176              :     u8 taskType;   // 用于识别不同任务。参考KfcTaskType定义
     177              :     u8 debugMode;  // 调测模式
     178              :     // 1:单独执行CUBE
     179              :     // 2:单独执行Vector
     180              :     // 4:单独执行AICPU KFC算子
     181              :     // 8:KFC等待通信结束
     182              :     // 16:KFC统计各阶段耗时
     183              :     u8 stepSize;         // 用于指定通算频率步长
     184              :     u8 sendArgIndex;     // 发送数据参数索引,对应算子原型的参数顺序
     185              :     u8 recvArgIndex;     // 接收数据参数索引,对应算子原型的参数顺序
     186              :     u8 commOutArgIndex;  // 通信输出参数索引,对应算子原型的参数顺序
     187              :     u8 hasCommOut;       // 是否有通信输出
     188              : };
     189              : 
     190              : enum HcclKfcTaskType {
     191              :     HCCL_KFC_TASK_HCC_RES_INIT = 1,      // 集合通信资源下发&校验
     192              :     HCCL_KFC_TASK_HCC_START_SERVER = 2,  // 只启动KFC server,从msg queue接收任务
     193              :     HCCL_KFC_TASK_HCC_TASK_PREPARE = 3,  // 从参数获取通信任务,完成准备,待AIC通知消息再激活
     194              :     HCCL_KFC_TASK_HCC_TASK_DELIVER = 4,  // 从参数获取通信任务,直接下发。AIC自己发Record激活
     195              :     HCCL_KFC_TASK_COMMON_CMD_EXE = 5,    // 预留,通用任务执行,具体任务信息可以在参数中描述。
     196              :     HCCL_KFC_TASK_HCCL_ONLY_EXE = 6,     // 通信任务单独执行
     197              :     KFC_TASK_TYPE_END
     198              : };
     199              : 
     200              : #define list_entry(ptr, type, member) (reinterpret_cast<type *>(reinterpret_cast<char *>(ptr) - offsetof(type, member)))
     201              : 
     202              : constexpr u64 COMM_P2P = 1UL << 0;
     203              : constexpr u64 COMM_RDMA = 1UL << 1;
     204              : 
     205              : constexpr u32 LINK_P2P_MAX_NUM = 64;
     206              : constexpr u32 MEM_DETAILS_NUM = 2; // link信息中memDetails的大小:0对应INPUT,1对应OUTPUT
     207              : constexpr u32 RDMA_QP_MAX_NUM = 33;
     208              : constexpr u32 RDMA_NOTIFY_MAX_NUM = 8 * 3;
     209              : constexpr u32 LOCAL_STREAM_MAX_NUM = 40U;
     210              : constexpr u32 LOCAL_NOTIFY_MAX_NUM = 64;
     211              : using RANK_TYPE = u32;
     212              : using TAG_TYPE = u32;
     213              : using LENGTH_TYPE = u32;
     214              : constexpr u32 TOP_COMM_LEVEL0_SHIFT = 16;
     215              : constexpr u32 TOP_COMM_LEVEL0_LOCATION = 0xFFFF0000;
     216              : constexpr u32 TOP_COMM_LEVEL1_LOCATION = 0xFFFF;
     217              : constexpr u32 TOP_HIERARCHICAL_COMM_LEVEL0_SHIFT = 12;
     218              : constexpr u32 TOP_HIERARCHICAL_COMM_LEVEL1_SHIFT = 16;
     219              : constexpr u32 TOP_HIERARCHICAL_COMM_LEVEL0_LOCATION = 0xF0000000;
     220              : constexpr u32 TOP_HIERARCHICAL_COMM_LEVEL1_LOCATION = 0xFFF0000;
     221              : constexpr u32 TOP_HIERARCHICAL_COMM_LEVEL2_LOCATION = 0xFFFF;
     222              : constexpr u32 TOP_HIERARCHICAL_CONF_SIZE = 32;
     223              : constexpr u32 TOP_HIERARCHICAL_CONF_lENGTH_INDEX = 0;
     224              : constexpr u32 TOP_HIERARCHICAL_CONF_INFO_INDEX = 1;
     225              : constexpr u32 TOP_HIERARCHICAL_CONF_LEVEL_SHIFT = 0;
     226              : constexpr u32 TOP_HIERARCHICAL_CONF_CONC_TYPE_SHIFT = 4;
     227              : constexpr u32 TOP_HIERARCHICAL_CONF_OP_TYPE_SHIFT = 8;
     228              : constexpr u32 TOP_HIERARCHICAL_CONF_TEMPLATE_TYPE_SHIFT = 16;
     229              : constexpr u32 TOP_HIERARCHICAL_CONF_LEVEL_LOCATION = 0x0000000F;
     230              : constexpr u32 TOP_HIERARCHICAL_CONF_CONC_TYPE_LOCATION = 0x000000F0;
     231              : constexpr u32 TOP_HIERARCHICAL_CONF_OP_TYPE_LOCATION = 0x0000FF00;
     232              : constexpr u32 TOP_HIERARCHICAL_CONF_TEMPLATE_TYPE_LOCATION = 0xFFFF0000;
     233              : constexpr u32 TOP_COMM_RING_LOCATION = 0;
     234              : constexpr u32 TAG_MAX_LENGTH = 256;
     235              : constexpr u32 AICPU_OP_NOTIFY_MAX_NUM = 2;
     236              : constexpr u32 AICPU_ORDER_NOTIFY_MAX_NUM = 3;
     237              : constexpr u32 AICPU_MAX_RANK_NUM = 128 * 1024;
     238              : constexpr u32 MAX_RANK_NUM_A3 = 768;
     239              : constexpr u32 HCOMID_MAX_LENGTH = 256;
     240              : 
     241              : // aclgraph 销毁场景下从 host 端投递到 aicpu 端的清理任务 payload,与 HcclKFCTilingData 独立;host 端通过 RunAicpuKfcClearOpRes 投递,aicpu 端按 group 定位 HcclCommAicpu 后批量清 tags
     242              : constexpr u32 HCCL_KFC_CLEAR_OP_RES_MAGIC = 0x484B4346U; // 'HKCF',aicpu 端校验防误投
     243              : constexpr u32 HCCL_KFC_CLEAR_OP_RES_MAX_BATCH = 10240U;  // 单次 launch 最多清的 tag 数;10240×256B ≈ 2.5MB
     244              : struct HcclKfcClearOpResTilingData {
     245              :     u32 magic;                                                                  // 必须等于HCCL_KFC_CLEAR_OP_RES_MAGIC
     246              :     u32 tagCount;                                                               // 本批实际有效 tag 数 (1..MAX_BATCH)
     247              :     char group[HCOMID_MAX_LENGTH];                                              // communicator identifier
     248              :     char tags[HCCL_KFC_CLEAR_OP_RES_MAX_BATCH][TAG_MAX_LENGTH];                 // 待清理 op tag 列表,含_Capture后缀
     249              : };
     250              : 
     251              : struct HcclOpConfigV2 {
     252              :     u8 deterministic;  // 确定性计算开关
     253              : };
     254              : 
     255              : struct HcclMC2WorkSpaceV2 {
     256              :     u64 workSpace;
     257              :     u64 workSpaceSize;
     258              : };
     259              : 
     260              : struct HcclStreamInfoV2 {
     261              :     s32 streamIds;
     262              :     u32 sqIds;
     263              : };
     264              : 
     265              : struct ListCommon {
     266              :     u64 nextHost;
     267              :     u64 preHost;
     268              :     u64 nextDevice;
     269              :     u64 preDevice;
     270              : };
     271              : 
     272          825 : static inline void ListCommonInit(struct ListCommon *deviceList, struct ListCommon *hostList)
     273              : {
     274          824 :     if (hostList == nullptr) {
     275            0 :         HCCL_ERROR("hostList[%p] is nullptr", hostList);
     276            0 :         return;
     277              :     }
     278          825 :     hostList->nextHost = reinterpret_cast<u64>(hostList);
     279          825 :     hostList->preHost = reinterpret_cast<u64>(hostList);
     280          825 :     hostList->nextDevice = reinterpret_cast<u64>(deviceList);
     281          825 :     hostList->preDevice = reinterpret_cast<u64>(deviceList);
     282              : }
     283              : 
     284          227 : static inline void ListCommonAddHead(struct ListCommon *newDeviceL, struct ListCommon *newHostL,
     285              :     struct ListCommon *headHostL, struct ListCommon *headDeviceL)
     286              : {
     287          227 :     if (newHostL == nullptr || headHostL == nullptr) {
     288            0 :         HCCL_ERROR("input ptr is nullptr, newHostL[%p], headHostL[%p]", newHostL, headHostL);
     289            0 :         return;
     290              :     }
     291          227 :     ListCommon *headHostLNextHost = reinterpret_cast<ListCommon *>(headHostL->nextHost);
     292          227 :     headHostLNextHost->preHost = reinterpret_cast<u64>(newHostL);
     293          227 :     newHostL->nextHost = headHostL->nextHost;
     294          227 :     newHostL->preHost = reinterpret_cast<u64>(headHostL);
     295          227 :     headHostL->nextHost = reinterpret_cast<u64>(newHostL);
     296              : 
     297          227 :     headHostLNextHost->preDevice = reinterpret_cast<u64>(newDeviceL);
     298          227 :     newHostL->nextDevice = headHostL->nextDevice;
     299          227 :     newHostL->preDevice = reinterpret_cast<u64>(headDeviceL);
     300          227 :     headHostL->nextDevice = reinterpret_cast<u64>(newDeviceL);
     301              : }
     302              : 
     303              : // 跟 ListCommonAddHead 对称的双链表 unlink,同时维护 host 和 device 两套 prev/next 指针
     304            4 : static inline void ListCommonRemove(struct ListCommon *nodeHostL)
     305              : {
     306            4 :     if (nodeHostL == nullptr) {
     307            1 :         HCCL_ERROR("nodeHostL is nullptr");
     308            1 :         return;
     309              :     }
     310            3 :     ListCommon *prevHost = reinterpret_cast<ListCommon *>(nodeHostL->preHost);
     311            3 :     ListCommon *nextHost = reinterpret_cast<ListCommon *>(nodeHostL->nextHost);
     312            3 :     if (prevHost == nullptr || nextHost == nullptr) {
     313            0 :         HCCL_ERROR("nodeHostL link broken, preHost[%p] nextHost[%p]", prevHost, nextHost);
     314            0 :         return;
     315              :     }
     316            3 :     prevHost->nextHost = nodeHostL->nextHost;
     317            3 :     nextHost->preHost = nodeHostL->preHost;
     318            3 :     prevHost->nextDevice = nodeHostL->nextDevice;
     319            3 :     nextHost->preDevice = nodeHostL->preDevice;
     320              :     // 自指向,避免悬空指针被误访问(跟 ListCommonInit 后空链表状态一致)
     321            3 :     nodeHostL->nextHost = reinterpret_cast<u64>(nodeHostL);
     322            3 :     nodeHostL->preHost = reinterpret_cast<u64>(nodeHostL);
     323            3 :     nodeHostL->nextDevice = nodeHostL->nextHost;
     324            3 :     nodeHostL->preDevice = nodeHostL->preHost;
     325              : }
     326              : 
     327              : // KFC控制命令
     328              : enum class KfcCommand : int64_t {
     329              :     kNone = 0,          // 空命令
     330              :     kStopLaunch,        // 停止算子下发
     331              :     kStopExec,          // 停止算子执行
     332              :     kClear,                     // 清理算子状态&资源
     333              :     kChangeLink,    // 切换主备链路
     334              :     kRetry,                     // 重新执行算子
     335              :     kExit,                      // 退出算子执行
     336              :     NsStopLaunch,   // N秒快恢下的停止算子下发
     337              :     NsStopExec,     // N秒快恢下的停止算子执行
     338              :     NsClear,        // N秒快恢下的清理算子状态&资源
     339              :     NsChangeLink,   // N秒快恢下的切换主备链路
     340              :     kDestroyComm,   // 销毁AICPU通信域
     341              :     kSwitchNic,     // 发起主动借轨
     342              :     kWaitSwitchNic, // 等待主动借轨完成
     343              :     kAllSwitched,   // 通信域内的所有卡完成主动借轨
     344              :     kSwitchFail,    // 主动借轨失败,回退借轨操作
     345              :     kReportRetryErr,      // 退出算子执行,但支持step重计算
     346              : };
     347              : 
     348              : // AICPU背景线程控制
     349              : enum class BackgroundCommand : int64_t {
     350              :     kNone = 0,                  // 空命令
     351              :     kStop,
     352              : };
     353              : 
     354              : // device侧感知目前通信域的状态
     355              : enum class HcclComSuspendingFlag : int64_t {
     356              :     isNull = 0,
     357              :     isResume,      // device侧感知是resume状态
     358              :     isSuspending,  // device侧感知是suspending状态
     359              : };
     360              : 
     361              : // host向aicpu发送link状态
     362            3 : using ChangeLinkInfo = struct ChangeLinkInfoDef {
     363              :     u32 remoteRankNum = 0;
     364              :     u32 remoteRankList[AICPU_MAX_RANK_NUM] = {};
     365              :     bool isUseDefaultPort[AICPU_MAX_RANK_NUM] = {};
     366              :     bool isChangeLinkFlag = false;
     367              : };
     368              : 
     369              : // host向aicpu发送的命令
     370              : using KfcExecControl = struct KfcExecControlDef {
     371              :     KfcCommand kfcCmd;                          // 控制KFC执行
     372              :     BackgroundCommand bgCmd;            // 控制背景线程执行
     373              :     HcclComSuspendingFlag suspendingStatus;  // KFC状态
     374              :     HcclOpIdentifier targetOp;
     375              :     ChangeLinkInfo changeLinkInfo;
     376              : };
     377              : 
     378              : // KFC的执行状态
     379              : enum class KfcStatus : int64_t {
     380              :     kNull = 0 , // 算子的执行状态还没有initOpStatus前的状态
     381              :     kRuning,
     382              :     kEnd,
     383              :     kStoplaunch,
     384              :     kStopExec,
     385              :     kClear,
     386              :     kChanged,
     387              :     kError,
     388              :     kDestroyComm,
     389              :     kPlanSwitch,
     390              :     kSwitchError,
     391              :     kWaitSwitchRes,
     392              :     kSwitchSuccess,
     393              :     kSwitchFail,
     394              :     kRetryError,  // 重执行失败状态
     395              :     kResumeError, // 恢复执行失败状态
     396              :     kResumeChanged, // 恢复过程借轨成功
     397              : };
     398              : 
     399              : // KFC的执行错误码
     400              : enum class KfcError : int64_t {
     401              :     kNone = 0,        // 无异常
     402              :     kSdma,            // SDMA task执行失败
     403              :     kRdma,            // RDMA task执行失败
     404              :     kTimeout,         // task执行超时
     405              :     kInner,           // 通信算子展开、task下发失败
     406              :     kExec,            // 算子执行失败
     407              :     kExit,            // 算子强行终止
     408              :     kExecConstraint,  // 进入约束的算子重执行失败
     409              : };
     410              : 
     411              : enum class PollStatus : int64_t {
     412              :     kDefault = 0,
     413              :     kStopAsException,
     414              : };
     415              : 
     416              : enum class BackgroundStatus : int64_t {
     417              :     kNone = 0,                  // 正常状态
     418              :     kStop,              //背景线程停止状态
     419              : };
     420              : 
     421              : using KfcTaskException = struct KfcTaskExceptionDef {
     422              :     uint16_t streamId = 0;
     423              :     uint16_t taskId = 0;
     424              :     uint32_t errorCode = 0;
     425              :     uint8_t errorType = 0;
     426              :     uint8_t sqeType = 0;
     427              :     uint16_t sqId = 0;
     428              : };
     429              : using KfcRetryInfo = struct KfcRetryStatusDef {
     430              :     uint32_t retryCount = 0;         // 已重试次数;
     431              : };
     432              : 
     433              : struct ErrorMessageReport {
     434              :     char tag[TAG_MAX_LENGTH] = {0};
     435              :     char group[GROUP_NAME_MAX_LEN + 1] = {0};
     436              :     u32 remoteUserRank = 0;
     437              :     s32 streamId = 0;
     438              :     u32 taskId = 0;
     439              :     u32 notifyId = 0;
     440              :     s32 stage = 0;
     441              :     u32 rankId = 0;
     442              :     u32 rankSize = 0;
     443              :     AlgType algType;
     444              :     hccl::TaskType taskType = hccl::TaskType::TASK_SDMA;
     445              :     uint64_t count = 0;
     446              :     uint64_t dstAddr = 0;
     447              :     uint64_t srcAddr = 0;
     448              :     uint32_t opIndex = 0;                // 记录index
     449              :     uint32_t reduceType = 255; // 255 为 HcclReduceOp::HCCL_REDUCE_RESERVED
     450              :     uint8_t dataType = 0;
     451              : };
     452              : 
     453              : struct ExecStatusDef {
     454              :         KfcStatus kfcStatus;            // KFC状态
     455              :         KfcError kfcError;                      // KFC错误码
     456              :         KfcRetryInfo retryInfo;
     457              :         KfcTaskException taskException;
     458              :         PollStatus pollStatus;          // 背景线程状态
     459              :         BackgroundStatus backgroundStatus;
     460              : };
     461              : 
     462              : #pragma pack(push)
     463              : #pragma pack(1)
     464              : // aicpu向host提供的状态查询
     465              : using KfcExecStatus = struct KfcExecStatusDef {
     466              :     HcclOpIdentifier opId;
     467              :     ExecStatusDef execStatus;
     468              :     ErrorMessageReport emrReport;
     469              : };
     470              : #pragma pack(pop)
     471              : 
     472              : // P2P同步资源
     473              : struct HcclLinkP2pV2 {
     474              :     MemDetails localMem[MEM_DETAILS_NUM];
     475              :     MemDetails remoteMem[MEM_DETAILS_NUM];
     476              :     HcclSignalInfo localIpcSignal[LINK_P2P_MAX_NUM];  // localnotify
     477              :     HcclSignalInfo remoteIpcSignal[LINK_P2P_MAX_NUM];
     478              :     hccl::TransportAttr transportAttr;
     479              : };
     480              : 
     481              : struct HcclLinkRoceV2 {
     482              :     MemDetails localMem[MEM_DETAILS_NUM];
     483              :     MemDetails remoteMem[MEM_DETAILS_NUM];
     484              :     u64 notifyValue{0};  // notify record的src地址value存储位置
     485              :     u32 notifyValueKey{0};
     486              :     u32 singleQPNotifyNum{0};  // one link multi notify resources nums obtained via alg
     487              :     u64 localNotifyList{0};    // devicePtrValue    type:HcclSignalInfo  size: [3,8192]
     488              :     u64 remoteNotifyList{0};   // devicePtrValue    type:u64             size: [3,8192]
     489              :     u32 remoteNotifyKey{0};    // deprecated
     490              :     s64 chipId{LLONG_MAX};     // deprecated
     491              :     HcclQpInfoV2 QpInfo[RDMA_QP_MAX_NUM];  // ayyay size: [1, 1 + HCCL_RDMA_QPS_PER_CONNECTION_MAX]
     492              :     u32 qpsPerConnection{1};               // current link actual qp num obtained via env、workflowMode、qpMode
     493              :     bool useAtomicWrite{false}; // 是否使用atomic write
     494              : };
     495              : 
     496              : struct HccltagRemoteResV2 {
     497              :     ListCommon nextTagRes;
     498              :     char tag[TAG_MAX_LENGTH]; // newtag
     499              :     HcclLinkP2pV2 linkP2p;
     500              :     HcclLinkP2pV2 linkP2pSio;
     501              :     HcclLinkRoceV2 linkRoce[4];
     502              : };
     503              : 
     504              : struct HccltagRemoteResV3 {
     505              :    HccltagRemoteResV2 *tagRemoteResPtr;
     506              :    u64 p2pNotifyNum = 0;            // 用于linkp2p添加notify信息,不能超过Max个,超过报错(不区分local&remote)
     507              :    u64 roceNotifyNum = 0;           // 主链路:用于linkroce添加notify信息,不能超过Max个,超过报错(不区分local&remote)
     508              :    u64 roceNotifyNumBackup = 0;     // 备链路:用于linkroce添加notify信息,不能超过Max个,超过报错(不区分local&remote)
     509              :    u64 qpNum = 0;                   // 主链路:QP计数,支持多个,用于linkroce添加QP信息
     510              :    u64 qpNumBackup = 0;             // 备链路:QP计数,支持多个,用于linkroce添加QP信息
     511              : };
     512              : 
     513              : struct HcclRankRelationResV2 {
     514              :     u32 remoteUsrRankId = 0;
     515              :     u32 remoteWorldRank = 0;
     516              :     u64 windowsIn = 0;
     517              :     u64 windowsOut = 0;
     518              :     u64 windowsExp = 0;
     519              :     ListCommon nextTagRes = { 0 }; // HccltagRemoteResV2(根据tag区分)
     520              : };
     521              : 
     522              : struct HccltagLocalResV2 {     // TAG专用,scratchmem,
     523              :     ListCommon nextTagRes;     // 为0时,为尾节点
     524              :     char tag[TAG_MAX_LENGTH];  // 通信域内共享的资源则与通信域的hcomid相同
     525              :     u64 ScratchmemSize;        // 为0时代表没有使用Scratchmem
     526              :     u64 Scratchmem;
     527              : };
     528              : 
     529              : // 预留占位内存
     530              : struct ReservedStruct {
     531              :     u32 streamNum;
     532              :     u32 signalNum;
     533              :     HcclSignalInfo localSignals[LOCAL_NOTIFY_MAX_NUM];
     534              :     HcclStreamInfo streamInfo[19]; // 19为630版本数组的实际大小,不能使用已经变更为40的LOCAL_STREAM_MAX_NUM,否则会有兼容问题
     535              :     HcclStreamInfo mainStreamInfo;
     536              :     HcclSignalInfo aicpuOpNotify[AICPU_OP_NOTIFY_MAX_NUM];  // 集合通信AICPU展开资源
     537              :     ListCommon nextTagRes;                                  // HccltagLocalResV2
     538              : };
     539              : 
     540              : // 卡内主从流同步,下沉图,单算子,通信域内复用
     541              : struct LocalResInfoV2 {
     542              :     u32 streamNum;
     543              :     u32 signalNum;
     544              :     HcclSignalInfo localSignals[LOCAL_NOTIFY_MAX_NUM];
     545              :     HcclStreamParam streamParam[LOCAL_STREAM_MAX_NUM];
     546              :     HcclStreamParam mainStreamParam;
     547              :     HcclSignalInfo aicpuOpNotify[AICPU_OP_NOTIFY_MAX_NUM];  // 集合通信AICPU展开资源
     548              :     ListCommon nextTagRes;                                  // HccltagLocalResV2
     549              : };
     550              : 
     551              : struct CommonTlv {
     552              :     TAG_TYPE type;
     553              :     LENGTH_TYPE length;  // 本TLV总字节数,包括Type和length
     554              :     RANK_TYPE value;
     555              : };
     556              : 
     557              : struct AlgoTopoInfo {
     558              :     u32 userRank;      // 通信域 RankID
     559              :     u32 userRankSize;  // 通信域的 Rank数量
     560              :     s32 deviceLogicId;
     561              :     bool isSingleMeshAggregation;
     562              :     u32 deviceNumPerAggregation;  // 每个module中的Device数量
     563              :     u32 superPodNum;           // 集群中总的超节点数
     564              :     u32 devicePhyId;
     565              :     u32 topoType;  // TopoType
     566              :     u32 deviceType;
     567              :     u32 serverNum;
     568              :     u32 meshAggregationRankSize;
     569              :     u32 multiModuleDiffDeviceNumMode;
     570              :     u32 multiSuperPodDiffServerNumMode;
     571              :     u32 realUserRank;
     572              :     bool isDiffDeviceModule;
     573              :     bool isDiffDeviceType;
     574              :     u32 gcdDeviceNumPerAggregation;
     575              :     u32 moduleNum;
     576              :     u32 isUsedRdmaRankPairNum;
     577              :     u64 isUsedRdmaRankPair;
     578              :     u32 pairLinkCounterNum;
     579              :     u64 pairLinkCounter;
     580              :     u32 nicNum;
     581              :     u64 nicList;            // niclist数组指针
     582              :     u64 complanRankLength;  // complanRank占用的字节数
     583              :     u64 complanRank;        // 指针
     584              :     u64 bridgeRankNum;      // bridgeRank占用的个数
     585              :     u64 bridgeRank;         // 指针
     586              :     u64 serverAndsuperPodRankLength;  // serverAndsuperPodRank占用的字节数
     587              :     u64 serverAndsuperPodRank;    // 指针
     588              : };
     589              : struct RemoteResPtr {
     590              :     u64 nextHostPtr;
     591              :     u64 nextDevicePtr;
     592              : };
     593              : 
     594              : constexpr u32 ZERO_COPY_BUFFER_MAX_MAP_COUNT = 16 * 32 * 1024; // 16卡,一次每卡最多32k个映射修改
     595              : constexpr u32 ZERO_COPY_IPC_BUFFER_LENGTH = 4096;              // 跨进程交换地址所需buffer长度
     596              : struct LocalIpc2RemoteAddr {
     597              :     u32 devicePhyId = 0;
     598              :     u64 localIpcAddr = 0;
     599              :     u64 remoteAddr = 0;
     600              :     u64 length = 0;
     601              : };
     602              : 
     603              : enum class ZeroCopyItemType : u32 {
     604              :     SET_MEMORY,
     605              :     UNSET_MEMORY,
     606              :     ACTIVATE_MEMORY,
     607              :     DEACTIVATE_MEMORY
     608              : };
     609              : 
     610              : struct ZeroCopyRingBufferItem {
     611              :     ZeroCopyItemType type;
     612              :     LocalIpc2RemoteAddr addr;
     613              : };
     614              : 
     615              : // 层次化算法信息
     616              : struct HierarchicalAlgInfo {
     617              :     u64 commplaneSubGroupRankLength;  // complanSubGroupRank占用的字节数
     618              :     u64 commplaneSubGroupRank;  // 指针
     619              :     u32 hierarchicalAlgOptionNum;
     620              :     u64 hierarchicalAlgOptionVec;    // hierarchicalAlgOptionVec数组指针
     621              : };
     622              : 
     623              : constexpr u32 HCCL_TAG_SIZE = 256;
     624              : constexpr u32 OPINFO_RING_BUFFER_MAX = 2048;
     625              : struct AicpuOpInfo {
     626              :     char  tagBuff[HCCL_TAG_SIZE] {0}; //记录tag信息
     627              :     uint32_t opIndex = 0;                // 记录算子下发index
     628              :     uint64_t count = 0;
     629              :     uint8_t dataType = 0;
     630              :     uint8_t opType = 0;             // 算子类型
     631              :     uint32_t rootId;
     632              :     uint64_t dstAddr = 0;
     633              :     uint64_t srcAddr = 0;
     634              :     uint32_t reduceType = 255; // 255 为 HcclReduceOp::HCCL_REDUCE_RESERVED
     635              :     uint32_t opExecIndex = 0;                // 记录算子执行index
     636              :     bool isCustom = false;
     637              : };
     638              : 
     639              : struct TaskExceptionParam {
     640              :     u32 opRingBufferIdx = 0; // 记录算子信息在AicpuOpInfo数组里的下标
     641              :     AicpuOpInfo opInfo[OPINFO_RING_BUFFER_MAX]; // 用于记录每个task对应的算子入参信息
     642              : };
     643              : 
     644              : // aicpu和custom进程需要交互的部分信息
     645              : struct AicpuCustomParam {
     646              :     TaskExceptionParam taskExceptionParam; // 故障上报信息
     647              : };
     648              : 
     649              : // 注意,本数据结构整体均被MC2不同算子使用
     650              : // MC2使用偏移量访问整个数据结构,不能调整任意的位置,长度等信息
     651              : struct HcclOpResParam {
     652              :     // 本地资源
     653              :     HcclMC2WorkSpace mc2WorkSpace;
     654              :     u32 localUsrRankId;  // usrrankid
     655              :     u32 rankSize;        // 通信域内total rank个数
     656              :     u64 winSize;  // 每个win大小,静态图时,可能为0,如果通信域内也有动态图,则可能为非0
     657              :     u64 localWindowsIn;   // 全F为无效值
     658              :     u64 localWindowsOut;  // 全F为无效值
     659              :     char hcomId[128];
     660              :     u64 winExpSize;
     661              :     u64 localWindowsExp;
     662              :     // aicore识别remote window
     663              :     u32 rWinStart;   // 为HcclRankRelationRes起始位置
     664              :     u32 rWinOffset;  // 为HcclRemoteRes的大小
     665              :     u64 version;
     666              :     ReservedStruct reservedStrcut;
     667              :     AlgoTopoInfo topoInfo;
     668              : 
     669              :     // 外部配置参数
     670              :     HcclOpConfig config;
     671              :     u64 hostStateInfo;
     672              :     u64 aicpuStateInfo;
     673              :     u64 lockAddr;
     674              :     u32 rsv[16];
     675              :     u32 notifysize;                              // RDMA场景使用,910B/910_93为4B,其余芯片为8B
     676              :     u32 remoteResNum;                            // 有效的remoteResNum
     677              :     RemoteResPtr remoteRes[AICPU_MAX_RANK_NUM];  // 数组指针,指向HcclRankRelationResV2,下标为remoteUserRankId
     678              : 
     679              :     // communicate retry
     680              :     hccl::HDCommunicateParams kfcControlTransferH2DParams;
     681              :     hccl::HDCommunicateParams kfcStatusTransferD2HParams;
     682              : 
     683              :     u64 tinyMem;   // for all2all
     684              :     u64 tinyMemSize;
     685              : 
     686              :     // 零拷贝场景使用
     687              :     u64 zeroCopyHeadPtr;
     688              :     u64 zeroCopyTailPtr;
     689              :     u64 zeroCopyRingBuffer;
     690              :     u64 zeroCopyIpcPtrs[AICPU_ZERO_COPY_MAX_DEVICE_NUM_A3];               // 保存集合通信时每个对端的输入输出内存地址
     691              :     u32 zeroCopyDevicePhyId[AICPU_ZERO_COPY_MAX_DEVICE_NUM_A3];           // 保存每个rank对应的物理卡Id
     692              : 
     693              :     bool utraceStatusFlag;
     694              : 
     695              :     OpCounterInfo opCounterInfo;
     696              : 
     697              :     HierarchicalAlgInfo hierarchicalAlgInfo;
     698              :     LocalResInfoV2 localRes;
     699              :     u64 debugConfig = 0; // 环境变量HCCL_DEBUG_CONFIG, 考虑兼容性放在结构体末尾
     700              : 
     701              :     // aicpu和custom进程需要交互的部分信息
     702              :     u64 aicpuCustomParamAddr;
     703              :     u64 aicpuCustomParamSize;
     704              : 
     705              :     // 外部mc2等算子使用偏移量访问
     706              :     MemDetails userMemRes[MAX_RANK_NUM_A3];     // 下标为rank id
     707              :     u32 userMemType = 0;                             // 0:CCL Buffer; 1:user Mem
     708              : 
     709              :     HcclStreamParam aicpuOrderStreamParam; // 按序下发的stream
     710              :     u64 aicpuOrderNotifyAddr;
     711              :     u64 aicpuOrderNotifySize;
     712              :     // ARS算法属性
     713              :     u32 multiSuperPodDiffDeviceNumMode;
     714              :     bool isARSDoubleRing;
     715              :     // 读取HCCL_ENTRY_LOG_ENABLE环境变量,用于增加算子kernel展开信息
     716              :     bool opEntry{false};
     717              :     uint32_t hcclSdmaQos; //HCCL SDMA QOS TAG
     718              :     // 外部mc2等算子跨框AIV场景使用
     719              :     u64 sizeOfAiRMAInfo = 0; // sizeof(HcclAiRMAInfo), 用于内存校验
     720              :     u64 aiRMAInfo = 0; // HcclAiRMAInfo* 单个结构体指针
     721              : };
     722              : 
     723              : struct OpTilingData {
     724              :     char tag[128];
     725              :     char newTag[256];
     726              :     char algName[128];
     727              :     u32 index; // 集合通信算子在通信域内的编号,aicpu侧使用时区分算子类型(bsr、sendrecv、其他)单独计数
     728              :     u64 algType;
     729              :     u8 floatOverflowMode;
     730              :     u8 dumpDebug;
     731              :     u8 debugMode;
     732              :     u8 workflowMode;
     733              :     u64 inputPtr;
     734              :     u64 outputPtr;
     735              :     u8 reduceType;  // HcclReduceOp ::HCCL_REDUCE_RESERVED
     736              :     u8 syncMode;    // SyncMode::DEFAULT_TIMEWAITSYNCMODE;
     737              :     RankId root = INVALID_VALUE_RANKID;
     738              :     RankId dstRank = 0;
     739              :     RankId srcRank = 0;
     740              :     u8 opType; // HcclCMDType::HCCL_CMD_INVALID;
     741              :     u8 inplaceSupportRetry;
     742              :     u8 retryEnable;
     743              :     u8 inPlaceSupportRetryStatus;
     744              :     u8 isInplacePreSync;
     745              :     u8 isPostSync;
     746              :     u8 isZeroCopy = 0;
     747              :     u64 version = 0;
     748              :     s32 userStreamId;
     749              :     u32 ahcConfInfo[TOP_HIERARCHICAL_CONF_SIZE] = {0};
     750              :     uint8_t aicpuCacheEnable = 0; // 是否开启aicpu cache
     751              :     u8 isSymmetricMemory = 0;
     752              :     u64 inputSymWindow;
     753              :     u64 inputOffset = 0;
     754              :     u64 outputSymWindow;
     755              :     u64 outputOffset = 0;
     756              : 
     757              :     /******************可变长度数据区,如需新增字段请在这之前增加*******************/
     758              :     u64 length;   // 可变长度数据区长度
     759              :     u64 customDataLength;    // 用户自定义预留可变长度数据区长度,预期在aicpu侧做数据块校验
     760              :     u8 isCapture = 0; // 算子是否aclgraph模式
     761              :     u8 orderLaunchMode = 0; // 对应AicpuNotifyMode的枚举值
     762              :     u8 needIncreLink = 0; // 是否需要增量建链
     763              : 
     764              :     /* 不同算子,长度不同,依据opType决定选择使用
     765              :     * (1)batchsendrcv
     766              :     * struct {
     767              :     *     u32 itemNum;
     768              :     *     HcclSendRecvItem orderedList[itemNum];
     769              :     * } OpTilingBatchSendRecvDataDes;
     770              :     * (2)alltoallv
     771              :     * struct {
     772              :     *     u8 sendType;  // HcclDataType
     773              :     *     u8 recvType;  // HcclDataType
     774              :     *     u32 rankSize;
     775              :     *     u64 sendCounts[rankSize];
     776              :     *     u64 recvCounts[rankSize];
     777              :     *     u64 sdispls[rankSize];
     778              :     *     u64 rdispls[rankSize];
     779              :     * };
     780              :     * (3)alltoallvc
     781              :     * struct {
     782              :     *     u8 sendType;  // HcclDataType
     783              :     *     u8 recvType;  // HcclDataType
     784              :     *     u32 rankSize;
     785              :     *     u64 sendCountMatrix[rankSize * rankSize];
     786              :     * };
     787              :     *  (4)alltoall
     788              :     * struct {
     789              :     *     u8 sendType;  // HcclDataType
     790              :     *     u8 recvType;  // HcclDataType
     791              :     *     u64 sendCount;
     792              :     *     u64 recvCount;
     793              :     * };
     794              :     *  (5)other operators
     795              :     * struct {
     796              :     *     u64 count;
     797              :     *     u8 datatype;  // HcclDataType
     798              :     * }; */
     799              : };
     800              : struct OpTilingDataDes {
     801              :     u64 count;
     802              :     u8 dataType;
     803              : };
     804              : struct OpTilingVDataDes {
     805              :     u8 dataType;    // HcclDataType
     806              :     u64 vDataLen;   // TLV: T is opType in OpTilingData, L is vData length
     807              :     u64 vData[];    // counts/displs
     808              : };
     809              : struct OpTilingBatchSendRecvDataDes {
     810              :     u32 itemNum;
     811              :     HcclSendRecvItem batchSendRecvItem[];
     812              : };
     813              : struct OpTilingAllToAllDataDes{
     814              :     u8 sendType;  // HcclDataType
     815              :     u8 recvType;  // HcclDataType
     816              :     u64 sendCount;
     817              : };
     818              : struct OpTilingAlltoallvDataDes {
     819              :     u8 sendType;  // HcclDataType
     820              :     u8 recvType;  // HcclDataType
     821              :     u64 sendRecvInfos[];
     822              : };
     823              : struct OpTilingAlltoallvcDataDes {
     824              :     u8 sendType;  // HcclDataType
     825              :     u8 recvType;  // HcclDataType
     826              :     u64 sendCountMatrix[];
     827              : };
     828              : struct HcclOneSideCommResParam {        // 单边通信使用的Stream和Notify资源
     829              :     HcclStreamParam execStreamParam;    // HOST侧申请传递给AICPU侧使用的执行流
     830              :     HcclSignalInfo aicpuOpNotify[AICPU_OP_NOTIFY_MAX_NUM];  // 用于HOST和AICPU侧同步的Notify资源,HOST侧申请传递给AICPU侧
     831              : };
     832              : struct HcclOneSideOpDescParam {
     833              :     u64 localAddr;  // 本端VA
     834              :     u64 remoteAddr; // 远端VA
     835              :     u32 lkey;       // 本端内存对应的key
     836              :     u32 rkey;       // 远端内存对应的key
     837              :     u64 count;      // 数据的个数
     838              :     u8 dataType;    // 数据的类型
     839              : };
     840              : struct OpTilingOneSideCommDataDes {
     841              :     u64 commResParaAddr;    // 记录HcclOneSideCommResParam地址
     842              :     u64 commResParaSize;    // 记录HcclOneSideCommResParam大小
     843              :     u64 transportDataAddr;  // 记录TransportDeviceNormalData地址
     844              :     u64 transportDataSize;  // 记录TransportDeviceNormalData大小
     845              :     u32 rankSize;
     846              :     u32 linkTimeout;        // RDMA发送重试超时时间
     847              :     u8 linkType;            // 单边通信链路类型 LinkType, rdma: LinkType::LINK_ROCE sdma: LinkType::LINK_HCCS
     848              :     bool finalize;          // 通信域销毁标志位
     849              :     u32 descNum;            // 单边通信接口传入的descNum加1,最后1个为OpFence的位置
     850              :     u64 descDataLen;        // TLV: T is opType in OpTilingData, L is descDataLen
     851              :     u64 desc[];             // desc的占位
     852              : };
     853              : #endif
        

Generated by: LCOV version 2.0-1