LCOV - code coverage report
Current view: top level - acl/aclrt_impl - context.cpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 144 144 100.0 %
Date: 2026-08-27 13:24:42 Functions: 15 15 100.0 %

          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 "acl_rt_impl.h"
      12             : #include "acl_rt_impl_base.h"
      13             : 
      14             : #include "runtime/context.h"
      15             : #include "runtime/rts/rts_context.h"
      16             : #include "runtime/dev.h"
      17             : #include "runtime/config.h"
      18             : 
      19             : #include "common/log_inner.h"
      20             : #include "common/error_codes_inner.h"
      21             : #include "common/prof_reporter.h"
      22             : #include "common/resource_statistics.h"
      23             : 
      24           7 : aclError aclrtCreateContextImpl(aclrtContext *context, int32_t deviceId)
      25             : {
      26          14 :     ACL_PROFILING_REG(acl::AclProfType::AclrtCreateContext);
      27           7 :     ACL_ADD_APPLY_TOTAL_COUNT(acl::ACL_STATISTICS_CREATE_DESTROY_CONTEXT);
      28           7 :     ACL_LOG_INFO("start to execute aclrtCreateContext, device is %d.", deviceId);
      29           7 :     ACL_REQUIRES_NOT_NULL_WITH_INPUT_REPORT(context);
      30             : 
      31           5 :     rtContext_t rtCtx = nullptr;
      32           5 :     const rtError_t rtErr = rtCtxCreateEx(&rtCtx, static_cast<uint32_t>(RT_CTX_NORMAL_MODE), deviceId);
      33           5 :     if (rtErr != RT_ERROR_NONE) {
      34           2 :         ACL_LOG_CALL_ERROR("create context failed, device is %d, runtime errorCode is %d",
      35             :             deviceId, static_cast<int32_t>(rtErr));
      36           2 :         return ACL_GET_ERRCODE_RTS(rtErr);
      37             :     }
      38           3 :     ACL_LOG_INFO("successfully execute aclrtCreateContext, device is %d.", deviceId);
      39           3 :     *context = static_cast<aclrtContext>(rtCtx);
      40           3 :     ACL_ADD_APPLY_SUCCESS_COUNT(acl::ACL_STATISTICS_CREATE_DESTROY_CONTEXT);
      41             : 
      42             :     // update platform info
      43           3 :     const auto err = acl::UpdatePlatformInfoWithDevice(deviceId);
      44           3 :     if (err != ACL_SUCCESS) {
      45           1 :         ACL_LOG_WARN("update platform info with device failed, error code is [%d], deviceId is [%d]", err, deviceId);
      46             :     }
      47           3 :     return ACL_SUCCESS;
      48             : }
      49             : 
      50           6 : aclError aclrtDestroyContextImpl(aclrtContext context)
      51             : {
      52          12 :     ACL_PROFILING_REG(acl::AclProfType::AclrtDestroyContext);
      53           6 :     ACL_ADD_RELEASE_TOTAL_COUNT(acl::ACL_STATISTICS_CREATE_DESTROY_CONTEXT);
      54           6 :     ACL_LOG_INFO("start to execute aclrtDestroyContext.");
      55           6 :     ACL_REQUIRES_NOT_NULL_WITH_INPUT_REPORT(context);
      56             : 
      57           4 :     const rtError_t rtErr = rtCtxDestroyEx(static_cast<rtContext_t>(context));
      58           4 :     if (rtErr != RT_ERROR_NONE) {
      59           2 :         ACL_LOG_CALL_ERROR("destory context failed, runtime errorCode is %d", static_cast<int32_t>(rtErr));
      60           2 :         return ACL_GET_ERRCODE_RTS(rtErr);
      61             :     }
      62           2 :     ACL_LOG_INFO("successfully execute aclrtDestroyContext");
      63           2 :     ACL_ADD_RELEASE_SUCCESS_COUNT(acl::ACL_STATISTICS_CREATE_DESTROY_CONTEXT);
      64           2 :     return ACL_SUCCESS;
      65             : }
      66             : 
      67           6 : aclError aclrtSetCurrentContextImpl(aclrtContext context)
      68             : {
      69          12 :     ACL_PROFILING_REG(acl::AclProfType::AclrtSetCurrentContext);
      70           6 :     ACL_LOG_INFO("start to execute aclrtSetCurrentContext.");
      71           6 :     ACL_REQUIRES_NOT_NULL_WITH_INPUT_REPORT(context);
      72             : 
      73           4 :     const rtError_t rtErr = rtCtxSetCurrent(static_cast<rtContext_t>(context));
      74           4 :     if (rtErr != RT_ERROR_NONE) {
      75           2 :         ACL_LOG_CALL_ERROR("set current context failed, runtime errorCode is %d", static_cast<int32_t>(rtErr));
      76           2 :         return ACL_GET_ERRCODE_RTS(rtErr);
      77             :     }
      78           2 :     ACL_LOG_INFO("successfully execute aclrtSetCurrentContext");
      79           2 :     return ACL_SUCCESS;
      80             : }
      81             : 
      82           6 : aclError aclrtGetCurrentContextImpl(aclrtContext *context)
      83             : {
      84          12 :     ACL_PROFILING_REG(acl::AclProfType::AclrtGetCurrentContext);
      85           6 :     ACL_REQUIRES_NOT_NULL_WITH_INPUT_REPORT(context);
      86             : 
      87           4 :     rtContext_t rtCtx = nullptr;
      88           4 :     const rtError_t rtErr = rtCtxGetCurrent(&rtCtx);
      89           4 :     if (rtErr != RT_ERROR_NONE) {
      90           2 :         ACL_LOG_INFO("can not get current context, runtime errorCode is %d", static_cast<int32_t>(rtErr));
      91           2 :         return ACL_GET_ERRCODE_RTS(rtErr);
      92             :     }
      93             : 
      94           2 :     *context = rtCtx;
      95           2 :     return ACL_SUCCESS;
      96             : }
      97             : 
      98          13 : static aclError GetSysParamOpt(aclSysParamOpt opt, int64_t *value, bool isCtx)
      99             : {
     100          13 :     ACL_REQUIRES_NOT_NULL_WITH_INPUT_REPORT(value);
     101          11 :     if (opt != ACL_OPT_DETERMINISTIC && opt != ACL_OPT_ENABLE_DEBUG_KERNEL && opt != ACL_OPT_STRONG_CONSISTENCY && opt != ACL_OPT_EARLY_START) {
     102           2 :         ACL_LOG_INNER_ERROR("[Check][SysParamOpt]opt = %d is invalid, it should be %d or %d or %d or %d",
     103             :                             static_cast<int32_t>(opt), static_cast<int32_t>(ACL_OPT_DETERMINISTIC),
     104             :                             static_cast<int32_t>(ACL_OPT_ENABLE_DEBUG_KERNEL),
     105             :                             static_cast<int32_t>(ACL_OPT_STRONG_CONSISTENCY),
     106             :                             static_cast<int32_t>(ACL_OPT_EARLY_START));
     107           6 :         acl::AclErrorLogManager::ReportInputError(acl::INVALID_PARAM_MSG,
     108           4 :             std::vector<const char *>({"param", "value", "reason"}),
     109           4 :             std::vector<const char *>({"aclSysParamOpt", std::to_string(opt).c_str(), "must be 0 or 1 or 2 or 3"}));
     110           2 :         return ACL_ERROR_INVALID_PARAM;
     111             :     }
     112           9 :     rtError_t rtErr = RT_ERROR_NONE;
     113           9 :     if (isCtx) {
     114           6 :         rtErr = rtCtxGetSysParamOpt(static_cast<rtSysParamOpt>(opt), value);
     115             :     }
     116             :     else {
     117           3 :         rtErr = rtGetSysParamOpt(static_cast<rtSysParamOpt>(opt), value);
     118             :     }
     119           9 :     if (rtErr == ACL_ERROR_RT_SYSPARAMOPT_NOT_SET) {
     120           3 :         ACL_LOG_WARN("option %d is not set, runtime errorCode is %d",
     121             :             static_cast<int32_t>(opt),  static_cast<int32_t>(rtErr));
     122           3 :         return ACL_GET_ERRCODE_RTS(rtErr);
     123             :     }
     124           6 :     if (rtErr != RT_ERROR_NONE) {
     125           3 :         ACL_LOG_CALL_ERROR("get sys param failed, runtime result = %d, opt = %d.",
     126             :                            static_cast<int32_t>(rtErr), static_cast<int32_t>(opt));
     127           3 :         return ACL_GET_ERRCODE_RTS(rtErr);
     128             :     }
     129           3 :     ACL_LOG_INFO("successfully execute GetSysParamOpt, opt = %d, value = %ld",
     130             :                  static_cast<int32_t>(opt), *value);
     131           3 :     return ACL_SUCCESS;
     132             : }
     133             : 
     134           8 : static aclError SetSysParamOpt(aclSysParamOpt opt, int64_t value, bool isCtx)
     135             : {
     136           8 :     if (opt != ACL_OPT_DETERMINISTIC && opt != ACL_OPT_ENABLE_DEBUG_KERNEL && opt != ACL_OPT_STRONG_CONSISTENCY && opt != ACL_OPT_EARLY_START) {
     137           2 :         ACL_LOG_INNER_ERROR("[Check][SysParamOpt]opt = %d is invalid, it should be %d or %d or %d or %d",
     138             :                             static_cast<int32_t>(opt), static_cast<int32_t>(ACL_OPT_DETERMINISTIC),
     139             :                             static_cast<int32_t>(ACL_OPT_ENABLE_DEBUG_KERNEL),
     140             :                             static_cast<int32_t>(ACL_OPT_STRONG_CONSISTENCY),
     141             :                             static_cast<int32_t>(ACL_OPT_EARLY_START));
     142           6 :         acl::AclErrorLogManager::ReportInputError(acl::INVALID_PARAM_MSG,
     143           4 :             std::vector<const char *>({"param", "value", "reason"}),
     144           4 :             std::vector<const char *>({"aclSysParamOpt", std::to_string(opt).c_str(), "should be 0 or 1 or 2 or 3"}));
     145           2 :         return ACL_ERROR_INVALID_PARAM;
     146             :     }
     147           6 :     rtError_t rtErr = RT_ERROR_NONE;
     148           6 :     if (isCtx) {
     149           4 :         rtErr = rtCtxSetSysParamOpt(static_cast<rtSysParamOpt>(opt), value);
     150             :     } else {
     151           2 :         rtErr = rtSetSysParamOpt(static_cast<rtSysParamOpt>(opt), value);
     152             :     }
     153           6 :     if (rtErr != RT_ERROR_NONE) {
     154           3 :         ACL_LOG_CALL_ERROR("set sys param failed, runtime result = %d, opt = %d.",
     155             :                            static_cast<int32_t>(rtErr), static_cast<int32_t>(opt));
     156           3 :         return ACL_GET_ERRCODE_RTS(rtErr);
     157             :     }
     158           3 :     ACL_LOG_INFO("successfully execute aclrtCtxSetSysParamOpt");
     159           3 :     return ACL_SUCCESS;
     160             : }
     161             : 
     162             : 
     163           8 : aclError aclrtCtxGetSysParamOptImpl(aclSysParamOpt opt, int64_t *value)
     164             : {
     165          16 :     ACL_PROFILING_REG(acl::AclProfType::AclrtCtxGetSysParamOpt);
     166          16 :     return GetSysParamOpt(opt, value, true);
     167             : }
     168             : 
     169           5 : aclError aclrtCtxSetSysParamOptImpl(aclSysParamOpt opt, int64_t value)
     170             : {
     171          10 :     ACL_PROFILING_REG(acl::AclProfType::AclrtCtxSetSysParamOpt);
     172           5 :     ACL_LOG_INFO("start to execute aclrtCtxSetSysParamOpt, opt = %d, value = %ld.",
     173             :                  static_cast<int32_t>(opt), value);
     174          10 :     return SetSysParamOpt(opt, value, true);
     175             : }
     176             : 
     177           5 : aclError aclrtGetSysParamOptImpl(aclSysParamOpt opt, int64_t *value)
     178             : {
     179           5 :     return GetSysParamOpt(opt, value, false);
     180             : }
     181             : 
     182           3 : aclError aclrtSetSysParamOptImpl(aclSysParamOpt opt, int64_t value)
     183             : {
     184           3 :     ACL_LOG_INFO("start to execute aclrtSetSysParamOpt, opt = %d, value = %ld.",
     185             :                  static_cast<int32_t>(opt), value);
     186           3 :     return SetSysParamOpt(opt, value, false);
     187             : }
     188             : 
     189           2 : aclError aclrtPeekAtLastErrorImpl(aclrtLastErrLevel level)
     190             : {
     191           2 :     ACL_LOG_INFO("start to execute aclrtPeekAtLastError, level is %d", static_cast<int32_t>(level));
     192           2 :     if (level != ACL_RT_THREAD_LEVEL) {
     193           1 :         ACL_LOG_ERROR("invalid input param level %d, only support ACL_RT_THREAD_LEVEL", static_cast<int32_t>(level));
     194           1 :         return ACL_ERROR_INVALID_PARAM;
     195             :     }
     196           1 :     const rtLastErrLevel_t rtLevel = static_cast<rtLastErrLevel_t>(level);
     197           1 :     return rtPeekAtLastError(rtLevel);
     198             : }
     199             : 
     200           2 : aclError aclrtGetLastErrorImpl(aclrtLastErrLevel level)
     201             : {
     202           2 :     ACL_LOG_INFO("start to execute aclrtGetLastError, level is %d", static_cast<int32_t>(level));
     203           2 :     if (level != ACL_RT_THREAD_LEVEL) {
     204           1 :         ACL_LOG_ERROR("invalid input param level %d, only support ACL_RT_THREAD_LEVEL", static_cast<int32_t>(level));
     205           1 :         return ACL_ERROR_INVALID_PARAM;
     206             :     }
     207           1 :     const rtLastErrLevel_t rtLevel = static_cast<rtLastErrLevel_t>(level);
     208           1 :     return rtGetLastError(rtLevel);
     209             : }
     210             : 
     211           3 : aclError aclrtCtxGetCurrentDefaultStreamImpl(aclrtStream *stream)
     212             : {
     213           6 :     ACL_PROFILING_REG(acl::AclProfType::AclrtCtxGetCurrentDefaultStream);
     214           3 :     ACL_LOG_INFO("start to execute aclrtCtxGetCurrentDefaultStream");
     215           3 :     ACL_REQUIRES_NOT_NULL_WITH_INPUT_REPORT(stream);
     216             : 
     217           2 :     const rtError_t rtErr = rtsCtxGetCurrentDefaultStream(stream);
     218           2 :     if (rtErr != RT_ERROR_NONE) {
     219           1 :         ACL_LOG_ERROR("call rtsCtxGetCurrentDefaultStream failed, runtime errorCode is %d",
     220             :             static_cast<int32_t>(rtErr));
     221           1 :         return ACL_GET_ERRCODE_RTS(rtErr);
     222             :     }
     223             : 
     224           1 :     ACL_LOG_INFO("successfully execute aclrtCtxGetCurrentDefaultStream");
     225           1 :     return ACL_SUCCESS;
     226             : }
     227             : 
     228           2 : aclError aclrtCtxGetFloatOverflowAddrImpl(void **overflowAddr)
     229             : {
     230           4 :     ACL_PROFILING_REG(acl::AclProfType::AclrtCtxGetFloatOverflowAddr);
     231             : 
     232           2 :     const rtError_t rtErr = rtsCtxGetFloatOverflowAddr(overflowAddr);
     233           2 :     if (rtErr != RT_ERROR_NONE) {
     234           1 :         ACL_LOG_ERROR("call rtsCtxGetFloatOverflowAddr failed, runtime errorCode is %d",
     235             :             static_cast<int32_t>(rtErr));
     236           1 :         return ACL_GET_ERRCODE_RTS(rtErr);
     237             :     }
     238             : 
     239           1 :     return ACL_SUCCESS;
     240             : }
     241             : 
     242           4 : aclError aclrtGetPrimaryCtxStateImpl(int32_t deviceId, uint32_t *flags, int32_t *active)
     243             : {
     244           4 :     ACL_LOG_INFO("start to execute aclrtGetPrimaryCtxState");
     245           4 :     ACL_REQUIRES_NOT_NULL_WITH_INPUT_REPORT(active);
     246           3 :     if (flags != nullptr) {
     247           1 :         ACL_LOG_ERROR("[Check][flags]paramete flags is reserved, it must be null.");
     248           1 :             const char_t *argList[] = {"param"};
     249           1 :             const char_t *argVal[] = {"flags"};
     250           1 :         acl::AclErrorLogManager::ReportInputErrorWithChar(acl::INVALID_PARAM_MSG,
     251             :             argList, argVal, 1U);
     252           1 :         return ACL_ERROR_INVALID_PARAM;
     253             :     }
     254           2 :     uint32_t tmp = 0;
     255           2 :     const rtError_t rtErr = rtsGetPrimaryCtxState(deviceId, &tmp, active);
     256           2 :     if (rtErr != RT_ERROR_NONE) {
     257           1 :         ACL_LOG_WARN("call aclrtGetPrimaryCtxState failed, runtime errorCode is %d, device id is %d",
     258             :             static_cast<int32_t>(rtErr), deviceId);
     259           1 :         return ACL_GET_ERRCODE_RTS(rtErr);
     260             :     }
     261           1 :     ACL_LOG_INFO("successfully execute aclrtGetPrimaryCtxState");
     262           1 :     return ACL_SUCCESS;
     263             : }

Generated by: LCOV version 1.14