* Copyright (c) 2025 Huawei Technologies Co., Ltd.
* This program is free software, you can redistribute it and/or modify it under the terms and conditions of
* CANN Open Software License Agreement Version 2.0 (the "License").
* Please refer to the License for details. You may not use this file except in compliance with the License.
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
* See LICENSE in the root of the software repository for the full text of the License.
*/
#include "api_c.h"
#include "api.hpp"
#include "api_event.hpp"
#include "api_handle_guard.h"
#include "ipc_event.hpp"
#include "base.hpp"
#include "device_enum_desc.hpp"
#include "enum_desc.hpp"
#include "stream_enum_desc.hpp"
#include "prof_ctrl_callback_manager.hpp"
#include "error_message_manage.hpp"
#include "errcode_manage.hpp"
#include "error_code.h"
#include "dvpp_grp.hpp"
#include "inner.hpp"
#include "osal.hpp"
#include "notify.hpp"
#include "prof_map_ge_model_device.hpp"
#include "runtime.hpp"
#include "thread_local_container.hpp"
#include "prof_acl_api.h"
#include "soc_info.h"
#include "task_abort.hpp"
#include "global_state_manager.hpp"
#include "platform_manager_v2.h"
#include "kernel_dfx_info.hpp"
#include "api_handle_guard.h"
#include "runtime/kernel.h"
#include "runtime/inner_kernel.h"
#include "runtime/rt_inner_task.h"
using namespace cce::runtime;
namespace cce {
namespace runtime {
TIMESTAMP_EXTERN(rtFftsPlusTaskLaunch);
TIMESTAMP_EXTERN(rtFftsPlusTaskLaunchWithFlag);
TIMESTAMP_EXTERN(CmoAddrTaskLaunch);
TIMESTAMP_EXTERN(CmoTaskLaunch);
TIMESTAMP_EXTERN(rtNpuGetFloatStatus);
TIMESTAMP_EXTERN(rtNpuClearFloatStatus);
TIMESTAMP_EXTERN(rtMemsetD32);
TIMESTAMP_EXTERN(rtMemsetD32Async);
TIMESTAMP_EXTERN(rtMallocCached);
}
}
#ifdef __cplusplus
extern "C" {
#endif
static rtError_t ConvertFuncToKernel(
Api* const apiInstance, void* func, Kernel*& kernel, const char_t* const callerFuncName)
{
Kernel* symbolKernel = nullptr;
const rtError_t ret = apiInstance->GetFunctionBySymbol(func, &symbolKernel);
if (ret == RT_ERROR_NONE) {
RT_LOG(RT_LOG_INFO, "find function handle by symbol");
kernel = symbolKernel;
return RT_ERROR_NONE;
} else if (ret == RT_ERROR_INVALID_DEVICE_FUNCTION) {
RT_LOG(RT_LOG_INFO, "cannot find function handle by symbol, treat func as handle directly");
return ValidateKernelHandleForApi(func, kernel, callerFuncName);
} else {
return GetRtExtErrCodeAndSetGlobalErr(ret);
}
}
VISIBILITY_DEFAULT
rtError_t rtWriteValue(rtWriteValueInfo_t* const info, rtStream_t const stm)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, exeStream);
const rtError_t error = apiInstance->WriteValue(info, exeStream);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return error;
}
VISIBILITY_DEFAULT
rtError_t rtWriteValuePtr(void* const writeValueInfo, rtStream_t const stm, void* const pointedAddr)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, exeStream);
const rtError_t error = apiInstance->WriteValuePtr(writeValueInfo, exeStream, pointedAddr);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtStreamTaskAbort(rtStream_t stm)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, exeStream);
const rtError_t error = apiInstance->StreamTaskAbort(exeStream);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtStreamRecover(rtStream_t stm)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, exeStream);
const rtError_t error = apiInstance->StreamRecover(exeStream);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtStreamTaskClean(rtStream_t stm)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, exeStream);
const rtError_t error = apiInstance->StreamTaskClean(exeStream);
COND_RETURN_WITH_NOLOG(error == RT_ERROR_FEATURE_NOT_SUPPORT, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtDeviceResourceClean(const int32_t devId)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const rtError_t error = apiInstance->DeviceResourceClean(devId);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtGetBinaryDeviceBaseAddr(void* handle, void** deviceBase)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT_WITH_VALIDATOR(handle, Program, realProgram, ValidateProgramHandleForApi);
const rtError_t ret = apiInstance->GetBinaryDeviceBaseAddr(realProgram, deviceBase);
ERROR_RETURN_WITH_EXT_ERRCODE(ret);
return ACL_RT_SUCCESS;
}
rtError_t rtFftsPlusTaskLaunch(rtFftsPlusTaskInfo_t* fftsPlusTaskInfo, rtStream_t stm)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
if (!IS_SUPPORT_CHIP_FEATURE(rtInstance->GetChipType(), RtOptionalFeatureType::RT_FEATURE_TASK_FFTS_PLUS)) {
RT_LOG_OUTER_MSG_WITH_FUNC(ErrorCode::EE1005);
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
TIMESTAMP_BEGIN(rtFftsPlusTaskLaunch);
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, streamPtr);
const rtError_t error = apiInstance->FftsPlusTaskLaunch(fftsPlusTaskInfo, streamPtr, 0U);
TIMESTAMP_END(rtFftsPlusTaskLaunch);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtFftsPlusTaskLaunchWithFlag(rtFftsPlusTaskInfo_t* fftsPlusTaskInfo, rtStream_t stm, uint32_t flag)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
if (!IS_SUPPORT_CHIP_FEATURE(rtInstance->GetChipType(), RtOptionalFeatureType::RT_FEATURE_TASK_FFTS_PLUS)) {
RT_LOG_OUTER_MSG_WITH_FUNC(ErrorCode::EE1005);
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
TIMESTAMP_BEGIN(rtFftsPlusTaskLaunchWithFlag);
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, streamPtr);
const rtError_t ret = apiInstance->FftsPlusTaskLaunch(fftsPlusTaskInfo, streamPtr, flag);
TIMESTAMP_END(rtFftsPlusTaskLaunchWithFlag);
ERROR_RETURN_WITH_EXT_ERRCODE(ret);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtRDMASend(uint32_t sqIndex, uint32_t wqeIndex, rtStream_t stm)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, exeStream);
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
const rtChipType_t chipType = rtInstance->GetChipType();
if (!IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_TASK_RDMA)) {
RT_LOG_OUTER_MSG_WITH_FUNC(ErrorCode::EE1005);
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
const rtError_t error = apiInstance->RDMASend(sqIndex, wqeIndex, exeStream);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtRDMADBSend(uint32_t dbIndex, uint64_t dbInfo, rtStream_t stm)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, exeStream);
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const Runtime* const rt = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rt);
const rtChipType_t chipType = rt->GetChipType();
if (!IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_TASK_RDMA)) {
RT_LOG_OUTER_MSG_WITH_FUNC(ErrorCode::EE1005);
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
const rtError_t error = apiInstance->RdmaDbSend(dbIndex, dbInfo, exeStream);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtIpcSetMemoryName(const void* ptr, uint64_t byteCount, char_t* name, uint32_t len)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const rtError_t error = apiInstance->IpcSetMemoryName(ptr, byteCount, name, len, RT_IPC_MEM_FLAG_DEFAULT);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtIpcSetMemoryAttr(const char* name, uint32_t type, uint64_t attr)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const rtError_t error = apiInstance->IpcSetMemoryAttr(name, type, attr);
COND_RETURN_WITH_NOLOG(error == RT_ERROR_FEATURE_NOT_SUPPORT, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
COND_RETURN_WITH_NOLOG(error == RT_ERROR_DRV_LINK_TYPE_NOT_SUPPORTED, ACL_ERROR_RT_LINK_TYPE_NOT_SUPPORTED);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtIpcDestroyMemoryName(const char_t* name)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const rtError_t error = apiInstance->IpcDestroyMemoryName(name);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtIpcOpenMemory(void** ptr, const char_t* name)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const rtError_t error = apiInstance->IpcOpenMemory(ptr, name, RT_IPC_MEM_FLAG_DEFAULT);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtIpcCloseMemory(const void* ptr)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const rtError_t error = apiInstance->IpcCloseMemory(ptr);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtIpcSetNotifyName(rtNotify_t notify, char_t* name, uint32_t len)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(notify, Notify, notifyPtr);
const rtError_t error = apiInstance->IpcSetNotifyName(notifyPtr, name, len, RT_NOTIFY_FLAG_DEFAULT);
COND_RETURN_WITH_NOLOG(error == RT_ERROR_FEATURE_NOT_SUPPORT, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtIpcOpenNotify(rtNotify_t* notify, const char_t* name)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
const rtChipType_t chipType = rtInstance->GetChipType();
COND_RETURN_WARN(
!IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_IPC_NOTIFY),
ACL_ERROR_RT_FEATURE_NOT_SUPPORT, "chip type(%d) does not support, return.", static_cast<int32_t>(chipType));
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const rtError_t error = apiInstance->IpcOpenNotify(RtPtrToPtr<Notify**>(notify), name);
COND_RETURN_WITH_NOLOG(error == RT_ERROR_FEATURE_NOT_SUPPORT, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
Notify* realNotify = RtPtrToPtr<Notify*>(*notify);
*notify = ExportEmbeddedHandle<rtNotify_t>(realNotify);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtIpcOpenNotifyWithFlag(rtNotify_t* notify, const char_t* name, uint32_t flag)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
const rtChipType_t chipType = rtInstance->GetChipType();
COND_RETURN_WARN(
!IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_IPC_NOTIFY),
ACL_ERROR_RT_FEATURE_NOT_SUPPORT, "chip type(%d) does not support, return.", static_cast<int32_t>(chipType));
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const rtError_t error = apiInstance->IpcOpenNotify(RtPtrToPtr<Notify**>(notify), name, flag);
COND_RETURN_WITH_NOLOG(error == RT_ERROR_FEATURE_NOT_SUPPORT, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
Notify* realNotify = RtPtrToPtr<Notify*>(*notify);
*notify = ExportEmbeddedHandle<rtNotify_t>(realNotify);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtLaunchSqeUpdateTask(uint32_t streamId, uint32_t taskId, void* src, uint64_t cnt, rtStream_t stm)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
COND_RETURN_WARN(
!IS_SUPPORT_CHIP_FEATURE(rtInstance->GetChipType(), RtOptionalFeatureType::RT_FEATURE_UPDATE_SQE_TILING_KEY),
ACL_ERROR_RT_FEATURE_NOT_SUPPORT, "only support in cloud_v2.");
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, exeStream);
const rtError_t error = apiInstance->LaunchSqeUpdateTask(streamId, taskId, src, cnt, exeStream);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtRegKernelLaunchFillFunc(const char* symbol, rtKernelLaunchFillFunc callback)
{
Runtime* rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
const rtChipType_t chipType = rtInstance->GetChipType();
COND_RETURN_WARN(
(!IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_KERNEL_REGISTER_CALLBACK)),
ACL_ERROR_RT_FEATURE_NOT_SUPPORT, "chip type(%d) does not support, return.", static_cast<int32_t>(chipType));
const rtError_t error = rtInstance->RegKernelLaunchFillFunc(symbol, callback);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtUnRegKernelLaunchFillFunc(const char* symbol)
{
Runtime* rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
const rtChipType_t chipType = rtInstance->GetChipType();
COND_RETURN_WARN(
(!IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_KERNEL_REGISTER_CALLBACK)),
ACL_ERROR_RT_FEATURE_NOT_SUPPORT, "chip type(%d) does not support, return.", static_cast<int32_t>(chipType));
const rtError_t error = rtInstance->UnRegKernelLaunchFillFunc(symbol);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtsLaunchReduceAsyncTask(const rtReduceInfo_t* reduceInfo, const rtStream_t stm, const void* reserve)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
COND_RETURN_EXT_ERRCODE_AND_MSG_OUTER_WITH_PARAM((reserve != nullptr), RT_ERROR_INVALID_VALUE, reserve, "nullptr");
PARAM_NULL_RETURN_ERROR_WITH_EXT_ERRCODE(reduceInfo, RT_ERROR_INVALID_VALUE);
const auto rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
rtError_t ret = RT_ERROR_NONE;
DevProperties properties;
const auto error = GET_DEV_PROPERTIES(rtInstance->GetChipType(), properties);
COND_RETURN_ERROR_MSG_INNER(
error != RT_ERROR_NONE, error, "GetDevProperties failed, chip type=%s.",
ChipTypeToString(rtInstance->GetChipType()).c_str());
if (properties.reduceOverflow == ReduceOverflowType::REDUCE_OVERFLOW_TS_VERSION_REDUCE_V2_ID ||
properties.reduceOverflow == ReduceOverflowType::REDUCE_OVERFLOW_TS_VERSION_REDUCV2_SUPPORT_DC) {
void* overflowAddr = nullptr;
ret = apiInstance->CtxGetOverflowAddr(&overflowAddr);
ERROR_RETURN_WITH_EXT_ERRCODE(ret);
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, exeStream);
ret = apiInstance->ReduceAsyncV2(
reduceInfo->dst, reduceInfo->src, reduceInfo->count, reduceInfo->kind, reduceInfo->type, exeStream,
overflowAddr);
ERROR_RETURN_WITH_EXT_ERRCODE(ret);
return ACL_RT_SUCCESS;
}
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, exeStream);
ret = apiInstance->ReduceAsync(
reduceInfo->dst, reduceInfo->src, reduceInfo->count, reduceInfo->kind, reduceInfo->type, exeStream, nullptr);
ERROR_RETURN_WITH_EXT_ERRCODE(ret);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtsLaunchUpdateTask(rtStream_t destStm, uint32_t destTaskId, rtStream_t stm, rtTaskUpdateCfg_t* cfg)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
PARAM_NULL_RETURN_ERROR_WITH_EXT_ERRCODE(cfg, RT_ERROR_INVALID_VALUE);
rtError_t error = RT_ERROR_NONE;
const rtUpdateTaskAttrId updateType = cfg->id;
switch (updateType) {
case RT_UPDATE_DSA_TASK: {
PARAM_NULL_RETURN_ERROR_WITH_EXT_ERRCODE(destStm, RT_ERROR_INVALID_VALUE);
RT_VALIDATE_AND_UNWRAP_OBJECT(destStm, Stream, destStream);
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
if (!IS_SUPPORT_CHIP_FEATURE(
rtInstance->GetChipType(), RtOptionalFeatureType::RT_FEATURE_TASK_DSA_UPDATE)) {
RT_LOG(RT_LOG_WARNING, "only support in cloud_v2");
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, exeStream);
error = apiInstance->LaunchSqeUpdateTask(
static_cast<uint32_t>(destStream->Id_()), destTaskId, cfg->val.dsaTaskAttr.srcAddr,
cfg->val.dsaTaskAttr.size, exeStream, true);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
break;
}
case RT_UPDATE_AIC_AIV_TASK: {
rtMdlTaskUpdateInfo_t para = {};
para.tilingKeyAddr = RtPtrToPtr<uint64_t*>(cfg->val.aicAivTaskAttr.funcEntryAddr);
para.blockDimAddr = RtPtrToPtr<uint64_t*>(cfg->val.aicAivTaskAttr.blockDimAddr);
para.hdl = cfg->val.aicAivTaskAttr.binHandle;
para.fftsPlusTaskInfo = nullptr;
error = rtModelTaskUpdate(destStm, destTaskId, stm, ¶);
break;
}
default:
error = RT_ERROR_INVALID_VALUE;
RT_LOG_OUTER_MSG_WITH_FUNC(
ErrorCode::EE1003,
RtFmtMsg(
"%s(%d)", (cfg->id == RT_UPDATE_MAX) ? "UPDATE_MAX" : "UNKNOWN", static_cast<int32_t>(cfg->id)),
"cfg->id", "[1, " + std::to_string(RT_UPDATE_MAX) + ")");
break;
}
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtsGetCmoDescSize(size_t* size)
{
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
const rtChipType_t chipType = rtInstance->GetChipType();
if (!IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_TASK_CMO)) {
RT_LOG(RT_LOG_WARNING, "chip type(%d) does not support, return.", static_cast<int32_t>(chipType));
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
Api* apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const rtError_t error = apiInstance->GetCmoDescSize(size);
COND_RETURN_WITH_NOLOG(error == RT_ERROR_FEATURE_NOT_SUPPORT, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtsSetCmoDesc(rtCmoDesc_t cmoDesc, void* srcAddr, size_t srcLen)
{
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
const rtChipType_t chipType = rtInstance->GetChipType();
if (!IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_TASK_CMO)) {
RT_LOG(RT_LOG_WARNING, "chip type(%d) does not support, return.", static_cast<int32_t>(chipType));
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
Api* apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const rtError_t error = apiInstance->SetCmoDesc(cmoDesc, srcAddr, srcLen);
COND_RETURN_WITH_NOLOG(error == RT_ERROR_FEATURE_NOT_SUPPORT, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtsLaunchCmoAddrTask(rtCmoDesc_t cmoDesc, rtStream_t stm, rtCmoOpCode cmoOpCode, const void* reserve)
{
COND_RETURN_EXT_ERRCODE_AND_MSG_OUTER_WITH_PARAM((reserve != nullptr), RT_ERROR_INVALID_VALUE, reserve, "nullptr");
DevProperties properties;
const auto error = GET_DEV_PROPERTIES(Runtime::Instance()->GetChipType(), properties);
COND_RETURN_ERROR_MSG_INNER(
error != RT_ERROR_NONE, error, "GetDevProperties failed, chip type=%s.",
ChipTypeToString(Runtime::Instance()->GetChipType()).c_str());
const uint64_t sizeMax = properties.cmoDDRStructInfoSize;
return rtCmoAddrTaskLaunch(cmoDesc, sizeMax, cmoOpCode, stm, 0U);
}
VISIBILITY_DEFAULT
rtError_t rtCmoAddrTaskLaunch(
void* cmoAddrInfo, uint64_t destMax, rtCmoOpCode_t cmoOpCode, rtStream_t stm, uint32_t flag)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
DevProperties properties;
(void)GET_DEV_PROPERTIES(rtInstance->GetChipType(), properties);
if (properties.cmoDDRStructInfoSize == 0) {
RT_LOG(
RT_LOG_WARNING, "chip type(%d) does not support, return.", static_cast<int32_t>(rtInstance->GetChipType()));
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, streamPtr);
TIMESTAMP_BEGIN(CmoAddrTaskLaunch);
const rtError_t error = apiInstance->CmoAddrTaskLaunch(cmoAddrInfo, destMax, cmoOpCode, streamPtr, flag);
TIMESTAMP_END(CmoAddrTaskLaunch);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtModelTaskUpdate(rtStream_t desStm, uint32_t desTaskId, rtStream_t sinkStm, rtMdlTaskUpdateInfo_t* para)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
Api* apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(desStm, Stream, desStream);
RT_VALIDATE_AND_UNWRAP_OBJECT(sinkStm, Stream, sinkStream);
const rtError_t error = apiInstance->ModelTaskUpdate(desStream, desTaskId, sinkStream, para);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtReduceAsyncV2(
void* dst, uint64_t destMax, const void* src, uint64_t cnt, rtRecudeKind_t kind, rtDataType_t type, rtStream_t stm,
void* overflowAddr)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
UNUSED(destMax);
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
DevProperties properties;
auto error = GET_DEV_PROPERTIES(rtInstance->GetChipType(), properties);
COND_RETURN_ERROR_MSG_INNER(
error != RT_ERROR_NONE, error, "GetDevProperties failed, chip type=%s.",
ChipTypeToString(rtInstance->GetChipType()).c_str());
if (properties.reduceOverflow != ReduceOverflowType::REDUCE_OVERFLOW_TS_VERSION_REDUCE_V2_ID &&
properties.reduceOverflow != ReduceOverflowType::REDUCE_OVERFLOW_TS_VERSION_REDUCV2_SUPPORT_DC) {
RT_LOG_OUTER_MSG_WITH_FUNC(ErrorCode::EE1005);
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, exeStream);
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
error = apiInstance->ReduceAsyncV2(dst, src, cnt, kind, type, exeStream, overflowAddr);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtStreamCreateWithFlagsExternal(rtStream_t* stm, int32_t priority, uint32_t flags)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
const rtChipType_t chipType = rtInstance->GetChipType();
COND_RETURN_EXT_ERRCODE_AND_MSG_OUTER(
(priority != RT_STREAM_GREATEST_PRIORITY) &&
(!IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_STREAM_CREATE_PRIORITY_GREATEST)),
RT_ERROR_INVALID_VALUE, ErrorCode::EE1011, __func__, StreamPriorityToString(priority).c_str(), "priority",
"The priority can be set to RT_STREAM_GREATEST_PRIORITY only when chipType is " + std::to_string(CHIP_DC) +
". The actual chipType is " + std::to_string(chipType));
return rtStreamCreateWithFlags(stm, priority, flags);
}
VISIBILITY_DEFAULT
rtError_t rtModelGetNodes(rtModel_t mdl, uint32_t* const num)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(mdl, Model, realModel);
const rtError_t error = apiInstance->ModelGetNodes(realModel, num);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtModelDebugDotPrint(rtModel_t mdl)
{
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
const rtChipType_t chipType = rtInstance->GetChipType();
if (!IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_MODEL_ACL_GRAPH)) {
RT_LOG(
RT_LOG_WARNING, "chip type(%d) does not support, return.", static_cast<int32_t>(rtInstance->GetChipType()));
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(mdl, Model, realModel);
const rtError_t error = apiInstance->ModelDebugDotPrint(realModel);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtModelDebugJsonPrint(rtModel_t mdl, const char* path, uint32_t flags)
{
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
const rtChipType_t chipType = rtInstance->GetChipType();
if (!IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_MODEL_ACL_GRAPH)) {
RT_LOG(
RT_LOG_WARNING, "chip type(%d) does not support, return.", static_cast<int32_t>(rtInstance->GetChipType()));
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(mdl, Model, realModel);
const rtError_t error = apiInstance->ModelDebugJsonPrint(realModel, path, flags);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtStreamAddToModel(rtStream_t stm, rtModel_t captureMdl)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
const rtChipType_t chipType = rtInstance->GetChipType();
if (!IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_MODEL_ACL_GRAPH)) {
RT_LOG(RT_LOG_WARNING, "chip type(%d) does not support, return.", static_cast<int32_t>(chipType));
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(captureMdl, Model, realModel);
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, streamPtr);
const rtError_t error = apiInstance->StreamAddToModel(streamPtr, realModel);
COND_RETURN_WITH_NOLOG(error == RT_ERROR_FEATURE_NOT_SUPPORT, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtModelUpdate(rtModel_t mdl)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(mdl, Model, realModel);
const rtError_t error = apiInstance->ModelUpdate(realModel);
COND_RETURN_WITH_NOLOG(
(error == RT_ERROR_FEATURE_NOT_SUPPORT || error == RT_ERROR_DRV_NOT_SUPPORT), ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtStreamBeginCapture(rtStream_t stm, const rtStreamCaptureMode mode)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
const rtChipType_t chipType = rtInstance->GetChipType();
if (!IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_MODEL_ACL_GRAPH)) {
RT_LOG(RT_LOG_WARNING, "chip type(%d) does not support, return.", static_cast<int32_t>(chipType));
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, streamPtr);
const rtError_t error = apiInstance->StreamBeginCapture(streamPtr, mode);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtStreamEndCapture(rtStream_t stm, rtModel_t* captureMdl)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
const rtChipType_t chipType = rtInstance->GetChipType();
if (!IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_MODEL_ACL_GRAPH)) {
RT_LOG(RT_LOG_WARNING, "chip type(%d) does not support, return.", static_cast<int32_t>(chipType));
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, streamPtr);
const rtError_t error = apiInstance->StreamEndCapture(streamPtr, RtPtrToPtr<Model**>(captureMdl));
ERROR_RETURN_WITH_EXT_ERRCODE(error);
if (captureMdl != nullptr) {
*captureMdl = ExportEmbeddedHandle<rtModel_t>(RtPtrToPtr<Model*>(*captureMdl));
}
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtStreamGetCaptureInfo(rtStream_t stm, rtStreamCaptureStatus* const status, rtModel_t* captureMdl)
{
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
static const bool isSupportAclGraph =
IS_SUPPORT_CHIP_FEATURE(rtInstance->GetChipType(), RtOptionalFeatureType::RT_FEATURE_MODEL_ACL_GRAPH);
if (!isSupportAclGraph) {
RT_LOG(
RT_LOG_WARNING, "chip type(%d) does not support, return.", static_cast<int32_t>(rtInstance->GetChipType()));
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, streamPtr);
const rtError_t error = apiInstance->StreamGetCaptureInfo(streamPtr, status, RtPtrToPtr<Model**>(captureMdl));
ERROR_RETURN_WITH_EXT_ERRCODE(error);
Model* captureModel = nullptr;
if ((captureMdl != nullptr) && (*captureMdl != nullptr)) {
captureModel = RtPtrToPtr<Model*>(*captureMdl);
}
StoreOptionalEmbeddedHandle<rtModel_t>(captureModel, captureMdl);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtModelCondHandleCreate(
rtModel_t mdl, uint32_t defaultLaunchValue, rtCondHandleFlag_t flag, rtCondHandle_t* handle)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(mdl, Model, realModel);
CondHandle* condHandle = nullptr;
const rtError_t error = apiInstance->ModelCondHandleCreate(realModel, defaultLaunchValue, flag, &condHandle);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
*handle = ExportEmbeddedHandle<rtCondHandle_t>(condHandle);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtModelCondHandleGetCondPtr(rtCondHandle_t handle, uint64_t** devPtr)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(handle, CondHandle, realHandle);
const rtError_t error = apiInstance->ModelCondHandleGetCondPtr(realHandle, devPtr);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtStreamAddCondTask(rtCondTaskParams params, rtStream_t stm, uint32_t flags)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(params.handle, CondHandle, realHandle);
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, realStm);
const rtError_t error = apiInstance->StreamAddCondTask(params, realStm, flags);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
for (uint32_t i = 0; i < params.size; i++) {
StoreOptionalEmbeddedHandle<rtModel_t>(RtPtrToPtr<Model*>(params.modelRIArray[i]), ¶ms.modelRIArray[i]);
}
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtStreamBeginCaptureToModel(rtStream_t stm, rtModel_t mdl, const rtStreamCaptureMode mode)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
const rtChipType_t chipType = rtInstance->GetChipType();
if (!IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_MODEL_ACL_GRAPH)) {
RT_LOG(RT_LOG_WARNING, "chip type(%d) does not support, return.", static_cast<int32_t>(chipType));
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(mdl, Model, realModel);
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, streamPtr);
const rtError_t error = apiInstance->StreamBeginCapture(streamPtr, mode, realModel);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtCmoAsync(void* srcAddrPtr, size_t srcLen, rtCmoOpCode_t cmoType, rtStream_t stm)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
const rtChipType_t chipType = rtInstance->GetChipType();
COND_RETURN_WARN(
(!IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_TASK_CMO)),
ACL_ERROR_RT_FEATURE_NOT_SUPPORT, "chip type(%d) does not support, return.", static_cast<int32_t>(chipType));
const bool isSupport = (cmoType == RT_CMO_PREFETCH) || (cmoType == RT_CMO_WRITEBACK) ||
(cmoType == RT_CMO_INVALID) || (cmoType == RT_CMO_FLUSH);
COND_RETURN_WARN(
!isSupport, ACL_ERROR_RT_FEATURE_NOT_SUPPORT, "cmoType %s does not support, support[%s, %s, %s, %s], return.",
CmoOpCodeToString(cmoType).c_str(), "CMO_PREFETCH(6)", "CMO_WRITEBACK(7)", "CMO_INVALID(8)", "CMO_FLUSH(9)");
NULL_PTR_RETURN_MSG_OUTER(srcAddrPtr, ACL_ERROR_RT_PARAM_INVALID);
COND_RETURN_AND_MSG_OUTER_WITH_PARAM((srcLen == 0), ACL_ERROR_RT_PARAM_INVALID, srcLen, "greater than 0");
rtCmoTaskInfo_t taskInfo = {};
taskInfo.opCode = cmoType;
taskInfo.lengthInner = static_cast<uint32_t>(srcLen);
taskInfo.sourceAddr = RtPtrToValue(srcAddrPtr);
return rtCmoTaskLaunch(&taskInfo, stm, 0);
}
VISIBILITY_DEFAULT
rtError_t rtCmoTaskLaunch(rtCmoTaskInfo_t* taskInfo, rtStream_t stm, uint32_t flag)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
const rtChipType_t chipType = rtInstance->GetChipType();
if (!IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_TASK_CMO) &&
!IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_TASK_ASYNC_CMO)) {
RT_LOG(RT_LOG_WARNING, "chip type(%d) does not support, return.", static_cast<int32_t>(chipType));
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, streamPtr);
TIMESTAMP_BEGIN(CmoTaskLaunch);
const rtError_t error = apiInstance->CmoTaskLaunch(taskInfo, streamPtr, flag);
TIMESTAMP_END(CmoTaskLaunch);
if (IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_TASK_CMO_DOT_NO_LOG)) {
COND_RETURN_WITH_NOLOG(error == RT_ERROR_FEATURE_NOT_SUPPORT, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
}
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtReduceAsync(
void* dst, uint64_t destMax, const void* src, uint64_t cnt, rtRecudeKind_t kind, rtDataType_t type, rtStream_t stm)
{
UNUSED(destMax);
GLOBAL_STATE_WAIT_IF_LOCKED();
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, exeStream);
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const rtError_t error = apiInstance->ReduceAsync(dst, src, cnt, kind, type, exeStream, nullptr);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtReduceAsyncWithCfg(
void* dst, uint64_t destMax, const void* src, uint64_t cnt, rtRecudeKind_t kind, rtDataType_t type, rtStream_t stm,
uint32_t qosCfg)
{
UNUSED(destMax);
GLOBAL_STATE_WAIT_IF_LOCKED();
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, exeStream);
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
rtTaskCfgInfo_t cfgInfo = {};
cfgInfo.qos = static_cast<uint8_t>(qosCfg & 0xFU);
cfgInfo.partId = static_cast<uint8_t>((qosCfg & 0xFF0U) >> 4U);
const rtError_t error = apiInstance->ReduceAsync(dst, src, cnt, kind, type, exeStream, &cfgInfo);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtReduceAsyncWithCfgV2(
void* dst, uint64_t destMax, const void* src, uint64_t cnt, rtRecudeKind_t kind, rtDataType_t type, rtStream_t stm,
const rtTaskCfgInfo_t* cfgInfo)
{
UNUSED(destMax);
GLOBAL_STATE_WAIT_IF_LOCKED();
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, exeStream);
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const rtError_t error = apiInstance->ReduceAsync(dst, src, cnt, kind, type, exeStream, cfgInfo);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtMallocCached(void** devPtr, uint64_t size, rtMemType_t type, const uint16_t moduleId)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
TIMESTAMP_BEGIN(rtMallocCached);
const rtError_t error = apiInstance->DevMalloc(devPtr, size, type, moduleId);
TIMESTAMP_END(rtMallocCached);
if (unlikely(error != RT_ERROR_NONE)) {
return GetRtExtErrCodeAndSetGlobalErr(error);
}
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtMemcpyAsyncWithOffset(
void** dst, uint64_t dstMax, uint64_t dstDataOffset, const void** src, uint64_t cnt, uint64_t srcDataOffset,
rtMemcpyKind kind, rtStream_t stm)
{
if (cnt == 0U) {
RT_LOG(RT_LOG_INFO, "cnt is 0, no need to copy memory async with offset, just return success.");
return ACL_RT_SUCCESS;
}
COND_RETURN_EXT_ERRCODE_AND_MSG_OUTER_WITH_PARAM_NAME(
(kind != RT_MEMCPY_KIND_INNER_DEVICE_TO_DEVICE), RT_ERROR_INVALID_VALUE, MemcpyNewKindToString(kind), "kind",
"MEMCPY_KIND_INNER_DEVICE_TO_DEVICE(6)");
return rtMemcpyD2DAddrAsync(
RtPtrToPtr<void*>(dst), dstMax, dstDataOffset, RtPtrToPtr<void*>(src), cnt, srcDataOffset, stm);
}
VISIBILITY_DEFAULT
rtError_t rtMemsetD32(void* dst, uint64_t destMax, uint32_t value, uint64_t count)
{
if (count == 0U) {
RT_LOG(RT_LOG_INFO, "count is 0, no need to set memory, just return success.");
return ACL_RT_SUCCESS;
}
GLOBAL_STATE_WAIT_IF_LOCKED();
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
TIMESTAMP_BEGIN(rtMemsetD32);
const rtError_t error = apiInstance->MemsetD32(dst, destMax, value, count);
TIMESTAMP_END(rtMemsetD32);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtMemsetD32Async(void* dst, uint64_t destMax, uint32_t value, uint64_t count, rtStream_t stm)
{
if (count == 0U) {
RT_LOG(RT_LOG_INFO, "count is 0, no need to set memory async, just return success.");
return ACL_RT_SUCCESS;
}
GLOBAL_STATE_WAIT_IF_LOCKED();
TIMESTAMP_BEGIN(rtMemsetD32Async);
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, exeStream);
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const rtError_t error = apiInstance->MemsetD32Async(dst, destMax, value, count, exeStream);
COND_RETURN_WITH_NOLOG(error == RT_ERROR_FEATURE_NOT_SUPPORT, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
TIMESTAMP_END(rtMemsetD32Async);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtIpcMemImportPidInterServer(const char* key, const rtServerPid* serverPids, size_t num)
{
PARAM_NULL_RETURN_ERROR_WITH_EXT_ERRCODE(key, RT_ERROR_INVALID_VALUE);
PARAM_NULL_RETURN_ERROR_WITH_EXT_ERRCODE(serverPids, RT_ERROR_INVALID_VALUE);
COND_RETURN_EXT_ERRCODE_AND_MSG_OUTER_WITH_PARAM(num == 0UL, RT_ERROR_INVALID_VALUE, num, "not equal to 0");
for (size_t i = 0; i < num; i++) {
COND_RETURN_EXT_ERRCODE_AND_MSG_OUTER(
(serverPids[i].pid == nullptr), RT_ERROR_INVALID_VALUE, ErrorCode::EE1004, __func__,
"serverPids[" + std::to_string(i) + "].pid");
const rtError_t ret = rtSetIpcMemorySuperPodPid(
key, serverPids[i].sdid, serverPids[i].pid, static_cast<int32_t>(serverPids[i].num & INT32_MAX));
if (ret != ACL_RT_SUCCESS) {
return ret;
}
}
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtMemAdvise(void* devPtr, uint64_t count, uint32_t advise)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
Runtime* rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
if (!IS_SUPPORT_CHIP_FEATURE(
rtInstance->GetChipType(), RtOptionalFeatureType::RT_FEATURE_MEM_L2_CACHE_PERSISTANT)) {
RT_LOG(RT_LOG_INFO, "chip type(%d) does not support, return.", static_cast<int32_t>(rtInstance->GetChipType()));
return ACL_RT_SUCCESS;
}
Api* apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const rtError_t error = apiInstance->MemAdvise(devPtr, count, advise);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtMemcpyD2DAddrAsync(
void* dst, uint64_t dstMax, uint64_t dstOffset, const void* src, uint64_t cnt, uint64_t srcOffset, rtStream_t stm)
{
if (cnt == 0U) {
RT_LOG(RT_LOG_INFO, "cnt is 0, no need to copy memory async by offset, just return success.");
return ACL_RT_SUCCESS;
}
GLOBAL_STATE_WAIT_IF_LOCKED();
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
const rtChipType_t chipType = rtInstance->GetChipType();
if (!IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_TASK_MEMCPY_D2D_BY_OFFSET)) {
RT_LOG(RT_LOG_WARNING, "chip type(%d) does not support, return.", static_cast<int32_t>(chipType));
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, exeStream);
rtD2DAddrCfgInfo_t addrCfgInfo = {};
addrCfgInfo.dstOffset = dstOffset;
addrCfgInfo.srcOffset = srcOffset;
const rtError_t error = apiInstance->MemcpyAsync(
dst, dstMax, src, cnt, RT_MEMCPY_ADDR_DEVICE_TO_DEVICE, exeStream, nullptr, &addrCfgInfo);
COND_RETURN_WITH_NOLOG(error == RT_ERROR_FEATURE_NOT_SUPPORT, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtStartADCProfiler(void** addr, uint32_t length)
{
rtError_t error;
constexpr uint32_t minimum = 1024U * 256U;
constexpr uint32_t maximum = 1024U * 1024U;
Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
if (!IS_SUPPORT_CHIP_FEATURE(rtInstance->GetChipType(), RtOptionalFeatureType::RT_FEATURE_PROFILING_ADC)) {
RT_LOG_OUTER_MSG_WITH_FUNC(ErrorCode::EE1005);
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
if ((length < minimum) || (length > maximum)) {
RT_LOG_INNER_MSG(RT_LOG_ERROR, "Invalid length=%u, valid range=[%u, %u].", length, minimum, maximum);
REPORT_FUNC_ERROR_REASON(RT_ERROR_INVALID_VALUE);
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_INVALID_VALUE);
}
const rtMemType_t memType = rtInstance->GetTsMemType(MEM_REQUEST_FEATURE_DEFAULT, static_cast<uint64_t>(length));
error = rtMalloc(addr, static_cast<uint64_t>(length), memType, MODULEID_RUNTIME);
if (error != RT_ERROR_NONE) {
RT_LOG_INNER_MSG(RT_LOG_ERROR, "Failed to malloc memory, error=%d, length=%u.", error, length);
return GetRtExtErrCodeAndSetGlobalErr((RT_ERROR_MEMORY_ALLOCATION));
}
error = apiInstance->AdcProfiler(RtPtrToValue(*addr), length);
if (error != RT_ERROR_NONE) {
(void)rtFree(*addr);
*addr = nullptr;
RT_LOG_INNER_MSG(RT_LOG_ERROR, "AdcProfiler failed, error=%d, length=%u.", error, length);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
}
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtStopADCProfiler(void* addr)
{
rtError_t error;
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
if (!IS_SUPPORT_CHIP_FEATURE(rtInstance->GetChipType(), RtOptionalFeatureType::RT_FEATURE_PROFILING_ADC)) {
RT_LOG_OUTER_MSG_WITH_FUNC(ErrorCode::EE1005);
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
if (addr == nullptr) {
REPORT_FUNC_ERROR_REASON(RT_ERROR_INVALID_VALUE);
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_INVALID_VALUE);
}
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
error = apiInstance->AdcProfiler(RtPtrToValue(addr), 0U);
if (error == RT_ERROR_NONE) {
error = rtFree(addr);
}
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtNotifyGetPhyInfo(rtNotify_t notify, uint32_t* phyDevId, uint32_t* tsId)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
const rtChipType_t chipType = rtInstance->GetChipType();
if (!IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_NOTIFY_USER_VA_MAPPING)) {
PARAM_NULL_RETURN_ERROR_WITH_EXT_ERRCODE(phyDevId, RT_ERROR_INVALID_VALUE);
PARAM_NULL_RETURN_ERROR_WITH_EXT_ERRCODE(tsId, RT_ERROR_INVALID_VALUE);
RT_VALIDATE_AND_UNWRAP_OBJECT(notify, Notify, notifyPtr);
rtNotifyPhyInfo notifyInfo;
const rtError_t error = apiInstance->GetNotifyPhyInfo(notifyPtr, ¬ifyInfo);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
*phyDevId = notifyInfo.phyId;
*tsId = notifyInfo.tsId;
} else {
RT_LOG(RT_LOG_INFO, "chip type(%d) does not support, return.", static_cast<int32_t>(rtInstance->GetChipType()));
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtSetIpcNotifyPid(const char_t* name, int32_t pid[], int32_t num)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
if (!IS_SUPPORT_CHIP_FEATURE(rtInstance->GetChipType(), RtOptionalFeatureType::RT_FEATURE_IPC_NOTIFY)) {
RT_LOG_OUTER_MSG_WITH_FUNC(ErrorCode::EE1005);
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const rtError_t error = apiInstance->SetIpcNotifyPid(name, pid, num);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtSetIpcMemPid(const char_t* name, int32_t pid[], int32_t num)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const rtError_t error = apiInstance->SetIpcMemPid(name, pid, num);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
rtError_t rtNpuGetFloatStatus(void* outputAddrPtr, uint64_t outputSize, uint32_t checkMode, rtStream_t stm)
{
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
if (!IS_SUPPORT_CHIP_FEATURE(rtInstance->GetChipType(), RtOptionalFeatureType::RT_FEATURE_DEVICE_FLOAT_STATUS)) {
RT_LOG_OUTER_MSG_WITH_FUNC(ErrorCode::EE1005);
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
TIMESTAMP_BEGIN(rtNpuGetFloatStatus);
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, streamPtr);
const rtError_t ret = apiInstance->NpuGetFloatStatus(outputAddrPtr, outputSize, checkMode, streamPtr);
TIMESTAMP_END(rtNpuGetFloatStatus);
ERROR_RETURN_WITH_EXT_ERRCODE(ret);
return ACL_RT_SUCCESS;
}
rtError_t rtNpuClearFloatStatus(uint32_t checkMode, rtStream_t stm)
{
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
if (!IS_SUPPORT_CHIP_FEATURE(rtInstance->GetChipType(), RtOptionalFeatureType::RT_FEATURE_DEVICE_FLOAT_STATUS)) {
RT_LOG_OUTER_MSG_WITH_FUNC(ErrorCode::EE1005);
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
TIMESTAMP_BEGIN(rtNpuClearFloatStatus);
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, streamPtr);
const rtError_t ret = apiInstance->NpuClearFloatStatus(checkMode, streamPtr);
TIMESTAMP_END(rtNpuClearFloatStatus);
ERROR_RETURN_WITH_EXT_ERRCODE(ret);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
RTS_API rtError_t rtGetDevArgsAddr(rtStream_t stm, rtArgsEx_t* argsInfo, void** devArgsAddr, void** argsHandle)
{
Runtime* rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
if (!IS_SUPPORT_CHIP_FEATURE(rtInstance->GetChipType(), RtOptionalFeatureType::RT_FEATURE_TASK_FFTS_PLUS)) {
RT_LOG(RT_LOG_WARNING, "Chip type(%d) does not support.", static_cast<int32_t>(rtInstance->GetChipType()));
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
Api* apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, streamPtr);
const rtError_t error = apiInstance->GetDevArgsAddr(streamPtr, argsInfo, devArgsAddr, argsHandle);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtSetIpcNotifySuperPodPid(const char* name, uint32_t sdid, int32_t pid)
{
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
if (!IS_SUPPORT_CHIP_FEATURE(rtInstance->GetChipType(), RtOptionalFeatureType::RT_FEATURE_IPC_NOTIFY)) {
RT_LOG_OUTER_MSG_WITH_FUNC(ErrorCode::EE1005);
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
Api* apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const rtError_t error = apiInstance->ShrIdSetPodPid(name, sdid, pid);
COND_RETURN_WITH_NOLOG(error == RT_ERROR_FEATURE_NOT_SUPPORT, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtSetStreamTag(rtStream_t stm, uint32_t geOpTag)
{
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
if (!IS_SUPPORT_CHIP_FEATURE(rtInstance->GetChipType(), RtOptionalFeatureType::RT_FEATURE_STREAM_TAG)) {
RT_LOG(
RT_LOG_DEBUG, "chip type(%d) does not support, return.", static_cast<int32_t>(rtInstance->GetChipType()));
return ACL_RT_SUCCESS;
}
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, streamPtr);
const rtError_t error = apiInstance->SetStreamTag(streamPtr, geOpTag);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtThreadExchangeCaptureMode(rtStreamCaptureMode* mode)
{
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
const rtChipType_t chipType = rtInstance->GetChipType();
if (!IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_MODEL_ACL_GRAPH)) {
RT_LOG(RT_LOG_WARNING, "chip type(%d) does not support, return.", static_cast<int32_t>(chipType));
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const rtError_t error = apiInstance->ThreadExchangeCaptureMode(mode);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtsStreamBeginTaskGrp(rtStream_t stm)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
const rtChipType_t chipType = rtInstance->GetChipType();
if (!IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_MODEL_ACL_GRAPH)) {
RT_LOG(
RT_LOG_WARNING, "chip type(%d) or ctx gen mode does not support, return.", static_cast<int32_t>(chipType));
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, streamPtr);
const rtError_t error = apiInstance->StreamBeginTaskGrp(streamPtr);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtsStreamBeginTaskUpdate(rtStream_t stm, rtTaskGrp_t handle)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
const rtChipType_t chipType = rtInstance->GetChipType();
if (!IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_MODEL_ACL_GRAPH)) {
RT_LOG(
RT_LOG_WARNING, "chip type(%d) or ctx gen mode does not support, return.", static_cast<int32_t>(chipType));
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, exeStream);
TaskGroup* const taskGrpHandle = static_cast<TaskGroup*>(handle);
const rtError_t error = apiInstance->StreamBeginTaskUpdate(exeStream, taskGrpHandle);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtNotifySetImportPidInterServer(rtNotify_t notify, const rtServerPid* serverPids, size_t num)
{
PARAM_NULL_RETURN_ERROR_WITH_EXT_ERRCODE(notify, RT_ERROR_INVALID_VALUE);
PARAM_NULL_RETURN_ERROR_WITH_EXT_ERRCODE(serverPids, RT_ERROR_INVALID_VALUE);
COND_RETURN_EXT_ERRCODE_AND_MSG_OUTER_WITH_PARAM(num == 0UL, RT_ERROR_INVALID_VALUE, num, "not equal to 0");
RT_VALIDATE_AND_UNWRAP_OBJECT(notify, Notify, notifyPtr);
for (size_t i = 0; i < num; i++) {
const rtServerPid& serverPid = *(serverPids + i);
COND_RETURN_EXT_ERRCODE_AND_MSG_OUTER(
(serverPid.pid == nullptr), RT_ERROR_INVALID_VALUE, ErrorCode::EE1004, __func__,
"serverPids[" + std::to_string(i) + "].pid");
COND_RETURN_EXT_ERRCODE_AND_MSG_OUTER(
(serverPid.num != 1UL), RT_ERROR_INVALID_VALUE, ErrorCode::EE1003, __func__, serverPid.num,
"serverPids[" + std::to_string(i) + "].num", "1");
const rtError_t ret =
rtSetIpcNotifySuperPodPid(notifyPtr->GetIpcName().c_str(), serverPid.sdid, *(serverPid.pid));
if (ret != ACL_RT_SUCCESS) {
return ret;
}
}
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtsPersistentTaskClean(rtStream_t stm)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, exeStream);
const rtError_t error = apiInstance->StreamTaskClean(exeStream);
COND_RETURN_WITH_NOLOG(error == RT_ERROR_FEATURE_NOT_SUPPORT, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtNonBlockingLaunchBegin(rtStream_t stream, uint64_t flag)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(stream, Stream, targetStream);
const rtError_t error = apiInstance->NonBlockingLaunchBegin(targetStream, flag);
COND_RETURN_WITH_NOLOG(error == RT_ERROR_FEATURE_NOT_SUPPORT, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtNonBlockingLaunchEnd(rtStream_t stream, uint64_t flag)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(stream, Stream, targetStream);
const rtError_t error = apiInstance->NonBlockingLaunchEnd(targetStream, flag);
COND_RETURN_WITH_NOLOG(error == RT_ERROR_FEATURE_NOT_SUPPORT, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtCacheLastTaskOpInfo(const void* const infoPtr, const size_t infoSize)
{
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
const rtChipType_t chipType = rtInstance->GetChipType();
if (!IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_MODEL_ACL_GRAPH)) {
RT_LOG(RT_LOG_WARNING, "Chip type(%d) does not support rtCacheLastTaskOpInfo api.", chipType);
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const rtError_t ret = apiInstance->CacheLastTaskOpInfo(infoPtr, infoSize);
ERROR_RETURN_WITH_EXT_ERRCODE(ret);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtCacheLastTaskExtendInfo(const char* const extendInfoPtr, const size_t infoSize)
{
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
const rtChipType_t chipType = rtInstance->GetChipType();
if (!IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_MODEL_ACL_GRAPH)) {
RT_LOG(RT_LOG_WARNING, "Chip type(%d) does not support rtCacheLastTaskExtendInfo api.", chipType);
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const rtError_t ret = apiInstance->CacheLastTaskExtendInfo(extendInfoPtr, infoSize);
ERROR_RETURN_WITH_EXT_ERRCODE(ret);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtEventWorkModeSet(uint8_t mode)
{
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
const rtChipType_t chipType = rtInstance->GetChipType();
if (!IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_TASK_VALUE_WAIT)) {
RT_LOG(RT_LOG_WARNING, "Chip type(%d) does not support rtEventWorkModeSet api.", chipType);
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const rtError_t error = apiInstance->EventWorkModeSet(mode);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtEventWorkModeGet(uint8_t* mode)
{
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
const rtChipType_t chipType = rtInstance->GetChipType();
if (!IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_TASK_VALUE_WAIT)) {
RT_LOG(RT_LOG_WARNING, "Chip type(%d) does not support rtEventWorkModeGet api.", chipType);
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const rtError_t error = apiInstance->EventWorkModeGet(mode);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtIpcGetEventHandle(rtEvent_t event, rtIpcEventHandle_t* handle)
{
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
const rtChipType_t chipType = rtInstance->GetChipType();
if (!IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_IPC_EVENT)) {
RT_LOG(RT_LOG_WARNING, "Chip type(%d) does not support rtIpcGetEventHandle api.", chipType);
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
ApiEvent* const apiEventInstance = ApiEvent::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiEventInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(event, Event, eventPtr);
const rtError_t error = apiEventInstance->IpcGetEventHandle(static_cast<IpcEvent*>(eventPtr), handle);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return error;
}
VISIBILITY_DEFAULT
rtError_t rtIpcOpenEventHandle(rtIpcEventHandle_t handle, rtEvent_t* event)
{
RT_LOG(RT_LOG_INFO, "rtIpcOpenEventHandle start");
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
const rtChipType_t chipType = rtInstance->GetChipType();
if (!IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_IPC_EVENT)) {
RT_LOG(RT_LOG_WARNING, "Chip type(%d) does not support rtIpcOpenEventHandle api.", chipType);
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
ApiEvent* const apiEventInstance = ApiEvent::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiEventInstance);
rtIpcEventHandle_t* eventHandle = &handle;
const rtError_t error = apiEventInstance->IpcOpenEventHandle(eventHandle, RtPtrToPtr<IpcEvent**>(event));
ERROR_RETURN_WITH_EXT_ERRCODE(error);
IpcEvent* realEvent = RtPtrToPtr<IpcEvent*>(*event);
*event = ExportEmbeddedHandle<rtEvent_t>(realEvent);
RT_LOG(RT_LOG_INFO, "rtIpcOpenEventHandle end");
return error;
}
VISIBILITY_DEFAULT
rtError_t rtFunctionGetAttribute(rtFuncHandle funcHandle, rtFuncAttribute attrType, int64_t* attrValue)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT_WITH_VALIDATOR(funcHandle, Kernel, realKernel, ValidateKernelHandleForApi);
const rtError_t error =
apiInstance->FunctionGetAttribute(RtPtrToPtr<rtFuncHandle>(realKernel), attrType, attrValue);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtFunctionGetBinary(const rtFuncHandle funcHandle, rtBinHandle* binHandle)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT_WITH_VALIDATOR(funcHandle, Kernel, realKernel, ValidateKernelHandleForApi);
const rtError_t ret = apiInstance->FunctionGetBinary(realKernel, RtPtrToPtr<Program**>(binHandle));
ERROR_RETURN_WITH_EXT_ERRCODE(ret);
Program* const realProgram = RtPtrToPtr<Program*>(*binHandle);
if (realProgram != nullptr) {
InitEmbeddedInnerHandle<Program>(realProgram);
}
*binHandle = ExportEmbeddedHandle<rtBinHandle>(realProgram);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtBinaryGetGlobal(const rtBinHandle binHandle, const char* name, void** dptr, size_t* size)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
if (IS_SUPPORT_CHIP_FEATURE(rtInstance->GetChipType(), RtOptionalFeatureType::RT_FEATURE_XPU)) {
RT_LOG(RT_LOG_WARNING, "XPU does not support rtBinaryGetGlobal");
return ACL_ERROR_RT_FEATURE_NOT_SUPPORT;
}
RT_VALIDATE_AND_UNWRAP_OBJECT_WITH_VALIDATOR(binHandle, Program, realProgram, ValidateProgramHandleForApi);
const rtError_t ret = apiInstance->BinaryGetGlobal(realProgram, name, dptr, size);
COND_RETURN_WITH_NOLOG(ret == RT_ERROR_FEATURE_NOT_SUPPORT, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
ERROR_RETURN_WITH_EXT_ERRCODE(ret);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
void rtRegisterVariable(
void* binHandle, const void* hostVar, const char* deviceVarName, size_t size, uint32_t flags, void* reserve)
{
UNUSED(reserve);
Api* const apiInstance = Api::Instance();
if (unlikely(apiInstance == nullptr)) {
RT_LOG(RT_LOG_ERROR, "Null apiInstance pointer");
return;
}
Program* realProgram = nullptr;
const rtError_t handleRet = ValidateProgramHandleForApi(binHandle, realProgram, __func__);
if (handleRet != RT_ERROR_NONE) {
return;
}
(void)apiInstance->RegisterVariable(realProgram, hostVar, deviceVarName, size, flags);
return;
}
VISIBILITY_DEFAULT
rtError_t rtSymbolLookup(const void* hostVar, void** devPtr, size_t* size)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const rtError_t error = apiInstance->SymbolLookup(hostVar, devPtr, size);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtFunctionGetParamCount(const void* func, size_t* paramCount)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
if (IS_SUPPORT_CHIP_FEATURE(rtInstance->GetChipType(), RtOptionalFeatureType::RT_FEATURE_XPU)) {
RT_LOG(RT_LOG_WARNING, "XPU does not support rtFunctionGetParamCount");
return ACL_ERROR_RT_FEATURE_NOT_SUPPORT;
}
RT_VALIDATE_AND_UNWRAP_OBJECT_WITH_VALIDATOR(func, Kernel, realKernel, ValidateKernelHandleForApi);
const Kernel* const kernel = realKernel;
const rtError_t error = apiInstance->FunctionGetParamCount(kernel, paramCount);
COND_RETURN_WITH_NOLOG(error == RT_ERROR_FEATURE_NOT_SUPPORT, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtFunctionGetParamInfo(const void* func, size_t paramIndex, size_t* paramOffset, size_t* paramSize)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
if (IS_SUPPORT_CHIP_FEATURE(rtInstance->GetChipType(), RtOptionalFeatureType::RT_FEATURE_XPU)) {
RT_LOG(RT_LOG_WARNING, "XPU does not support rtFunctionGetParamInfo");
return ACL_ERROR_RT_FEATURE_NOT_SUPPORT;
}
RT_VALIDATE_AND_UNWRAP_OBJECT_WITH_VALIDATOR(func, Kernel, realKernel, ValidateKernelHandleForApi);
const Kernel* const kernel = realKernel;
const rtError_t error = apiInstance->FunctionGetParamInfo(kernel, paramIndex, paramOffset, paramSize);
COND_RETURN_WITH_NOLOG(error == RT_ERROR_FEATURE_NOT_SUPPORT, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtFunctionGetAvailDynUbufPerBlock(void* func, uint32_t flags, size_t* dynamicUbufSize)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT_WITH_VALIDATOR(func, Kernel, kernel, ValidateKernelHandleForApi);
const rtError_t error = apiInstance->FunctionGetAvailDynUbufPerBlock(kernel, flags, dynamicUbufSize);
COND_RETURN_WITH_NOLOG(error == RT_ERROR_FEATURE_NOT_SUPPORT, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtRegisterFuncSymbol(void* binHandle, const void* symbol, const char* kernelName, void* reserve)
{
UNUSED(reserve);
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT_WITH_VALIDATOR(binHandle, Program, realProgram, ValidateProgramHandleForApi);
const rtError_t ret = apiInstance->RegisterFuncSymbol(realProgram, symbol, kernelName);
ERROR_RETURN_WITH_EXT_ERRCODE(ret);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtLaunchKernelWithArgsArray(
void* func, uint32_t numBlocks, rtStream_t stm, rtKernelLaunchCfg_t* cfg, void** args)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
if (IS_SUPPORT_CHIP_FEATURE(rtInstance->GetChipType(), RtOptionalFeatureType::RT_FEATURE_XPU)) {
RT_LOG(RT_LOG_WARNING, "XPU does not support rtLaunchKernelWithArgsArray");
return ACL_ERROR_RT_FEATURE_NOT_SUPPORT;
}
RtArgsWithType argsWithType = {};
argsWithType.type = RT_ARGS_ARRAY;
argsWithType.args.argsArrayInfo = args;
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, exeStream);
Kernel* kernel = nullptr;
rtError_t ret = ConvertFuncToKernel(apiInstance, func, kernel, __func__);
if (ret != RT_ERROR_NONE) {
return ret;
}
ret = apiInstance->LaunchKernelV2(kernel, numBlocks, &argsWithType, exeStream, cfg);
COND_RETURN_WITH_NOLOG(ret == RT_ERROR_KERNEL_INVALID, ACL_ERROR_RT_INVALID_HANDLE);
COND_RETURN_WITH_NOLOG(ret == RT_ERROR_FEATURE_NOT_SUPPORT, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
ERROR_RETURN_WITH_EXT_ERRCODE(ret);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtFuncGetSize(const rtFuncHandle funcHandle, size_t* aicSize, size_t* aivSize)
{
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
const rtChipType_t chipType = rtInstance->GetChipType();
COND_RETURN_WARN(
!IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_MODEL_ACL_GRAPH),
ACL_ERROR_RT_FEATURE_NOT_SUPPORT, "chip type(%d) does not support rtFuncGetSize api, return.",
static_cast<int32_t>(chipType));
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT_WITH_VALIDATOR(funcHandle, Kernel, realKernel, ValidateKernelHandleForApi);
const rtError_t ret = apiInstance->FuncGetSize(realKernel, aicSize, aivSize);
ERROR_RETURN_WITH_EXT_ERRCODE(ret);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtGetFuncBySymbol(const void* symbol, rtFuncHandle* funcHandle)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const rtError_t ret = apiInstance->GetFunctionBySymbol(symbol, RtPtrToPtr<Kernel**>(funcHandle));
COND_RETURN_EXT_ERRCODE_AND_MSG_OUTER(
ret == RT_ERROR_INVALID_DEVICE_FUNCTION, ACL_ERROR_RT_INVALID_DEVICE_FUNCTION, ErrorCode::EE1017, __func__,
"symbol", "The corresponding kernel function cannot be found through the symbol");
ERROR_RETURN_WITH_EXT_ERRCODE(ret);
Kernel* const realKernel = RtPtrToPtr<Kernel*>(*funcHandle);
if (realKernel != nullptr) {
InitEmbeddedInnerHandle<Kernel>(realKernel);
}
*funcHandle = ExportEmbeddedHandle<rtFuncHandle>(realKernel);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtBinaryGetMetaNum(const rtBinHandle binHandle, const rtBinaryMetaType type, size_t* numOfMeta)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT_WITH_VALIDATOR(binHandle, Program, realProgram, ValidateProgramHandleForApi);
const rtError_t ret = apiInstance->BinaryGetMetaNum(realProgram, type, numOfMeta);
COND_RETURN_WITH_NOLOG(ret == RT_ERROR_FEATURE_NOT_SUPPORT, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
ERROR_RETURN_WITH_EXT_ERRCODE(ret);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtBinaryGetMetaInfo(
const rtBinHandle binHandle, const rtBinaryMetaType type, const size_t numOfMeta, void** data,
const size_t* dataSize)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT_WITH_VALIDATOR(binHandle, Program, realProgram, ValidateProgramHandleForApi);
const rtError_t ret = apiInstance->BinaryGetMetaInfo(realProgram, type, numOfMeta, data, dataSize);
COND_RETURN_WITH_NOLOG(ret == RT_ERROR_FEATURE_NOT_SUPPORT, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
ERROR_RETURN_WITH_EXT_ERRCODE(ret);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtGetSocSpec(const char* label, const char* key, char* val, const uint32_t maxLen)
{
PARAM_NULL_RETURN_ERROR_WITH_EXT_ERRCODE(label, RT_ERROR_INVALID_VALUE);
PARAM_NULL_RETURN_ERROR_WITH_EXT_ERRCODE(key, RT_ERROR_INVALID_VALUE);
PARAM_NULL_RETURN_ERROR_WITH_EXT_ERRCODE(val, RT_ERROR_INVALID_VALUE);
char_t socVersion[SOC_VERSION_LEN] = {};
const auto error = rtGetSocVersion(socVersion, static_cast<uint32_t>(sizeof(socVersion)));
ERROR_RETURN_WITH_EXT_ERRCODE(error);
std::string result = "";
const int32_t ret =
PlatformManagerV2::Instance().GetSocSpec(std::string(socVersion), std::string(label), std::string(key), result);
if (ret != RT_ERROR_NONE) {
if (ret == RT_ERROR_NOT_FOUND) {
RT_LOG(RT_LOG_WARNING, "No platform info found from GetSocSpec.");
return ret;
}
RT_LOG(RT_LOG_ERROR, "Get soc spec failed, ret = %u, please check.", ret);
return ret;
}
COND_RETURN_EXT_ERRCODE_AND_MSG_OUTER_WITH_PARAM(
(maxLen < (result.size() + 1U)), RT_ERROR_INVALID_VALUE, maxLen,
"maxLen should be larger than size of query result");
const errno_t rtn = memcpy_s(val, maxLen, result.c_str(), result.size() + 1U);
if (rtn != EOK) {
std::stringstream ss;
ss << std::hex << "val=0x" << RtPtrToValue(val) << ", src=0x" << RtPtrToValue(result.c_str()) << std::dec
<< ", maxLen=" << maxLen << ", count=" << (result.size() + 1U) << ".";
RT_LOG_OUTER_MSG_IMPL(
ErrorCode::EE1020, __func__, "memcpy_s", std::to_string(rtn).c_str(), strerror(rtn), ss.str().c_str());
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_INVALID_VALUE);
}
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtSetKernelDfxInfoCallback(rtKernelDfxInfoType type, rtKernelDfxInfoProFunc func)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const rtError_t error = apiInstance->SetKernelDfxInfoCallback(type, func);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtRegisterParseDfxInfoFunc(rtParseDfxInfoFunc func)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const rtError_t error = apiInstance->RegisterParseDfxInfoFunc(func);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtModelDestroyRegisterCallback(rtModel_t const mdl, rtCallback_t fn, void* ptr)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(mdl, Model, realModel);
const rtError_t error = apiInstance->ModelDestroyRegisterCallback(realModel, fn, ptr);
COND_RETURN_WITH_NOLOG(error == RT_ERROR_FEATURE_NOT_SUPPORT, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtModelDestroyUnregisterCallback(rtModel_t const mdl, rtCallback_t fn)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(mdl, Model, realModel);
const rtError_t error = apiInstance->ModelDestroyUnregisterCallback(realModel, fn);
COND_RETURN_WITH_NOLOG(error == RT_ERROR_FEATURE_NOT_SUPPORT, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtsNotifySetImportPid(rtNotify_t notify, int32_t pid[], int num)
{
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
const rtChipType_t chipType = rtInstance->GetChipType();
if (!IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_IPC_NOTIFY)) {
RT_LOG(RT_LOG_WARNING, "chip type(%d) does not support NotifySetImportPid.", static_cast<int32_t>(chipType));
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(notify, Notify, notifyPtr);
PARAM_NULL_RETURN_ERROR_WITH_EXT_ERRCODE(notifyPtr, RT_ERROR_INVALID_VALUE);
const rtError_t error = apiInstance->SetIpcNotifyPid(notifyPtr->GetIpcName().c_str(), pid, num);
COND_RETURN_WITH_NOLOG(error == RT_ERROR_FEATURE_NOT_SUPPORT, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtModelGetStreams(rtModel_t const mdl, rtStream_t* streams, uint32_t* numStreams)
{
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
static const bool isSupportAclGraph =
IS_SUPPORT_CHIP_FEATURE(rtInstance->GetChipType(), RtOptionalFeatureType::RT_FEATURE_MODEL_ACL_GRAPH);
if (!isSupportAclGraph) {
RT_LOG(
RT_LOG_WARNING, "chip type(%d) does not support, return.", static_cast<int32_t>(rtInstance->GetChipType()));
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(mdl, Model, realModel);
PARAM_NULL_RETURN_ERROR_WITH_EXT_ERRCODE(numStreams, RT_ERROR_INVALID_VALUE);
if (streams == nullptr) {
const rtError_t error = apiInstance->ModelGetStreams(realModel, nullptr, numStreams);
COND_RETURN_WITH_NOLOG(error == RT_ERROR_FEATURE_NOT_SUPPORT, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
if (*numStreams == 0U) {
Stream* stream = nullptr;
const rtError_t error = apiInstance->ModelGetStreams(realModel, &stream, numStreams);
COND_RETURN_WITH_NOLOG(error == RT_ERROR_FEATURE_NOT_SUPPORT, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
std::vector<Stream*> streamVec(*numStreams, nullptr);
const rtError_t error = apiInstance->ModelGetStreams(realModel, streamVec.data(), numStreams);
COND_RETURN_WITH_NOLOG(error == RT_ERROR_FEATURE_NOT_SUPPORT, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
for (uint32_t i = 0U; i < *numStreams; ++i) {
*(streams + i) = ExportEmbeddedHandle<rtStream_t>(streamVec[i]);
}
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtStreamGetTasks(rtStream_t const stm, rtTask_t* tasks, uint32_t* numTasks)
{
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
static const bool isSupportAclGraph =
IS_SUPPORT_CHIP_FEATURE(rtInstance->GetChipType(), RtOptionalFeatureType::RT_FEATURE_MODEL_ACL_GRAPH);
if (!isSupportAclGraph) {
RT_LOG(
RT_LOG_WARNING, "chip type(%d) does not support, return.", static_cast<int32_t>(rtInstance->GetChipType()));
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, streamPtr);
const rtError_t error = apiInstance->StreamGetTasks(streamPtr, static_cast<void**>(tasks), numTasks);
COND_RETURN_WITH_NOLOG(error == RT_ERROR_FEATURE_NOT_SUPPORT, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtLaunchSIMTKernelWithHostArgs(
void* func, rtDim3 gridDim, rtDim3 blockDim, size_t dynUbufSize, rtStream_t stm, rtKernelLaunchCfg_t* cfg,
void* hostArgs, uint32_t argsSize, rtPlaceHolderInfo_t* placeHolderArray, uint32_t placeHolderNum)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
NULL_PTR_RETURN_MSG_OUTER(func, ACL_ERROR_RT_INVALID_HANDLE);
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
if (IS_SUPPORT_CHIP_FEATURE(rtInstance->GetChipType(), RtOptionalFeatureType::RT_FEATURE_XPU)) {
RT_LOG(RT_LOG_WARNING, "XPU does not support rtLaunchSIMTKernelWithHostArgs");
return ACL_ERROR_RT_FEATURE_NOT_SUPPORT;
}
SimtArgsHost simtArgsHost = {};
simtArgsHost.gridDim = gridDim;
simtArgsHost.blockDim = blockDim;
simtArgsHost.hostArgs = hostArgs;
simtArgsHost.argsSize = argsSize;
simtArgsHost.placeHolderArray = placeHolderArray;
simtArgsHost.placeHolderNum = placeHolderNum;
simtArgsHost.dynUbufSize = dynUbufSize;
RtArgsWithType argsWithType = {};
argsWithType.type = RT_SIMT_ARGS_HOST;
argsWithType.args.simtArgsHost = &simtArgsHost;
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, exeStream);
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
Kernel* kernel = nullptr;
rtError_t ret = ConvertFuncToKernel(apiInstance, func, kernel, __func__);
if (ret != RT_ERROR_NONE) {
return ret;
}
ret = apiInstance->LaunchKernelV2(
kernel, simtArgsHost.gridDim.x * simtArgsHost.gridDim.y * simtArgsHost.gridDim.z, &argsWithType, exeStream,
cfg);
COND_RETURN_WITH_NOLOG(ret == RT_ERROR_KERNEL_INVALID, ACL_ERROR_RT_INVALID_HANDLE);
COND_RETURN_WITH_NOLOG(ret == RT_ERROR_FEATURE_NOT_SUPPORT, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
ERROR_RETURN_WITH_EXT_ERRCODE(ret);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtNotifyReset(rtNotify_t notify)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
if (IS_SUPPORT_CHIP_FEATURE(rtInstance->GetChipType(), RtOptionalFeatureType::RT_FEATURE_NOTIFY_RESET)) {
RT_VALIDATE_AND_UNWRAP_OBJECT(notify, Notify, notifyPtr);
const rtError_t error = apiInstance->NotifyReset(notifyPtr);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
} else {
RT_LOG(RT_LOG_WARNING, "chip type(%d) does not support.", static_cast<int32_t>(rtInstance->GetChipType()));
return ACL_ERROR_RT_FEATURE_NOT_SUPPORT;
}
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtSetOpExecuteTimeOut(uint32_t timeout)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
const rtChipType_t chipType = rtInstance->GetChipType();
if (IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_TASK_TIMEOUT_CONFIG)) {
COND_RETURN_WARN(
rtInstance->GetAicpuCnt() == 0, ACL_ERROR_RT_FEATURE_NOT_SUPPORT,
"does not support rtSetOpExecuteTimeOut.");
} else {
COND_RETURN_WARN(
IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_TASK_OP_EXE_TIMEOUT_CONFIG),
ACL_ERROR_RT_FEATURE_NOT_SUPPORT, "does not support rtSetOpExecuteTimeOut.");
}
const rtError_t error = apiInstance->SetOpExecuteTimeOut(timeout, RT_TIME_UNIT_TYPE_S);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
rtError_t rtBarrierTaskLaunch(rtBarrierTaskInfo_t* taskInfo, rtStream_t stm, uint32_t flag)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
const rtChipType_t chipType = rtInstance->GetChipType();
if (!IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_TASK_ASYNC_CMO)) {
RT_LOG_OUTER_MSG_WITH_FUNC(ErrorCode::EE1005);
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, streamPtr);
const rtError_t error = apiInstance->BarrierTaskLaunch(taskInfo, streamPtr, flag);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtBinaryLoadWithoutTilingKey(const void* data, const uint64_t length, rtBinHandle* binHandle)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
const rtChipType_t chipType = rtInstance->GetChipType();
if (!IS_SUPPORT_CHIP_FEATURE(chipType, RtOptionalFeatureType::RT_FEATURE_KERNEL_BINARY_LOAD_DOT_WITHOUT_TILING)) {
RT_LOG(RT_LOG_WARNING, "chip type(%d) does not support.", static_cast<int32_t>(chipType));
return GetRtExtErrCodeAndSetGlobalErr(RT_ERROR_FEATURE_NOT_SUPPORT);
}
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const rtError_t ret = apiInstance->BinaryLoadWithoutTilingKey(data, length, RtPtrToPtr<Program**>(binHandle));
ERROR_RETURN_WITH_EXT_ERRCODE(ret);
Program* const realProgram = RtPtrToPtr<Program*>(*binHandle);
InitEmbeddedInnerHandle<Program>(realProgram);
*binHandle = ExportEmbeddedHandle<rtBinHandle>(realProgram);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtBinaryEnumerateFunctions(rtBinHandle const binHandle, rtFuncHandle* funcHandles, uint32_t numFunctions)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
RT_VALIDATE_AND_UNWRAP_OBJECT_WITH_VALIDATOR(binHandle, Program, realProgram, ValidateProgramHandleForApi);
uint32_t actualCount = 0U;
const rtError_t ret = apiInstance->BinaryEnumerateFunctions(
realProgram, RtPtrToPtr<Kernel**>(funcHandles), numFunctions, &actualCount);
ERROR_RETURN_WITH_EXT_ERRCODE(ret);
for (uint32_t i = 0U; i < actualCount; i++) {
Kernel* const realKernel = RtPtrToPtr<Kernel*>(funcHandles[i]);
InitEmbeddedInnerHandle<Kernel>(realKernel);
funcHandles[i] = ExportEmbeddedHandle<rtFuncHandle>(realKernel);
}
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtLaunchSIMTKernelWithArgsArray(
void* func, rtDim3 gridDim, rtDim3 blockDim, size_t dynUbufSize, rtStream_t stm, rtKernelLaunchCfg_t* cfg,
void** args)
{
GLOBAL_STATE_WAIT_IF_LOCKED();
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const Runtime* const rtInstance = Runtime::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(rtInstance);
if (IS_SUPPORT_CHIP_FEATURE(rtInstance->GetChipType(), RtOptionalFeatureType::RT_FEATURE_XPU)) {
RT_LOG(RT_LOG_WARNING, "XPU does not support rtLaunchSIMTKernelWithArgsArray");
return ACL_ERROR_RT_FEATURE_NOT_SUPPORT;
}
SimtArgsArray simtArgsArray = {};
simtArgsArray.gridDim = gridDim;
simtArgsArray.blockDim = blockDim;
simtArgsArray.argsArrayInfo = args;
simtArgsArray.dynUbufSize = dynUbufSize;
RtArgsWithType argsWithType = {};
argsWithType.type = RT_SIMT_ARGS_ARRAY;
argsWithType.args.simtArgsArray = &simtArgsArray;
Kernel* kernel = nullptr;
rtError_t ret = ConvertFuncToKernel(apiInstance, func, kernel, __func__);
if (ret != RT_ERROR_NONE) {
return ret;
}
RT_VALIDATE_AND_UNWRAP_OBJECT(stm, Stream, exeStream);
ret = apiInstance->LaunchKernelV2(
kernel, simtArgsArray.gridDim.x * simtArgsArray.gridDim.y * simtArgsArray.gridDim.z, &argsWithType, exeStream,
cfg);
COND_RETURN_WITH_NOLOG(ret == RT_ERROR_KERNEL_INVALID, ACL_ERROR_RT_INVALID_HANDLE);
COND_RETURN_WITH_NOLOG(ret == RT_ERROR_FEATURE_NOT_SUPPORT, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
ERROR_RETURN_WITH_EXT_ERRCODE(ret);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtDeviceL2CacheFlush(void* rsv)
{
UNUSED(rsv);
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const rtError_t error = apiInstance->DeviceL2CacheFlush();
COND_RETURN_WITH_NOLOG(error == RT_ERROR_FEATURE_NOT_SUPPORT, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
VISIBILITY_DEFAULT
rtError_t rtHostGetDevicePointerAddrRange(rtAddrRange* addrRange, uint32_t* count)
{
Api* const apiInstance = Api::Instance();
NULL_RETURN_ERROR_WITH_EXT_ERRCODE(apiInstance);
const rtError_t error = apiInstance->HostGetDevicePointerAddrRange(addrRange, count);
COND_RETURN_WITH_NOLOG(error == RT_ERROR_DRV_NOT_SUPPORT, ACL_ERROR_RT_FEATURE_NOT_SUPPORT);
ERROR_RETURN_WITH_EXT_ERRCODE(error);
return ACL_RT_SUCCESS;
}
#ifdef __cplusplus
}
#endif