|
|
|
@@ -18,6 +18,7 @@ |
|
|
|
|
|
|
|
#include <string> |
|
|
|
|
|
|
|
#include "aicpu/aicpu_schedule/aicpu_op_type_list.h" |
|
|
|
#include "common/dump/dump_manager.h" |
|
|
|
#include "common/l2_cache_optimize.h" |
|
|
|
#include "common/profiling/profiling_manager.h" |
|
|
|
@@ -1499,4 +1500,165 @@ Status ModelManager::EnableExceptionDump(const std::map<string, string> &options |
|
|
|
return SUCCESS; |
|
|
|
} |
|
|
|
|
|
|
|
Status ModelManager::LaunchKernelCheckAicpuOpType(GeModelPtr ge_model) { |
|
|
|
GE_CHECK_NOTNULL(ge_model); |
|
|
|
std::string kernel_name = "checkOpType"; |
|
|
|
GELOGI("LaunchCustAucpuSo in, kernel name %s", kernel_name.c_str()); |
|
|
|
std::lock_guard<std::mutex> lock(cust_aicpu_mutex_); |
|
|
|
std::vector<std::string> aicpu_optype_list; |
|
|
|
std::vector<std::string> aicpu_tf_optype_list; |
|
|
|
|
|
|
|
bool aicpu_need_check = ge::AttrUtils.GetListStr(&ge_model, "needCheckCpu", aicpu_optype_list); |
|
|
|
bool tf_need_check = ge::AttrUtils.GetListStr(&ge_model, "needCheckTf", aicpu_tf_optype_list); |
|
|
|
|
|
|
|
if (!aicpu_need_check && !tf_need_check) |
|
|
|
{ |
|
|
|
GELOGI("No need to check aicpu optype."); |
|
|
|
return SUCCESS; |
|
|
|
} |
|
|
|
|
|
|
|
vector<void *> allocated_mem; |
|
|
|
rtError_t status; |
|
|
|
rtStream_t stream = nullptr; |
|
|
|
void *args = nullptr; |
|
|
|
|
|
|
|
void *d_req_op_list = nullptr; |
|
|
|
void *d_res_op_list = nullptr; |
|
|
|
void *d_ret_code_list = nullptr; |
|
|
|
|
|
|
|
size_t aicpu_op_nums = aicpu_optype_list.size(); |
|
|
|
size_t tf_op_nums = aicpu_tf_optype_list.size(); |
|
|
|
size_t op_nums = aicpu_op_nums + tf_op_nums; |
|
|
|
// malloc sysOpInfoList in SysOpCheckInfo |
|
|
|
status = rtMalloc(&d_req_op_list, op_nums * sizeof(SysOpInfo), RT_MEMORY_HBM); |
|
|
|
if (status != RT_ERROR_NONE) { |
|
|
|
GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); |
|
|
|
return RT_ERROR_TO_GE_STATUS(status); |
|
|
|
} |
|
|
|
allocated_mem.push_back(d_req_op_list); |
|
|
|
|
|
|
|
// malloc sysOpInfoList in SysOpCheckResp |
|
|
|
status = rtMalloc(&d_res_op_list, op_nums * sizeof(SysOpInfo), RT_MEMORY_HBM); |
|
|
|
if (status != RT_ERROR_NONE) { |
|
|
|
GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); |
|
|
|
return RT_ERROR_TO_GE_STATUS(status); |
|
|
|
} |
|
|
|
allocated_mem.push_back(d_res_op_list); |
|
|
|
|
|
|
|
// malloc returnCodeList in SysOpCheckResp |
|
|
|
status = rtMalloc(&d_ret_code_list, op_nums * sizeof(ReturnCode), RT_MEMORY_HBM); |
|
|
|
if (status != RT_ERROR_NONE) { |
|
|
|
GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); |
|
|
|
return RT_ERROR_TO_GE_STATUS(status); |
|
|
|
} |
|
|
|
allocated_mem.push_back(d_ret_code_list); |
|
|
|
|
|
|
|
for (const auto &op_type : aicpu_optype_list) { |
|
|
|
uint32_t i = 0; |
|
|
|
SysOpInfo op_info; |
|
|
|
// malloc op_type name in SysOpInfo |
|
|
|
void *d_op_type_name = nullptr; |
|
|
|
status = rtMalloc(&d_op_type_name, op_type.length(), RT_MEMORY_HBM); |
|
|
|
if (status != RT_ERROR_NONE) { |
|
|
|
GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); |
|
|
|
return RT_ERROR_TO_GE_STATUS(status); |
|
|
|
} |
|
|
|
allocated_mem.push_back(d_op_type_name); |
|
|
|
GE_CHK_RT(rtMemcpy(d_op_type_name, op_type.length(), op_type.c_str(), op_type.length(), RT_MEMCPY_HOST_TO_DEVICE)); |
|
|
|
op_info.opType = reinterpret_cast<uint64_t>(reinterpret_cast<uintptr_t>(d_op_type_name)); |
|
|
|
op_info.opLen = op_type.length(); |
|
|
|
op_info.kernelsType = CPU_KERNEL; |
|
|
|
GE_CHK_RT(rtMemcpy(d_req_op_list + i * sizeof(SysOpInfo), sizeof(SysOpInfo), &op_info, sizeof(SysOpInfo), RT_MEMCPY_HOST_TO_DEVICE)); |
|
|
|
i++; |
|
|
|
} |
|
|
|
|
|
|
|
for (const auto &op_type : aicpu_tf_optype_list) { |
|
|
|
uint32_t i = aicpu_op_nums; |
|
|
|
SysOpInfo op_info; |
|
|
|
// malloc op_type name in SysOpInfo |
|
|
|
void *d_op_type_name = nullptr; |
|
|
|
status = rtMalloc(&d_op_type_name, op_type.size(), RT_MEMORY_HBM); |
|
|
|
if (status != RT_ERROR_NONE) { |
|
|
|
GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); |
|
|
|
return RT_ERROR_TO_GE_STATUS(status); |
|
|
|
} |
|
|
|
allocated_mem.push_back(d_op_type_name); |
|
|
|
GE_CHK_RT(rtMemcpy(d_op_type_name, op_type.size(), op_type.c_str(), op_type.size(), RT_MEMCPY_HOST_TO_DEVICE)); |
|
|
|
op_info.opType = reinterpret_cast<uint64_t>(reinterpret_cast<uintptr_t>(d_op_type_name)); |
|
|
|
op_info.opLen = op_type.size(); |
|
|
|
op_info.kernelsType = TF_KERNEL; |
|
|
|
GE_CHK_RT(rtMemcpy(d_req_op_list + i * sizeof(SysOpInfo), sizeof(SysOpInfo), &op_info, sizeof(SysOpInfo), RT_MEMCPY_HOST_TO_DEVICE)); |
|
|
|
i++; |
|
|
|
} |
|
|
|
|
|
|
|
SysOpCheckInfo op_check_info_req; |
|
|
|
SysOpCheckResp op_check_info_res; |
|
|
|
op_check_info_req.opListNum = op_nums; |
|
|
|
op_check_info_req.offSetLen = sizeof(SysOpCheckInfo); |
|
|
|
SysOpCheckInfo.sysOpInfoList = d_req_op_list; |
|
|
|
|
|
|
|
op_check_info_res.opListNum = op_nums; |
|
|
|
op_check_info_res.returnCodeList = d_ret_code_list; |
|
|
|
op_check_info_res.sysOpInfoList = d_res_op_list; |
|
|
|
|
|
|
|
uint32_t args_size = sizeof(SysOpCheckInfo) + sizeof(SysOpCheckResp); |
|
|
|
status = rtMalloc(&args, args_size, RT_MEMORY_HBM); |
|
|
|
if (status != RT_ERROR_NONE) { |
|
|
|
GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); |
|
|
|
return RT_ERROR_TO_GE_STATUS(status); |
|
|
|
} |
|
|
|
allocated_mem.push_back(args); |
|
|
|
GE_CHK_RT(rtMemcpy(args, sizeof(SysOpCheckInfo), &op_check_info_req, sizeof(SysOpCheckInfo), RT_MEMCPY_HOST_TO_DEVICE)); |
|
|
|
GE_CHK_RT(rtMemcpy(args + op_check_info_req.offSetLen, sizeof(SysOpCheckResp), &op_check_info_res, sizeof(SysOpCheckResp), RT_MEMCPY_HOST_TO_DEVICE)); |
|
|
|
|
|
|
|
GE_CHK_RT(rtStreamCreate(&stream, 0)); |
|
|
|
GE_CHK_RT(rtCpuKernelLaunch(nullptr, kernel_name.c_str(), 1, args, args_size, nullptr, stream)); |
|
|
|
|
|
|
|
status = rtStreamSynchronize(stream); |
|
|
|
if (status != RT_ERROR_NONE) { |
|
|
|
GELOGE(RT_FAILED, "Call rt stream sync failed, status: 0x%x", status); |
|
|
|
return RT_ERROR_TO_GE_STATUS(status); |
|
|
|
} |
|
|
|
|
|
|
|
// Check the response |
|
|
|
void *d_op_check_info_res = args + op_check_info_req.offSetLen; |
|
|
|
std::vector<SysOpInfo> res_sysopinfo_list; |
|
|
|
std::vector<ReturnCode> ret_code_list; |
|
|
|
op_check_info_res = {}; |
|
|
|
GE_CHK_RT(rtMemcpy(&op_check_info_res, sizeof(SysOpCheckResp), d_op_check_info_res, sizeof(SysOpCheckResp), RT_MEMCPY_DEVICE_TO_HOST)); |
|
|
|
std::function<void()> callback = [&]() { |
|
|
|
for (auto mem : allocated_mem) { |
|
|
|
GE_CHK_RT(rtFree(mem)); |
|
|
|
} |
|
|
|
GE_CHK_RT(rtStreamDestroy(stream)); |
|
|
|
}; |
|
|
|
|
|
|
|
if (op_check_info_res.opListNum != 0) { |
|
|
|
String fail_reason = "Check aicpu op_type failed. details: \n"; |
|
|
|
for (uint32_t i = 0; i < op_check_info_res.opListNum; i++) { |
|
|
|
ReturnCode ret_code; |
|
|
|
GE_CHK_RT(rtMemcpy(&ret_code, sizeof(ReturnCode), op_check_info_res.returnCodeList + i * sizeof(ReturnCode), sizeof(ReturnCode), RT_MEMCPY_DEVICE_TO_HOST)); |
|
|
|
SysOpInfo aicpu_info; |
|
|
|
GE_CHK_RT(rtMemcpy(&aicpu_info, sizeof(SysOpInfo), op_check_info_res.sysOpInfoList + i * sizeof(SysOpInfo), sizeof(SysOpInfo), RT_MEMCPY_DEVICE_TO_HOST)); |
|
|
|
std::vector<char> op_name; |
|
|
|
GE_CHK_RT(rtMemcpy(op_name.data(), aicpu_info.opLen, aicpu_info.opType, aicpu_info.opLen, RT_MEMCPY_DEVICE_TO_HOST)); |
|
|
|
String kernel_type = static_cast<OpKernelType>(aicpu_info.kernelsType) == TF_KERNEL ? "TF_KERNEL" : "CPU_KERNEL"; |
|
|
|
string op_name_str(op_name.data()); |
|
|
|
fail_reason += "op_type: " + op_name_str + " kernel_type: " + kernel_type + " " + ret_code + "<0: op_type, 1: format, 2: datatype> not support\n"; |
|
|
|
} |
|
|
|
GELOGE(FAILED, fail_reason); |
|
|
|
GE_MAKE_GUARD(release, callback); |
|
|
|
return FAILED; |
|
|
|
} |
|
|
|
|
|
|
|
GE_MAKE_GUARD(release, callback); |
|
|
|
GELOGI("Cpu kernel launch check optype task success."); |
|
|
|
return SUCCESS; |
|
|
|
} |
|
|
|
|
|
|
|
Status ModelManager::CheckAicpuOptype(GeModelPtr ge_model) { |
|
|
|
GE_CHK_STATUS_RET(LaunchKernelCheckAicpuType(ge_model), "launch cust op so failed."); |
|
|
|
return SUCCESS; |
|
|
|
} |
|
|
|
|
|
|
|
} // namespace ge |