From 3c08c44daf0f28bec628c220a32d665115c44dae Mon Sep 17 00:00:00 2001 From: qq_49735440 Date: Mon, 15 Dec 2025 17:24:28 +0800 Subject: [PATCH 1/2] SIMT --- common/acl.cpp | 49 ++++++++++--- common/common_inner.h | 7 ++ common/json_parser.cpp | 69 ++++++++++--------- common/json_parser.h | 4 +- .../testStackSize_abnormal_-1.json | 4 +- .../testStackSize_abnormal_abc.json | 4 +- .../testStackSize_abnormal_aligned.json | 7 ++ .../testStackSize_abnormal_null.json | 2 +- .../testStackSize_normal_32768.json | 4 +- tests/ut/acl/testcase/acl_common_unittest.cpp | 27 ++++++++ 10 files changed, 131 insertions(+), 46 deletions(-) create mode 100644 tests/ut/acl/json/testStackSize/testStackSize_abnormal_aligned.json diff --git a/common/acl.cpp b/common/acl.cpp index 325c0b41..9c2c93ad 100755 --- a/common/acl.cpp +++ b/common/acl.cpp @@ -201,32 +201,63 @@ aclError HandleEventModeConfig(const char_t *const configPath) { return ACL_SUCCESS; } -aclError HandleDefaultDeviceAndStackSize(const char_t *const configPath) { +const std::map limitToKeyMap = { + {RT_LIMIT_TYPE_STACK_SIZE, "aicore_stack_size"}, + {RT_LIMIT_TYPE_SIMT_WARP_STACK_SIZE, "simt_stack_size"}, + {RT_LIMIT_TYPE_SIMT_DVG_WARP_STACK_SIZE, "simt_divergence_stack_size"} +}; + +// 封装的栈设置函数,从配置文件解析指定类型 +aclError SetStackSizeByType(const char_t *const configPath, rtLimitType_t limitType, + const std::string &typeName) { size_t stackSize = 0; bool stackSizeExist = false; - auto ret = acl::JsonParser::GetStackSize(configPath, stackSize, stackSizeExist); + + auto ret = acl::JsonParser::GetStackSizeByType(configPath, typeName, stackSize, stackSizeExist); if (ret != ACL_SUCCESS) { return ACL_ERROR_FAILURE; } - rtError_t rtErr = RT_ERROR_NONE; + if (stackSizeExist) { - rtErr = rtDeviceSetLimit(0, RT_LIMIT_TYPE_STACK_SIZE, static_cast(stackSize)); + rtError_t rtErr = rtDeviceSetLimit(0, limitType, static_cast(stackSize)); if (rtErr != RT_ERROR_NONE) { - ACL_LOG_CALL_ERROR("set limit (aicore_stack_size %zu)failed, runtime result = %d.", - stackSize, static_cast(ret)); + ACL_LOG_CALL_ERROR("set limit (%s %zu) failed, runtime result = %d.", + typeName.c_str(), stackSize, static_cast(rtErr)); return ACL_GET_ERRCODE_RTS(rtErr); } - ACL_LOG_INFO("get aicore stack size %zu success\n", stackSize); + ACL_LOG_INFO("get %s stack size %zu success\n", typeName.c_str(), stackSize); + } + + return ACL_SUCCESS; +} + +// 批量设置所有栈空间 +aclError SetAllStackSizes(const char_t *const configPath) { + for (const auto &entry : limitToKeyMap) { + rtLimitType_t limitType = entry.first; + const std::string &typeName = entry.second; // 获取类型名 + + aclError ret = SetStackSizeByType(configPath, limitType, typeName.c_str()); + if (ret != ACL_SUCCESS) { + return ret; // 任一失败即返回 + } } + return ACL_SUCCESS; +} + +aclError HandleDefaultDeviceAndStackSize(const char_t *const configPath) { + // 调用批量设置函数 + ACL_REQUIRES_OK(SetAllStackSizes(configPath)); + // 设置默认设备 int32_t defaultDeviceId = INVALID_DEFAULT_DEVICE; - ret = acl::JsonParser::GetDefaultDeviceIdFromFile(configPath, defaultDeviceId); + auto ret = acl::JsonParser::GetDefaultDeviceIdFromFile(configPath, defaultDeviceId); if (ret != ACL_SUCCESS) { return ACL_ERROR_FAILURE; } if (defaultDeviceId == INVALID_DEFAULT_DEVICE) { return ACL_SUCCESS; } - rtErr = rtSetDefaultDeviceId(defaultDeviceId); + rtError_t rtErr = rtSetDefaultDeviceId(defaultDeviceId); if (rtErr != RT_ERROR_NONE) { ACL_LOG_CALL_ERROR("set default device id failed, ret:%d", rtErr); return ACL_GET_ERRCODE_RTS(rtErr); diff --git a/common/common_inner.h b/common/common_inner.h index ecb72338..cfc6eb67 100755 --- a/common/common_inner.h +++ b/common/common_inner.h @@ -15,6 +15,7 @@ #include "acl/acl_base.h" #include "runtime/acl_rt_impl.h" #include "log_inner.h" +#include "runtime/base.h" namespace acl { const std::string &GetSocVersion(); @@ -42,11 +43,17 @@ namespace acl { int32_t UpdateOpSystemRunCfg(void *cfgAddr, uint32_t cfgLen); + extern const std::map limitToKeyMap; + aclError HandleEventModeConfig(const char_t *const configPath); aclError HandleDefaultDeviceAndStackSize(const char_t *const configPath); aclError GetAlignedAndPaddingSize(const size_t size, const bool isPadding, size_t &alignedSize); + + aclError SetAllStackSizes(const char_t *const configPath); + + aclError SetStackSizeByType(const char_t *const configPath, rtLimitType_t limitType, const std::string &typeName); } #endif // ACL_COMMON_INNER_API_H_ diff --git a/common/json_parser.cpp b/common/json_parser.cpp index 081d5bdf..34cf7329 100755 --- a/common/json_parser.cpp +++ b/common/json_parser.cpp @@ -385,40 +385,45 @@ namespace acl { return ACL_SUCCESS; } - aclError JsonParser::GetStackSize(const char_t *const fileName, size_t &aicoreStackSize, bool &exist) - { - ACL_LOG_DEBUG("start to execute GetStackSize."); - exist = false; - nlohmann::json js; - aclError ret = acl::JsonParser::ParseJsonFromFile(fileName, js); - if (ret != ACL_SUCCESS) { - ACL_LOG_ERROR("[Parse][JsonFromFile]parse default config from file[%s] failed, errorCode = %d", fileName, ret); - acl::AclErrorLogManager::ReportInputError(acl::INVALID_FILE_MSG, - std::vector({"path", "reason"}), - std::vector({fileName, "Parse config file failed"})); - return ret; - } - size_t statckSize = 0; - try { - if (JsonParser::ContainKey(js, "StackSize")) { - const nlohmann::json &stackSizeJs = JsonParser::GetCfgJsonByKey(js, "StackSize"); - if (JsonParser::ContainKey(stackSizeJs, "aicore_stack_size")) { - statckSize = stackSizeJs.at("aicore_stack_size").get(); - exist = true; - ACL_LOG_INFO("successfully parse aicore_stack_size, size is %zu", statckSize); - } - } - } catch (const nlohmann::json::exception &e) { - ACL_LOG_ERROR("parse config file [%s], exception: %s", fileName, e.what()); - acl::AclErrorLogManager::ReportInputError(acl::INVALID_FILE_MSG, - std::vector({"path", "reason"}), - std::vector({fileName, ("Parse exception: " + std::string(e.what())).c_str()})); - return ACL_ERROR_INTERNAL_ERROR; +aclError JsonParser::GetStackSizeByType(const char_t *const fileName, const std::string &typeName, size_t &outSize, + bool &outExist) +{ + ACL_LOG_DEBUG("start to execute GetStackSizeByType, typeName = %s.", typeName.c_str()); + outExist = false; + outSize = 0; + + nlohmann::json js; + aclError ret = acl::JsonParser::ParseJsonFromFile(fileName, js); + if (ret != ACL_SUCCESS) { + ACL_LOG_ERROR("[Parse][JsonFromFile]parse default config from file[%s] failed, errorCode = %d", fileName, + ret); + acl::AclErrorLogManager::ReportInputError( + acl::INVALID_FILE_MSG, std::vector({"path", "reason"}), + std::vector({fileName, "Parse config file failed"})); + return ret; + } + try { + if (!JsonParser::ContainKey(js, "StackSize")) { + ACL_LOG_DEBUG("StackSize key not found in config file [%s]", fileName); + return ACL_SUCCESS; } + const nlohmann::json &stackSizeJs = JsonParser::GetCfgJsonByKey(js, "StackSize"); - aicoreStackSize = statckSize; - ACL_LOG_DEBUG("successfully parse StackSize"); - return ACL_SUCCESS; + if (JsonParser::ContainKey(stackSizeJs, typeName.c_str())) { + size_t rawSize = stackSizeJs.at(typeName.c_str()).get(); + outSize = rawSize; + outExist = true; + ACL_LOG_INFO("successfully parse %s, size is %zu", typeName.c_str(), outSize); + } + } catch (const nlohmann::json::exception &e) { + ACL_LOG_ERROR("parse config file [%s], exception: %s", fileName, e.what()); + acl::AclErrorLogManager::ReportInputError( + acl::INVALID_FILE_MSG, std::vector({"path", "reason"}), + std::vector({fileName, ("Parse exception: " + std::string(e.what())).c_str()})); + return ACL_ERROR_INTERNAL_ERROR; } + ACL_LOG_DEBUG("successfully parse StackSize by type"); + return ACL_SUCCESS; +} } // namespace acl diff --git a/common/json_parser.h b/common/json_parser.h index 0ecd069a..e56f9239 100755 --- a/common/json_parser.h +++ b/common/json_parser.h @@ -15,6 +15,7 @@ #include "acl/acl_base.h" #include "log_inner.h" #include "utils/cann_info_utils.h" +#include "runtime/base.h" namespace acl { class JsonParser { @@ -26,9 +27,10 @@ namespace acl { const char_t *const fileName, std::map &cannInfoMap); static aclError GetDefaultDeviceIdFromFile(const char_t *const fileName, int32_t& devId); static aclError GetEventModeFromFile(const char_t *const fileName, uint8_t &event_mode, bool &found); - static aclError GetStackSize(const char_t *const fileName, size_t &aicoreStackSize, bool &exist); static aclError ParseJson(const char_t *const buffer, nlohmann::json &js); static aclError GetConfigStrFromFile(const char_t *const fileName, std::string &configBuffer); + static aclError GetStackSizeByType(const char_t *const fileName, const std::string &typeName, size_t &outSize, + bool &outExist); private: static void GetMaxNestedLayers(const char_t *const fileName, const size_t length, size_t &maxObjDepth, size_t &maxArrayDepth); diff --git a/tests/ut/acl/json/testStackSize/testStackSize_abnormal_-1.json b/tests/ut/acl/json/testStackSize/testStackSize_abnormal_-1.json index 2a900f88..3ee97948 100755 --- a/tests/ut/acl/json/testStackSize/testStackSize_abnormal_-1.json +++ b/tests/ut/acl/json/testStackSize/testStackSize_abnormal_-1.json @@ -1,5 +1,7 @@ { "StackSize":{ - "aicore_stack_size":-1 + "aicore_stack_size":-1, + "simt_stack_size":-1, + "simt_divergence_stack_size":-1 } } diff --git a/tests/ut/acl/json/testStackSize/testStackSize_abnormal_abc.json b/tests/ut/acl/json/testStackSize/testStackSize_abnormal_abc.json index 18c445de..263a928a 100755 --- a/tests/ut/acl/json/testStackSize/testStackSize_abnormal_abc.json +++ b/tests/ut/acl/json/testStackSize/testStackSize_abnormal_abc.json @@ -1,5 +1,7 @@ { "StackSize":{ - "aicore_stack_size":"abc" + "aicore_stack_size":"abc", + "simt_stack_size":"abc", + "simt_divergence_stack_size":"abc" } } diff --git a/tests/ut/acl/json/testStackSize/testStackSize_abnormal_aligned.json b/tests/ut/acl/json/testStackSize/testStackSize_abnormal_aligned.json new file mode 100644 index 00000000..f5a760f3 --- /dev/null +++ b/tests/ut/acl/json/testStackSize/testStackSize_abnormal_aligned.json @@ -0,0 +1,7 @@ +{ + "StackSize":{ + "aicore_stack_size":32768, + "simt_stack_size":200, + "simt_divergence_stack_size":300 + } +} diff --git a/tests/ut/acl/json/testStackSize/testStackSize_abnormal_null.json b/tests/ut/acl/json/testStackSize/testStackSize_abnormal_null.json index 4798c686..b1640bdc 100755 --- a/tests/ut/acl/json/testStackSize/testStackSize_abnormal_null.json +++ b/tests/ut/acl/json/testStackSize/testStackSize_abnormal_null.json @@ -1,5 +1,5 @@ { "StackSize":{ - "aicore_stack_size": + "aicore_stack_size":null } } diff --git a/tests/ut/acl/json/testStackSize/testStackSize_normal_32768.json b/tests/ut/acl/json/testStackSize/testStackSize_normal_32768.json index 3bc94fbd..c2d1b9f7 100755 --- a/tests/ut/acl/json/testStackSize/testStackSize_normal_32768.json +++ b/tests/ut/acl/json/testStackSize/testStackSize_normal_32768.json @@ -1,5 +1,7 @@ { "StackSize":{ - "aicore_stack_size":32768 + "aicore_stack_size":32768, + "simt_stack_size":256, + "simt_divergence_stack_size":1024 } } diff --git a/tests/ut/acl/testcase/acl_common_unittest.cpp b/tests/ut/acl/testcase/acl_common_unittest.cpp index 32a3158d..0592df99 100755 --- a/tests/ut/acl/testcase/acl_common_unittest.cpp +++ b/tests/ut/acl/testcase/acl_common_unittest.cpp @@ -243,6 +243,8 @@ TEST_F(UTEST_ACL_Common, SetStackSize) ret = HandleDefaultDeviceAndStackSize(ACL_BASE_DIR "/tests/ut/acl/json/testStackSize/testStackSize_abnormal_-1.json"); EXPECT_EQ(ret, ACL_SUCCESS); + ret = HandleDefaultDeviceAndStackSize(ACL_BASE_DIR "/tests/ut/acl/json/testStackSize/testStackSize_abnormal_aligned.json"); + EXPECT_EQ(ret, ACL_SUCCESS); // not exist file ret = HandleDefaultDeviceAndStackSize(ACL_BASE_DIR "/tests/ut/acl/json/testStackSize/xxxxxxxxxxxxx.json"); EXPECT_EQ(ret, ACL_ERROR_FAILURE); @@ -254,6 +256,31 @@ TEST_F(UTEST_ACL_Common, SetStackSize) EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID); } +TEST_F(UTEST_ACL_Common, SetStackSize_SimtStackFail) +{ + // 测试SIMT栈设置失败的情况 + EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtDeviceSetLimit(_,_,_)) + .WillOnce(Return(0)) // 第一次调用成功(aicore_stack_size) + .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID)) // 第二次调用失败(simt_stack_size) + .WillRepeatedly(Return(0)); + + aclError ret = HandleDefaultDeviceAndStackSize(ACL_BASE_DIR "/tests/ut/acl/json/testStackSize/testStackSize_normal_32768.json"); + EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID); +} + +TEST_F(UTEST_ACL_Common, SetStackSize_SimtDivergenceStackFail) +{ + // 测试SIMT分支栈设置失败的情况 + EXPECT_CALL(MockFunctionTest::aclStubInstance(), rtDeviceSetLimit(_,_,_)) + .WillOnce(Return(0)) // 第一次调用成功(aicore_stack_size) + .WillOnce(Return(0)) // 第二次调用成功(simt_stack_size) + .WillOnce(Return(ACL_ERROR_RT_PARAM_INVALID)) // 第三次调用失败(simt_divergence_stack_size) + .WillRepeatedly(Return(0)); + + aclError ret = HandleDefaultDeviceAndStackSize(ACL_BASE_DIR "/tests/ut/acl/json/testStackSize/testStackSize_normal_32768.json"); + EXPECT_EQ(ret, ACL_ERROR_RT_PARAM_INVALID); +} + TEST_F(UTEST_ACL_Common, ErrorManagerTest) { auto ret = aclInitCallbackRegister(ACL_REG_TYPE_ACL_DVPP, InitCallback_Fail, nullptr); -- Gitee From 21e73afad4d01223481fc3c2dc71e84988717912 Mon Sep 17 00:00:00 2001 From: qq_49735440 Date: Sat, 27 Dec 2025 15:39:45 +0800 Subject: [PATCH 2/2] aclrtLaunchKernelWithHostArgs --- inc/external/acl/acl_rt.h | 58 ++++++++++++++++++++++++++------------- runtime/acl_rt.cpp | 24 ++++++++++------ runtime/acl_rt_impl.h | 6 +++- runtime/kernel.cpp | 29 ++++++++++++++++++++ 4 files changed, 89 insertions(+), 28 deletions(-) diff --git a/inc/external/acl/acl_rt.h b/inc/external/acl/acl_rt.h index 9ca51f8b..f7910b65 100755 --- a/inc/external/acl/acl_rt.h +++ b/inc/external/acl/acl_rt.h @@ -291,38 +291,38 @@ typedef struct aclrtMemUceInfo { size_t reserved[UCE_INFO_RESERVED_SIZE]; } aclrtMemUceInfo; -typedef enum { +typedef enum { ACL_RT_NO_ERROR = 0, - ACL_RT_ERROR_MEMORY = 1, - ACL_RT_ERROR_L2 = 2, - ACL_RT_ERROR_AICORE = 3, - ACL_RT_ERROR_LINK = 4, + ACL_RT_ERROR_MEMORY = 1, + ACL_RT_ERROR_L2 = 2, + ACL_RT_ERROR_AICORE = 3, + ACL_RT_ERROR_LINK = 4, ACL_RT_ERROR_OTHERS = 0xFFFF, } aclrtErrorType; -typedef enum aclrtAicoreErrorType { - ACL_RT_AICORE_ERROR_UNKNOWN, - ACL_RT_AICORE_ERROR_SW, - ACL_RT_AICORE_ERROR_HW_LOCAL, +typedef enum aclrtAicoreErrorType { + ACL_RT_AICORE_ERROR_UNKNOWN, + ACL_RT_AICORE_ERROR_SW, + ACL_RT_AICORE_ERROR_HW_LOCAL, } aclrtAicoreErrorType; -#define ACL_RT_MEM_UCE_INFO_MAX_NUM 20 +#define ACL_RT_MEM_UCE_INFO_MAX_NUM 20 typedef struct { size_t arraySize; - aclrtMemUceInfo memUceInfoArray[ACL_RT_MEM_UCE_INFO_MAX_NUM]; + aclrtMemUceInfo memUceInfoArray[ACL_RT_MEM_UCE_INFO_MAX_NUM]; } aclrtMemUceInfoArray; -typedef union aclrtErrorInfoDetail { - aclrtMemUceInfoArray uceInfo; - aclrtAicoreErrorType aicoreErrType; -} aclrtErrorInfoDetail; +typedef union aclrtErrorInfoDetail { + aclrtMemUceInfoArray uceInfo; + aclrtAicoreErrorType aicoreErrType; +} aclrtErrorInfoDetail; -typedef struct aclrtErrorInfo { - uint8_t tryRepair; +typedef struct aclrtErrorInfo { + uint8_t tryRepair; uint8_t hasDetail; uint8_t reserved[2]; aclrtErrorType errorType; - aclrtErrorInfoDetail detail; + aclrtErrorInfoDetail detail; } aclrtErrorInfo; typedef enum aclrtCmoType { @@ -845,7 +845,7 @@ ACL_FUNC_VISIBILITY aclError aclrtResetDevice(int32_t deviceId); * * @retval ACL_SUCCESS The function is successfully executed. * @retval OtherValues Failure - * + * * @see aclrtResetDevice */ ACL_FUNC_VISIBILITY aclError aclrtResetDeviceForce(int32_t deviceId); @@ -3622,6 +3622,26 @@ ACL_FUNC_VISIBILITY aclError aclrtSnapShotProcessRestore(); */ ACL_FUNC_VISIBILITY aclError aclrtLaunchHostFunc(aclrtStream stream, aclrtHostFunc fn, void *args); +/** + * @ingroup AscendCL + * @brief Launch kernel with host args + * @param [in] funcHandle function handle + * @param [in] blockDim block dimentions + * @param [in] stream stream handle + * @param [in] cfg configuration information + * @param [in] hostArgs host args data + * @param [in] argsSize args size + * @param [in] placeHolderArray placeHolder array + * @param [in] placeHolderNum placeHolder num + * @retval ACL_SUCCESS The function is successfully executed. + * @retval OtherValues Failure + */ +ACL_FUNC_VISIBILITY aclError aclrtLaunchKernelWithHostArgs(aclrtFuncHandle funcHandle, uint32_t blockDim, + aclrtStream stream, aclrtLaunchKernelCfg *cfg, + void *hostArgs, size_t argsSize, + aclrtPlaceHolderInfo *placeHolderArray, + size_t placeHolderNum); + #ifdef __cplusplus } #endif diff --git a/runtime/acl_rt.cpp b/runtime/acl_rt.cpp index d2babe0f..93e7cdda 100755 --- a/runtime/acl_rt.cpp +++ b/runtime/acl_rt.cpp @@ -1543,16 +1543,16 @@ aclError aclrtAllocatorUnregister(aclrtStream stream) return aclrtAllocatorUnregisterImpl(stream); } -aclError aclrtGetErrorVerbose(int32_t deviceId, aclrtErrorInfo *errorInfo) -{ - ACL_PROFILING_REG(acl::AclProfType::AclrtGetErrorVerbose); - return aclrtGetErrorVerboseImpl(deviceId, errorInfo); +aclError aclrtGetErrorVerbose(int32_t deviceId, aclrtErrorInfo *errorInfo) +{ + ACL_PROFILING_REG(acl::AclProfType::AclrtGetErrorVerbose); + return aclrtGetErrorVerboseImpl(deviceId, errorInfo); } -aclError aclrtRepairError(int32_t deviceId, const aclrtErrorInfo *errorInfo) -{ - ACL_PROFILING_REG(acl::AclProfType::AclrtRepairError); - return aclrtRepairErrorImpl(deviceId, errorInfo); +aclError aclrtRepairError(int32_t deviceId, const aclrtErrorInfo *errorInfo) +{ + ACL_PROFILING_REG(acl::AclProfType::AclrtRepairError); + return aclrtRepairErrorImpl(deviceId, errorInfo); } aclError aclrtSnapShotProcessLock() { @@ -1583,3 +1583,11 @@ aclError aclrtLaunchHostFunc(aclrtStream stream, aclrtHostFunc fn, void *args) ACL_PROFILING_REG(acl::AclProfType::AclrtLaunchHostFunc); return aclrtLaunchHostFuncImpl(stream, fn, args); } + +aclError aclrtLaunchKernelWithHostArgs(aclrtFuncHandle funcHandle, uint32_t blockDim, aclrtStream stream, + aclrtLaunchKernelCfg *cfg, void *hostArgs, size_t argsSize, + aclrtPlaceHolderInfo *placeHolderArray, size_t placeHolderNum) +{ + return aclrtLaunchKernelWithHostArgsImpl(funcHandle, blockDim, stream, cfg, hostArgs, argsSize, + placeHolderArray, placeHolderNum); +} \ No newline at end of file diff --git a/runtime/acl_rt_impl.h b/runtime/acl_rt_impl.h index 97f4a710..dd2cdc92 100755 --- a/runtime/acl_rt_impl.h +++ b/runtime/acl_rt_impl.h @@ -313,7 +313,7 @@ ACL_FUNC_VISIBILITY aclError aclrtKernelArgsAppendPlaceHolderImpl(aclrtArgsHandl aclrtParamHandle *paramHandle); ACL_FUNC_VISIBILITY aclError aclrtKernelArgsGetPlaceHolderBufferImpl(aclrtArgsHandle argsHandle, - aclrtParamHandle paramHandle, size_t dataSize, void **bufferAddr); + aclrtParamHandle paramHandle, size_t dataSize, void **bufferAddr); ACL_FUNC_VISIBILITY aclError aclrtKernelArgsParaUpdateImpl(aclrtArgsHandle argsHandle, aclrtParamHandle paramHandle, void *param, size_t paramSize); @@ -573,6 +573,10 @@ ACL_FUNC_VISIBILITY aclError aclrtSnapShotProcessRestoreImpl(); ACL_FUNC_VISIBILITY aclError aclrtLaunchHostFuncImpl(aclrtStream stream, aclrtHostFunc fn, void *args); +ACL_FUNC_VISIBILITY aclError aclrtLaunchKernelWithHostArgsImpl(aclrtFuncHandle funcHandle, uint32_t blockDim, + aclrtStream stream, aclrtLaunchKernelCfg *cfg, void *hostArgs, size_t argsSize, + aclrtPlaceHolderInfo *placeHolderArray, size_t placeHolderNum); + #ifdef __cplusplus } #endif diff --git a/runtime/kernel.cpp b/runtime/kernel.cpp index fbe08907..9a598739 100755 --- a/runtime/kernel.cpp +++ b/runtime/kernel.cpp @@ -402,3 +402,32 @@ aclError aclrtCmoWaitBarrierImpl(aclrtBarrierTaskInfo *taskInfo, aclrtStream str } return ACL_SUCCESS; } + +aclError aclrtLaunchKernelWithHostArgsImpl(aclrtFuncHandle funcHandle, uint32_t blockDim, aclrtStream stream, + aclrtLaunchKernelCfg *cfg, void *hostArgs, size_t argsSize, + aclrtPlaceHolderInfo *placeHolderArray, size_t placeHolderNum) +{ + ACL_PROFILING_REG(acl::AclProfType::AclrtLaunchKernelWithHostArgs); + ACL_LOG_INFO("Start to execute aclrtLaunchKernelWithHostArgs"); + ACL_REQUIRES_NOT_NULL_WITH_INPUT_REPORT(funcHandle); + ACL_REQUIRES_NOT_NULL_WITH_INPUT_REPORT(hostArgs); + + rtKernelLaunchCfg_t *rt_cfg = nullptr; + rtPlaceHolderInfo_t *rt_placeHolderArray = nullptr; + if (cfg != nullptr ) { + rt_cfg = reinterpret_cast(cfg); + } + + if (placeHolderArray != nullptr ) { + rt_placeHolderArray = reinterpret_cast(placeHolderArray); + } + + const rtError_t rtErr = rtsLaunchKernelWithHostArgs(funcHandle, blockDim, stream, rt_cfg, + hostArgs, static_cast(argsSize), rt_placeHolderArray, placeHolderNum); + if (rtErr != RT_ERROR_NONE) { + ACL_LOG_CALL_ERROR("rtsLaunchKernelWithHostArgs failed, runtime result = %d.", rtErr); + return ACL_GET_ERRCODE_RTS(rtErr); + } + + return ACL_SUCCESS; +} \ No newline at end of file -- Gitee