LCOV - code coverage report
Current view: top level - legacy/ascend950/framework/aiv/aiv_ins - hccl_aiv_utils.cc (source / functions) Coverage Total Hit
Test: coverage.info Lines: 84.4 % 167 141
Test Date: 2026-08-18 17:47:01 Functions: 91.7 % 12 11

            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              : #include <mutex>
      12              : #include <vector>
      13              : #include <iostream>
      14              : #include <fstream>
      15              : #include "mmpa_api.h"
      16              : #include "acl/acl_rt.h"
      17              : #include "env_config_v2.h"
      18              : #include "hccl_aiv_utils.h"
      19              : #include "aicpu/launch_device_v2.h"
      20              : 
      21              : using namespace std;
      22              : 
      23              : namespace Hccl {
      24              : constexpr u32 SIG_MOVE_LEFT_BITS = 20;
      25              : constexpr u32 MAX_BIN_FILE_SIZE = 100 * 1024 * 1024;
      26              : constexpr s32 RESET_TAIL_SYNC_TAG = 2;
      27              : constexpr uint64_t MIN_NPU_TIMEOUT = 1;
      28              : constexpr uint64_t MAX_NPU_TIMEOUT = 254;
      29              : 
      30              : static bool g_init = false;
      31              : static mutex g_mut;
      32              : static aclrtBinHandle g_binHandle;
      33              : static std::unordered_map<const s8*, aclrtFuncHandle> g_aivFuncMap;
      34              : static std::unordered_map<const s8*, std::string> g_aivNameMap;
      35              : 
      36              : using AivKernelInfo = struct AivKernelInfoDef {
      37              :     const char* kernelName;
      38              :     HcclCMDType cmdType;
      39              :     DataType dataType;
      40              :     KernelArgsType argsType;
      41              : 
      42          156 :     AivKernelInfoDef(
      43              :         const char* kernelName, HcclCMDType cmdType, DataType dataType,
      44              :         KernelArgsType argsType = KernelArgsType::ARGS_TYPE_SERVER)
      45          156 :         : kernelName(kernelName),
      46          156 :           cmdType(cmdType),
      47          156 :           dataType(dataType),
      48          156 :           argsType(argsType)
      49          156 :     {}
      50              : };
      51              : 
      52              : static std::vector<AivKernelInfo> g_aivKernelInfoList = {
      53              :     // scatter
      54              :     {"aiv_scatter_half", HcclCMDType::HCCL_CMD_SCATTER, DataType::FP16},
      55              :     {"aiv_scatter_int16_t", HcclCMDType::HCCL_CMD_SCATTER, DataType::INT16},
      56              :     {"aiv_scatter_uint16_t", HcclCMDType::HCCL_CMD_SCATTER, DataType::UINT16},
      57              :     {"aiv_scatter_float", HcclCMDType::HCCL_CMD_SCATTER, DataType::FP32},
      58              :     {"aiv_scatter_uint64_t", HcclCMDType::HCCL_CMD_SCATTER, DataType::FP64},
      59              :     {"aiv_scatter_int32_t", HcclCMDType::HCCL_CMD_SCATTER, DataType::INT32},
      60              :     {"aiv_scatter_uint32_t", HcclCMDType::HCCL_CMD_SCATTER, DataType::UINT32},
      61              :     {"aiv_scatter_int8_t", HcclCMDType::HCCL_CMD_SCATTER, DataType::INT8},
      62              :     {"aiv_scatter_uint8_t", HcclCMDType::HCCL_CMD_SCATTER, DataType::UINT8},
      63              :     {"aiv_scatter_bfloat16_t", HcclCMDType::HCCL_CMD_SCATTER, DataType::BFP16},
      64              :     {"aiv_scatter_uint64_t", HcclCMDType::HCCL_CMD_SCATTER, DataType::INT64},
      65              :     {"aiv_scatter_int64_t", HcclCMDType::HCCL_CMD_SCATTER, DataType::UINT64},
      66              :     {"aiv_scatter_hifloat8_t", HcclCMDType::HCCL_CMD_SCATTER, DataType::HIF8},
      67              :     {"aiv_scatter_fp8_e4m3fn_t", HcclCMDType::HCCL_CMD_SCATTER, DataType::FP8E4M3},
      68              :     {"aiv_scatter_fp8_e5m2_t", HcclCMDType::HCCL_CMD_SCATTER, DataType::FP8E5M2},
      69              :     {"aiv_scatter_fp8_e8m0_t", HcclCMDType::HCCL_CMD_SCATTER, DataType::FP8E8M0},
      70              : 
      71              :     {"aiv_all_gather_half", HcclCMDType::HCCL_CMD_ALLGATHER, DataType::FP16},
      72              :     {"aiv_all_gather_int16_t", HcclCMDType::HCCL_CMD_ALLGATHER, DataType::INT16},
      73              :     {"aiv_all_gather_uint16_t", HcclCMDType::HCCL_CMD_ALLGATHER, DataType::UINT16},
      74              :     {"aiv_all_gather_float", HcclCMDType::HCCL_CMD_ALLGATHER, DataType::FP32},
      75              :     {"aiv_all_gather_uint64_t", HcclCMDType::HCCL_CMD_ALLGATHER, DataType::FP64},
      76              :     {"aiv_all_gather_int32_t", HcclCMDType::HCCL_CMD_ALLGATHER, DataType::INT32},
      77              :     {"aiv_all_gather_uint32_t", HcclCMDType::HCCL_CMD_ALLGATHER, DataType::UINT32},
      78              :     {"aiv_all_gather_int8_t", HcclCMDType::HCCL_CMD_ALLGATHER, DataType::INT8},
      79              :     {"aiv_all_gather_uint8_t", HcclCMDType::HCCL_CMD_ALLGATHER, DataType::UINT8},
      80              :     {"aiv_all_gather_bfloat16_t", HcclCMDType::HCCL_CMD_ALLGATHER, DataType::BFP16},
      81              :     {"aiv_all_gather_uint64_t", HcclCMDType::HCCL_CMD_ALLGATHER, DataType::INT64},
      82              :     {"aiv_all_gather_int64_t", HcclCMDType::HCCL_CMD_ALLGATHER, DataType::UINT64},
      83              :     {"aiv_all_gather_hifloat8_t", HcclCMDType::HCCL_CMD_ALLGATHER, DataType::HIF8},
      84              :     {"aiv_all_gather_fp8_e4m3fn_t", HcclCMDType::HCCL_CMD_ALLGATHER, DataType::FP8E4M3},
      85              :     {"aiv_all_gather_fp8_e5m2_t", HcclCMDType::HCCL_CMD_ALLGATHER, DataType::FP8E5M2},
      86              :     {"aiv_all_gather_fp8_e8m0_t", HcclCMDType::HCCL_CMD_ALLGATHER, DataType::FP8E8M0},
      87              :     // allreduce
      88              :     {"aiv_allreduce_half", HcclCMDType::HCCL_CMD_ALLREDUCE, DataType::FP16},
      89              :     {"aiv_allreduce_int16_t", HcclCMDType::HCCL_CMD_ALLREDUCE, DataType::INT16},
      90              :     {"aiv_allreduce_float", HcclCMDType::HCCL_CMD_ALLREDUCE, DataType::FP32},
      91              :     {"aiv_allreduce_int32_t", HcclCMDType::HCCL_CMD_ALLREDUCE, DataType::INT32},
      92              :     {"aiv_allreduce_int8_t", HcclCMDType::HCCL_CMD_ALLREDUCE, DataType::INT8},
      93              :     {"aiv_allreduce_bfloat16_t", HcclCMDType::HCCL_CMD_ALLREDUCE, DataType::BFP16},
      94              :     {"aiv_allreduce_int64_t", HcclCMDType::HCCL_CMD_ALLREDUCE, DataType::INT64},
      95              :     // broadcast
      96              :     {"aiv_broadcast_half", HcclCMDType::HCCL_CMD_BROADCAST, DataType::FP16},
      97              :     {"aiv_broadcast_int16_t", HcclCMDType::HCCL_CMD_BROADCAST, DataType::INT16},
      98              :     {"aiv_broadcast_uint16_t", HcclCMDType::HCCL_CMD_BROADCAST, DataType::UINT16},
      99              :     {"aiv_broadcast_float", HcclCMDType::HCCL_CMD_BROADCAST, DataType::FP32},
     100              :     {"aiv_broadcast_uint64_t", HcclCMDType::HCCL_CMD_BROADCAST, DataType::FP64},
     101              :     {"aiv_broadcast_int32_t", HcclCMDType::HCCL_CMD_BROADCAST, DataType::INT32},
     102              :     {"aiv_broadcast_uint32_t", HcclCMDType::HCCL_CMD_BROADCAST, DataType::UINT32},
     103              :     {"aiv_broadcast_int8_t", HcclCMDType::HCCL_CMD_BROADCAST, DataType::INT8},
     104              :     {"aiv_broadcast_uint8_t", HcclCMDType::HCCL_CMD_BROADCAST, DataType::UINT8},
     105              :     {"aiv_broadcast_bfloat16_t", HcclCMDType::HCCL_CMD_BROADCAST, DataType::BFP16},
     106              :     {"aiv_broadcast_uint64_t", HcclCMDType::HCCL_CMD_BROADCAST, DataType::INT64},
     107              :     {"aiv_broadcast_int64_t", HcclCMDType::HCCL_CMD_BROADCAST, DataType::UINT64},
     108              :     {"aiv_broadcast_hifloat8_t", HcclCMDType::HCCL_CMD_BROADCAST, DataType::HIF8},
     109              :     {"aiv_broadcast_fp8_e4m3fn_t", HcclCMDType::HCCL_CMD_BROADCAST, DataType::FP8E4M3},
     110              :     {"aiv_broadcast_fp8_e5m2_t", HcclCMDType::HCCL_CMD_BROADCAST, DataType::FP8E5M2},
     111              :     {"aiv_broadcast_fp8_e8m0_t", HcclCMDType::HCCL_CMD_BROADCAST, DataType::FP8E8M0},
     112              :     // allreduce two shot
     113              :     {"aiv_allreduce_mesh1d_twoshot_half", HcclCMDType::HCCL_CMD_ALLREDUCE, DataType::FP16,
     114              :      KernelArgsType::ARGS_TYPE_TWO_SHOT},
     115              :     {"aiv_allreduce_mesh1d_twoshot_int16_t", HcclCMDType::HCCL_CMD_ALLREDUCE, DataType::INT16,
     116              :      KernelArgsType::ARGS_TYPE_TWO_SHOT},
     117              :     {"aiv_allreduce_mesh1d_twoshot_float", HcclCMDType::HCCL_CMD_ALLREDUCE, DataType::FP32,
     118              :      KernelArgsType::ARGS_TYPE_TWO_SHOT},
     119              :     {"aiv_allreduce_mesh1d_twoshot_int32_t", HcclCMDType::HCCL_CMD_ALLREDUCE, DataType::INT32,
     120              :      KernelArgsType::ARGS_TYPE_TWO_SHOT},
     121              :     {"aiv_allreduce_mesh1d_twoshot_int8_t", HcclCMDType::HCCL_CMD_ALLREDUCE, DataType::INT8,
     122              :      KernelArgsType::ARGS_TYPE_TWO_SHOT},
     123              :     {"aiv_allreduce_mesh1d_twoshot_bfloat16_t", HcclCMDType::HCCL_CMD_ALLREDUCE, DataType::BFP16,
     124              :      KernelArgsType::ARGS_TYPE_TWO_SHOT},
     125              :     {"aiv_allreduce_mesh1d_twoshot_int64_t", HcclCMDType::HCCL_CMD_ALLREDUCE, DataType::INT64,
     126              :      KernelArgsType::ARGS_TYPE_TWO_SHOT},
     127              :     // alltoall
     128              :     {"aiv_alltoall_half", HcclCMDType::HCCL_CMD_ALLTOALL, DataType::FP16},
     129              :     {"aiv_alltoall_int16_t", HcclCMDType::HCCL_CMD_ALLTOALL, DataType::INT16},
     130              :     {"aiv_alltoall_uint16_t", HcclCMDType::HCCL_CMD_ALLTOALL, DataType::UINT16},
     131              :     {"aiv_alltoall_float", HcclCMDType::HCCL_CMD_ALLTOALL, DataType::FP32},
     132              :     {"aiv_alltoall_uint64_t", HcclCMDType::HCCL_CMD_ALLTOALL, DataType::FP64},
     133              :     {"aiv_alltoall_int32_t", HcclCMDType::HCCL_CMD_ALLTOALL, DataType::INT32},
     134              :     {"aiv_alltoall_uint32_t", HcclCMDType::HCCL_CMD_ALLTOALL, DataType::UINT32},
     135              :     {"aiv_alltoall_int8_t", HcclCMDType::HCCL_CMD_ALLTOALL, DataType::INT8},
     136              :     {"aiv_alltoall_uint8_t", HcclCMDType::HCCL_CMD_ALLTOALL, DataType::UINT8},
     137              :     {"aiv_alltoall_bfloat16_t", HcclCMDType::HCCL_CMD_ALLTOALL, DataType::BFP16},
     138              :     {"aiv_alltoall_uint64_t", HcclCMDType::HCCL_CMD_ALLTOALL, DataType::INT64},
     139              :     {"aiv_alltoall_int64_t", HcclCMDType::HCCL_CMD_ALLTOALL, DataType::UINT64},
     140              :     {"aiv_alltoall_hifloat8_t", HcclCMDType::HCCL_CMD_ALLTOALL, DataType::HIF8},
     141              :     {"aiv_alltoall_fp8_e4m3fn_t", HcclCMDType::HCCL_CMD_ALLTOALL, DataType::FP8E4M3},
     142              :     {"aiv_alltoall_fp8_e5m2_t", HcclCMDType::HCCL_CMD_ALLTOALL, DataType::FP8E5M2},
     143              :     {"aiv_alltoall_fp8_e8m0_t", HcclCMDType::HCCL_CMD_ALLTOALL, DataType::FP8E8M0},
     144              :     // alltoallv
     145              :     {"aiv_alltoallv_half", HcclCMDType::HCCL_CMD_ALLTOALLV, DataType::FP16},
     146              :     {"aiv_alltoallv_int16_t", HcclCMDType::HCCL_CMD_ALLTOALLV, DataType::INT16},
     147              :     {"aiv_alltoallv_uint16_t", HcclCMDType::HCCL_CMD_ALLTOALLV, DataType::UINT16},
     148              :     {"aiv_alltoallv_float", HcclCMDType::HCCL_CMD_ALLTOALLV, DataType::FP32},
     149              :     {"aiv_alltoallv_uint64_t", HcclCMDType::HCCL_CMD_ALLTOALLV, DataType::FP64},
     150              :     {"aiv_alltoallv_int32_t", HcclCMDType::HCCL_CMD_ALLTOALLV, DataType::INT32},
     151              :     {"aiv_alltoallv_uint32_t", HcclCMDType::HCCL_CMD_ALLTOALLV, DataType::UINT32},
     152              :     {"aiv_alltoallv_int8_t", HcclCMDType::HCCL_CMD_ALLTOALLV, DataType::INT8},
     153              :     {"aiv_alltoallv_uint8_t", HcclCMDType::HCCL_CMD_ALLTOALLV, DataType::UINT8},
     154              :     {"aiv_alltoallv_bfloat16_t", HcclCMDType::HCCL_CMD_ALLTOALLV, DataType::BFP16},
     155              :     {"aiv_alltoallv_uint64_t", HcclCMDType::HCCL_CMD_ALLTOALLV, DataType::INT64},
     156              :     {"aiv_alltoallv_int64_t", HcclCMDType::HCCL_CMD_ALLTOALLV, DataType::UINT64},
     157              :     {"aiv_alltoallv_hifloat8_t", HcclCMDType::HCCL_CMD_ALLTOALLV, DataType::HIF8},
     158              :     {"aiv_alltoallv_fp8_e4m3fn_t", HcclCMDType::HCCL_CMD_ALLTOALLV, DataType::FP8E4M3},
     159              :     {"aiv_alltoallv_fp8_e5m2_t", HcclCMDType::HCCL_CMD_ALLTOALLV, DataType::FP8E5M2},
     160              :     {"aiv_alltoallv_fp8_e8m0_t", HcclCMDType::HCCL_CMD_ALLTOALLV, DataType::FP8E8M0},
     161              :     // reduce
     162              :     {"aiv_reduce_half", HcclCMDType::HCCL_CMD_REDUCE, DataType::FP16},
     163              :     {"aiv_reduce_int16_t", HcclCMDType::HCCL_CMD_REDUCE, DataType::INT16},
     164              :     {"aiv_reduce_float", HcclCMDType::HCCL_CMD_REDUCE, DataType::FP32},
     165              :     {"aiv_reduce_int32_t", HcclCMDType::HCCL_CMD_REDUCE, DataType::INT32},
     166              :     {"aiv_reduce_int8_t", HcclCMDType::HCCL_CMD_REDUCE, DataType::INT8},
     167              :     {"aiv_reduce_bfloat16_t", HcclCMDType::HCCL_CMD_REDUCE, DataType::BFP16},
     168              :     {"aiv_reduce_int64_t", HcclCMDType::HCCL_CMD_REDUCE, DataType::INT64},
     169              :     // reducescatter
     170              :     {"aiv_reduce_scatter_half", HcclCMDType::HCCL_CMD_REDUCE_SCATTER, DataType::FP16},
     171              :     {"aiv_reduce_scatter_int16_t", HcclCMDType::HCCL_CMD_REDUCE_SCATTER, DataType::INT16},
     172              :     {"aiv_reduce_scatter_float", HcclCMDType::HCCL_CMD_REDUCE_SCATTER, DataType::FP32},
     173              :     {"aiv_reduce_scatter_int32_t", HcclCMDType::HCCL_CMD_REDUCE_SCATTER, DataType::INT32},
     174              :     {"aiv_reduce_scatter_int8_t", HcclCMDType::HCCL_CMD_REDUCE_SCATTER, DataType::INT8},
     175              :     {"aiv_reduce_scatter_bfloat16_t", HcclCMDType::HCCL_CMD_REDUCE_SCATTER, DataType::BFP16},
     176              :     {"aiv_reduce_scatter_int64_t", HcclCMDType::HCCL_CMD_REDUCE_SCATTER, DataType::INT64},
     177              :     // send
     178              :     {"aiv_send_int8_t", HcclCMDType::HCCL_CMD_SEND, DataType::INT8}, // hccl_types.h
     179              :     {"aiv_send_int16_t", HcclCMDType::HCCL_CMD_SEND, DataType::INT16},
     180              :     {"aiv_send_int32_t", HcclCMDType::HCCL_CMD_SEND, DataType::INT32},
     181              :     {"aiv_send_int64_t", HcclCMDType::HCCL_CMD_SEND, DataType::INT64},
     182              :     {"aiv_send_uint8_t", HcclCMDType::HCCL_CMD_SEND, DataType::UINT8},
     183              :     {"aiv_send_uint16_t", HcclCMDType::HCCL_CMD_SEND, DataType::UINT16},
     184              :     {"aiv_send_uint32_t", HcclCMDType::HCCL_CMD_SEND, DataType::UINT32},
     185              :     {"aiv_send_uint64_t", HcclCMDType::HCCL_CMD_SEND, DataType::UINT64},
     186              :     {"aiv_send_half", HcclCMDType::HCCL_CMD_SEND, DataType::FP16},
     187              :     {"aiv_send_float", HcclCMDType::HCCL_CMD_SEND, DataType::FP32},
     188              :     {"aiv_send_uint64_t", HcclCMDType::HCCL_CMD_SEND, DataType::FP64},
     189              :     {"aiv_send_bfloat16_t", HcclCMDType::HCCL_CMD_SEND, DataType::BFP16},
     190              :     {"aiv_send_hifloat8_t", HcclCMDType::HCCL_CMD_SEND, DataType::HIF8},
     191              :     {"aiv_send_fp8_e4m3fn_t", HcclCMDType::HCCL_CMD_SEND, DataType::FP8E4M3},
     192              :     {"aiv_send_fp8_e5m2_t", HcclCMDType::HCCL_CMD_SEND, DataType::FP8E5M2},
     193              :     {"aiv_send_fp8_e8m0_t", HcclCMDType::HCCL_CMD_SEND, DataType::FP8E8M0},
     194              :     // recv
     195              :     {"aiv_recv_int8_t", HcclCMDType::HCCL_CMD_RECEIVE, DataType::INT8},
     196              :     {"aiv_recv_int16_t", HcclCMDType::HCCL_CMD_RECEIVE, DataType::INT16},
     197              :     {"aiv_recv_int32_t", HcclCMDType::HCCL_CMD_RECEIVE, DataType::INT32},
     198              :     {"aiv_recv_int64_t", HcclCMDType::HCCL_CMD_RECEIVE, DataType::INT64},
     199              :     {"aiv_recv_uint8_t", HcclCMDType::HCCL_CMD_RECEIVE, DataType::UINT8},
     200              :     {"aiv_recv_uint16_t", HcclCMDType::HCCL_CMD_RECEIVE, DataType::UINT16},
     201              :     {"aiv_recv_uint32_t", HcclCMDType::HCCL_CMD_RECEIVE, DataType::UINT32},
     202              :     {"aiv_recv_uint64_t", HcclCMDType::HCCL_CMD_RECEIVE, DataType::UINT64},
     203              :     {"aiv_recv_half", HcclCMDType::HCCL_CMD_RECEIVE, DataType::FP16},
     204              :     {"aiv_recv_float", HcclCMDType::HCCL_CMD_RECEIVE, DataType::FP32},
     205              :     {"aiv_recv_uint64_t", HcclCMDType::HCCL_CMD_RECEIVE, DataType::FP64},
     206              :     {"aiv_recv_bfloat16_t", HcclCMDType::HCCL_CMD_RECEIVE, DataType::BFP16},
     207              :     {"aiv_recv_hifloat8_t", HcclCMDType::HCCL_CMD_RECEIVE, DataType::HIF8},
     208              :     {"aiv_recv_fp8_e4m3fn_t", HcclCMDType::HCCL_CMD_RECEIVE, DataType::FP8E4M3},
     209              :     {"aiv_recv_fp8_e5m2_t", HcclCMDType::HCCL_CMD_RECEIVE, DataType::FP8E5M2},
     210              :     {"aiv_recv_fp8_e8m0_t", HcclCMDType::HCCL_CMD_RECEIVE, DataType::FP8E8M0},
     211              :     // batchSendRecv
     212              :     {"aiv_batchSendRecv_int8_t", HcclCMDType::HCCL_CMD_BATCH_SEND_RECV, DataType::INT8},
     213              :     {"aiv_batchSendRecv_int16_t", HcclCMDType::HCCL_CMD_BATCH_SEND_RECV, DataType::INT16},
     214              :     {"aiv_batchSendRecv_int32_t", HcclCMDType::HCCL_CMD_BATCH_SEND_RECV, DataType::INT32},
     215              :     {"aiv_batchSendRecv_int64_t", HcclCMDType::HCCL_CMD_BATCH_SEND_RECV, DataType::INT64},
     216              :     {"aiv_batchSendRecv_uint8_t", HcclCMDType::HCCL_CMD_BATCH_SEND_RECV, DataType::UINT8},
     217              :     {"aiv_batchSendRecv_uint16_t", HcclCMDType::HCCL_CMD_BATCH_SEND_RECV, DataType::UINT16},
     218              :     {"aiv_batchSendRecv_uint32_t", HcclCMDType::HCCL_CMD_BATCH_SEND_RECV, DataType::UINT32},
     219              :     {"aiv_batchSendRecv_uint64_t", HcclCMDType::HCCL_CMD_BATCH_SEND_RECV, DataType::UINT64},
     220              :     {"aiv_batchSendRecv_half", HcclCMDType::HCCL_CMD_BATCH_SEND_RECV, DataType::FP16},
     221              :     {"aiv_batchSendRecv_float", HcclCMDType::HCCL_CMD_BATCH_SEND_RECV, DataType::FP32},
     222              :     {"aiv_batchSendRecv_uint64_t", HcclCMDType::HCCL_CMD_BATCH_SEND_RECV, DataType::FP64},
     223              :     {"aiv_batchSendRecv_bfloat16_t", HcclCMDType::HCCL_CMD_BATCH_SEND_RECV, DataType::BFP16},
     224              :     {"aiv_batchSendRecv_hifloat8_t", HcclCMDType::HCCL_CMD_BATCH_SEND_RECV, DataType::HIF8},
     225              :     {"aiv_batchSendRecv_fp8_e4m3fn_t", HcclCMDType::HCCL_CMD_BATCH_SEND_RECV, DataType::FP8E4M3},
     226              :     {"aiv_batchSendRecv_fp8_e5m2_t", HcclCMDType::HCCL_CMD_BATCH_SEND_RECV, DataType::FP8E5M2},
     227              :     {"aiv_batchSendRecv_fp8_e8m0_t", HcclCMDType::HCCL_CMD_BATCH_SEND_RECV, DataType::FP8E8M0},
     228              : };
     229              : using AivExtraKernelArgs = struct AivExtraKernelArgsDef {
     230              :     const void* buffersIn; // 注册的CCLIN地址,所有卡可访问
     231              :     u64 input;
     232              :     u64 output;
     233              :     u32 rank;
     234              :     u32 sendRecvRemoteRank;
     235              :     u32 rankSize;
     236              :     u64 xRankSize;
     237              :     u64 yRankSize;
     238              :     u64 zRankSize;
     239              :     u64 len;
     240              :     u32 dataType;
     241              :     u32 reduceOp;
     242              :     u32 root;
     243              :     u32 tag; // 第几次调用,定时重置成1
     244              :     u64 inputSliceStride;
     245              :     u64 outputSliceStride;
     246              :     u64 repeatNum;
     247              :     u64 inputRepeatStride;
     248              :     u64 outputRepeatStride;
     249              :     bool isOpBase;
     250              :     const void* headCountMem;
     251              :     const void* tailCountMem;
     252              :     const void* addOneMem;
     253              :     u32 counterMemSize;
     254              :     bool isEnableCounter;
     255              :     ExtraArgsA2A extraArgs;
     256              : 
     257            1 :     AivExtraKernelArgsDef(
     258              :         const void* buffIn, u64 input, u64 output, u32 rank, u32 sendRecvRemoteRank, u32 rankSize, u64 xRankSize,
     259              :         u64 yRankSize, u64 zRankSize, u64 len, u32 dataType, u32 reduceOp, u32 root, u32 tag, u64 inputSliceStride,
     260              :         u64 outputSliceStride, u64 repeatNum, u64 inputRepeatStride, u64 outputRepeatStride, bool isOpBase = true,
     261              :         const void* headCountMem = nullptr, const void* tailCountMem = nullptr, const void* addOneMem = nullptr,
     262              :         u32 counterMemSize = 0, const ExtraArgsA2A* extraArgsPtr = nullptr)
     263            1 :         : buffersIn(buffIn),
     264            1 :           input(input),
     265            1 :           output(output),
     266            1 :           rank(rank),
     267            1 :           sendRecvRemoteRank(sendRecvRemoteRank),
     268            1 :           rankSize(rankSize),
     269            1 :           xRankSize(xRankSize),
     270            1 :           yRankSize(yRankSize),
     271            1 :           zRankSize(zRankSize),
     272            1 :           len(len),
     273            1 :           dataType(dataType),
     274            1 :           reduceOp(reduceOp),
     275            1 :           root(root),
     276            1 :           tag(tag),
     277            1 :           inputSliceStride(inputSliceStride),
     278            1 :           outputSliceStride(outputSliceStride),
     279            1 :           repeatNum(repeatNum),
     280            1 :           inputRepeatStride(inputRepeatStride),
     281            1 :           outputRepeatStride(outputRepeatStride),
     282            1 :           isOpBase(isOpBase),
     283            1 :           headCountMem(headCountMem),
     284            1 :           tailCountMem(tailCountMem),
     285            1 :           addOneMem(addOneMem),
     286            1 :           counterMemSize(counterMemSize)
     287              :     {
     288            1 :         if (extraArgsPtr != nullptr) {
     289            1 :             extraArgs = *extraArgsPtr;
     290              :         }
     291            1 :     }
     292              : };
     293              : 
     294            1 : HcclResult GetAivOpBinaryPath(std::string& binaryPath)
     295              : {
     296            1 :     char* envValue = nullptr;
     297            1 :     MM_SYS_GET_ENV(MM_ENV_ASCEND_HOME_PATH, envValue);
     298              : 
     299            1 :     std::string libPath;
     300            1 :     if (envValue != nullptr) {
     301            1 :         libPath = envValue;
     302              :     } else {
     303            0 :         libPath = "/usr/local/Ascend/cann";
     304            0 :         HCCL_WARNING("[AIV][GetAivOpBinaryPath]ENV:ASCEND_HOME_PATH is not set, use default path[%s]", libPath.c_str());
     305              :     }
     306              : 
     307            1 :     binaryPath = libPath + "/lib64/hccl_aiv_op_910_95.o";
     308              : 
     309            3 :     HCCL_INFO("[AIV][GetAivOpBinaryPath]binaryPath: %s", binaryPath.c_str());
     310              : 
     311            1 :     return HCCL_SUCCESS;
     312            1 : }
     313              : 
     314          157 : s8* GetStubFunc(HcclCMDType cmdType, DataType dataType, KernelArgsType argsType = KernelArgsType::ARGS_TYPE_SERVER)
     315              : {
     316              :     return reinterpret_cast<s8*>(
     317          157 :         (((static_cast<s64>(cmdType) << SIG_MOVE_LEFT_BITS) + static_cast<s64>(dataType)) << SIG_MOVE_LEFT_BITS)
     318          157 :         + static_cast<s64>(argsType));
     319              : }
     320              : 
     321          156 : HcclResult RegisterBinaryKernel(const char* funcName, const aclrtBinHandle binHandle, const s8* stubFunc)
     322              : {
     323          156 :     if (stubFunc == nullptr) {
     324            0 :         return HCCL_E_PARA;
     325              :     }
     326              : 
     327              :     aclrtFuncHandle funcHandle;
     328          156 :     aclError aclRet = aclrtBinaryGetFunction(binHandle, funcName, &funcHandle);
     329          156 :     CHK_PRT_RET(
     330              :         aclRet != ACL_SUCCESS,
     331              :         HCCL_ERROR("[RegisterBinaryKernel]errNo[0x%016llx] get function from binary error.", aclRet), HCCL_E_NOT_FOUND);
     332              : 
     333          156 :     g_aivFuncMap[stubFunc] = funcHandle;
     334          156 :     g_aivNameMap[stubFunc] = funcName;
     335              : 
     336          156 :     return HCCL_SUCCESS;
     337              : }
     338              : 
     339           42 : HcclResult RegisterKernel()
     340              : {
     341           42 :     lock_guard<mutex> guard(g_mut);
     342           42 :     if (g_init) {
     343           41 :         return HCCL_SUCCESS;
     344              :     }
     345              : 
     346              :     HcclResult ret;
     347            1 :     string binFilePath;
     348            1 :     ret = GetAivOpBinaryPath(binFilePath);
     349            3 :     HCCL_INFO("[RegisterKernel] binFilePath: %s", binFilePath.c_str());
     350            1 :     CHK_PRT_RET(ret != HCCL_SUCCESS, HCCL_ERROR("[AIV][RegisterKernel] get aiv op binary path failed"), HCCL_E_RUNTIME);
     351              : 
     352            1 :     LoadBinaryFromFile(binFilePath.c_str(), ACL_RT_BINARY_LOAD_OPT_LAZY_LOAD, 1, g_binHandle);
     353          157 :     for (auto& aivKernelInfo : g_aivKernelInfoList) {
     354          312 :         ret = RegisterBinaryKernel(
     355              :             aivKernelInfo.kernelName, g_binHandle,
     356          156 :             GetStubFunc(aivKernelInfo.cmdType, aivKernelInfo.dataType, aivKernelInfo.argsType));
     357              : 
     358          156 :         CHK_PRT_RET(
     359              :             ret != HCCL_SUCCESS,
     360              :             HCCL_ERROR(
     361              :                 "[AIV][RegisterKernel] register binary kernel for kernelName[%s] "
     362              :                 "cmdType[%d] dataType[%d] argsType[%d] failed",
     363              :                 aivKernelInfo.kernelName, aivKernelInfo.cmdType, aivKernelInfo.dataType, aivKernelInfo.argsType),
     364              :             HCCL_E_RUNTIME);
     365              :     }
     366              : 
     367            1 :     g_init = true;
     368              : 
     369            1 :     return HCCL_SUCCESS;
     370           42 : }
     371              : 
     372            0 : HcclResult UnRegisterAivKernel()
     373              : {
     374            0 :     lock_guard<mutex> guard(g_mut);
     375            0 :     if (g_init) {
     376            0 :         aclError aclRet = aclrtBinaryUnLoad(g_binHandle);
     377            0 :         CHK_PRT_RET(
     378              :             aclRet != ACL_SUCCESS, HCCL_ERROR("[UnRegisterAivKernel] aclrtBinaryUnLoad failed, ret[%d]", aclRet),
     379              :             HCCL_E_RUNTIME);
     380            0 :         g_aivFuncMap.clear();
     381            0 :         g_init = false;
     382              :     }
     383            0 :     return HCCL_SUCCESS;
     384            0 : }
     385              : 
     386            1 : HcclResult GetMinAndMaxNpuSchedTimeOut(u64& minNpuSchedTimeout, u64& maxNpuSchedTimeout)
     387              : {
     388            1 :     uint64_t interval = 0;
     389            1 :     aclError aclRet = aclrtGetOpTimeOutInterval(&interval);
     390            1 :     CHK_PRT_RET(
     391              :         aclRet != ACL_SUCCESS, HCCL_ERROR("aclrtGetOpTimeOutInterval get timeout interval failed, ret[%d]", aclRet),
     392              :         HCCL_E_RUNTIME);
     393              : 
     394              :     // NPU超时范围(1, 254) * interval
     395            1 :     minNpuSchedTimeout = MIN_NPU_TIMEOUT * interval;
     396            1 :     maxNpuSchedTimeout = MAX_NPU_TIMEOUT * interval;
     397            3 :     HCCL_INFO(
     398              :         "GetMinAndMaxNpuSchedTimeOut minNpuSchedTimeout[%u]us, maxNpuSchedTimeout[%u]us.", minNpuSchedTimeout,
     399              :         maxNpuSchedTimeout);
     400            1 :     return HCCL_SUCCESS;
     401              : }
     402              : 
     403            1 : u32 GetAivTimeout()
     404              : {
     405            1 :     constexpr u32 TIME_S_TO_US = 1000000;
     406            1 :     constexpr u32 AIV_TIMEOUT_DEFAULT_US = 1091 * TIME_S_TO_US;
     407            1 :     constexpr u32 AIV_TIMEOUT_MAX_US = 1091 * TIME_S_TO_US;
     408            1 :     u32 timeout = AIV_TIMEOUT_DEFAULT_US;
     409            1 :     double execTimeOut = EnvConfig::GetInstance().GetRtsConfig().GetAivExecTimeOut();
     410              : 
     411            1 :     double timeoutUs = execTimeOut * TIME_S_TO_US;
     412            1 :     if (timeoutUs > static_cast<double>(std::numeric_limits<u32>::max())) {
     413            0 :         HCCL_INFO("[GetAivTimeout]Get input timeout[%.2f us] is out of valid range.", timeoutUs);
     414            0 :         return AIV_TIMEOUT_MAX_US;
     415              :     }
     416            1 :     u32 timeoutUsInt = static_cast<u32>(timeoutUs);
     417            1 :     if (timeoutUsInt == 0) {
     418            0 :         timeoutUsInt = AIV_TIMEOUT_MAX_US;
     419              :     }
     420            1 :     u64 minNpuSchedTimeout = 0;
     421            1 :     u64 maxNpuSchedTimeout = 0;
     422            1 :     CHK_RET(GetMinAndMaxNpuSchedTimeOut(minNpuSchedTimeout, maxNpuSchedTimeout));
     423            1 :     timeout = (timeoutUsInt < minNpuSchedTimeout) ? minNpuSchedTimeout :
     424            1 :               (timeoutUsInt > maxNpuSchedTimeout) ? maxNpuSchedTimeout :
     425              :                                                     timeoutUsInt;
     426            3 :     HCCL_INFO(
     427              :         "[GetAivTimeout]timeout[%u]us, execTimeOut[%.2f]s, minNpuSchedTimeout[%u]us, maxNpuSchedTimeout[%u]us.",
     428              :         timeout, execTimeOut, minNpuSchedTimeout, maxNpuSchedTimeout);
     429              : 
     430            1 :     return timeout;
     431              : }
     432              : 
     433            1 : HcclResult GetKernelFunc(aclrtFuncHandle& funcHandle, const s8* stubFunc)
     434              : {
     435            1 :     if (stubFunc == nullptr || g_aivFuncMap.find(stubFunc) == g_aivFuncMap.end()) {
     436            3 :         HCCL_ERROR("[GetKernelFunc] stubFunc not found in g_aivFuncMap");
     437            1 :         return HCCL_E_PARA;
     438              :     }
     439            0 :     funcHandle = g_aivFuncMap[stubFunc];
     440            0 :     return HCCL_SUCCESS;
     441              : }
     442              : 
     443              : // KernelLaunch内部接口
     444            1 : HcclResult ExecuteKernelLaunchInner(const AivOpArgs& opArgs, void* args, u32 argsSize)
     445              : {
     446            1 :     constexpr u32 AIV_ATTRNUM_THREE = 3;
     447            3 :     HCCL_INFO(
     448              :         "[AIV][ExecuteKernelLaunch] sendbuff [%llu] recvbuff [%llu] rank [%u] sendRecvRemoteRank [%u] rankSize [%u] "
     449              :         "count [%llu] "
     450              :         "dataType [%d] reduceOp [%d] root [%u] tag [%u] isOpBase [%d] "
     451              :         "extraArgsPtr [%p] argsSize [%u] numBlocks [%u]",
     452              :         opArgs.input, opArgs.output, opArgs.rank, opArgs.sendRecvRemoteRank, opArgs.rankSize, opArgs.count,
     453              :         opArgs.dataType, opArgs.op, opArgs.root, opArgs.aivTag, opArgs.isOpBase, args, argsSize, opArgs.numBlocks);
     454              : 
     455              :     aclrtLaunchKernelCfg cfg;
     456              :     aclrtLaunchKernelAttr attr[AIV_ATTRNUM_THREE];
     457              : 
     458            1 :     u32 timeoutUs = GetAivTimeout();
     459            1 :     attr[0].id = ACL_RT_LAUNCH_KERNEL_ATTR_SCHEM_MODE;
     460            1 :     attr[0].value.schemMode = 1;
     461            1 :     attr[1].id = ACL_RT_LAUNCH_KERNEL_ATTR_TIMEOUT_US;
     462            1 :     attr[1].value.timeoutUs.timeoutLow = timeoutUs;
     463            1 :     attr[1].value.timeoutUs.timeoutHigh = 0;
     464            1 :     attr[2].id = ACL_RT_LAUNCH_KERNEL_ATTR_ENGINE_TYPE;
     465            1 :     attr[2].value.engineType = ACL_RT_ENGINE_TYPE_AIV;
     466            1 :     cfg.numAttrs = AIV_ATTRNUM_THREE;
     467            1 :     cfg.attrs = attr;
     468              : 
     469            3 :     HCCL_INFO(
     470              :         "[AIV][ExecuteKernelLaunch] KernelAttr attr[0]: id=[%u], schemMode=[%u]; attr[1]: id=[%u], "
     471              :         "timeoutLow=[%u us], timeoutHigh=[%u us]; attr[2]: id=[%u], engineType=[%u]; cfg: numAttrs=[%u]",
     472              :         attr[0].id, attr[0].value.schemMode, attr[1].id, attr[1].value.timeoutUs.timeoutLow,
     473              :         attr[1].value.timeoutUs.timeoutHigh, attr[2].id, attr[2].value.engineType, cfg.numAttrs);
     474              : 
     475              :     aclrtFuncHandle funcHandle;
     476            1 :     const s8* stubFunc = GetStubFunc(opArgs.cmdType, opArgs.dataType, opArgs.argsType);
     477            1 :     HcclResult ret = GetKernelFunc(funcHandle, stubFunc);
     478            4 :     CHK_PRT_RET(
     479              :         ret != HCCL_SUCCESS,
     480              :         HCCL_ERROR(
     481              :             "[ExecuteKernelLaunchInner] errNo[0x%016llx] GetKernelFunc failed, "
     482              :             "return[%d]",
     483              :             HCCL_ERROR_CODE(HCCL_E_RUNTIME), ret),
     484              :         HCCL_E_RUNTIME);
     485              : 
     486              :     aclError aclRet
     487            0 :         = aclrtLaunchKernelWithHostArgs(funcHandle, opArgs.numBlocks, opArgs.stream, &cfg, args, argsSize, nullptr, 0);
     488            0 :     if (aclRet == ACL_ERROR_RT_INVALID_HANDLE) {
     489            0 :         aclError aclGetRet = aclrtBinaryGetFunction(g_binHandle, g_aivNameMap[stubFunc].c_str(), &funcHandle);
     490            0 :         CHK_PRT_RET(
     491              :             aclGetRet != ACL_SUCCESS,
     492              :             HCCL_ERROR("[RegisterBinaryKernel]errNo[0x%016llx] get function from binary error.", aclRet),
     493              :             HCCL_E_NOT_FOUND);
     494            0 :         aclRet = aclrtLaunchKernelWithHostArgs(
     495            0 :             funcHandle, opArgs.numBlocks, opArgs.stream, &cfg, args, argsSize, nullptr, 0);
     496              :     }
     497            0 :     CHK_PRT_RET(
     498              :         aclRet != ACL_SUCCESS,
     499              :         HCCL_ERROR(
     500              :             "[ExecuteKernelLaunchInner]errNo[0x%016llx] aclrtLaunchKernelWithHostArgs error[%d].",
     501              :             HCCL_ERROR_CODE(HCCL_E_RUNTIME), aclRet),
     502              :         HCCL_E_RUNTIME);
     503            0 :     return HCCL_SUCCESS;
     504              : }
     505              : 
     506              : // Kernel单次调用Launch外部接口
     507            1 : HcclResult ExecuteKernelLaunch(const AivOpArgs& opArgs)
     508              : {
     509              :     AivExtraKernelArgs aivExtraKernelArgs{
     510            1 :         opArgs.buffersIn,
     511            1 :         opArgs.input,
     512            1 :         opArgs.output,
     513            1 :         opArgs.rank,
     514            1 :         opArgs.sendRecvRemoteRank,
     515            1 :         opArgs.rankSize,
     516            1 :         opArgs.xRankSize,
     517            1 :         opArgs.yRankSize,
     518            1 :         opArgs.zRankSize,
     519            1 :         opArgs.count,
     520              :         opArgs.dataType,
     521              :         opArgs.op,
     522            1 :         opArgs.root,
     523            1 :         opArgs.aivTag,
     524            1 :         opArgs.inputSliceStride,
     525            1 :         opArgs.outputSliceStride,
     526            1 :         opArgs.repeatNum,
     527            1 :         opArgs.inputRepeatStride,
     528            1 :         opArgs.outputRepeatStride,
     529            1 :         opArgs.isOpBase,
     530            1 :         reinterpret_cast<void*>(opArgs.counter.headCountMem),
     531            1 :         reinterpret_cast<void*>(opArgs.counter.tailCountMem),
     532            1 :         reinterpret_cast<void*>(opArgs.counter.addOneMem),
     533            1 :         opArgs.counter.memSize,
     534              :         &opArgs.extraArgs // 这里是真正发送的地方,device侧单个kernel不能超过32K,先写死1024个结构体
     535            1 :     };
     536            4 :     CHK_RET(ExecuteKernelLaunchInner(opArgs, &aivExtraKernelArgs, sizeof(aivExtraKernelArgs)));
     537              : 
     538            0 :     return HCCL_SUCCESS;
     539              : }
     540              : 
     541              : } // namespace Hccl
        

Generated by: LCOV version 2.0-1