From: @ding_fei_fei Reviewed-by: @xsmq,@liucunwei,@liucunwei Signed-off-by: @liucunwei,@liucunweitags/v1.3.0
@@ -229,7 +229,7 @@ if [[ "X$ENABLE_GE_UT" = "Xon" || "X$ENABLE_GE_COV" = "Xon" ]]; then | |||||
rm -rf ${BASEPATH}/cov | rm -rf ${BASEPATH}/cov | ||||
mkdir ${BASEPATH}/cov | mkdir ${BASEPATH}/cov | ||||
lcov -c -d build/tests/ut/ge -d build/tests/ut/common/graph/ -o cov/tmp.info | lcov -c -d build/tests/ut/ge -d build/tests/ut/common/graph/ -o cov/tmp.info | ||||
lcov -r cov/tmp.info '*/output/*' '*/build/opensrc/*' '*/build/proto/*' '*/third_party/*' '*/tests/*' '/usr/local/*' -o cov/coverage.info | |||||
lcov -r cov/tmp.info '*/output/*' '*/build/opensrc/*' '*/build/proto/*' '*/third_party/*' '*/tests/*' '/usr/local/*' '/usr/include/*' '*/metadef/*' '*/parser/*' -o cov/coverage.info | |||||
cd ${BASEPATH}/cov | cd ${BASEPATH}/cov | ||||
genhtml coverage.info | genhtml coverage.info | ||||
fi | fi | ||||
@@ -31,6 +31,7 @@ set(PROTO_HEADER_LIST | |||||
protobuf_generate(ge PROTO_SRCS PROTO_HDRS ${PROTO_LIST}) | protobuf_generate(ge PROTO_SRCS PROTO_HDRS ${PROTO_LIST}) | ||||
protobuf_generate(ge PROTO_CLIENT_SRCS PROTO_CLIENT_HDRS ${PROTO_CLIENT_LIST}) | protobuf_generate(ge PROTO_CLIENT_SRCS PROTO_CLIENT_HDRS ${PROTO_CLIENT_LIST}) | ||||
protobuf_generate(ge PROTO_HEADER_SRCS PROTO_HEADER_HDRS ${PROTO_HEADER_LIST}) | protobuf_generate(ge PROTO_HEADER_SRCS PROTO_HEADER_HDRS ${PROTO_HEADER_LIST}) | ||||
protobuf_generate(ge_client PROTO_CLIENT_HEADER_SRCS PROTO_CLIENT_HEADER_HDRS ${PROTO_HEADER_LIST}) | |||||
if (NOT ENABLE_D AND NOT ENABLE_ACL AND NOT ENABLE_MS_TESTCASES) | if (NOT ENABLE_D AND NOT ENABLE_ACL AND NOT ENABLE_MS_TESTCASES) | ||||
############ libge_proto_common.a ############ | ############ libge_proto_common.a ############ | ||||
@@ -56,7 +57,7 @@ target_link_libraries(ge_proto_common PRIVATE | |||||
############ libge_proto_client.a ############ | ############ libge_proto_client.a ############ | ||||
add_library(ge_proto_client STATIC | add_library(ge_proto_client STATIC | ||||
${PROTO_HEADER_HDRS} | |||||
${PROTO_CLIENT_HEADER_HDRS} | |||||
${PROTO_CLIENT_SRCS} | ${PROTO_CLIENT_SRCS} | ||||
) | ) | ||||
@@ -65,6 +66,11 @@ target_compile_definitions(ge_proto_client PRIVATE | |||||
google=ascend_private | google=ascend_private | ||||
) | ) | ||||
target_include_directories(ge_proto_client PRIVATE | |||||
${CMAKE_BINARY_DIR}/proto/ge_client | |||||
${CMAKE_BINARY_DIR}/proto/ge_client/proto | |||||
) | |||||
target_compile_options(ge_proto_client PRIVATE | target_compile_options(ge_proto_client PRIVATE | ||||
-O2 | -O2 | ||||
-fno-common | -fno-common | ||||
@@ -102,6 +108,7 @@ set(TRAIN_SRC_LIST | |||||
"common/helper/model_cache_helper.cc" | "common/helper/model_cache_helper.cc" | ||||
"common/profiling/profiling_manager.cc" | "common/profiling/profiling_manager.cc" | ||||
"common/dump/dump_manager.cc" | "common/dump/dump_manager.cc" | ||||
"common/dump/exception_dumper.cc" | |||||
"common/dump/dump_properties.cc" | "common/dump/dump_properties.cc" | ||||
"common/dump/opdebug_register.cc" | "common/dump/opdebug_register.cc" | ||||
"common/dump/dump_op.cc" | "common/dump/dump_op.cc" | ||||
@@ -189,6 +196,7 @@ set(TRAIN_SRC_LIST | |||||
"graph/passes/atomic_addr_clean_pass.cc" | "graph/passes/atomic_addr_clean_pass.cc" | ||||
"graph/passes/mark_same_addr_pass.cc" | "graph/passes/mark_same_addr_pass.cc" | ||||
"graph/passes/mark_graph_unknown_status_pass.cc" | "graph/passes/mark_graph_unknown_status_pass.cc" | ||||
"graph/passes/mark_node_unknown_shape_pass.cc" | |||||
"graph/passes/mark_agnostic_pass.cc" | "graph/passes/mark_agnostic_pass.cc" | ||||
"graph/partition/dynamic_shape_partition.cc" | "graph/partition/dynamic_shape_partition.cc" | ||||
"graph/partition/stage_partition.cc" | "graph/partition/stage_partition.cc" | ||||
@@ -209,6 +217,7 @@ set(TRAIN_SRC_LIST | |||||
"graph/passes/dimension_compute_pass.cc" | "graph/passes/dimension_compute_pass.cc" | ||||
"graph/passes/dropout_pass.cc" | "graph/passes/dropout_pass.cc" | ||||
"graph/passes/hccl_group_pass.cc" | "graph/passes/hccl_group_pass.cc" | ||||
"graph/passes/hccl_tailing_optimization_pass.cc" | |||||
"graph/passes/enter_pass.cc" | "graph/passes/enter_pass.cc" | ||||
"graph/passes/assign_remove_pass.cc" | "graph/passes/assign_remove_pass.cc" | ||||
"graph/passes/inplace_support_check_pass.cc" | "graph/passes/inplace_support_check_pass.cc" | ||||
@@ -320,7 +329,9 @@ set(TRAIN_SRC_LIST | |||||
"graph/passes/variable_ref_useless_control_out_delete_pass.cc" | "graph/passes/variable_ref_useless_control_out_delete_pass.cc" | ||||
"graph/passes/end_of_sequence_add_control_pass.cc" | "graph/passes/end_of_sequence_add_control_pass.cc" | ||||
"graph/passes/memcpy_addr_async_pass.cc" | "graph/passes/memcpy_addr_async_pass.cc" | ||||
"graph/passes/parallel_group_pass.cc" | |||||
"graph/passes/set_input_output_offset_pass.cc" | "graph/passes/set_input_output_offset_pass.cc" | ||||
"graph/passes/buffer_pool_memory_pass.cc" | |||||
"graph/preprocess/graph_preprocess.cc" | "graph/preprocess/graph_preprocess.cc" | ||||
"graph/preprocess/insert_op/ge_aipp_op.cc" | "graph/preprocess/insert_op/ge_aipp_op.cc" | ||||
"graph/preprocess/insert_op/util_insert_aipp_op.cc" | "graph/preprocess/insert_op/util_insert_aipp_op.cc" | ||||
@@ -399,6 +410,7 @@ set(TRAIN_SRC_LIST | |||||
"graph/build/memory/hybrid_mem_assigner.cc" | "graph/build/memory/hybrid_mem_assigner.cc" | ||||
"graph/build/memory/max_block_mem_assigner.cc" | "graph/build/memory/max_block_mem_assigner.cc" | ||||
"graph/build/memory/var_mem_assign_util.cc" | "graph/build/memory/var_mem_assign_util.cc" | ||||
"graph/build/memory/buffer_pool_mem_assigner.cc" | |||||
) | ) | ||||
set(INFER_SRC_LIST | set(INFER_SRC_LIST | ||||
@@ -426,6 +438,7 @@ set(INFER_SRC_LIST | |||||
"common/formats/formats.cc" | "common/formats/formats.cc" | ||||
"common/profiling/profiling_manager.cc" | "common/profiling/profiling_manager.cc" | ||||
"common/dump/dump_properties.cc" | "common/dump/dump_properties.cc" | ||||
"common/dump/exception_dumper.cc" | |||||
"common/dump/dump_manager.cc" | "common/dump/dump_manager.cc" | ||||
"common/dump/dump_op.cc" | "common/dump/dump_op.cc" | ||||
"common/dump/opdebug_register.cc" | "common/dump/opdebug_register.cc" | ||||
@@ -499,6 +512,7 @@ set(INFER_SRC_LIST | |||||
"graph/passes/atomic_addr_clean_pass.cc" | "graph/passes/atomic_addr_clean_pass.cc" | ||||
"graph/passes/mark_same_addr_pass.cc" | "graph/passes/mark_same_addr_pass.cc" | ||||
"graph/passes/mark_graph_unknown_status_pass.cc" | "graph/passes/mark_graph_unknown_status_pass.cc" | ||||
"graph/passes/mark_node_unknown_shape_pass.cc" | |||||
"graph/passes/mark_agnostic_pass.cc" | "graph/passes/mark_agnostic_pass.cc" | ||||
"graph/common/omg_util.cc" | "graph/common/omg_util.cc" | ||||
"graph/common/bcast.cc" | "graph/common/bcast.cc" | ||||
@@ -605,8 +619,11 @@ set(INFER_SRC_LIST | |||||
"graph/passes/link_gen_mask_nodes_pass.cc" | "graph/passes/link_gen_mask_nodes_pass.cc" | ||||
"graph/passes/replace_with_empty_const_pass.cc" | "graph/passes/replace_with_empty_const_pass.cc" | ||||
"graph/passes/hccl_group_pass.cc" | "graph/passes/hccl_group_pass.cc" | ||||
"graph/passes/hccl_tailing_optimization_pass.cc" | |||||
"graph/passes/memcpy_addr_async_pass.cc" | "graph/passes/memcpy_addr_async_pass.cc" | ||||
"graph/passes/set_input_output_offset_pass.cc" | "graph/passes/set_input_output_offset_pass.cc" | ||||
"graph/passes/parallel_group_pass.cc" | |||||
"graph/passes/buffer_pool_memory_pass.cc" | |||||
"graph/manager/model_manager/event_manager.cc" | "graph/manager/model_manager/event_manager.cc" | ||||
"graph/manager/util/rt_context_util.cc" | "graph/manager/util/rt_context_util.cc" | ||||
"graph/manager/util/variable_accelerate_ctrl.cc" | "graph/manager/util/variable_accelerate_ctrl.cc" | ||||
@@ -670,6 +687,7 @@ set(INFER_SRC_LIST | |||||
"graph/build/memory/hybrid_mem_assigner.cc" | "graph/build/memory/hybrid_mem_assigner.cc" | ||||
"graph/build/memory/max_block_mem_assigner.cc" | "graph/build/memory/max_block_mem_assigner.cc" | ||||
"graph/build/memory/var_mem_assign_util.cc" | "graph/build/memory/var_mem_assign_util.cc" | ||||
"graph/build/memory/buffer_pool_mem_assigner.cc" | |||||
) | ) | ||||
if (NOT ENABLE_D AND NOT ENABLE_ACL AND NOT ENABLE_MS_TESTCASES) | if (NOT ENABLE_D AND NOT ENABLE_ACL AND NOT ENABLE_MS_TESTCASES) | ||||
@@ -700,6 +718,7 @@ target_compile_definitions(ge_runner PRIVATE | |||||
DAVINCI_CLOUD | DAVINCI_CLOUD | ||||
google=ascend_private | google=ascend_private | ||||
FUNC_VISIBILITY | FUNC_VISIBILITY | ||||
$<$<STREQUAL:${ENABLE_OPEN_SRC},True>:ONLY_COMPILE_OPEN_SRC> | |||||
) | ) | ||||
target_compile_options(ge_runner PRIVATE | target_compile_options(ge_runner PRIVATE | ||||
@@ -775,6 +794,7 @@ target_compile_definitions(ge_compiler PRIVATE | |||||
COMPILE_OMG_PACKAGE | COMPILE_OMG_PACKAGE | ||||
google=ascend_private | google=ascend_private | ||||
FUNC_VISIBILITY | FUNC_VISIBILITY | ||||
$<$<STREQUAL:${ENABLE_OPEN_SRC},True>:ONLY_COMPILE_OPEN_SRC> | |||||
) | ) | ||||
target_compile_options(ge_compiler PRIVATE | target_compile_options(ge_compiler PRIVATE | ||||
@@ -937,6 +957,10 @@ add_library(atc_stub_ge_compiler SHARED | |||||
add_dependencies(atc_stub_ge_compiler ge_stub) | add_dependencies(atc_stub_ge_compiler ge_stub) | ||||
target_compile_options(atc_stub_ge_compiler PRIVATE | |||||
-fno-common | |||||
) | |||||
target_link_libraries(atc_stub_ge_compiler PRIVATE | target_link_libraries(atc_stub_ge_compiler PRIVATE | ||||
$<BUILD_INTERFACE:intf_pub> | $<BUILD_INTERFACE:intf_pub> | ||||
) | ) | ||||
@@ -973,6 +997,10 @@ add_library(fwk_stub_ge_runner SHARED | |||||
add_dependencies(fwk_stub_ge_runner ge_stub) | add_dependencies(fwk_stub_ge_runner ge_stub) | ||||
target_compile_options(fwk_stub_ge_runner PRIVATE | |||||
-fno-common | |||||
) | |||||
target_link_libraries(fwk_stub_ge_runner PRIVATE | target_link_libraries(fwk_stub_ge_runner PRIVATE | ||||
$<BUILD_INTERFACE:intf_pub> | $<BUILD_INTERFACE:intf_pub> | ||||
) | ) | ||||
@@ -155,12 +155,12 @@ std::shared_ptr<GraphInfo> Analyzer::GetJsonObject(uint64_t session_id, uint64_t | |||||
std::lock_guard<std::recursive_mutex> lg(mutex_); | std::lock_guard<std::recursive_mutex> lg(mutex_); | ||||
auto iter = graph_infos_.find(session_id); | auto iter = graph_infos_.find(session_id); | ||||
if (iter == graph_infos_.end()) { | if (iter == graph_infos_.end()) { | ||||
GELOGE(PARAM_INVALID, "[Check][Session_id]session_id:%lu does not exist! graph_id:%lu.", session_id, graph_id); | |||||
GELOGE(PARAM_INVALID, "[Check][SessionId]session_id:%lu does not exist! graph_id:%lu", session_id, graph_id); | |||||
return nullptr; | return nullptr; | ||||
} else { | } else { | ||||
auto iter1 = (iter->second).find(graph_id); | auto iter1 = (iter->second).find(graph_id); | ||||
if (iter1 == (iter->second).end()) { | if (iter1 == (iter->second).end()) { | ||||
GELOGE(PARAM_INVALID, "[Check][Graph_id]graph_id:%lu does not exist! session_id:%lu.", graph_id, session_id); | |||||
GELOGE(PARAM_INVALID, "[Check][GraphId]graph_id:%lu does not exist! session_id:%lu.", graph_id, session_id); | |||||
return nullptr; | return nullptr; | ||||
} | } | ||||
GELOGI("GetJsonObject Success!session_id:%lu graph_id:%lu", session_id, graph_id); | GELOGI("GetJsonObject Success!session_id:%lu graph_id:%lu", session_id, graph_id); | ||||
@@ -200,7 +200,7 @@ ge::Status Analyzer::CreateAnalyzerFile() { | |||||
} | } | ||||
ge::Status Analyzer::SaveAnalyzerDataToFile(uint64_t session_id, uint64_t graph_id) { | ge::Status Analyzer::SaveAnalyzerDataToFile(uint64_t session_id, uint64_t graph_id) { | ||||
GELOGD("start to save analyze file."); | |||||
GELOGD("start to save analyze file"); | |||||
auto graph_info = GetJsonObject(session_id, graph_id); | auto graph_info = GetJsonObject(session_id, graph_id); | ||||
GE_CHECK_NOTNULL(graph_info); | GE_CHECK_NOTNULL(graph_info); | ||||
@@ -221,7 +221,10 @@ ge::Status Analyzer::SaveAnalyzerDataToFile(uint64_t session_id, uint64_t graph_ | |||||
try { | try { | ||||
json_file_ << jsn.dump(kJsonDumpLevel) << std::endl; | json_file_ << jsn.dump(kJsonDumpLevel) << std::endl; | ||||
} catch (nlohmann::detail::type_error &e) { | } catch (nlohmann::detail::type_error &e) { | ||||
GELOGE(FAILED, "[Json.dump][GraphInfo]json.dump to analyze file [%s] failed because [%s], session_id:%lu, graph_id:%lu", json_file_name_.c_str(), e.what(), session_id, graph_id); | |||||
GELOGE(FAILED, | |||||
"[Json.dump][GraphInfo]json.dump to analyze file [%s] failed because [%s]," | |||||
"session_id:%lu, graph_id:%lu", | |||||
json_file_name_.c_str(), e.what(), session_id, graph_id); | |||||
ret_failed = true; | ret_failed = true; | ||||
} | } | ||||
json_file_.close(); | json_file_.close(); | ||||
@@ -229,7 +232,7 @@ ge::Status Analyzer::SaveAnalyzerDataToFile(uint64_t session_id, uint64_t graph_ | |||||
} | } | ||||
ge::Status Analyzer::DoAnalyze(DataInfo &data_info) { | ge::Status Analyzer::DoAnalyze(DataInfo &data_info) { | ||||
GELOGD("start to do analyzer process!"); | |||||
GELOGD("start to do analyzer process"); | |||||
auto pnode = data_info.node_ptr; | auto pnode = data_info.node_ptr; | ||||
GE_CHECK_NOTNULL(pnode); | GE_CHECK_NOTNULL(pnode); | ||||
@@ -241,7 +244,9 @@ ge::Status Analyzer::DoAnalyze(DataInfo &data_info) { | |||||
GE_CHECK_NOTNULL(graph_info); | GE_CHECK_NOTNULL(graph_info); | ||||
auto status = SaveOpInfo(desc, data_info, graph_info); | auto status = SaveOpInfo(desc, data_info, graph_info); | ||||
if (status != SUCCESS) { | if (status != SUCCESS) { | ||||
GELOGE(status, "[Check][SaveOpInfo]save op info: desc_name [%s] desc_type [%s] failed!", desc->GetName().c_str(), desc->GetType().c_str()); | |||||
GELOGE(status, | |||||
"[Check][SaveOpInfo]save op info: desc_name [%s] desc_type [%s] failed!", | |||||
desc->GetName().c_str(), desc->GetType().c_str()); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
// create json file | // create json file | ||||
@@ -69,7 +69,11 @@ Status CheckOptionsValid(const std::map<string, string> &options) { | |||||
auto job_id_iter = options.find(OPTION_EXEC_JOB_ID); | auto job_id_iter = options.find(OPTION_EXEC_JOB_ID); | ||||
if (job_id_iter != options.end()) { | if (job_id_iter != options.end()) { | ||||
if (job_id_iter->second.length() > kMaxStrLen) { | if (job_id_iter->second.length() > kMaxStrLen) { | ||||
GELOGE(PARAM_INVALID, "CheckOptionsValid job_id failed, string len > %d", kMaxStrLen); | |||||
GELOGE(PARAM_INVALID,"[Check][JobId]Failed," | |||||
"the job_id [%s] string length: %zu > max string length: %d", | |||||
job_id_iter->second.c_str(), job_id_iter->second.length(), kMaxStrLen); | |||||
REPORT_INPUT_ERROR("E10051", std::vector<std::string>({"id","length"}), | |||||
std::vector<std::string>({job_id_iter->second, std::to_string(kMaxStrLen)})); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
} | } | ||||
@@ -84,7 +88,8 @@ Status GEInitializeImpl(const std::map<string, string> &options) { | |||||
std::string path_base = ge::GELib::GetPath(); | std::string path_base = ge::GELib::GetPath(); | ||||
auto ret = ErrorManager::GetInstance().Init(path_base); | auto ret = ErrorManager::GetInstance().Init(path_base); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
GELOGE(GE_CLI_INIT_FAILED, "ErrorManager init fail"); | |||||
GELOGE(GE_CLI_INIT_FAILED, | |||||
"[Init][PathBase]Init failed when pass param path_base:%s", path_base.c_str()); | |||||
return ret; | return ret; | ||||
} | } | ||||
@@ -104,7 +109,9 @@ Status GEInitializeImpl(const std::map<string, string> &options) { | |||||
bool is_proto_init = manager->Initialize(option_tmp); | bool is_proto_init = manager->Initialize(option_tmp); | ||||
GE_TIMESTAMP_END(GEInitialize, "GEInitialize::ManagerInitialize"); | GE_TIMESTAMP_END(GEInitialize, "GEInitialize::ManagerInitialize"); | ||||
if (!is_proto_init) { | if (!is_proto_init) { | ||||
GELOGE(GE_CLI_INIT_FAILED, "geInitialize failed, ops proto path is invalid."); | |||||
GELOGE(GE_CLI_INIT_FAILED, | |||||
"[Init][OpsProtoPath]Loading OpsProto lib plugin failed, OpsProtoPath:%s invalid.", | |||||
opsproto_path.c_str()); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -127,7 +134,7 @@ Status GEInitializeImpl(const std::map<string, string> &options) { | |||||
ret = ge::GELib::Initialize(options); | ret = ge::GELib::Initialize(options); | ||||
GE_TIMESTAMP_END(GELibInitialize, "GEInitialize::GELibInitialize"); | GE_TIMESTAMP_END(GELibInitialize, "GEInitialize::GELibInitialize"); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
GELOGE(GE_CLI_INIT_FAILED, "geInitialize failed, error code = %u", ret); | |||||
GELOGE(GE_CLI_INIT_FAILED, "[Init][GELib]Failed, error code = %u", ret); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -155,7 +162,9 @@ Status GEInitialize(const std::map<AscendString, AscendString> &options) { | |||||
std::map<std::string, std::string> str_options; | std::map<std::string, std::string> str_options; | ||||
for (auto &option : options) { | for (auto &option : options) { | ||||
if (option.first.GetString() == nullptr || option.second.GetString() == nullptr) { | if (option.first.GetString() == nullptr || option.second.GetString() == nullptr) { | ||||
GELOGE(FAILED, "GEInitialize options is nullptr."); | |||||
GELOGE(FAILED, "[Check][Param]Options invalid, first or second option is nullptr."); | |||||
REPORT_INNER_ERROR("E19999", "Check parameter's options invalid," | |||||
"the first or second option is nullptr."); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
std::string key = option.first.GetString(); | std::string key = option.first.GetString(); | ||||
@@ -171,17 +180,17 @@ Status GEInitialize(const std::map<AscendString, AscendString> &options) { | |||||
// GE finalize, releasing all resources | // GE finalize, releasing all resources | ||||
Status GEFinalize() { | Status GEFinalize() { | ||||
ErrorManager::GetInstance().SetStage(ErrorMessage::kFinalize, ErrorMessage::kFinalize); | |||||
GELOGT(TRACE_INIT, "GEFinalize start"); | |||||
ErrorManager::GetInstance().GenWorkStreamIdDefault(); | |||||
std::lock_guard<std::mutex> lock(g_ge_release_mutex); | |||||
// check init status | // check init status | ||||
if (!g_ge_initialized) { | if (!g_ge_initialized) { | ||||
GELOGW("GEFinalize is called before GEInitialize"); | |||||
GELOGW("[FINAL][FINAL]GEFinalize is called before GEInitialize"); | |||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
std::lock_guard<std::mutex> lock(g_ge_release_mutex); | |||||
ErrorManager::GetInstance().SetStage(ErrorMessage::kFinalize, ErrorMessage::kFinalize); | |||||
ErrorManager::GetInstance().GenWorkStreamIdDefault(); | |||||
GELOGT(TRACE_INIT, "GEFinalize start"); | |||||
// call Finalize | // call Finalize | ||||
Status ret = SUCCESS; | Status ret = SUCCESS; | ||||
Status middle_ret; | Status middle_ret; | ||||
@@ -237,13 +246,17 @@ Session::Session(const std::map<string, string> &options) { | |||||
// check init status | // check init status | ||||
sessionId_ = 0; | sessionId_ = 0; | ||||
if (!g_ge_initialized) { | if (!g_ge_initialized) { | ||||
GELOGE(GE_CLI_GE_NOT_INITIALIZED, "GE is not initialized."); | |||||
GELOGE(GE_CLI_GE_NOT_INITIALIZED, | |||||
"[Construct][Session]Failed because lack GEInitialize call before."); | |||||
REPORT_INNER_ERROR("E19999", | |||||
"Creating session failed because lack GEInitialize call before."); | |||||
return; | return; | ||||
} | } | ||||
// call Initialize | // call Initialize | ||||
std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance(); | std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance(); | ||||
if (instance_ptr == nullptr || !instance_ptr->InitFlag()) { | if (instance_ptr == nullptr || !instance_ptr->InitFlag()) { | ||||
GELOGE(GE_CLI_GE_NOT_INITIALIZED, "Session Constructor failed"); | |||||
GELOGE(GE_CLI_GE_NOT_INITIALIZED, | |||||
"[Construct][Session]Failed, GELib instance is nullptr or it is not InitFlag"); | |||||
return; | return; | ||||
} | } | ||||
@@ -256,7 +269,7 @@ Session::Session(const std::map<string, string> &options) { | |||||
if (ret == SUCCESS) { | if (ret == SUCCESS) { | ||||
sessionId_ = session_id; | sessionId_ = session_id; | ||||
} else { | } else { | ||||
GELOGE(ret, "Session constructor failed, session Id not initialized"); | |||||
GELOGE(ret, "[Construct][Session]Failed, error code:%u.", ret); | |||||
return; | return; | ||||
} | } | ||||
GELOGT(TRACE_STOP, "Session Constructor finished"); | GELOGT(TRACE_STOP, "Session Constructor finished"); | ||||
@@ -270,13 +283,17 @@ Session::Session(const std::map<AscendString, AscendString> &options) { | |||||
// check init status | // check init status | ||||
sessionId_ = 0; | sessionId_ = 0; | ||||
if (!g_ge_initialized) { | if (!g_ge_initialized) { | ||||
GELOGE(GE_CLI_GE_NOT_INITIALIZED, "GE is not initialized."); | |||||
GELOGE(GE_CLI_GE_NOT_INITIALIZED, | |||||
"[Construct][Session]Failed because lack GEInitialize call before."); | |||||
REPORT_INNER_ERROR("E19999", | |||||
"Creating session failed because lack GEInitialize call before."); | |||||
return; | return; | ||||
} | } | ||||
// call Initialize | // call Initialize | ||||
std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance(); | std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance(); | ||||
if (instance_ptr == nullptr || !instance_ptr->InitFlag()) { | if (instance_ptr == nullptr || !instance_ptr->InitFlag()) { | ||||
GELOGE(GE_CLI_GE_NOT_INITIALIZED, "Session Constructor failed"); | |||||
GELOGE(GE_CLI_GE_NOT_INITIALIZED, | |||||
"[Construct][Session]Failed, the GELib instance is nullptr or is not InitFlag"); | |||||
return; | return; | ||||
} | } | ||||
@@ -284,7 +301,9 @@ Session::Session(const std::map<AscendString, AscendString> &options) { | |||||
std::map<std::string, std::string> str_options; | std::map<std::string, std::string> str_options; | ||||
for (auto &option : options) { | for (auto &option : options) { | ||||
if (option.first.GetString() == nullptr || option.second.GetString() == nullptr) { | if (option.first.GetString() == nullptr || option.second.GetString() == nullptr) { | ||||
GELOGE(FAILED, "Session options is nullptr."); | |||||
GELOGE(FAILED, "[Construct][Session]Failed, the first or second option is nullptr."); | |||||
REPORT_INNER_ERROR("E19999", "Creating session's options invalid," | |||||
"the first or second option is nullptr."); | |||||
return; | return; | ||||
} | } | ||||
std::string key = option.first.GetString(); | std::string key = option.first.GetString(); | ||||
@@ -299,7 +318,7 @@ Session::Session(const std::map<AscendString, AscendString> &options) { | |||||
if (ret == SUCCESS) { | if (ret == SUCCESS) { | ||||
sessionId_ = session_id; | sessionId_ = session_id; | ||||
} else { | } else { | ||||
GELOGE(ret, "Session constructor failed, session Id not initialized"); | |||||
GELOGE(ret, "[Construct][Session]Failed, error code:%u.", ret); | |||||
return; | return; | ||||
} | } | ||||
GELOGT(TRACE_STOP, "Session Constructor finished"); | GELOGT(TRACE_STOP, "Session Constructor finished"); | ||||
@@ -331,17 +350,18 @@ Session::~Session() { | |||||
ret = instance_ptr->SessionManagerObj().DestroySession(session_id); | ret = instance_ptr->SessionManagerObj().DestroySession(session_id); | ||||
} catch (google::protobuf::FatalException &e) { | } catch (google::protobuf::FatalException &e) { | ||||
GELOGE(GE_CLI_SESS_DESTROY_FAILED, "SessionDestructor throws FatalException"); | |||||
GELOGE(GE_CLI_SESS_DESTROY_FAILED, "[Destruct][Session]Failed because get fatalException."); | |||||
} | } | ||||
// check return status, return, update session id if success | // check return status, return, update session id if success | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
GELOGE(ret, "Session Destructor failed"); | |||||
GELOGE(ret, "[Destruct][Session]Failed, error code:%u.", ret); | |||||
} | } | ||||
GELOGT(TRACE_STOP, "Session Destructor finished"); | GELOGT(TRACE_STOP, "Session Destructor finished"); | ||||
} | } | ||||
// Add Graph | |||||
Status Session::AddGraph(uint32_t graph_id, const Graph &graph) { | Status Session::AddGraph(uint32_t graph_id, const Graph &graph) { | ||||
ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther); | ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther); | ||||
std::map<std::string, std::string> options; | std::map<std::string, std::string> options; | ||||
@@ -349,25 +369,32 @@ Status Session::AddGraph(uint32_t graph_id, const Graph &graph) { | |||||
return AddGraph(graph_id, graph, options); | return AddGraph(graph_id, graph, options); | ||||
} | } | ||||
// Add Graph | |||||
Status Session::AddGraph(uint32_t graph_id, const Graph &graph, const std::map<std::string, std::string> &options) { | Status Session::AddGraph(uint32_t graph_id, const Graph &graph, const std::map<std::string, std::string> &options) { | ||||
ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther); | ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther); | ||||
GELOGT(TRACE_INIT, "Start to add graph in Session. graph_id: %u, session_id: %lu.", graph_id, sessionId_); | GELOGT(TRACE_INIT, "Start to add graph in Session. graph_id: %u, session_id: %lu.", graph_id, sessionId_); | ||||
ErrorManager::GetInstance().GenWorkStreamIdBySessionGraph(sessionId_, graph_id); | ErrorManager::GetInstance().GenWorkStreamIdBySessionGraph(sessionId_, graph_id); | ||||
std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance(); | std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance(); | ||||
if (instance_ptr == nullptr || !instance_ptr->InitFlag()) { | if (instance_ptr == nullptr || !instance_ptr->InitFlag()) { | ||||
GELOGE(GE_CLI_GE_NOT_INITIALIZED, "AddGraph failed in Session."); | |||||
GELOGE(GE_CLI_GE_NOT_INITIALIZED, | |||||
"[Add][Graph]Failed because GELib instance is nullptr or it is not InitFlag."); | |||||
REPORT_INNER_ERROR("E19999", | |||||
"AddGraph Failed, GELib instance is nullptr or it is not InitFlag."); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
GELOGD("Adding graph to session"); | GELOGD("Adding graph to session"); | ||||
Status ret = instance_ptr->SessionManagerObj().AddGraph(sessionId_, graph_id, graph, options); | Status ret = instance_ptr->SessionManagerObj().AddGraph(sessionId_, graph_id, graph, options); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
GELOGE(ret, "AddGraph failed in Session."); | |||||
GELOGE(ret, | |||||
"[Add][Graph]Failed, error code:%u, session_id:%lu, graph_id:%u.", | |||||
ret, sessionId_, graph_id); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
GELOGD("AddGraph finished in Session."); | GELOGD("AddGraph finished in Session."); | ||||
return ret; | return ret; | ||||
} | } | ||||
//Add Graph | |||||
Status Session::AddGraph(uint32_t graph_id, const Graph &graph, | Status Session::AddGraph(uint32_t graph_id, const Graph &graph, | ||||
const std::map<AscendString, AscendString> &options) { | const std::map<AscendString, AscendString> &options) { | ||||
ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther); | ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther); | ||||
@@ -375,14 +402,19 @@ Status Session::AddGraph(uint32_t graph_id, const Graph &graph, | |||||
ErrorManager::GetInstance().GenWorkStreamIdBySessionGraph(sessionId_, graph_id); | ErrorManager::GetInstance().GenWorkStreamIdBySessionGraph(sessionId_, graph_id); | ||||
std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance(); | std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance(); | ||||
if (instance_ptr == nullptr || !instance_ptr->InitFlag()) { | if (instance_ptr == nullptr || !instance_ptr->InitFlag()) { | ||||
GELOGE(GE_CLI_GE_NOT_INITIALIZED, "AddGraph failed in Session."); | |||||
GELOGE(GE_CLI_GE_NOT_INITIALIZED, | |||||
"[Add][Graph]Failed, the GELib instance is nullptr or is not InitFlag."); | |||||
REPORT_INNER_ERROR("E19999", | |||||
"AddGraph Failed, GELib instance is nullptr or it is not InitFlag."); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
GELOGD("Adding graph to session"); | GELOGD("Adding graph to session"); | ||||
std::map<std::string, std::string> str_options; | std::map<std::string, std::string> str_options; | ||||
for (auto &option : options) { | for (auto &option : options) { | ||||
if (option.first.GetString() == nullptr || option.second.GetString() == nullptr) { | if (option.first.GetString() == nullptr || option.second.GetString() == nullptr) { | ||||
GELOGE(FAILED, "AddGraph options is nullptr."); | |||||
GELOGE(FAILED, "[Add][Graph]Failed, the first or second option is nullptr."); | |||||
REPORT_INNER_ERROR("E19999", | |||||
"Add Graph Failed, the first or second option is nullptr."); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
std::string key = option.first.GetString(); | std::string key = option.first.GetString(); | ||||
@@ -391,7 +423,9 @@ Status Session::AddGraph(uint32_t graph_id, const Graph &graph, | |||||
} | } | ||||
Status ret = instance_ptr->SessionManagerObj().AddGraph(sessionId_, graph_id, graph, str_options); | Status ret = instance_ptr->SessionManagerObj().AddGraph(sessionId_, graph_id, graph, str_options); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
GELOGE(ret, "AddGraph failed in Session."); | |||||
GELOGE(ret, | |||||
"[Add][Graph]Failed, error code:%u, session_id:%lu, graph_id:%u.", | |||||
ret, sessionId_, graph_id); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
GELOGD("AddGraph finished in Session."); | GELOGD("AddGraph finished in Session."); | ||||
@@ -405,6 +439,7 @@ Status Session::AddGraphWithCopy(uint32_t graph_id, const Graph &graph) { | |||||
return AddGraphWithCopy(graph_id, graph, options); | return AddGraphWithCopy(graph_id, graph, options); | ||||
} | } | ||||
// Add Graph With Copy | |||||
Status Session::AddGraphWithCopy(uint32_t graph_id, const Graph &graph, | Status Session::AddGraphWithCopy(uint32_t graph_id, const Graph &graph, | ||||
const std::map<AscendString, AscendString> &options) { | const std::map<AscendString, AscendString> &options) { | ||||
ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther); | ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther); | ||||
@@ -412,7 +447,10 @@ Status Session::AddGraphWithCopy(uint32_t graph_id, const Graph &graph, | |||||
ErrorManager::GetInstance().GenWorkStreamIdBySessionGraph(sessionId_, graph_id); | ErrorManager::GetInstance().GenWorkStreamIdBySessionGraph(sessionId_, graph_id); | ||||
std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance(); | std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance(); | ||||
if (instance_ptr == nullptr || !instance_ptr->InitFlag()) { | if (instance_ptr == nullptr || !instance_ptr->InitFlag()) { | ||||
GELOGE(GE_CLI_GE_NOT_INITIALIZED, "AddGraph failed in Session."); | |||||
GELOGE(GE_CLI_GE_NOT_INITIALIZED, | |||||
"[Add][Graph]Failed, the GELib instance is nullptr or is not InitFlag."); | |||||
REPORT_INNER_ERROR("E19999", | |||||
"AddGraph Failed, GELib instance is nullptr or is not InitFlag."); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
std::map<std::string, std::string> str_options; | std::map<std::string, std::string> str_options; | ||||
@@ -422,13 +460,16 @@ Status Session::AddGraphWithCopy(uint32_t graph_id, const Graph &graph, | |||||
GELOGD("Adding graph to session"); | GELOGD("Adding graph to session"); | ||||
Status ret = instance_ptr->SessionManagerObj().AddGraphWithCopy(sessionId_, graph_id, graph, str_options); | Status ret = instance_ptr->SessionManagerObj().AddGraphWithCopy(sessionId_, graph_id, graph, str_options); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
GELOGE(ret, "AddGraph failed in Session."); | |||||
GELOGE(ret, | |||||
"[Add][Graph]Failed, error code:%u, session_id:%lu, graph_id:%u.", | |||||
ret, sessionId_, graph_id); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
GELOGD("AddGraph finished in Session."); | GELOGD("AddGraph finished in Session."); | ||||
return ret; | return ret; | ||||
} | } | ||||
// Remove Graph | |||||
Status Session::RemoveGraph(uint32_t graph_id) { | Status Session::RemoveGraph(uint32_t graph_id) { | ||||
ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther); | ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther); | ||||
GELOGT(TRACE_INIT, "Session RemoveGraph start"); | GELOGT(TRACE_INIT, "Session RemoveGraph start"); | ||||
@@ -437,7 +478,10 @@ Status Session::RemoveGraph(uint32_t graph_id) { | |||||
// call RemoveGraph | // call RemoveGraph | ||||
std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance(); | std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance(); | ||||
if (!instance_ptr || !instance_ptr->InitFlag()) { | if (!instance_ptr || !instance_ptr->InitFlag()) { | ||||
GELOGE(GE_CLI_GE_NOT_INITIALIZED, "Session RemoveGraph failed"); | |||||
GELOGE(GE_CLI_GE_NOT_INITIALIZED, | |||||
"[Remove][Graph]Failed, GELib instance is nullptr or is not InitFlag "); | |||||
REPORT_INNER_ERROR("E19999", | |||||
"RemoveGraph Failed, GELib instance is nullptr or is not InitFlag."); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -445,13 +489,16 @@ Status Session::RemoveGraph(uint32_t graph_id) { | |||||
Status ret = instance_ptr->SessionManagerObj().RemoveGraph(sessionId_, graph_id); | Status ret = instance_ptr->SessionManagerObj().RemoveGraph(sessionId_, graph_id); | ||||
// check return status, return | // check return status, return | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
GELOGE(ret, "session RemoveGraph failed"); | |||||
GELOGE(ret, | |||||
"[Remove][Graph]Failed, error code:%u, session_id:%lu, graph_id:%u.", | |||||
ret, sessionId_, graph_id); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
GELOGT(TRACE_STOP, "Session RemoveGraph finished"); | GELOGT(TRACE_STOP, "Session RemoveGraph finished"); | ||||
return ret; | return ret; | ||||
} | } | ||||
// Print Output Result | |||||
void PrintOutputResult(std::vector<Tensor> &outputs) { | void PrintOutputResult(std::vector<Tensor> &outputs) { | ||||
if (outputs.empty() || outputs[0].GetData() == nullptr) { | if (outputs.empty() || outputs[0].GetData() == nullptr) { | ||||
GELOGW("outputs is empty or data is nullptr."); | GELOGW("outputs is empty or data is nullptr."); | ||||
@@ -499,6 +546,7 @@ void PrintOutputResult(std::vector<Tensor> &outputs) { | |||||
} | } | ||||
} | } | ||||
// Run Graph | |||||
Status Session::RunGraph(uint32_t graph_id, const std::vector<Tensor> &inputs, std::vector<Tensor> &outputs) { | Status Session::RunGraph(uint32_t graph_id, const std::vector<Tensor> &inputs, std::vector<Tensor> &outputs) { | ||||
ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther); | ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther); | ||||
GELOGT(TRACE_INIT, "Session RunGraph start"); | GELOGT(TRACE_INIT, "Session RunGraph start"); | ||||
@@ -508,14 +556,19 @@ Status Session::RunGraph(uint32_t graph_id, const std::vector<Tensor> &inputs, s | |||||
// call RunGraph | // call RunGraph | ||||
std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance(); | std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance(); | ||||
if (instance_ptr == nullptr || !instance_ptr->InitFlag()) { | if (instance_ptr == nullptr || !instance_ptr->InitFlag()) { | ||||
GELOGE(GE_CLI_GE_NOT_INITIALIZED, "Session RunGraph failed"); | |||||
GELOGE(GE_CLI_GE_NOT_INITIALIZED, | |||||
"[Run][Graph]Failed, GELib instance is nullptr or is not InitFlag."); | |||||
REPORT_INNER_ERROR("E19999", | |||||
"RunGraph Failed, GELib instance is nullptr or is not InitFlag."); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
GELOGT(TRACE_RUNNING, "Running Graph"); | GELOGT(TRACE_RUNNING, "Running Graph"); | ||||
Status ret = instance_ptr->SessionManagerObj().RunGraph(sessionId_, graph_id, graph_inputs, outputs); | Status ret = instance_ptr->SessionManagerObj().RunGraph(sessionId_, graph_id, graph_inputs, outputs); | ||||
// check return status | // check return status | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
GELOGE(ret, "Session RunGraph failed"); | |||||
GELOGE(ret, | |||||
"[Run][Graph]Failed, error code:%u, session_id:%lu, graph_id:%u.", | |||||
ret, sessionId_, graph_id); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -529,6 +582,7 @@ Status Session::RunGraph(uint32_t graph_id, const std::vector<Tensor> &inputs, s | |||||
return ret; | return ret; | ||||
} | } | ||||
// Register Call Back | |||||
Status Session::RegisterCallBackFunc(const std::string &key, const pCallBackFunc &callback) { | Status Session::RegisterCallBackFunc(const std::string &key, const pCallBackFunc &callback) { | ||||
ErrorManager::GetInstance().GenWorkStreamIdDefault(); | ErrorManager::GetInstance().GenWorkStreamIdDefault(); | ||||
return ge::GELib::GetInstance()->SessionManagerObj().RegisterCallBackFunc(sessionId_, key, callback); | return ge::GELib::GetInstance()->SessionManagerObj().RegisterCallBackFunc(sessionId_, key, callback); | ||||
@@ -543,30 +597,40 @@ Status Session::RegisterCallBackFunc(const char *key, const session::pCallBackFu | |||||
return ge::GELib::GetInstance()->SessionManagerObj().RegisterCallBackFunc(sessionId_, str_key, callback); | return ge::GELib::GetInstance()->SessionManagerObj().RegisterCallBackFunc(sessionId_, str_key, callback); | ||||
} | } | ||||
// Build Graph | |||||
Status Session::BuildGraph(uint32_t graph_id, const std::vector<InputTensorInfo> &inputs) { | Status Session::BuildGraph(uint32_t graph_id, const std::vector<InputTensorInfo> &inputs) { | ||||
ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther); | ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther); | ||||
ErrorManager::GetInstance().GenWorkStreamIdBySessionGraph(sessionId_, graph_id); | ErrorManager::GetInstance().GenWorkStreamIdBySessionGraph(sessionId_, graph_id); | ||||
std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance(); | std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance(); | ||||
if (instance_ptr == nullptr || !instance_ptr->InitFlag()) { | if (instance_ptr == nullptr || !instance_ptr->InitFlag()) { | ||||
GELOGE(GE_CLI_GE_NOT_INITIALIZED, "SessionConstructor failed"); | |||||
GELOGE(GE_CLI_GE_NOT_INITIALIZED, | |||||
"[Build][Graph]Failed, the GELib instance is nullptr or is not InitFlag."); | |||||
REPORT_INNER_ERROR("E19999", | |||||
"Build graph failed, the GELib instance is nullptr or is not InitFlag."); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
GELOGT(TRACE_RUNNING, "Building Graph"); | GELOGT(TRACE_RUNNING, "Building Graph"); | ||||
Status ret = instance_ptr->SessionManagerObj().BuildGraph(sessionId_, graph_id, inputs); | Status ret = instance_ptr->SessionManagerObj().BuildGraph(sessionId_, graph_id, inputs); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
GELOGE(ret, "Session BuildGraph failed"); | |||||
GELOGE(ret, | |||||
"[Build][Graph]Failed, error code:%u, session_id:%lu, graph_id:%u.", | |||||
ret, sessionId_, graph_id); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
// Run Graph Asynchronously | |||||
Status Session::RunGraphAsync(uint32_t graph_id, const std::vector<InputTensorInfo> &inputs, | Status Session::RunGraphAsync(uint32_t graph_id, const std::vector<InputTensorInfo> &inputs, | ||||
RunAsyncCallback callback) { | RunAsyncCallback callback) { | ||||
ErrorManager::GetInstance().SetStage(ErrorMessage::kModelExecute, ErrorMessage::kModelExecute); | ErrorManager::GetInstance().SetStage(ErrorMessage::kModelExecute, ErrorMessage::kModelExecute); | ||||
ErrorManager::GetInstance().GenWorkStreamIdBySessionGraph(sessionId_, graph_id); | ErrorManager::GetInstance().GenWorkStreamIdBySessionGraph(sessionId_, graph_id); | ||||
std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance(); | std::shared_ptr<GELib> instance_ptr = ge::GELib::GetInstance(); | ||||
if (instance_ptr == nullptr || !instance_ptr->InitFlag()) { | if (instance_ptr == nullptr || !instance_ptr->InitFlag()) { | ||||
GELOGE(GE_CLI_GE_NOT_INITIALIZED, "SessionConstructor failed"); | |||||
GELOGE(GE_CLI_GE_NOT_INITIALIZED, | |||||
"[Run][Graph]RunGraphAsyncFailed, the GELib instance is nullptr or is not InitFlag."); | |||||
REPORT_INNER_ERROR("E19999", | |||||
"RunGraphAsync Failed, the GELib instance is nullptr or is not InitFlag."); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
GELOGT(TRACE_RUNNING, "Run Graph Asynchronously"); | GELOGT(TRACE_RUNNING, "Run Graph Asynchronously"); | ||||
@@ -575,49 +639,59 @@ Status Session::RunGraphAsync(uint32_t graph_id, const std::vector<InputTensorIn | |||||
Status ret = ge::GELib::GetInstance()->SessionManagerObj().RunGraphAsync(sessionId_, graph_id, inputs, callback); | Status ret = ge::GELib::GetInstance()->SessionManagerObj().RunGraphAsync(sessionId_, graph_id, inputs, callback); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
GELOGE(ret, "SessionManager RunGraphAsync failed"); | |||||
GELOGE(ret, "[Run][Graph]RunGraphAsync Failed, error code:%u, session_id:%lu, graph_id:%u.", | |||||
ret, sessionId_, graph_id); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
// Get Variables | |||||
Status Session::GetVariables(const std::vector<std::string> &var_names, std::vector<Tensor> &var_values) { | Status Session::GetVariables(const std::vector<std::string> &var_names, std::vector<Tensor> &var_values) { | ||||
ErrorManager::GetInstance().SetStage(ErrorMessage::kModelExecute, ErrorMessage::kModelExecute); | ErrorManager::GetInstance().SetStage(ErrorMessage::kModelExecute, ErrorMessage::kModelExecute); | ||||
ErrorManager::GetInstance().GenWorkStreamIdDefault(); | ErrorManager::GetInstance().GenWorkStreamIdDefault(); | ||||
auto instance_ptr = ge::GELib::GetInstance(); | auto instance_ptr = ge::GELib::GetInstance(); | ||||
if (instance_ptr == nullptr || !instance_ptr->InitFlag()) { | if (instance_ptr == nullptr || !instance_ptr->InitFlag()) { | ||||
GELOGE(GE_CLI_GE_NOT_INITIALIZED, "SessionConstructor failed"); | |||||
GELOGE(GE_CLI_GE_NOT_INITIALIZED, | |||||
"[Get][Variables]Failed, the GELib instance is nullptr or is not InitFlag."); | |||||
REPORT_INNER_ERROR("E19999", | |||||
"GetVariables failed, the GELib instance is nullptr or is not InitFlag."); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
GELOGT(TRACE_RUNNING, "Get Variables"); | GELOGT(TRACE_RUNNING, "Get Variables"); | ||||
Status ret = ge::GELib::GetInstance()->SessionManagerObj().GetVariables(sessionId_, var_names, var_values); | Status ret = ge::GELib::GetInstance()->SessionManagerObj().GetVariables(sessionId_, var_names, var_values); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
GELOGE(ret, "SessionManager RunGraphAsync failed"); | |||||
GELOGE(ret, "[Get][Variables]Failed, error code:%u, session_id:%lu.", ret, sessionId_); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
// Get Variables | |||||
Status Session::GetVariables(const std::vector<AscendString> &var_names, std::vector<Tensor> &var_values) { | Status Session::GetVariables(const std::vector<AscendString> &var_names, std::vector<Tensor> &var_values) { | ||||
ErrorManager::GetInstance().SetStage(ErrorMessage::kModelExecute, ErrorMessage::kModelExecute); | ErrorManager::GetInstance().SetStage(ErrorMessage::kModelExecute, ErrorMessage::kModelExecute); | ||||
ErrorManager::GetInstance().GenWorkStreamIdDefault(); | ErrorManager::GetInstance().GenWorkStreamIdDefault(); | ||||
auto instance_ptr = ge::GELib::GetInstance(); | auto instance_ptr = ge::GELib::GetInstance(); | ||||
if (instance_ptr == nullptr || !instance_ptr->InitFlag()) { | if (instance_ptr == nullptr || !instance_ptr->InitFlag()) { | ||||
GELOGE(GE_CLI_GE_NOT_INITIALIZED, "SessionConstructor failed"); | |||||
GELOGE(GE_CLI_GE_NOT_INITIALIZED, | |||||
"[Get][Variables]Failed, the GELib instance is nullptr or is not InitFlag."); | |||||
REPORT_INNER_ERROR("E19999", | |||||
"GetVariables failed, the GELib instance is nullptr or is not InitFlag."); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
GELOGT(TRACE_RUNNING, "Get Variables"); | GELOGT(TRACE_RUNNING, "Get Variables"); | ||||
std::vector<ge::string> str_var_names; | std::vector<ge::string> str_var_names; | ||||
for (auto &var_name : var_names) { | for (auto &var_name : var_names) { | ||||
if (var_name.GetString() == nullptr) { | if (var_name.GetString() == nullptr) { | ||||
GELOGE(FAILED, "GetVariables name is nullptr."); | |||||
GELOGE(FAILED, "[Get][Variable]Failed, variables' names are nullptr."); | |||||
REPORT_INNER_ERROR("E19999", "GetVariables failed, variables' names are nullptr."); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
str_var_names.emplace_back(var_name.GetString()); | str_var_names.emplace_back(var_name.GetString()); | ||||
} | } | ||||
Status ret = ge::GELib::GetInstance()->SessionManagerObj().GetVariables(sessionId_, str_var_names, var_values); | Status ret = ge::GELib::GetInstance()->SessionManagerObj().GetVariables(sessionId_, str_var_names, var_values); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
GELOGE(ret, "SessionManager RunGraphAsync failed"); | |||||
GELOGE(ret, "[Get][Variables]Failed, error code:%u, session_id:%lu.", ret, sessionId_); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
return SUCCESS; | return SUCCESS; | ||||
@@ -88,6 +88,7 @@ message AippOpParams { | |||||
int32 right_padding_size = 69; | int32 right_padding_size = 69; | ||||
int32 top_padding_size = 70; | int32 top_padding_size = 70; | ||||
int32 bottom_padding_size = 71; | int32 bottom_padding_size = 71; | ||||
float padding_value = 72; | |||||
int32 mean_chn_0 = 10; | int32 mean_chn_0 = 10; | ||||
int32 mean_chn_1 = 11; | int32 mean_chn_1 = 11; | ||||
@@ -16,6 +16,7 @@ set(PROTO_LIST | |||||
) | ) | ||||
protobuf_generate(ge PROTO_SRCS PROTO_HDRS ${PROTO_LIST}) | protobuf_generate(ge PROTO_SRCS PROTO_HDRS ${PROTO_LIST}) | ||||
protobuf_generate(ge_static PROTO_STATIC_SRCS PROTO_STATIC_HDRS ${PROTO_LIST}) | |||||
set(SRC_LIST | set(SRC_LIST | ||||
"context/ctx.cc" | "context/ctx.cc" | ||||
@@ -127,7 +128,7 @@ target_link_libraries(ge_common PRIVATE | |||||
) | ) | ||||
############ libge_common.a ############ | ############ libge_common.a ############ | ||||
add_library(ge_common_static STATIC ${SRC_LIST} ${PROTO_HDRS}) | |||||
add_library(ge_common_static STATIC ${SRC_LIST} ${PROTO_STATIC_HDRS}) | |||||
target_compile_definitions(ge_common_static PRIVATE | target_compile_definitions(ge_common_static PRIVATE | ||||
PROTOBUF_INLINE_NOT_IN_HEADERS=0 | PROTOBUF_INLINE_NOT_IN_HEADERS=0 | ||||
HOST_VISIBILITY | HOST_VISIBILITY | ||||
@@ -158,7 +159,7 @@ target_include_directories(ge_common_static PRIVATE | |||||
${METADEF_DIR}/inc/external/graph | ${METADEF_DIR}/inc/external/graph | ||||
${METADEF_DIR}/inc/graph | ${METADEF_DIR}/inc/graph | ||||
${CMAKE_BINARY_DIR} | ${CMAKE_BINARY_DIR} | ||||
${CMAKE_BINARY_DIR}/proto/ge | |||||
${CMAKE_BINARY_DIR}/proto/ge_static | |||||
#### yellow zone #### | #### yellow zone #### | ||||
${GE_DEPEND_DIR}/inc | ${GE_DEPEND_DIR}/inc | ||||
${GE_DEPEND_DIR}/inc/cce | ${GE_DEPEND_DIR}/inc/cce | ||||
@@ -33,7 +33,8 @@ const int kFileOpSuccess = 0; | |||||
namespace ge { | namespace ge { | ||||
Status FileSaver::OpenFile(int32_t &fd, const std::string &file_path) { | Status FileSaver::OpenFile(int32_t &fd, const std::string &file_path) { | ||||
if (CheckPath(file_path) != SUCCESS) { | if (CheckPath(file_path) != SUCCESS) { | ||||
GELOGE(FAILED, "Check output file failed."); | |||||
GELOGE(FAILED, "[Check][FilePath]Check output file failed, file_path:%s.", file_path.c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Check output file failed, file_path:%s.", file_path.c_str()); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -45,7 +46,8 @@ Status FileSaver::OpenFile(int32_t &fd, const std::string &file_path) { | |||||
fd = mmOpen2(real_path, M_RDWR | M_CREAT | O_TRUNC, mode); | fd = mmOpen2(real_path, M_RDWR | M_CREAT | O_TRUNC, mode); | ||||
if (fd == EN_INVALID_PARAM || fd == EN_ERROR) { | if (fd == EN_INVALID_PARAM || fd == EN_ERROR) { | ||||
// -1: Failed to open file; - 2: Illegal parameter | // -1: Failed to open file; - 2: Illegal parameter | ||||
GELOGE(FAILED, "Open file failed. mmpa_errno = %d, %s", fd, strerror(errno)); | |||||
GELOGE(FAILED, "[Open][File]Failed. mmpa_errno = %d, %s", fd, strerror(errno)); | |||||
REPORT_INNER_ERROR("E19999", "Open file failed, mmpa_errno = %d, error:%s.", fd, strerror(errno)); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
return SUCCESS; | return SUCCESS; | ||||
@@ -62,7 +64,9 @@ Status FileSaver::WriteData(const void *data, uint32_t size, int32_t fd) { | |||||
while (size > size_1g) { | while (size > size_1g) { | ||||
write_count = mmWrite(fd, reinterpret_cast<void *>(seek), size_1g); | write_count = mmWrite(fd, reinterpret_cast<void *>(seek), size_1g); | ||||
if (write_count == EN_INVALID_PARAM || write_count == EN_ERROR) { | if (write_count == EN_INVALID_PARAM || write_count == EN_ERROR) { | ||||
GELOGE(FAILED, "Write data failed. mmpa_errorno = %ld, %s", write_count, strerror(errno)); | |||||
GELOGE(FAILED, "[Write][Data]Failed, mmpa_errorno = %ld, error:%s", write_count, strerror(errno)); | |||||
REPORT_INNER_ERROR("E19999", "Write data failed, mmpa_errorno = %ld, error:%s.", | |||||
write_count, strerror(errno)); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
size -= size_1g; | size -= size_1g; | ||||
@@ -75,7 +79,9 @@ Status FileSaver::WriteData(const void *data, uint32_t size, int32_t fd) { | |||||
// -1: Failed to write to file; - 2: Illegal parameter | // -1: Failed to write to file; - 2: Illegal parameter | ||||
if (write_count == EN_INVALID_PARAM || write_count == EN_ERROR) { | if (write_count == EN_INVALID_PARAM || write_count == EN_ERROR) { | ||||
GELOGE(FAILED, "Write data failed. mmpa_errorno = %ld, %s", write_count, strerror(errno)); | |||||
GELOGE(FAILED, "[Write][Data]Failed. mmpa_errorno = %ld, error:%s", write_count, strerror(errno)); | |||||
REPORT_INNER_ERROR("E19999", "Write data failed, mmpa_errorno = %ld, error:%s.", | |||||
write_count, strerror(errno)); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -85,7 +91,8 @@ Status FileSaver::WriteData(const void *data, uint32_t size, int32_t fd) { | |||||
Status FileSaver::SaveWithFileHeader(const std::string &file_path, const ModelFileHeader &file_header, const void *data, | Status FileSaver::SaveWithFileHeader(const std::string &file_path, const ModelFileHeader &file_header, const void *data, | ||||
int len) { | int len) { | ||||
if (data == nullptr || len <= 0) { | if (data == nullptr || len <= 0) { | ||||
GELOGE(FAILED, "Model_data is null or the length[%d] less than 1.", len); | |||||
GELOGE(FAILED, "[Check][Param]Failed, model_data is null or the length[%d] is less than 1.", len); | |||||
REPORT_INNER_ERROR("E19999", "Save file failed, model_data is null or the length:%d is less than 1.", len); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -104,7 +111,8 @@ Status FileSaver::SaveWithFileHeader(const std::string &file_path, const ModelFi | |||||
} while (0); | } while (0); | ||||
// Close file | // Close file | ||||
if (mmClose(fd) != 0) { // mmClose 0: success | if (mmClose(fd) != 0) { // mmClose 0: success | ||||
GELOGE(FAILED, "Close file failed."); | |||||
GELOGE(FAILED, "[Close][File]Failed, error_code:%u errmsg:%s", ret, strerror(errno)); | |||||
REPORT_INNER_ERROR("E19999", "Close file failed, error_code:%u errmsg:%s", ret, strerror(errno)); | |||||
ret = FAILED; | ret = FAILED; | ||||
} | } | ||||
return ret; | return ret; | ||||
@@ -140,60 +148,95 @@ Status FileSaver::SaveWithFileHeader(const std::string &file_path, const ModelFi | |||||
} | } | ||||
} while (0); | } while (0); | ||||
// Close file | // Close file | ||||
GE_CHK_BOOL_RET_STATUS(mmClose(fd) == EN_OK, FAILED, "Close file failed."); | |||||
if (mmClose(fd) != EN_OK) { | |||||
GELOGE(FAILED, "[Close][File]Failed, error_code:%u errmsg:%s", ret, strerror(errno)); | |||||
REPORT_CALL_ERROR("E19999", "Close file failed, error_code:%u errmsg:%s", ret, strerror(errno)); | |||||
ret = FAILED; | |||||
} | |||||
return ret; | return ret; | ||||
} | } | ||||
Status FileSaver::SaveToBuffWithFileHeader(const ModelFileHeader &file_header, | Status FileSaver::SaveToBuffWithFileHeader(const ModelFileHeader &file_header, | ||||
ModelPartitionTable &model_partition_table, | ModelPartitionTable &model_partition_table, | ||||
const std::vector<ModelPartition> &partitionDatas, | |||||
const std::vector<ModelPartition> &partition_datas, | |||||
ge::ModelBufferData &model) { | |||||
const vector<ModelPartitionTable *> model_partition_tables = { &model_partition_table }; | |||||
const std::vector<std::vector<ModelPartition>> all_partition_datas = { partition_datas }; | |||||
return SaveToBuffWithFileHeader(file_header, model_partition_tables, all_partition_datas, model); | |||||
} | |||||
Status FileSaver::SaveToBuffWithFileHeader(const ModelFileHeader &file_header, | |||||
const vector<ModelPartitionTable *> &model_partition_tables, | |||||
const std::vector<std::vector<ModelPartition>> &all_partition_datas, | |||||
ge::ModelBufferData &model) { | ge::ModelBufferData &model) { | ||||
GE_CHK_BOOL_RET_STATUS( | |||||
!partitionDatas.empty() && model_partition_table.num != 0 && model_partition_table.num == partitionDatas.size(), | |||||
FAILED, "Invalid param:partition data size is (%u), model_partition_table.num is (%zu).", | |||||
model_partition_table.num, partitionDatas.size()); | |||||
uint32_t model_header_size = sizeof(ModelFileHeader); | |||||
uint32_t table_size = static_cast<uint32_t>(SIZE_OF_MODEL_PARTITION_TABLE(model_partition_table)); | |||||
uint32_t total_size = model_header_size + table_size; | |||||
for (const auto &partitionData : partitionDatas) { | |||||
auto ret = ge::CheckUint32AddOverflow(total_size, partitionData.size); | |||||
GE_CHK_BOOL_RET_STATUS(ret == SUCCESS, FAILED, "add uint32 overflow!"); | |||||
total_size = total_size + partitionData.size; | |||||
GE_CHK_BOOL_RET_STATUS(model_partition_tables.size() == all_partition_datas.size(), PARAM_INVALID, | |||||
"Model table size %zu does not match partition size %zu.", | |||||
model_partition_tables.size(), all_partition_datas.size()); | |||||
for (size_t index = 0; index < model_partition_tables.size(); ++index) { | |||||
auto &cur_partiton_data = all_partition_datas[index]; | |||||
auto &cur_model_partition_table = *model_partition_tables[index]; | |||||
GE_CHK_BOOL_RET_STATUS(!cur_partiton_data.empty() && cur_model_partition_table.num != 0 | |||||
&& cur_model_partition_table.num == cur_partiton_data.size(), FAILED, | |||||
"Invalid param: partition data size is (%zu), model_partition_table.num is (%u).", | |||||
cur_partiton_data.size(), cur_model_partition_table.num); | |||||
} | } | ||||
uint64_t model_header_size = sizeof(ModelFileHeader); | |||||
uint64_t total_size = model_header_size; | |||||
for (size_t index = 0; index < model_partition_tables.size(); ++index) { | |||||
auto &cur_model_partition_table = *model_partition_tables[index]; | |||||
total_size += static_cast<uint64_t>(SIZE_OF_MODEL_PARTITION_TABLE(cur_model_partition_table)); | |||||
auto &cur_partition_data = all_partition_datas[index]; | |||||
for (const auto &partition_data : cur_partition_data) { | |||||
auto ret = ge::CheckUint64AddOverflow(total_size, partition_data.size); | |||||
GE_CHK_BOOL_RET_STATUS(ret == SUCCESS, FAILED, "Add uint64 overflow!"); | |||||
total_size += partition_data.size; | |||||
} | |||||
} | |||||
// save to buff | |||||
auto buff = reinterpret_cast<uint8_t *>(malloc(total_size)); | auto buff = reinterpret_cast<uint8_t *>(malloc(total_size)); | ||||
GE_CHK_BOOL_RET_STATUS(buff != nullptr, FAILED, "malloc failed!"); | |||||
GE_PRINT_DYNAMIC_MEMORY(malloc, "file buffer.", total_size) | |||||
GE_CHK_BOOL_RET_STATUS(buff != nullptr, FAILED, "Malloc failed!"); | |||||
GE_PRINT_DYNAMIC_MEMORY(malloc, "File buffer.", total_size) | |||||
model.data.reset(buff, [](uint8_t *buff) { | model.data.reset(buff, [](uint8_t *buff) { | ||||
GELOGD("Free online model memory."); | GELOGD("Free online model memory."); | ||||
free(buff); | free(buff); | ||||
buff = nullptr; | buff = nullptr; | ||||
}); | }); | ||||
model.length = total_size; | model.length = total_size; | ||||
uint32_t left_space = total_size; | |||||
auto ret_mem1 = memcpy_s(buff, left_space, reinterpret_cast<void *>(const_cast<ModelFileHeader *>(&file_header)), | |||||
model_header_size); | |||||
GE_CHK_BOOL_RET_STATUS(ret_mem1 == 0, FAILED, "memcpy_s failed!"); | |||||
uint64_t left_space = total_size; | |||||
auto ret_mem = memcpy_s(buff, left_space, reinterpret_cast<void *>(const_cast<ModelFileHeader *>(&file_header)), | |||||
model_header_size); | |||||
GE_CHK_BOOL_RET_STATUS(ret_mem == EOK, FAILED, "Memcpy_s failed!"); | |||||
buff += model_header_size; | buff += model_header_size; | ||||
left_space -= model_header_size; | left_space -= model_header_size; | ||||
auto ret_mem2 = memcpy_s(buff, left_space, reinterpret_cast<void *>(&model_partition_table), table_size); | |||||
GE_CHK_BOOL_RET_STATUS(ret_mem2 == 0, FAILED, "memcpy_s failed!"); | |||||
buff += table_size; | |||||
left_space -= table_size; | |||||
for (const auto &partitionData : partitionDatas) { | |||||
auto ret_mem3 = memcpy_s(buff, left_space, reinterpret_cast<void *>(const_cast<uint8_t *>(partitionData.data)), | |||||
partitionData.size); | |||||
GE_CHK_BOOL_RET_STATUS(ret_mem3 == 0, FAILED, "memcpy failed!"); | |||||
buff += partitionData.size; | |||||
left_space -= partitionData.size; | |||||
for (size_t index = 0; index < model_partition_tables.size(); ++index) { | |||||
auto &cur_tabel = *model_partition_tables[index]; | |||||
uint64_t table_size = static_cast<uint64_t>(SIZE_OF_MODEL_PARTITION_TABLE(cur_tabel)); | |||||
ret_mem = memcpy_s(buff, left_space, reinterpret_cast<void *>(&cur_tabel), table_size); | |||||
GE_CHK_BOOL_RET_STATUS(ret_mem == EOK, FAILED, "Memcpy_s failed!"); | |||||
buff += table_size; | |||||
left_space -= table_size; | |||||
auto &cur_partition_data = all_partition_datas[index]; | |||||
for (const auto &partition_data : cur_partition_data) { | |||||
ret_mem = memcpy_s(buff, left_space, reinterpret_cast<void *>(const_cast<uint8_t *>(partition_data.data)), | |||||
partition_data.size); | |||||
GE_CHK_BOOL_RET_STATUS(ret_mem == EOK, FAILED, "Memcpy_s failed!"); | |||||
buff += partition_data.size; | |||||
left_space -= partition_data.size; | |||||
} | |||||
} | } | ||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status FileSaver::CheckPath(const std::string &file_path) { | FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status FileSaver::CheckPath(const std::string &file_path) { | ||||
// Determine file path length | // Determine file path length | ||||
if (file_path.size() >= MMPA_MAX_PATH) { | if (file_path.size() >= MMPA_MAX_PATH) { | ||||
GELOGE(FAILED, "Path is too long:%zu", file_path.size()); | |||||
GELOGE(FAILED, "[Check][FilePath]Failed, file path's length:%zu > mmpa_max_path:%d", | |||||
file_path.size(), MMPA_MAX_PATH); | |||||
REPORT_INNER_ERROR("E19999", "Check file path failed, file path's length:%zu > mmpa_max_path:%d", | |||||
file_path.size(), MMPA_MAX_PATH); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -212,7 +255,7 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status FileSaver::CheckPath(con | |||||
// If there is a path before the file name, create the path | // If there is a path before the file name, create the path | ||||
if (path_split_pos != -1) { | if (path_split_pos != -1) { | ||||
if (CreateDirectory(std::string(file_path).substr(0, static_cast<size_t>(path_split_pos))) != kFileOpSuccess) { | if (CreateDirectory(std::string(file_path).substr(0, static_cast<size_t>(path_split_pos))) != kFileOpSuccess) { | ||||
GELOGE(FAILED, "CreateDirectory failed, file path:%s.", file_path.c_str()); | |||||
GELOGE(FAILED, "[Create][Directory]Failed, file path:%s.", file_path.c_str()); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
} | } | ||||
@@ -223,7 +266,8 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status FileSaver::CheckPath(con | |||||
FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status | FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status | ||||
FileSaver::SaveToFile(const string &file_path, const ge::ModelData &model, const ModelFileHeader *model_file_header) { | FileSaver::SaveToFile(const string &file_path, const ge::ModelData &model, const ModelFileHeader *model_file_header) { | ||||
if (file_path.empty() || model.model_data == nullptr || model.model_len == 0) { | if (file_path.empty() || model.model_data == nullptr || model.model_len == 0) { | ||||
GELOGE(FAILED, "Incorrected input param. file_path.empty() || model.model_data == nullptr || model.model_len == 0"); | |||||
GELOGE(FAILED, "[Save][File]Incorrect input param, file_path is empty or model_data is nullptr or model_len is 0"); | |||||
REPORT_INNER_ERROR("E19999", "Save file failed, at least one of the input parameters(file_path, model_data, model_len) is incorrect"); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -240,7 +284,8 @@ FileSaver::SaveToFile(const string &file_path, const ge::ModelData &model, const | |||||
const Status ret = SaveWithFileHeader(file_path, file_header, model.model_data, file_header.length); | const Status ret = SaveWithFileHeader(file_path, file_header, model.model_data, file_header.length); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
GELOGE(FAILED, "Save file failed, file_path:%s, file header len:%u.", file_path.c_str(), file_header.length); | |||||
GELOGE(FAILED, "[Save][File]Failed, file_path:%s, file_header_len:%u, error_code:%u.", | |||||
file_path.c_str(), file_header.length, ret); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -305,7 +350,7 @@ Status FileSaver::SaveWithFileHeader(const std::string &file_path, const ModelFi | |||||
// Write partition data | // Write partition data | ||||
auto &cur_partition_datas = all_partition_datas[index]; | auto &cur_partition_datas = all_partition_datas[index]; | ||||
for (const auto &partition_data : cur_partition_datas) { | for (const auto &partition_data : cur_partition_datas) { | ||||
GELOGI("GC:size[%u]", partition_data.size); | |||||
GELOGI("part_size[%u]", partition_data.size); | |||||
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG( | GE_CHK_BOOL_TRUE_EXEC_WITH_LOG( | ||||
WriteData(static_cast<const void *>(partition_data.data), partition_data.size, fd) != SUCCESS, ret = FAILED; | WriteData(static_cast<const void *>(partition_data.data), partition_data.size, fd) != SUCCESS, ret = FAILED; | ||||
break); | break); | ||||
@@ -313,14 +358,19 @@ Status FileSaver::SaveWithFileHeader(const std::string &file_path, const ModelFi | |||||
} | } | ||||
} while (0); | } while (0); | ||||
// Close file | // Close file | ||||
GE_CHK_BOOL_RET_STATUS(mmClose(fd) == EN_OK, FAILED, "Close file failed."); | |||||
if (mmClose(fd) != 0) { // mmClose 0: success | |||||
GELOGE(FAILED, "[Close][File]Failed, error_code:%u errmsg:%s", ret, strerror(errno)); | |||||
REPORT_CALL_ERROR("E19999", "Close file failed, error_code:%u errmsg:%s", ret, strerror(errno)); | |||||
ret = FAILED; | |||||
} | |||||
return ret; | return ret; | ||||
} | } | ||||
FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status FileSaver::SaveToFile(const string &file_path, const void *data, | FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status FileSaver::SaveToFile(const string &file_path, const void *data, | ||||
int len) { | int len) { | ||||
if (data == nullptr || len <= 0) { | if (data == nullptr || len <= 0) { | ||||
GELOGE(FAILED, "Model_data is null or the length[%d] less than 1.", len); | |||||
GELOGE(FAILED, "[Check][Param]Failed, model_data is null or the length[%d] is less than 1.", len); | |||||
REPORT_INNER_ERROR("E19999", "Save file failed, the model_data is null or its length:%d is less than 1.", len); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -335,7 +385,8 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status FileSaver::SaveToFile(co | |||||
// Close file | // Close file | ||||
if (mmClose(fd) != 0) { // mmClose 0: success | if (mmClose(fd) != 0) { // mmClose 0: success | ||||
GELOGE(FAILED, "Close file failed."); | |||||
GELOGE(FAILED, "[Close][File]Failed, error_code:%u errmsg:%s", ret, strerror(errno)); | |||||
REPORT_CALL_ERROR("E19999", "Close file failed, error_code:%u errmsg:%s", ret, strerror(errno)); | |||||
ret = FAILED; | ret = FAILED; | ||||
} | } | ||||
return ret; | return ret; | ||||
@@ -80,9 +80,14 @@ class FileSaver { | |||||
static Status SaveToBuffWithFileHeader(const ModelFileHeader &file_header, | static Status SaveToBuffWithFileHeader(const ModelFileHeader &file_header, | ||||
ModelPartitionTable &model_partition_table, | ModelPartitionTable &model_partition_table, | ||||
const std::vector<ModelPartition> &partitionDatas, | |||||
const std::vector<ModelPartition> &partition_datas, | |||||
ge::ModelBufferData& model); | ge::ModelBufferData& model); | ||||
static Status SaveToBuffWithFileHeader(const ModelFileHeader &file_header, | |||||
const std::vector<ModelPartitionTable *> &model_partition_tables, | |||||
const std::vector<std::vector<ModelPartition>> &all_partition_datas, | |||||
ge::ModelBufferData &model); | |||||
static Status SaveToFile(const string &file_path, const void *data, int len); | static Status SaveToFile(const string &file_path, const void *data, int len); | ||||
protected: | protected: | ||||
@@ -113,8 +118,8 @@ class FileSaver { | |||||
ModelPartitionTable &model_partition_table, | ModelPartitionTable &model_partition_table, | ||||
const std::vector<ModelPartition> &partition_datas); | const std::vector<ModelPartition> &partition_datas); | ||||
static Status SaveWithFileHeader(const std::string &file_path, const ModelFileHeader &file_header, | static Status SaveWithFileHeader(const std::string &file_path, const ModelFileHeader &file_header, | ||||
vector<ModelPartitionTable *> &model_partition_tables, | |||||
const vector<vector<ModelPartition>> &all_partition_datas); | |||||
std::vector<ModelPartitionTable *> &model_partition_tables, | |||||
const std::vector<std::vector<ModelPartition>> &all_partition_datas); | |||||
}; | }; | ||||
} // namespace ge | } // namespace ge | ||||
#endif // GE_COMMON_AUTH_FILE_SAVER_H_ | #endif // GE_COMMON_AUTH_FILE_SAVER_H_ |
@@ -41,14 +41,16 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status MemoryDumper::DumpToFile | |||||
GE_CHECK_NOTNULL(filename); | GE_CHECK_NOTNULL(filename); | ||||
GE_CHECK_NOTNULL(data); | GE_CHECK_NOTNULL(data); | ||||
if (len == 0) { | if (len == 0) { | ||||
GELOGE(FAILED, "len is 0."); | |||||
GELOGE(FAILED, "[Check][Param]Failed, data length is 0."); | |||||
REPORT_INNER_ERROR("E19999", "Check param failed, data length is 0."); | |||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
} | } | ||||
// Open the file | // Open the file | ||||
int fd = OpenFile(filename); | int fd = OpenFile(filename); | ||||
if (fd == kInvalidFd) { | if (fd == kInvalidFd) { | ||||
GELOGE(FAILED, "Open file failed."); | |||||
GELOGE(FAILED, "[Open][File]Failed, filename:%s.", filename); | |||||
REPORT_INNER_ERROR("E19999", "Opne file failed, filename:%s.", filename); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -57,13 +59,15 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status MemoryDumper::DumpToFile | |||||
int32_t mmpa_ret = mmWrite(fd, data, len); | int32_t mmpa_ret = mmWrite(fd, data, len); | ||||
// mmWrite return -1:Failed to write data to file;return -2:Invalid parameter | // mmWrite return -1:Failed to write data to file;return -2:Invalid parameter | ||||
if (mmpa_ret == EN_ERROR || mmpa_ret == EN_INVALID_PARAM) { | if (mmpa_ret == EN_ERROR || mmpa_ret == EN_INVALID_PARAM) { | ||||
GELOGE(FAILED, "Write to file failed. errno = %d, %s", mmpa_ret, strerror(errno)); | |||||
GELOGE(FAILED, "[Write][Data]Failed, errno = %d, error:%s", mmpa_ret, strerror(errno)); | |||||
REPORT_INNER_ERROR("E19999", "Write data failed, errno = %d, error:%s.", mmpa_ret, strerror(errno)); | |||||
ret = FAILED; | ret = FAILED; | ||||
} | } | ||||
// Close the file | // Close the file | ||||
if (mmClose(fd) != EN_OK) { // mmClose return 0: success | if (mmClose(fd) != EN_OK) { // mmClose return 0: success | ||||
GELOGE(FAILED, "Close file failed."); | |||||
GELOGE(FAILED, "[Close][File]Failed, error_code:%u, filename:%s.", ret, filename); | |||||
REPORT_INNER_ERROR("E19999", "Close file failed, error_code:%u, filename:%s.", ret, filename); | |||||
ret = FAILED; | ret = FAILED; | ||||
} | } | ||||
@@ -89,7 +93,8 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status MemoryDumper::Open(const | |||||
fd_ = OpenFile(filename); | fd_ = OpenFile(filename); | ||||
if (fd_ == kInvalidFd) { | if (fd_ == kInvalidFd) { | ||||
GELOGE(FAILED, "Open %s failed.", filename); | |||||
GELOGE(FAILED, "[Open][File]Failed, filename:%s.", filename); | |||||
REPORT_INNER_ERROR("E19999", "Open file:%s failed.", filename); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -104,7 +109,8 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status MemoryDumper::Dump(void | |||||
int32_t mmpa_ret = mmWrite(fd_, data, len); | int32_t mmpa_ret = mmWrite(fd_, data, len); | ||||
// mmWrite return -1:failed to write data to file;return -2:invalid parameter | // mmWrite return -1:failed to write data to file;return -2:invalid parameter | ||||
if (mmpa_ret == EN_ERROR || mmpa_ret == EN_INVALID_PARAM) { | if (mmpa_ret == EN_ERROR || mmpa_ret == EN_INVALID_PARAM) { | ||||
GELOGE(FAILED, "Write to file failed. errno = %d, %s", mmpa_ret, strerror(errno)); | |||||
GELOGE(FAILED, "[Write][Data]Failed, errno = %d, error:%s", mmpa_ret, strerror(errno)); | |||||
REPORT_INNER_ERROR("E19999", "Write data to file failed, errno = %d, error:%s.", mmpa_ret, strerror(errno)); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -155,9 +161,10 @@ int MemoryDumper::OpenFile(const char *filename) { | |||||
// Using the O_EXCL, if the file already exists,return failed to avoid privilege escalation vulnerability. | // Using the O_EXCL, if the file already exists,return failed to avoid privilege escalation vulnerability. | ||||
mmMode_t mode = M_IRUSR | M_IWUSR; | mmMode_t mode = M_IRUSR | M_IWUSR; | ||||
int32_t fd = mmOpen2(real_path.c_str(), M_RDWR | M_CREAT | O_TRUNC, mode); | |||||
int32_t fd = mmOpen2(real_path.c_str(), M_RDWR | M_CREAT | M_APPEND, mode); | |||||
if (fd == EN_ERROR || fd == EN_INVALID_PARAM) { | if (fd == EN_ERROR || fd == EN_INVALID_PARAM) { | ||||
GELOGE(kInvalidFd, "open file failed. errno = %d, %s", fd, strerror(errno)); | |||||
GELOGE(kInvalidFd, "[Open][File]Failed. errno = %d, error:%s, filename:%s.", | |||||
fd, strerror(errno), filename); | |||||
return kInvalidFd; | return kInvalidFd; | ||||
} | } | ||||
return fd; | return fd; | ||||
@@ -96,7 +96,7 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status DumpManager::SetDumpConf | |||||
dump_mode = dump_config.dump_mode; | dump_mode = dump_config.dump_mode; | ||||
GELOGI("Dump mode is %s", dump_mode.c_str()); | GELOGI("Dump mode is %s", dump_mode.c_str()); | ||||
dump_properties.SetDumpMode(dump_mode); | dump_properties.SetDumpMode(dump_mode); | ||||
dump_properties_map_.emplace(kInferSessionId, dump_properties); | |||||
dump_properties_map_[kInferSessionId] = dump_properties; | |||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
@@ -20,6 +20,7 @@ | |||||
#include "common/ge/datatype_util.h" | #include "common/ge/datatype_util.h" | ||||
#include "framework/common/debug/ge_log.h" | #include "framework/common/debug/ge_log.h" | ||||
#include "framework/common/util.h" | #include "framework/common/util.h" | ||||
#include "framework/common/types.h" | |||||
#include "graph/anchor.h" | #include "graph/anchor.h" | ||||
#include "graph/ge_tensor.h" | #include "graph/ge_tensor.h" | ||||
#include "graph/op_desc.h" | #include "graph/op_desc.h" | ||||
@@ -55,8 +56,10 @@ void DumpOp::SetLoopAddr(void *global_step, void *loop_per_iter, void *loop_cond | |||||
loop_cond_ = reinterpret_cast<uintptr_t>(loop_cond); | loop_cond_ = reinterpret_cast<uintptr_t>(loop_cond); | ||||
} | } | ||||
void DumpOp::SetDynamicModelInfo(const string &dynamic_model_name, uint32_t dynamic_model_id) { | |||||
void DumpOp::SetDynamicModelInfo(const string &dynamic_model_name, const string &dynamic_om_name, | |||||
uint32_t dynamic_model_id) { | |||||
dynamic_model_name_ = dynamic_model_name; | dynamic_model_name_ = dynamic_model_name; | ||||
dynamic_om_name_ = dynamic_om_name; | |||||
dynamic_model_id_ = dynamic_model_id; | dynamic_model_id_ = dynamic_model_id; | ||||
} | } | ||||
@@ -200,6 +203,32 @@ Status DumpOp::ExecutorDumpOp(aicpu::dump::OpMappingInfo &op_mapping_info) { | |||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
Status DumpOp::SetDumpModelName(aicpu::dump::OpMappingInfo &op_mapping_info) { | |||||
if (dynamic_model_name_.empty() && dynamic_om_name_.empty()) { | |||||
GELOGI("Single op dump, no need set model name"); | |||||
return SUCCESS; | |||||
} | |||||
std::set<std::string> model_list = dump_properties_.GetAllDumpModel(); | |||||
bool not_find_by_omname = model_list.find(dynamic_om_name_) == model_list.end(); | |||||
bool not_find_by_modelname = model_list.find(dynamic_model_name_) == model_list.end(); | |||||
std::string dump_model_name = not_find_by_omname ? dynamic_model_name_ : dynamic_om_name_; | |||||
if (model_list.find(DUMP_ALL_MODEL) == model_list.end()) { | |||||
if (not_find_by_omname && not_find_by_modelname) { | |||||
std::string model_list_str; | |||||
for (auto &model : model_list) { | |||||
model_list_str += "[" + model + "]."; | |||||
} | |||||
GELOGW("Model %s will not be set to dump, dump list: %s", dump_model_name.c_str(), model_list_str.c_str()); | |||||
return FAILED; | |||||
} | |||||
} | |||||
if (!dump_model_name.empty() && dump_properties_.IsDumpOpen()) { | |||||
GELOGI("Dump model name is %s", dump_model_name.c_str()); | |||||
op_mapping_info.set_model_name(dump_model_name); | |||||
} | |||||
return SUCCESS; | |||||
} | |||||
Status DumpOp::LaunchDumpOp() { | Status DumpOp::LaunchDumpOp() { | ||||
GELOGI("Start to launch dump op %s", op_desc_->GetName().c_str()); | GELOGI("Start to launch dump op %s", op_desc_->GetName().c_str()); | ||||
int32_t device_id = 0; | int32_t device_id = 0; | ||||
@@ -209,8 +238,7 @@ Status DumpOp::LaunchDumpOp() { | |||||
return RT_ERROR_TO_GE_STATUS(rt_ret); | return RT_ERROR_TO_GE_STATUS(rt_ret); | ||||
} | } | ||||
if (device_id < 0) { | if (device_id < 0) { | ||||
GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, | |||||
"Check device_id failed, device_id = %d, which should be not less than 0.", | |||||
GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "Check device_id failed, device_id = %d, which should be not less than 0.", | |||||
device_id); | device_id); | ||||
return ACL_ERROR_GE_INTERNAL_ERROR; | return ACL_ERROR_GE_INTERNAL_ERROR; | ||||
} | } | ||||
@@ -220,11 +248,12 @@ Status DumpOp::LaunchDumpOp() { | |||||
op_mapping_info.set_flag(kAicpuLoadFlag); | op_mapping_info.set_flag(kAicpuLoadFlag); | ||||
op_mapping_info.set_dump_step(dump_properties_.GetDumpStep()); | op_mapping_info.set_dump_step(dump_properties_.GetDumpStep()); | ||||
op_mapping_info.set_model_id(dynamic_model_id_); | op_mapping_info.set_model_id(dynamic_model_id_); | ||||
if (!dynamic_model_name_.empty() && dump_properties_.IsDumpOpen()) { | |||||
op_mapping_info.set_model_name(dynamic_model_name_); | |||||
if (SetDumpModelName(op_mapping_info) != SUCCESS) { | |||||
return SUCCESS; | |||||
} | } | ||||
SetOpMappingLoopAddr(global_step_, loop_per_iter_, loop_cond_, op_mapping_info); | SetOpMappingLoopAddr(global_step_, loop_per_iter_, loop_cond_, op_mapping_info); | ||||
GELOGI("Dump step is %s ,dump path is %s ,in Launch dump op", dump_properties_.GetDumpStep().c_str(), | |||||
GELOGI("Dump step is %s ,dump path is %s in Launch dump op", dump_properties_.GetDumpStep().c_str(), | |||||
dump_path.c_str()); | dump_path.c_str()); | ||||
uint32_t task_id = 0; | uint32_t task_id = 0; | ||||
uint32_t stream_id = 0; | uint32_t stream_id = 0; | ||||
@@ -273,4 +302,4 @@ Status DumpOp::LaunchDumpOp() { | |||||
} | } | ||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
} // namesapce ge | |||||
} // namespace ge |
@@ -34,12 +34,13 @@ class DumpOp { | |||||
vector<uintptr_t> output_addrs, rtStream_t stream); | vector<uintptr_t> output_addrs, rtStream_t stream); | ||||
Status LaunchDumpOp(); | Status LaunchDumpOp(); | ||||
void SetLoopAddr(void *global_step, void *loop_per_iter, void *loop_cond); | void SetLoopAddr(void *global_step, void *loop_per_iter, void *loop_cond); | ||||
void SetDynamicModelInfo(const string &dynamic_model_name, uint32_t dynamic_model_id); | |||||
void SetDynamicModelInfo(const string &dynamic_model_name, const string &dynamic_om_name, uint32_t dynamic_model_id); | |||||
private: | private: | ||||
Status ExecutorDumpOp(aicpu::dump::OpMappingInfo &op_mapping_info); | Status ExecutorDumpOp(aicpu::dump::OpMappingInfo &op_mapping_info); | ||||
Status DumpOutput(aicpu::dump::Task &task); | Status DumpOutput(aicpu::dump::Task &task); | ||||
Status DumpInput(aicpu::dump::Task &task); | Status DumpInput(aicpu::dump::Task &task); | ||||
Status SetDumpModelName(aicpu::dump::OpMappingInfo &op_mapping_info); | |||||
DumpProperties dump_properties_; | DumpProperties dump_properties_; | ||||
OpDescPtr op_desc_; | OpDescPtr op_desc_; | ||||
@@ -54,6 +55,7 @@ class DumpOp { | |||||
uintptr_t loop_cond_; | uintptr_t loop_cond_; | ||||
std::string dynamic_model_name_; | std::string dynamic_model_name_; | ||||
std::string dynamic_om_name_; | |||||
std::uint32_t dynamic_model_id_; | std::uint32_t dynamic_model_id_; | ||||
}; | }; | ||||
} // namespace ge | } // namespace ge | ||||
@@ -35,14 +35,14 @@ const std::string kDumpStatusOpen = "on"; | |||||
const uint32_t kAicoreOverflow = (0x1 << 0); | const uint32_t kAicoreOverflow = (0x1 << 0); | ||||
const uint32_t kAtomicOverflow = (0x1 << 1); | const uint32_t kAtomicOverflow = (0x1 << 1); | ||||
const uint32_t kAllOverflow = (kAicoreOverflow | kAtomicOverflow); | const uint32_t kAllOverflow = (kAicoreOverflow | kAtomicOverflow); | ||||
} | |||||
} // namespace | |||||
namespace ge { | namespace ge { | ||||
FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY DumpProperties::DumpProperties(const DumpProperties &other) { | FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY DumpProperties::DumpProperties(const DumpProperties &other) { | ||||
CopyFrom(other); | CopyFrom(other); | ||||
} | } | ||||
FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY DumpProperties &DumpProperties::operator=( | FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY DumpProperties &DumpProperties::operator=( | ||||
const DumpProperties &other) { | |||||
const DumpProperties &other) { | |||||
CopyFrom(other); | CopyFrom(other); | ||||
return *this; | return *this; | ||||
} | } | ||||
@@ -97,7 +97,7 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY void DumpProperties::InitByOpti | |||||
// The following is the new dump scenario of the fusion operator | // The following is the new dump scenario of the fusion operator | ||||
FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY void DumpProperties::AddPropertyValue( | FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY void DumpProperties::AddPropertyValue( | ||||
const std::string &model, const std::set<std::string> &layers) { | |||||
const std::string &model, const std::set<std::string> &layers) { | |||||
for (const std::string &layer : layers) { | for (const std::string &layer : layers) { | ||||
GELOGI("This model %s config to dump layer %s", model.c_str(), layer.c_str()); | GELOGI("This model %s config to dump layer %s", model.c_str(), layer.c_str()); | ||||
} | } | ||||
@@ -138,7 +138,7 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY std::set<std::string> DumpPrope | |||||
} | } | ||||
FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY std::set<std::string> DumpProperties::GetPropertyValue( | FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY std::set<std::string> DumpProperties::GetPropertyValue( | ||||
const std::string &model) const { | |||||
const std::string &model) const { | |||||
auto iter = model_dump_properties_map_.find(model); | auto iter = model_dump_properties_map_.find(model); | ||||
if (iter != model_dump_properties_map_.end()) { | if (iter != model_dump_properties_map_.end()) { | ||||
return iter->second; | return iter->second; | ||||
@@ -147,8 +147,9 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY std::set<std::string> DumpPrope | |||||
} | } | ||||
FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY bool DumpProperties::IsLayerNeedDump( | FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY bool DumpProperties::IsLayerNeedDump( | ||||
const std::string &model, const std::string &om_name, const std::string &op_name) const { | |||||
const std::string &model, const std::string &om_name, const std::string &op_name) const { | |||||
// if dump all | // if dump all | ||||
GELOGD("model name is %s om name is %s op is %s in layer need dump", model.c_str(), om_name.c_str(), op_name.c_str()); | |||||
if (model_dump_properties_map_.find(DUMP_ALL_MODEL) != model_dump_properties_map_.end()) { | if (model_dump_properties_map_.find(DUMP_ALL_MODEL) != model_dump_properties_map_.end()) { | ||||
return true; | return true; | ||||
} | } | ||||
@@ -203,7 +204,7 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY const std::string &DumpProperti | |||||
} | } | ||||
FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY void DumpProperties::SetDumpOpSwitch( | FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY void DumpProperties::SetDumpOpSwitch( | ||||
const std::string &dump_op_switch) { | |||||
const std::string &dump_op_switch) { | |||||
dump_op_switch_ = dump_op_switch; | dump_op_switch_ = dump_op_switch; | ||||
} | } | ||||
@@ -270,4 +271,4 @@ void DumpProperties::SetDumpDebugOptions() { | |||||
GELOGI("ge.exec.enableDumpDebug is false or is not set."); | GELOGI("ge.exec.enableDumpDebug is false or is not set."); | ||||
} | } | ||||
} | } | ||||
} // namespace | |||||
} // namespace ge |
@@ -0,0 +1,241 @@ | |||||
/** | |||||
* Copyright 2019-2021 Huawei Technologies Co., Ltd | |||||
* | |||||
* Licensed under the Apache License, Version 2.0 (the "License"); | |||||
* you may not use this file except in compliance with the License. | |||||
* You may obtain a copy of the License at | |||||
* | |||||
* http://www.apache.org/licenses/LICENSE-2.0 | |||||
* | |||||
* Unless required by applicable law or agreed to in writing, software | |||||
* distributed under the License is distributed on an "AS IS" BASIS, | |||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
* See the License for the specific language governing permissions and | |||||
* limitations under the License. | |||||
*/ | |||||
#include "common/dump/exception_dumper.h" | |||||
#include "common/ge/datatype_util.h" | |||||
#include "common/debug/memory_dumper.h" | |||||
#include "framework/common/debug/log.h" | |||||
#include "graph/manager/util/debug.h" | |||||
#include "graph/utils/tensor_utils.h" | |||||
#include "graph/load/model_manager/model_utils.h" | |||||
#include "proto/dump_task.pb.h" | |||||
namespace { | |||||
static uint64_t GetNowTime() { | |||||
uint64_t ret = 0; | |||||
mmTimeval tv; | |||||
if (mmGetTimeOfDay(&tv, nullptr) == 0) { | |||||
ret = tv.tv_sec * 1000000ULL + tv.tv_usec; | |||||
} | |||||
return ret; | |||||
} | |||||
static void ReplaceStringElem(std::string &str) { | |||||
for_each(str.begin(), str.end(), [](char &ch) { | |||||
if ((ch == ' ') || (ch == '.') || (ch == '/') || (ch == '\\')) { | |||||
ch = '_'; | |||||
} | |||||
}); | |||||
} | |||||
static void SetDumpData(const ge::OpDescInfo &op_desc_info, toolkit::dumpdata::DumpData &dump_data) { | |||||
dump_data.set_version("2.0"); | |||||
dump_data.set_dump_time(GetNowTime()); | |||||
dump_data.set_op_name(op_desc_info.op_name); | |||||
for (size_t i = 0; i < op_desc_info.input_format.size(); ++i) { | |||||
toolkit::dumpdata::OpInput input; | |||||
input.set_data_type(toolkit::dumpdata::OutputDataType( | |||||
ge::DataTypeUtil::GetIrDataType(op_desc_info.input_data_type[i]))); | |||||
input.set_format(toolkit::dumpdata::OutputFormat(op_desc_info.input_format[i])); | |||||
for (auto dim : op_desc_info.input_shape[i]) { | |||||
input.mutable_shape()->add_dim(dim); | |||||
} | |||||
input.set_size(op_desc_info.input_size[i]); | |||||
GELOGI("[Set][DumpData] The input size int exception is %ld", op_desc_info.input_size[i]); | |||||
dump_data.mutable_input()->Add(std::move(input)); | |||||
} | |||||
for (size_t j = 0; j < op_desc_info.output_format.size(); ++j) { | |||||
toolkit::dumpdata::OpOutput output; | |||||
output.set_data_type(toolkit::dumpdata::OutputDataType( | |||||
ge::DataTypeUtil::GetIrDataType(op_desc_info.output_data_type[j]))); | |||||
output.set_format(toolkit::dumpdata::OutputFormat(op_desc_info.output_format[j])); | |||||
for (auto dim : op_desc_info.output_shape[j]) { | |||||
output.mutable_shape()->add_dim(dim); | |||||
} | |||||
output.set_size(op_desc_info.output_size[j]); | |||||
GELOGI("[Set][DumpData] The output size int exception is %ld", op_desc_info.output_size[j]); | |||||
dump_data.mutable_output()->Add(std::move(output)); | |||||
} | |||||
} | |||||
} // namespace | |||||
namespace ge { | |||||
ExceptionDumper::~ExceptionDumper() {} | |||||
void ExceptionDumper::SaveDumpOpInfo(const OpDescPtr &op, uint32_t task_id, uint32_t stream_id, | |||||
vector<void *> &input_addrs, vector<void *> &output_addrs) { | |||||
OpDescInfo op_desc_info; | |||||
SaveOpDescInfo(op, task_id, stream_id, op_desc_info); | |||||
op_desc_info.input_addrs = input_addrs; | |||||
op_desc_info.output_addrs = output_addrs; | |||||
op_desc_info_.emplace_back(std::move(op_desc_info)); | |||||
} | |||||
void ExceptionDumper::SaveDumpOpInfo(const RuntimeParam &model_param, const OpDescPtr &op, | |||||
uint32_t task_id, uint32_t stream_id) { | |||||
OpDescInfo op_desc_info; | |||||
SaveOpDescInfo(op, task_id, stream_id, op_desc_info); | |||||
op_desc_info.input_addrs = ModelUtils::GetInputDataAddrs(model_param, op); | |||||
op_desc_info.output_addrs = ModelUtils::GetOutputDataAddrs(model_param, op); | |||||
op_desc_info_.emplace_back(std::move(op_desc_info)); | |||||
} | |||||
void ExceptionDumper::SaveOpDescInfo(const OpDescPtr &op, uint32_t task_id, uint32_t stream_id, | |||||
OpDescInfo &op_desc_info) { | |||||
if (op == nullptr) { | |||||
GELOGW("[Save][OpExceptionInfo] op desc ptr is null."); | |||||
return; | |||||
} | |||||
GELOGD("[Save][OpExceptionInfo] Start to save dump op [%s] info of task_id: %u, stream_id: %u", | |||||
op->GetName().c_str(), task_id, stream_id); | |||||
op_desc_info.op_name = op->GetName(); | |||||
op_desc_info.op_type = op->GetType(); | |||||
op_desc_info.task_id = task_id; | |||||
op_desc_info.stream_id = stream_id; | |||||
for (size_t i = 0; i < op->GetAllInputsSize(); ++i) { | |||||
GeTensorDescPtr input_tensor_desc = op->MutableInputDesc(i); | |||||
if (input_tensor_desc == nullptr) { | |||||
continue; | |||||
} | |||||
op_desc_info.input_format.emplace_back(input_tensor_desc->GetFormat()); | |||||
op_desc_info.input_shape.emplace_back(input_tensor_desc->GetShape().GetDims()); | |||||
op_desc_info.input_data_type.emplace_back(input_tensor_desc->GetDataType()); | |||||
int64_t input_size = 0; | |||||
if (TensorUtils::GetTensorSizeInBytes(*input_tensor_desc, input_size) != SUCCESS) { | |||||
GELOGW("[Save][OpExceptionInfo] Op [%s] get input size failed.", op->GetName().c_str()); | |||||
return; | |||||
} | |||||
GELOGD("[Save][OpExceptionInfo] Save dump op info, the input size is %ld", input_size); | |||||
op_desc_info.input_size.emplace_back(input_size); | |||||
} | |||||
for (size_t j = 0; j < op->GetOutputsSize(); ++j) { | |||||
GeTensorDescPtr output_tensor_desc = op->MutableOutputDesc(j); | |||||
if (output_tensor_desc == nullptr) { | |||||
continue; | |||||
} | |||||
op_desc_info.output_format.emplace_back(output_tensor_desc->GetFormat()); | |||||
op_desc_info.output_shape.emplace_back(output_tensor_desc->GetShape().GetDims()); | |||||
op_desc_info.output_data_type.emplace_back(output_tensor_desc->GetDataType()); | |||||
int64_t output_size = 0; | |||||
if (TensorUtils::GetTensorSizeInBytes(*output_tensor_desc, output_size) != SUCCESS) { | |||||
GELOGW("[Save][OpExceptionInfo] Op [%s] get output size failed.", op->GetName().c_str()); | |||||
return; | |||||
} | |||||
GELOGD("[Save][OpExceptionInfo] Save dump op info, the output size is %ld.", output_size); | |||||
op_desc_info.output_size.emplace_back(output_size); | |||||
} | |||||
} | |||||
Status ExceptionDumper::DumpExceptionInfo(const std::vector<rtExceptionInfo> &exception_infos) const { | |||||
GELOGI("[Dump][Exception] Start to dump exception info"); | |||||
for (const rtExceptionInfo &iter : exception_infos) { | |||||
OpDescInfo op_desc_info; | |||||
if (GetOpDescInfo(iter.streamid, iter.taskid, op_desc_info)) { | |||||
toolkit::dumpdata::DumpData dump_data; | |||||
SetDumpData(op_desc_info, dump_data); | |||||
uint64_t now_time = GetNowTime(); | |||||
std::string op_name = op_desc_info.op_name; | |||||
std::string op_type = op_desc_info.op_type; | |||||
ReplaceStringElem(op_name); | |||||
ReplaceStringElem(op_type); | |||||
string dump_file_path = | |||||
"./" + op_type + "." + op_name + "." + std::to_string(op_desc_info.task_id) + "." + std::to_string(now_time); | |||||
GELOGI("[Dump][Exception] The exception dump file path is %s", dump_file_path.c_str()); | |||||
uint64_t proto_size = dump_data.ByteSizeLong(); | |||||
std::unique_ptr<char[]> proto_msg(new (std::nothrow) char[proto_size]); | |||||
bool ret = dump_data.SerializeToArray(proto_msg.get(), proto_size); | |||||
if (!ret || proto_size == 0) { | |||||
REPORT_INNER_ERROR("E19999", "Serialize proto to string fail"); | |||||
GELOGE(PARAM_INVALID, "[Dump][Exception] Dump data proto serialize failed"); | |||||
return PARAM_INVALID; | |||||
} | |||||
GE_CHK_STATUS_RET(MemoryDumper::DumpToFile(dump_file_path.c_str(), &proto_size, sizeof(uint64_t)), | |||||
"Failed to dump proto size"); | |||||
GE_CHK_STATUS_RET(MemoryDumper::DumpToFile(dump_file_path.c_str(), proto_msg.get(), proto_size), | |||||
"Failed to dump proto msg"); | |||||
if (DumpExceptionInput(op_desc_info, dump_file_path) != SUCCESS) { | |||||
GELOGE(PARAM_INVALID, "[Dump][Exception] Dump exception input failed"); | |||||
return PARAM_INVALID; | |||||
} | |||||
if (DumpExceptionOutput(op_desc_info, dump_file_path) != SUCCESS) { | |||||
GELOGE(PARAM_INVALID, "[Dump][Exception] Dump exception output failed"); | |||||
return PARAM_INVALID; | |||||
} | |||||
GELOGI("[Dump][Exception] Dump exception info SUCCESS"); | |||||
} else { | |||||
GELOGE(PARAM_INVALID, "[Dump][Exception] Get op desc info failed,task id:%u,stream id:%u", | |||||
iter.taskid, iter.streamid); | |||||
return PARAM_INVALID; | |||||
} | |||||
} | |||||
return SUCCESS; | |||||
} | |||||
bool ExceptionDumper::GetOpDescInfo(uint32_t stream_id, uint32_t task_id, OpDescInfo &op_desc_info) const { | |||||
GELOGI("[Get][OpDescInfo] There are %zu op need to dump.", op_desc_info_.size()); | |||||
for (size_t index = 0; index < op_desc_info_.size(); ++index) { | |||||
OpDescInfo dump_op_info = op_desc_info_.at(index); | |||||
if (dump_op_info.task_id == task_id && dump_op_info.stream_id == stream_id) { | |||||
GELOGI("[Get][OpDescInfo] Find exception op [%s] of task_id: %u, stream_id: %u.", | |||||
dump_op_info.op_name.c_str(), task_id, stream_id); | |||||
op_desc_info = dump_op_info; | |||||
return true; | |||||
} | |||||
} | |||||
return false; | |||||
} | |||||
Status ExceptionDumper::DumpExceptionInput(const OpDescInfo &op_desc_info, const string &dump_file) const { | |||||
GELOGI("[Dump][ExceptionInput] Start to dump exception input"); | |||||
for (size_t i = 0; i < op_desc_info.input_addrs.size(); i++) { | |||||
if (Debug::DumpDevMem(dump_file.data(), op_desc_info.input_addrs.at(i), op_desc_info.input_size.at(i)) != SUCCESS) { | |||||
GELOGE(PARAM_INVALID, "[Dump][ExceptionInput] Dump the %zu input data of op [%s] failed", | |||||
i, op_desc_info.op_name.c_str()); | |||||
return PARAM_INVALID; | |||||
} | |||||
} | |||||
return SUCCESS; | |||||
} | |||||
Status ExceptionDumper::DumpExceptionOutput(const OpDescInfo &op_desc_info, const string &dump_file) const { | |||||
GELOGI("[Dump][ExceptionOutput] Start to dump exception output"); | |||||
for (size_t i = 0; i < op_desc_info.output_addrs.size(); i++) { | |||||
if (Debug::DumpDevMem(dump_file.data(), op_desc_info.output_addrs.at(i), op_desc_info.output_size.at(i)) != | |||||
SUCCESS) { | |||||
GELOGE(PARAM_INVALID, "[Dump][ExceptionInput] Dump the %zu input data of op [%s] failed", | |||||
i, op_desc_info.op_name.c_str()); | |||||
return PARAM_INVALID; | |||||
} | |||||
} | |||||
return SUCCESS; | |||||
} | |||||
OpDescInfo *ExceptionDumper::MutableOpDescInfo(uint32_t task_id, uint32_t stream_id) { | |||||
for (OpDescInfo &op_desc_info : op_desc_info_) { | |||||
if (op_desc_info.task_id == task_id && op_desc_info.stream_id == stream_id) { | |||||
return &op_desc_info; | |||||
} | |||||
} | |||||
return nullptr; | |||||
} | |||||
} // namespace ge |
@@ -0,0 +1,48 @@ | |||||
/** | |||||
* Copyright 2019-2021 Huawei Technologies Co., Ltd | |||||
* | |||||
* Licensed under the Apache License, Version 2.0 (the "License"); | |||||
* you may not use this file except in compliance with the License. | |||||
* You may obtain a copy of the License at | |||||
* | |||||
* http://www.apache.org/licenses/LICENSE-2.0 | |||||
* | |||||
* Unless required by applicable law or agreed to in writing, software | |||||
* distributed under the License is distributed on an "AS IS" BASIS, | |||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
* See the License for the specific language governing permissions and | |||||
* limitations under the License. | |||||
*/ | |||||
#ifndef GE_COMMON_DUMP_EXCEPTION_DUMPER_H_ | |||||
#define GE_COMMON_DUMP_EXCEPTION_DUMPER_H_ | |||||
#include <vector> | |||||
#include "graph/op_desc.h" | |||||
#include "framework/common/ge_types.h" | |||||
#include "graph/load/model_manager/task_info/task_info.h" | |||||
namespace ge { | |||||
class ExceptionDumper { | |||||
public: | |||||
ExceptionDumper() = default; | |||||
~ExceptionDumper(); | |||||
void SaveDumpOpInfo(const OpDescPtr &op, uint32_t task_id, uint32_t stream_id, | |||||
std::vector<void *> &input_addrs, std::vector<void *> &output_addrs); | |||||
void SaveDumpOpInfo(const RuntimeParam &model_param, const OpDescPtr &op, uint32_t task_id, uint32_t stream_id); | |||||
Status DumpExceptionInfo(const std::vector<rtExceptionInfo> &exception_infos) const; | |||||
bool GetOpDescInfo(uint32_t stream_id, uint32_t task_id, OpDescInfo &op_desc_info) const; | |||||
OpDescInfo *MutableOpDescInfo(uint32_t task_id, uint32_t stream_id); | |||||
private: | |||||
void SaveOpDescInfo(const OpDescPtr &op, uint32_t task_id, uint32_t stream_id, OpDescInfo &op_desc_info); | |||||
Status DumpExceptionInput(const OpDescInfo &op_desc_info, const std::string &dump_file) const; | |||||
Status DumpExceptionOutput(const OpDescInfo &op_desc_info, const std::string &dump_file) const; | |||||
std::vector<OpDescInfo> op_desc_info_; | |||||
}; | |||||
} // namespace ge | |||||
#endif // GE_COMMON_DUMP_EXCEPTION_DUMPER_H_ |
@@ -80,13 +80,11 @@ Status OpdebugRegister::RegisterDebugForStream(rtStream_t stream, uint32_t op_de | |||||
uint32_t debug_stream_id = 0; | uint32_t debug_stream_id = 0; | ||||
uint32_t debug_task_id = 0; | uint32_t debug_task_id = 0; | ||||
#ifdef ONLY_COMPILE_OPEN_SRC | |||||
auto rt_ret = rtDebugRegisterForStream(stream, op_debug_mode, op_debug_addr_, &debug_stream_id, &debug_task_id); | auto rt_ret = rtDebugRegisterForStream(stream, op_debug_mode, op_debug_addr_, &debug_stream_id, &debug_task_id); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
GELOGE(RT_FAILED, "rtDebugRegisterForStream error, ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "rtDebugRegisterForStream error, ret: 0x%X", rt_ret); | ||||
return RT_ERROR_TO_GE_STATUS(rt_ret); | return RT_ERROR_TO_GE_STATUS(rt_ret); | ||||
} | } | ||||
#endif | |||||
GELOGD("debug_task_id:%u, debug_stream_id:%u in stream overflow.", debug_task_id, debug_stream_id); | GELOGD("debug_task_id:%u, debug_stream_id:%u in stream overflow.", debug_task_id, debug_stream_id); | ||||
data_dumper.SaveOpDebugId(debug_task_id, debug_stream_id, p2p_debug_addr_, true); | data_dumper.SaveOpDebugId(debug_task_id, debug_stream_id, p2p_debug_addr_, true); | ||||
return SUCCESS; | return SUCCESS; | ||||
@@ -94,7 +92,6 @@ Status OpdebugRegister::RegisterDebugForStream(rtStream_t stream, uint32_t op_de | |||||
void OpdebugRegister::UnregisterDebugForStream(rtStream_t stream) { | void OpdebugRegister::UnregisterDebugForStream(rtStream_t stream) { | ||||
rtError_t rt_ret = RT_ERROR_NONE; | rtError_t rt_ret = RT_ERROR_NONE; | ||||
#ifdef ONLY_COMPILE_OPEN_SRC | |||||
if (stream != nullptr) { | if (stream != nullptr) { | ||||
GELOGD("start call rtDebugUnRegisterForStream in unknown shape over flow."); | GELOGD("start call rtDebugUnRegisterForStream in unknown shape over flow."); | ||||
rt_ret = rtDebugUnRegisterForStream(stream); | rt_ret = rtDebugUnRegisterForStream(stream); | ||||
@@ -102,7 +99,6 @@ void OpdebugRegister::UnregisterDebugForStream(rtStream_t stream) { | |||||
GELOGW("rtDebugUnRegisterForStream failed, ret: 0x%X", rt_ret); | GELOGW("rtDebugUnRegisterForStream failed, ret: 0x%X", rt_ret); | ||||
} | } | ||||
} | } | ||||
#endif | |||||
if (op_debug_addr_ != nullptr) { | if (op_debug_addr_ != nullptr) { | ||||
rt_ret = rtFree(op_debug_addr_); | rt_ret = rtFree(op_debug_addr_); | ||||
@@ -145,4 +141,4 @@ Status OpdebugRegister::MallocMemForOpdebug() { | |||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
} // namespace ge | |||||
} // namespace ge |
@@ -154,7 +154,11 @@ Status DataTypeTransfer::TransDataType(const CastArgs &args, TransResult &result | |||||
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>()); | std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>()); | ||||
if (dst == nullptr) { | if (dst == nullptr) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to alloc the memory for dst buf %zu, data size %zu", total_size, args.src_data_size); | |||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, | |||||
"[Allocate][DSTMemory]Failed, memory for dst buf %zu, data size %zu", | |||||
total_size, args.src_data_size); | |||||
REPORT_CALL_ERROR("E19999", "Failed to allocate memory for dst buf %zu, data size %zu", | |||||
total_size, args.src_data_size); | |||||
return ACL_ERROR_GE_MEMORY_ALLOCATION; | return ACL_ERROR_GE_MEMORY_ALLOCATION; | ||||
} | } | ||||
@@ -49,11 +49,15 @@ Status CheckArgsForC1hwncoc0ToHwcn(const TransArgs &args) { | |||||
return ACL_ERROR_GE_DATATYPE_INVALID; | return ACL_ERROR_GE_DATATYPE_INVALID; | ||||
} | } | ||||
if (!CheckShapeValid(src_shape, kC1hwncoc0DimsNum)) { | if (!CheckShapeValid(src_shape, kC1hwncoc0DimsNum)) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check src shape %s", ShapeToString(src_shape).c_str()); | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][SrcShape]Failed, src shape %s", | |||||
ShapeToString(src_shape).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failed to check src shape %s", ShapeToString(src_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
if (!CheckShapeValid(dst_shape, kHwcnDimsNum)) { | if (!CheckShapeValid(dst_shape, kHwcnDimsNum)) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check dst shape %s.", ShapeToString(dst_shape).c_str()); | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][DSTShape]Failed, dst shape %s.", | |||||
ShapeToString(dst_shape).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failed to check dst shape %s", ShapeToString(dst_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
auto cube_size = GetCubeSizeByDataType(args.src_data_type); | auto cube_size = GetCubeSizeByDataType(args.src_data_type); | ||||
@@ -73,9 +77,17 @@ Status CheckArgsForC1hwncoc0ToHwcn(const TransArgs &args) { | |||||
Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, int size, int64_t total_size) { | Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, int size, int64_t total_size) { | ||||
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>()); | std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>()); | ||||
if (dst == nullptr) { | if (dst == nullptr) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld, shape %s", | |||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, | |||||
"[Allocate][DSTMemory]Failed to allcoate memory for dst buf %ld, " | |||||
"shape %s when trans format from %s to %s", | |||||
total_size, ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | TypeUtils::FormatToSerialString(args.src_format).c_str(), | ||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), total_size, ShapeToString(args.dst_shape).c_str()); | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failed to allcoate memory for dst buf %ld, " | |||||
"shape %s when trans format from %s to %s", | |||||
total_size, ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
return ACL_ERROR_GE_MEMORY_ALLOCATION; | return ACL_ERROR_GE_MEMORY_ALLOCATION; | ||||
} | } | ||||
@@ -115,10 +127,16 @@ Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, int size | |||||
static_cast<size_t>(size)); | static_cast<size_t>(size)); | ||||
if (ret != EOK) { | if (ret != EOK) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, | GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, | ||||
"Failed to copy data from C1HWNCoC0[%ld, %ld, %ld, %ld, %ld, %ld] offset %ld to " | |||||
"[Operate][Memory]Failed to copy data from " | |||||
"C1HWNCoC0[%ld, %ld, %ld, %ld, %ld, %ld] offset %ld to " | |||||
"HWCN[%ld, %ld, %ld, %ld] offset %ld, err-code %d", | "HWCN[%ld, %ld, %ld, %ld] offset %ld, err-code %d", | ||||
c1_idx, h_idx, w_idx, n_idx, co_idx, c0_idx, src_offset, h_idx, w_idx, c_idx, n_idx, dst_offset, | |||||
ret); | |||||
c1_idx, h_idx, w_idx, n_idx, co_idx, c0_idx, src_offset, | |||||
h_idx, w_idx, c_idx, n_idx, dst_offset, ret); | |||||
REPORT_CALL_ERROR("E19999", "Failed to copy data from " | |||||
"C1HWNCoC0[%ld, %ld, %ld, %ld, %ld, %ld] offset %ld to " | |||||
"HWCN[%ld, %ld, %ld, %ld] offset %ld, err-code %d", | |||||
c1_idx, h_idx, w_idx, n_idx, co_idx, c0_idx, src_offset, | |||||
h_idx, w_idx, c_idx, n_idx, dst_offset, ret); | |||||
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | ||||
} | } | ||||
} | } | ||||
@@ -144,8 +162,13 @@ Status FormatTransferC1hwncoc0Hwcn::TransFormat(const TransArgs &args, TransResu | |||||
result.length = static_cast<size_t>(total_size); | result.length = static_cast<size_t>(total_size); | ||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Get %ld total size from dst shape %s, src shape %s.", total_size, | |||||
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str()); | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Get][Shape]Failed, total size %ld from dst shape %s, " | |||||
"src shape %s.", | |||||
total_size, ShapeToString(args.dst_shape).c_str(), | |||||
ShapeToString(args.src_shape).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Get shape faield, total size %ld from dst shape %s, src shape %s.", | |||||
total_size, ShapeToString(args.dst_shape).c_str(), | |||||
ShapeToString(args.src_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
GELOGD("Begin to trans format from C1HWNCoC0 to HWCN, src shape %s, data type %s, dst shape %s, memory size %ld.", | GELOGD("Begin to trans format from C1HWNCoC0 to HWCN, src shape %s, data type %s, dst shape %s, memory size %ld.", | ||||
@@ -153,9 +176,16 @@ Status FormatTransferC1hwncoc0Hwcn::TransFormat(const TransArgs &args, TransResu | |||||
ShapeToString(args.dst_shape).c_str(), total_size); | ShapeToString(args.dst_shape).c_str(), total_size); | ||||
ret = GetDstDataAfterTrans(args, result, size, total_size); | ret = GetDstDataAfterTrans(args, result, size, total_size); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
GELOGE(ret, "Failed to get data after trans, src shape %s, data type %s, dst shape %s, memory size %ld", | |||||
ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), total_size); | |||||
GELOGE(ret, "[Get][Data]Failed when after trans, src shape %s, data type %s, dst shape %s, " | |||||
"memory size %ld, error_code %u", | |||||
ShapeToString(args.src_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), total_size, ret); | |||||
REPORT_CALL_ERROR("E19999", "Failed to get data after trans, src shape %s, data type %s, " | |||||
"dst shape %s, memory size %ld, error_code %u", | |||||
ShapeToString(args.src_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), total_size, ret); | |||||
return ret; | return ret; | ||||
} | } | ||||
return SUCCESS; | return SUCCESS; | ||||
@@ -94,9 +94,14 @@ Status TransFormatDhwckToFz3D(const TransArgs &args, TransResult &result) { | |||||
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size], std::default_delete<uint8_t[]>()); | std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size], std::default_delete<uint8_t[]>()); | ||||
if (dst == nullptr) { | if (dst == nullptr) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld", | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), dst_size); | |||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "[Allocate][DSTMemory]Failed to allcoate memory " | |||||
"for dst buf %ld when trans format from %s to %s", | |||||
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failed to allcoate memory for dst buf %ld " | |||||
"when trans format from %s to %s", | |||||
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
return ACL_ERROR_GE_MEMORY_ALLOCATION; | return ACL_ERROR_GE_MEMORY_ALLOCATION; | ||||
} | } | ||||
@@ -122,8 +127,10 @@ Status TransFormatDhwckToFz3D(const TransArgs &args, TransResult &result) { | |||||
args.data + src_idx * data_size, static_cast<size_t>(data_size)); | args.data + src_idx * data_size, static_cast<size_t>(data_size)); | ||||
} | } | ||||
if (ret != EOK) { | if (ret != EOK) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "Failed to operate the dst memory at offset %ld, error-code %d, pad mode %d", | |||||
dst_offset, ret, pad_zero); | |||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Operate][DSTMemory]Failed at " | |||||
"offset %ld, error-code %d, pad mode %d", dst_offset, ret, pad_zero); | |||||
REPORT_CALL_ERROR("E19999", "Failed to operate dst memory at offset %ld, " | |||||
"error-code %d, pad mode %d", dst_offset, ret, pad_zero); | |||||
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | ||||
} | } | ||||
} | } | ||||
@@ -95,9 +95,14 @@ Status TransFormatDhwncToFz3DTranspose(const TransArgs &args, TransResult &resul | |||||
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size], std::default_delete<uint8_t[]>()); | std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size], std::default_delete<uint8_t[]>()); | ||||
if (dst == nullptr) { | if (dst == nullptr) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld", | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), dst_size); | |||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "[Allocate][DSTMemory]Failed to allcoate memory " | |||||
"for dst buf %ld when trans format from %s to %s", | |||||
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failed to allcoate memory for dst buf %ld " | |||||
"when trans format from %s to %s", | |||||
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
return ACL_ERROR_GE_MEMORY_ALLOCATION; | return ACL_ERROR_GE_MEMORY_ALLOCATION; | ||||
} | } | ||||
@@ -123,8 +128,10 @@ Status TransFormatDhwncToFz3DTranspose(const TransArgs &args, TransResult &resul | |||||
args.data + src_idx * data_size, static_cast<size_t>(data_size)); | args.data + src_idx * data_size, static_cast<size_t>(data_size)); | ||||
} | } | ||||
if (ret != EOK) { | if (ret != EOK) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "Failed to operate the dst memory at offset %ld, error-code %d, pad mode %d", | |||||
dst_offset, ret, pad_zero); | |||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Operate][DSTMemory]Failed at " | |||||
"offset %ld, error-code %d, pad mode %d", dst_offset, ret, pad_zero); | |||||
REPORT_CALL_ERROR("E19999", "Failed to operate dst memory at offset %ld, " | |||||
"error-code %d, pad mode %d", dst_offset, ret, pad_zero); | |||||
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | ||||
} | } | ||||
} | } | ||||
@@ -60,7 +60,7 @@ bool CheckShape(Format format, const ShapeVector &shape) { | |||||
default: | default: | ||||
std::string error = "Trans format between " + FmtToStr(TypeUtils::FormatToSerialString(format)) + | std::string error = "Trans format between " + FmtToStr(TypeUtils::FormatToSerialString(format)) + | ||||
" and FORMAT_FRACTAL_NZ is not supported."; | " and FORMAT_FRACTAL_NZ is not supported."; | ||||
GE_ERRORLOG_AND_ERRORMSG(PARAM_INVALID, error.c_str()); | |||||
GE_ERRORLOG_AND_ERRORMSG(ACL_ERROR_GE_FORMAT_INVALID, error.c_str()); | |||||
return false; | return false; | ||||
} | } | ||||
} | } | ||||
@@ -87,7 +87,10 @@ Status TransShapeToFracNz(const ShapeVector &src_shape, DataType data_type, Shap | |||||
hw_shape.push_back(DIM_DEFAULT_VALUE); | hw_shape.push_back(DIM_DEFAULT_VALUE); | ||||
hw_shape.push_back(src_shape[kNdDimIndexN]); | hw_shape.push_back(src_shape[kNdDimIndexN]); | ||||
if (!IsShapeValid(dst_shape)) { | if (!IsShapeValid(dst_shape)) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check dst shape %s", ShapeToString(dst_shape).c_str()); | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][DSTShape]Failed, dst shape %s", | |||||
ShapeToString(dst_shape).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failed to check dst shape %s", | |||||
ShapeToString(dst_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
return SUCCESS; | return SUCCESS; | ||||
@@ -106,7 +109,10 @@ Status TransShapeToFracNz(const ShapeVector &src_shape, DataType data_type, Shap | |||||
hw_shape.push_back(src_shape[size - kNdDimCountBackwardsWH]); | hw_shape.push_back(src_shape[size - kNdDimCountBackwardsWH]); | ||||
hw_shape.push_back(src_shape[size - kNdDimCountBackwardsW]); | hw_shape.push_back(src_shape[size - kNdDimCountBackwardsW]); | ||||
if (!IsShapeValid(dst_shape)) { | if (!IsShapeValid(dst_shape)) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check dst shape %s", ShapeToString(dst_shape).c_str()); | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][DSTShape]Failed, dst shape %s", | |||||
ShapeToString(dst_shape).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failed to check dst shape %s", | |||||
ShapeToString(dst_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
return SUCCESS; | return SUCCESS; | ||||
@@ -117,10 +123,12 @@ Status CheckShapeRelation(const TransArgs &args, ShapeVector &hw_shape) { | |||||
ShapeVector expect_src_shape; | ShapeVector expect_src_shape; | ||||
auto ret = TransShapeToFracNz(args.dst_shape, args.src_data_type, expect_src_shape, hw_shape); | auto ret = TransShapeToFracNz(args.dst_shape, args.src_data_type, expect_src_shape, hw_shape); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
GELOGE(ret, "Trans shape from %s to %s, shape %s to %s, data type %s failed", | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), ShapeToString(args.dst_shape).c_str(), | |||||
ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
GELOGE(ret, "[Transfer][ShapeToFracNz]Failed, shape from %s to %s, shape %s to %s, " | |||||
"data type %s, error_code:%u", TypeUtils::FormatToSerialString(args.dst_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), | |||||
ShapeToString(args.src_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), ret); | |||||
return ret; | return ret; | ||||
} | } | ||||
if (!IsTransShapeSrcCorrect(args, expect_src_shape)) { | if (!IsTransShapeSrcCorrect(args, expect_src_shape)) { | ||||
@@ -139,9 +147,14 @@ Status TransFormatFromNdToFracNz(const TransArgs &args, TransResult &result, con | |||||
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size](), std::default_delete<uint8_t[]>()); | std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size](), std::default_delete<uint8_t[]>()); | ||||
if (dst == nullptr) { | if (dst == nullptr) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld", | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), dst_size); | |||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "[Allocate][DSTMemory]Failed to allocate memory " | |||||
"for dst buf %ld when trans format from %s to %s", | |||||
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failed to allocate memory for dst buf %ld " | |||||
"trans format from %s to %s", | |||||
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
return ACL_ERROR_GE_MEMORY_ALLOCATION; | return ACL_ERROR_GE_MEMORY_ALLOCATION; | ||||
} | } | ||||
@@ -175,7 +188,10 @@ Status TransFormatFromNdToFracNz(const TransArgs &args, TransResult &result, con | |||||
auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset, | auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset, | ||||
static_cast<size_t>(size * w0)); | static_cast<size_t>(size * w0)); | ||||
if (ret != EOK) { | if (ret != EOK) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "Failed to operate the dst memory at offset %ld, error-code %d", dst_offset, ret); | |||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED,"[Operate][DSTMemory]Failed at offset %ld, " | |||||
"error-code %d", dst_offset, ret); | |||||
REPORT_CALL_ERROR("E19999", "Failed to operate dst memory at offset %ld, error-code %d", | |||||
dst_offset, ret); | |||||
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | ||||
} | } | ||||
} | } | ||||
@@ -189,7 +205,10 @@ Status TransFormatFromNdToFracNz(const TransArgs &args, TransResult &result, con | |||||
auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset, | auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset, | ||||
static_cast<size_t>(size)); | static_cast<size_t>(size)); | ||||
if (ret != EOK) { | if (ret != EOK) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "Failed to operate the dst memory at offset %ld, error-code %d", dst_offset, ret); | |||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED,"[Operate][DSTMemory]Failed at offset %ld, " | |||||
"error-code %d", dst_offset, ret); | |||||
REPORT_CALL_ERROR("E19999", "Failed to operate dst memory at offset %ld, error-code %d", | |||||
dst_offset, ret); | |||||
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | ||||
} | } | ||||
} | } | ||||
@@ -210,9 +229,14 @@ Status TransFormatFromFracNzToNd(const TransArgs &args, TransResult &result, con | |||||
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size], std::default_delete<uint8_t[]>()); | std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size], std::default_delete<uint8_t[]>()); | ||||
if (dst == nullptr) { | if (dst == nullptr) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld", | |||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "[Allocate][DSTMemory]Failed to trans format " | |||||
"from %s to %s, memory for dst buf %ld", | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | TypeUtils::FormatToSerialString(args.src_format).c_str(), | ||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), dst_size); | TypeUtils::FormatToSerialString(args.dst_format).c_str(), dst_size); | ||||
REPORT_CALL_ERROR("E19999", "Failed to trans format from %s to %s and allocate memory " | |||||
"for dst buf %ld", | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), dst_size); | |||||
return ACL_ERROR_GE_MEMORY_ALLOCATION; | return ACL_ERROR_GE_MEMORY_ALLOCATION; | ||||
} | } | ||||
@@ -246,7 +270,11 @@ Status TransFormatFromFracNzToNd(const TransArgs &args, TransResult &result, con | |||||
ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset, | ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset, | ||||
static_cast<size_t>(size * w0)); | static_cast<size_t>(size * w0)); | ||||
if (ret != EOK) { | if (ret != EOK) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "Failed to operate the dst memory at offset %ld, error-code %d", dst_offset, ret); | |||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Operate][DSTMemory]Failed at offset %ld, " | |||||
"error-code %d", | |||||
dst_offset, ret); | |||||
REPORT_CALL_ERROR("E19999", "Failed to operate dst memory at offset %ld, error-code %d", | |||||
dst_offset, ret); | |||||
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | ||||
} | } | ||||
} | } | ||||
@@ -260,7 +288,11 @@ Status TransFormatFromFracNzToNd(const TransArgs &args, TransResult &result, con | |||||
ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset, | ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset, | ||||
static_cast<size_t>(size)); | static_cast<size_t>(size)); | ||||
if (ret != EOK) { | if (ret != EOK) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "Failed to operate the dst memory at offset %ld, error-code %d", dst_offset, ret); | |||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Operate][DSTMemory]Failed at offset %ld, " | |||||
"error-code %d", | |||||
dst_offset, ret); | |||||
REPORT_CALL_ERROR("E19999", "Failed to operate dst memory at offset %ld, error-code %d", | |||||
dst_offset, ret); | |||||
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | ||||
} | } | ||||
} | } | ||||
@@ -274,17 +306,39 @@ Status TransFormatFromFracNzToNd(const TransArgs &args, TransResult &result, con | |||||
Status FormatTransferFractalNz::TransFormat(const TransArgs &args, TransResult &result) { | Status FormatTransferFractalNz::TransFormat(const TransArgs &args, TransResult &result) { | ||||
if (!IsDataTypeSupport(args.src_data_type)) { | if (!IsDataTypeSupport(args.src_data_type)) { | ||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "Trans format from %s to %s, src shape %s, dst shape %s, data type %s is not supported", | |||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, | |||||
"[Check][Datatype]Failed, trans format from %s to %s, src shape %s, dst shape %s, " | |||||
"data type %s is not supported", | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | TypeUtils::FormatToSerialString(args.src_format).c_str(), | ||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), ShapeToString(args.src_shape).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), | |||||
ShapeToString(args.src_shape).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
REPORT_INNER_ERROR("E19999", "Check datatype failed, trans format from %s to %s, src shape %s, " | |||||
"dst shape %s, data type %s is not supported", | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), | |||||
ShapeToString(args.src_shape).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
return ACL_ERROR_GE_DATATYPE_INVALID; | return ACL_ERROR_GE_DATATYPE_INVALID; | ||||
} | } | ||||
if (!CheckShape(args.src_format, args.src_shape) || !IsShapeValid(args.dst_shape)) { | if (!CheckShape(args.src_format, args.src_shape) || !IsShapeValid(args.dst_shape)) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Trans format from %s to %s, src shape %s, dst shape %s, data type %s is not supported", | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, | |||||
"[Check][Shape]Failed, trans format from %s to %s, " | |||||
"src shape %s, dst shape %s, data type %s is not supported", | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | TypeUtils::FormatToSerialString(args.src_format).c_str(), | ||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), ShapeToString(args.src_shape).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), | |||||
ShapeToString(args.src_shape).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
REPORT_INNER_ERROR("E19999", "Check shape failed, trans format from %s to %s, " | |||||
"src shape %s, dst shape %s, data type %s is not supported", | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), | |||||
ShapeToString(args.src_shape).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
GELOGD("Begin to trans format from %s to %s, src shape %s, dst shape %s, data type %s", | GELOGD("Begin to trans format from %s to %s, src shape %s, dst shape %s, data type %s", | ||||
@@ -307,16 +361,34 @@ Status FormatTransferFractalNz::TransShape(Format src_format, const ShapeVector | |||||
Format dst_format, ShapeVector &dst_shape) { | Format dst_format, ShapeVector &dst_shape) { | ||||
if (!IsDataTypeSupport(data_type)) { | if (!IsDataTypeSupport(data_type)) { | ||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, | GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, | ||||
"Trans format from %s to %s, src shape %s, data type %s is not supported", | |||||
TypeUtils::FormatToSerialString(src_format).c_str(), TypeUtils::FormatToSerialString(dst_format).c_str(), | |||||
ShapeToString(src_shape).c_str(), TypeUtils::DataTypeToSerialString(data_type).c_str()); | |||||
"[Check][Datatype]Failed, trans format from %s to %s, src shape %s, " | |||||
"data type %s is not supported", | |||||
TypeUtils::FormatToSerialString(src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(dst_format).c_str(), | |||||
ShapeToString(src_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(data_type).c_str()); | |||||
REPORT_INNER_ERROR("E19999", "Check datatype failed, trans format from %s to %s, src shape %s, " | |||||
"data type %s is not supported", | |||||
TypeUtils::FormatToSerialString(src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(dst_format).c_str(), | |||||
ShapeToString(src_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(data_type).c_str()); | |||||
return ACL_ERROR_GE_DATATYPE_INVALID; | return ACL_ERROR_GE_DATATYPE_INVALID; | ||||
} | } | ||||
if (!CheckShape(src_format, src_shape)) { | if (!CheckShape(src_format, src_shape)) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, | GELOGE(ACL_ERROR_GE_SHAPE_INVALID, | ||||
"Trans format from %s to %s, src shape %s, data type %s is not supported", | |||||
TypeUtils::FormatToSerialString(src_format).c_str(), TypeUtils::FormatToSerialString(dst_format).c_str(), | |||||
ShapeToString(src_shape).c_str(), TypeUtils::DataTypeToSerialString(data_type).c_str()); | |||||
"[Check][Shape]Failed, trans format from %s to %s, src shape %s, " | |||||
"data type %s is not supported", | |||||
TypeUtils::FormatToSerialString(src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(dst_format).c_str(), | |||||
ShapeToString(src_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(data_type).c_str()); | |||||
REPORT_INNER_ERROR("E19999", "Check shape failed, trans format from %s to %s, src shape %s, " | |||||
"data type %s is not supported", | |||||
TypeUtils::FormatToSerialString(src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(dst_format).c_str(), | |||||
ShapeToString(src_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(data_type).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
ShapeVector hw_shape; | ShapeVector hw_shape; | ||||
@@ -325,18 +397,40 @@ Status FormatTransferFractalNz::TransShape(Format src_format, const ShapeVector | |||||
Status FormatTransferFractalNzND::TransFormat(const TransArgs &args, TransResult &result) { | Status FormatTransferFractalNzND::TransFormat(const TransArgs &args, TransResult &result) { | ||||
if (!IsDataTypeSupport(args.src_data_type)) { | if (!IsDataTypeSupport(args.src_data_type)) { | ||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "Trans format from %s to %s, src shape %s, dst shape %s, data type %s is not supported", | |||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, | |||||
"[Check][Datatype]Failed, trans format from %s to %s, src shape %s, dst shape %s, " | |||||
"data type %s is not supported", | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | TypeUtils::FormatToSerialString(args.src_format).c_str(), | ||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), ShapeToString(args.src_shape).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), | |||||
ShapeToString(args.src_shape).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
REPORT_INNER_ERROR("E19999", "Check datatype failed, trans format from %s to %s, src shape %s, " | |||||
"dst shape %s, data type %s is not supported", | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), | |||||
ShapeToString(args.src_shape).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
return ACL_ERROR_GE_DATATYPE_INVALID; | return ACL_ERROR_GE_DATATYPE_INVALID; | ||||
} | } | ||||
if (!IsShapeValid(args.src_shape) || !CheckShape(args.dst_format, args.dst_shape)) { | if (!IsShapeValid(args.src_shape) || !CheckShape(args.dst_format, args.dst_shape)) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Trans format from %s to %s, src shape %s, dst shape %s, data type %s is not supported", | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, | |||||
"[Check][Shape]Failed, trans format from %s to %s, src shape %s, dst shape %s, " | |||||
"data type %s is not supported", | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | TypeUtils::FormatToSerialString(args.src_format).c_str(), | ||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), ShapeToString(args.src_shape).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), | |||||
ShapeToString(args.src_shape).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
REPORT_INNER_ERROR("E19999", "Check shape failed, trans format from %s to %s, src shape %s, " | |||||
"dst shape %s, data type %s is not supported", | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), | |||||
ShapeToString(args.src_shape).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
GELOGD("Begin to trans format from %s to %s, src shape %s, dst shape %s, data type %s", | GELOGD("Begin to trans format from %s to %s, src shape %s, dst shape %s, data type %s", | ||||
@@ -29,6 +29,25 @@ | |||||
namespace ge { | namespace ge { | ||||
namespace formats { | namespace formats { | ||||
namespace { | namespace { | ||||
constexpr int64_t kDim = 1; | |||||
static int64_t Measure(int64_t x, int64_t y) { | |||||
int64_t z = y; | |||||
while (x % y != 0) { | |||||
z = x % y; | |||||
x = y; | |||||
y = z; | |||||
} | |||||
return z; | |||||
} | |||||
// least common multiple | |||||
static int64_t Lcm(int64_t a, int64_t b) { | |||||
if (b == 0) { | |||||
return -1; | |||||
} | |||||
int64_t temp = (a * b) / (Measure(a, b)); | |||||
return temp; | |||||
} | |||||
Status CheckDataTypeSupport(DataType data_type) { return GetSizeByDataType(data_type) > 0 ? SUCCESS : UNSUPPORTED; } | Status CheckDataTypeSupport(DataType data_type) { return GetSizeByDataType(data_type) > 0 ? SUCCESS : UNSUPPORTED; } | ||||
/** | /** | ||||
@@ -54,8 +73,39 @@ Status TransShapeToFz(int64_t n, int64_t c, int64_t h, int64_t w, DataType data_ | |||||
dst_shape.push_back(kNiSize); | dst_shape.push_back(kNiSize); | ||||
dst_shape.push_back(c0); | dst_shape.push_back(c0); | ||||
if (!IsShapeValid(dst_shape)) { | if (!IsShapeValid(dst_shape)) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check dst shape %s", | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Failed, dst shape %s", | |||||
ShapeToString(dst_shape).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failed to check dst shape %s", ShapeToString(dst_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | |||||
} | |||||
return SUCCESS; | |||||
} | |||||
Status TransShapeToFzWithGroups(int64_t n, int64_t c, int64_t h, int64_t w, DataType data_type, std::vector<int64_t> &dst_shape, | |||||
int64_t groups) { | |||||
auto c0 = GetCubeSizeByDataType(data_type); | |||||
if (c0 < 0) { | |||||
return ACL_ERROR_GE_DATATYPE_INVALID; | |||||
} | |||||
int64_t cin_ori = c; | |||||
int64_t cout_ori = n / groups; | |||||
int64_t cube_k = GetCubeSizeByDataType(data_type); | |||||
int64_t e_mult = std::min( | |||||
Lcm(Lcm(cin_ori, cube_k) / (cin_ori), Lcm(cout_ori, static_cast<int64_t>(kCubeSize)) / (cout_ori)), | |||||
groups); | |||||
int64_t cin_opt = Ceil(e_mult * cin_ori, cube_k) * cube_k; | |||||
int64_t c1_dim = cin_opt / cube_k; | |||||
int64_t g_dim = Ceil(groups, e_mult); | |||||
auto n1 = Ceil(cout_ori * e_mult, static_cast<int64_t>(kCubeSize)); | |||||
dst_shape.clear(); | |||||
dst_shape.push_back(g_dim * c1_dim * h * w); | |||||
dst_shape.push_back(n1); | |||||
dst_shape.push_back(16); | |||||
dst_shape.push_back(cube_k); | |||||
if (!IsShapeValid(dst_shape)) { | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Failed, dst shape %s", | |||||
ShapeToString(dst_shape).c_str()); | ShapeToString(dst_shape).c_str()); | ||||
REPORT_CALL_ERROR("E19999", "Failed to check dst shape %s", ShapeToString(dst_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
return SUCCESS; | return SUCCESS; | ||||
@@ -86,6 +136,21 @@ Status TransShapeHwcnToFz(const std::vector<int64_t> &src_shape, DataType data_t | |||||
return TransShapeToFz(n, c, h, w, data_type, dst_shape); | return TransShapeToFz(n, c, h, w, data_type, dst_shape); | ||||
} | } | ||||
Status TransShapeHwcnToFzWithGroups(const std::vector<int64_t> &src_shape, DataType data_type, std::vector<int64_t> &dst_shape | |||||
, int64_t groups){ | |||||
if (!CheckShapeValid(src_shape, kHwcnDimsNum)) { | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | |||||
} | |||||
auto h = src_shape.at(kHwcnH); | |||||
auto w = src_shape.at(kHwcnW); | |||||
auto c = src_shape.at(kHwcnC); | |||||
auto n = src_shape.at(kHwcnN); | |||||
return TransShapeToFzWithGroups(n, c, h, w, data_type, dst_shape, groups); | |||||
} | |||||
Status TransShapeNhwcToFz(const std::vector<int64_t> &src_shape, DataType data_type, std::vector<int64_t> &dst_shape) { | Status TransShapeNhwcToFz(const std::vector<int64_t> &src_shape, DataType data_type, std::vector<int64_t> &dst_shape) { | ||||
if (!CheckShapeValid(src_shape, kNhwcDimsNum)) { | if (!CheckShapeValid(src_shape, kNhwcDimsNum)) { | ||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
@@ -127,9 +192,14 @@ Status TransFormatFromNchwToFz(const TransArgs &args, TransResult &result) { | |||||
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size], std::default_delete<uint8_t[]>()); | std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size], std::default_delete<uint8_t[]>()); | ||||
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG( | GE_CHK_BOOL_TRUE_EXEC_WITH_LOG( | ||||
dst == nullptr, | dst == nullptr, | ||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld", | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), dst_size); | |||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "[Allocate][DSTMemory]Failed to allcoate memory " | |||||
"for dst buf %ld when trans format from %s to %s", | |||||
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failed to allcoate memory for dst buf %ld " | |||||
"when trans format from %s to %s", | |||||
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
return ACL_ERROR_GE_MEMORY_ALLOCATION;); | return ACL_ERROR_GE_MEMORY_ALLOCATION;); | ||||
for (int64_t vfi = 0; vfi < vf_cnt; vfi++) { | for (int64_t vfi = 0; vfi < vf_cnt; vfi++) { | ||||
@@ -173,8 +243,12 @@ Status TransFormatFromNchwToFz(const TransArgs &args, TransResult &result) { | |||||
} | } | ||||
} | } | ||||
if (ret != EOK) { | if (ret != EOK) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "Failed to operate the dst memory at offset %ld, error-code %d pad mode %d", offset, | |||||
ret, need_pad_zero); | |||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED,"[Operate][DSTMemory]Failed at offset %ld, " | |||||
"error-code %d pad mode %d", | |||||
offset, ret, need_pad_zero); | |||||
REPORT_CALL_ERROR("E19999","Failed to operate dst memory at offset %ld, " | |||||
"error-code %d pad mode %d", | |||||
offset, ret, need_pad_zero); | |||||
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | ||||
} | } | ||||
} | } | ||||
@@ -187,6 +261,89 @@ Status TransFormatFromNchwToFz(const TransArgs &args, TransResult &result) { | |||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
Status TransFormatHwcnToFzWithGroups(const TransArgs &args, TransResult &result, int64_t groups){ | |||||
int64_t h_dim = args.src_shape[kHwcnH]; | |||||
int64_t w_dim = args.src_shape[kHwcnW]; | |||||
int64_t c_dim = args.src_shape[kHwcnC]; | |||||
int64_t n_dim = args.src_shape[kHwcnN]; | |||||
int64_t cin_ori = c_dim; | |||||
int64_t cout_ori = n_dim / groups; | |||||
if (cin_ori == 0 || cout_ori == 0) { | |||||
GELOGE(GRAPH_FAILED, "[Check][Param]Failed, cin_ori, cout_ori must not be equal 0, " | |||||
"and current cin_ori, cout_ori, groups are %ld %ld %ld", cin_ori, cout_ori, groups); | |||||
REPORT_CALL_ERROR("E19999", "Check graph param failed, cin_ori, cout_ori must not be equal 0," | |||||
"and current cin_ori, cout_ori, groups are %ld %ld %ld", | |||||
cin_ori, cout_ori, groups); | |||||
return GRAPH_FAILED; | |||||
} | |||||
const int64_t cube_k = GetCubeSizeByDataType(args.src_data_type); | |||||
int64_t e_mult = std::min( | |||||
Lcm(Lcm(cin_ori, cube_k) / (cin_ori), Lcm(cout_ori, static_cast<int64_t>(kCubeSize)) / (cout_ori)), | |||||
groups); | |||||
int64_t cin_opt = Ceil(e_mult * cin_ori, cube_k) * cube_k; | |||||
int64_t cout_opt = Ceil(e_mult * cout_ori, static_cast<int64_t>(kCubeSize)) * static_cast<int64_t>(kCubeSize); | |||||
int64_t c1_dim = cin_opt / cube_k; | |||||
int64_t g_dim = Ceil(groups, e_mult); | |||||
int64_t dim_cin = cin_opt / cube_k; | |||||
int64_t data_size = GetSizeByDataType(args.src_data_type); | |||||
int64_t size_output_data = g_dim * kDim * dim_cin * h_dim * w_dim * cout_opt * cube_k * data_size; | |||||
if (size_output_data == 0) { | |||||
result.length = static_cast<size_t>(size_output_data); | |||||
return SUCCESS; | |||||
} | |||||
errno_t ret = EOK; | |||||
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[size_output_data], std::default_delete<uint8_t[]>()); | |||||
if (dst == nullptr) { | |||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "[Allocate][DSTMemory]Failed to allcoate memory " | |||||
"for dst buf %ld when trans format from %s to %s", | |||||
size_output_data, TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failed to allcoate memory for dst buf %ld " | |||||
"when trans format from %s to %s", | |||||
size_output_data, TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
return ACL_ERROR_GE_MEMORY_ALLOCATION; | |||||
} | |||||
ret = memset_s(dst.get(), static_cast<size_t>(size_output_data), 0, static_cast<size_t>(size_output_data)); | |||||
if (ret != EOK) { | |||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Operate][DSTMemory]Failed, ret is %d", ret); | |||||
REPORT_CALL_ERROR("E19999", "Failed to operate dst memory, ret is %d", ret); | |||||
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | |||||
} | |||||
for (int64_t g = 0; g < groups; g++) { | |||||
for (int64_t d = 0; d < kDim; d++) { | |||||
for (int64_t c = 0; c < c_dim; c++) { | |||||
for (int64_t h = 0; h < h_dim; h++) { | |||||
for (int64_t w = 0; w < w_dim; w++) { | |||||
for (int64_t n = 0; n < cout_ori; n++) { | |||||
int64_t e_val = g % e_mult; | |||||
int64_t dst_ci = e_val * cin_ori + c; | |||||
int64_t dst_co = e_val * cout_ori + n; | |||||
int64_t src_co = g * cout_ori + n; | |||||
int64_t tempory = dst_ci % cube_k; | |||||
int64_t srx_inx = 0; | |||||
int64_t dst_inx = (g / e_mult) * kDim * c1_dim * h_dim * w_dim * cout_opt * cube_k + | |||||
d * c1_dim * h_dim * w_dim * cout_opt * cube_k + | |||||
(dst_ci / cube_k) * h_dim * w_dim * cout_opt * cube_k + | |||||
h * w_dim * cout_opt * cube_k + w * cout_opt * cube_k + | |||||
dst_co * cube_k + tempory; | |||||
srx_inx = d * h_dim * w_dim * c_dim * n_dim + h * w_dim * c_dim * n_dim + | |||||
w * c_dim * n_dim + c * n_dim + src_co; | |||||
char *dst_data = reinterpret_cast<char *>(dst.get() + dst_inx * data_size); | |||||
const char *src_data = reinterpret_cast<const char *>(args.data + srx_inx * data_size); | |||||
for (int64_t index = 0; index < data_size; index++) { | |||||
*dst_data++ = *src_data++; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
result.data = dst; | |||||
result.length = static_cast<size_t>(size_output_data); | |||||
return SUCCESS; | |||||
} | |||||
Status TransFormatHwcnToFz(const TransArgs &args, TransResult &result) { | Status TransFormatHwcnToFz(const TransArgs &args, TransResult &result) { | ||||
int64_t h = args.src_shape[kHwcnH]; | int64_t h = args.src_shape[kHwcnH]; | ||||
int64_t w = args.src_shape[kHwcnW]; | int64_t w = args.src_shape[kHwcnW]; | ||||
@@ -213,9 +370,14 @@ Status TransFormatHwcnToFz(const TransArgs &args, TransResult &result) { | |||||
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size], std::default_delete<uint8_t[]>()); | std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size], std::default_delete<uint8_t[]>()); | ||||
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG( | GE_CHK_BOOL_TRUE_EXEC_WITH_LOG( | ||||
dst == nullptr, | dst == nullptr, | ||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld", | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), dst_size); | |||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "[Allocate][DSTMemory]Failed to allcoate memory " | |||||
"for dst buf %ld when trans format from %s to %s", | |||||
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failed to allcoate memory for dst buf %ld " | |||||
"when trans format from %s to %s", | |||||
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
return ACL_ERROR_GE_MEMORY_ALLOCATION;); | return ACL_ERROR_GE_MEMORY_ALLOCATION;); | ||||
for (int64_t c1i = 0; c1i < c1; c1i++) { | for (int64_t c1i = 0; c1i < c1; c1i++) { | ||||
@@ -235,7 +397,8 @@ Status TransFormatHwcnToFz(const TransArgs &args, TransResult &result) { | |||||
static_cast<size_t>(data_size)); | static_cast<size_t>(data_size)); | ||||
} else { | } else { | ||||
if (protected_size < data_size) { | if (protected_size < data_size) { | ||||
GELOGE(ACL_ERROR_GE_PARAM_INVALID, "Failed to operate the dst memory, protected_size is %ld and size is %ld", | |||||
GELOGE(ACL_ERROR_GE_PARAM_INVALID,"[Operate][DSTMemory]Failed, protected_size " | |||||
"is %ld and size is %ld", | |||||
protected_size, data_size); | protected_size, data_size); | ||||
return ACL_ERROR_GE_PARAM_INVALID; | return ACL_ERROR_GE_PARAM_INVALID; | ||||
} | } | ||||
@@ -247,8 +410,11 @@ Status TransFormatHwcnToFz(const TransArgs &args, TransResult &result) { | |||||
} | } | ||||
} | } | ||||
if (ret != EOK) { | if (ret != EOK) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "Failed to operate the dst memory at offset %ld, error-code %d, pad mode %d", | |||||
dst_offset, ret, pad_zero); | |||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Operate][DSTMemory]Failed, " | |||||
"at offset %ld, error-code %d, pad mode %d", dst_offset, ret, pad_zero); | |||||
REPORT_CALL_ERROR("E19999", "Failed to operate dst memoery at offset %ld, " | |||||
"error-code %d, pad mode %d", | |||||
dst_offset, ret, pad_zero); | |||||
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | ||||
} | } | ||||
} | } | ||||
@@ -288,9 +454,14 @@ Status TransFormatNhwcToFz(const TransArgs &args, TransResult &result) { | |||||
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size], std::default_delete<uint8_t[]>()); | std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size], std::default_delete<uint8_t[]>()); | ||||
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG( | GE_CHK_BOOL_TRUE_EXEC_WITH_LOG( | ||||
dst == nullptr, | dst == nullptr, | ||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld", | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), dst_size); | |||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "[Allocate][DSTMemory]Failed to allcoate memory " | |||||
"for dst buf %ld when trans format from %s to %s", | |||||
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failed to allcoate memory for dst buf %ld " | |||||
"when trans format from %s to %s", | |||||
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
return ACL_ERROR_GE_MEMORY_ALLOCATION;); | return ACL_ERROR_GE_MEMORY_ALLOCATION;); | ||||
for (int64_t c1i = 0; c1i < c1; c1i++) { | for (int64_t c1i = 0; c1i < c1; c1i++) { | ||||
@@ -310,7 +481,8 @@ Status TransFormatNhwcToFz(const TransArgs &args, TransResult &result) { | |||||
static_cast<size_t>(data_size)); | static_cast<size_t>(data_size)); | ||||
} else { | } else { | ||||
if (protected_size < data_size) { | if (protected_size < data_size) { | ||||
GELOGE(ACL_ERROR_GE_PARAM_INVALID, "Failed to operate the dst memory, protected_size is %ld and size is %ld", | |||||
GELOGE(ACL_ERROR_GE_PARAM_INVALID, "[Operate][DSTMemory]Failed, protected_size " | |||||
"is %ld and size is %ld", | |||||
protected_size, data_size); | protected_size, data_size); | ||||
return ACL_ERROR_GE_PARAM_INVALID; | return ACL_ERROR_GE_PARAM_INVALID; | ||||
} | } | ||||
@@ -322,8 +494,11 @@ Status TransFormatNhwcToFz(const TransArgs &args, TransResult &result) { | |||||
} | } | ||||
} | } | ||||
if (ret != EOK) { | if (ret != EOK) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "Failed to operate the dst memory at offset %ld, error-code %d, pad mode %d", | |||||
dst_offset, ret, pad_zero); | |||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Operate][DSTMemory]Failed at offset %ld," | |||||
" error-code %d, pad mode %d", dst_offset, ret, pad_zero); | |||||
REPORT_CALL_ERROR("E19999", "Failed to operate dst memory at offset %ld, " | |||||
"error-code %d, pad mode %d", | |||||
dst_offset, ret, pad_zero); | |||||
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | ||||
} | } | ||||
} | } | ||||
@@ -355,15 +530,16 @@ Status FormatTransferFractalZ::TransFormat(const TransArgs &args, TransResult &r | |||||
if (args.src_format == FORMAT_NHWC && args.dst_format == FORMAT_FRACTAL_Z) { | if (args.src_format == FORMAT_NHWC && args.dst_format == FORMAT_FRACTAL_Z) { | ||||
return TransFormatNhwcToFz(args, result); | return TransFormatNhwcToFz(args, result); | ||||
} | } | ||||
if (args.src_format == FORMAT_HWCN && args.dst_format == FORMAT_FRACTAL_Z) { | |||||
if ((args.src_format == FORMAT_HWCN) && (GetPrimaryFormat(args.dst_format) == FORMAT_FRACTAL_Z)) { | |||||
if (GetSubFormat(args.dst_format) > 1) { | |||||
return TransFormatHwcnToFzWithGroups(args, result, GetSubFormat(args.dst_format)); | |||||
} | |||||
return TransFormatHwcnToFz(args, result); | return TransFormatHwcnToFz(args, result); | ||||
} | } | ||||
if (args.src_format == FORMAT_NCHW && args.dst_format == FORMAT_FRACTAL_Z) { | if (args.src_format == FORMAT_NCHW && args.dst_format == FORMAT_FRACTAL_Z) { | ||||
return TransFormatFromNchwToFz(args, result); | return TransFormatFromNchwToFz(args, result); | ||||
} | } | ||||
return ACL_ERROR_GE_FORMAT_INVALID; | return ACL_ERROR_GE_FORMAT_INVALID; | ||||
} | } | ||||
@@ -376,7 +552,10 @@ Status FormatTransferFractalZ::TransShape(Format src_format, const std::vector<i | |||||
if (src_format == FORMAT_NHWC && dst_format == FORMAT_FRACTAL_Z) { | if (src_format == FORMAT_NHWC && dst_format == FORMAT_FRACTAL_Z) { | ||||
return TransShapeNhwcToFz(src_shape, data_type, dst_shape); | return TransShapeNhwcToFz(src_shape, data_type, dst_shape); | ||||
} | } | ||||
if (src_format == FORMAT_HWCN && dst_format == FORMAT_FRACTAL_Z) { | |||||
if ((src_format == FORMAT_HWCN) && (GetPrimaryFormat(dst_format) == FORMAT_FRACTAL_Z)) { | |||||
if (GetSubFormat(dst_format) > 1) { | |||||
return TransShapeHwcnToFzWithGroups(src_shape, data_type, dst_shape, GetSubFormat(dst_format)); | |||||
} | |||||
return TransShapeHwcnToFz(src_shape, data_type, dst_shape); | return TransShapeHwcnToFz(src_shape, data_type, dst_shape); | ||||
} | } | ||||
if (src_format == FORMAT_NCHW && dst_format == FORMAT_FRACTAL_Z) { | if (src_format == FORMAT_NCHW && dst_format == FORMAT_FRACTAL_Z) { | ||||
@@ -59,7 +59,7 @@ bool CheckShape(Format format, const ShapeVector &shape) { | |||||
default: | default: | ||||
std::string error = "Trans format between " + FmtToStr(TypeUtils::FormatToSerialString(format)) + | std::string error = "Trans format between " + FmtToStr(TypeUtils::FormatToSerialString(format)) + | ||||
" and FORMAT_FRACTAL_ZZ is not supported."; | " and FORMAT_FRACTAL_ZZ is not supported."; | ||||
GE_ERRORLOG_AND_ERRORMSG(PARAM_INVALID, error.c_str()); | |||||
GE_ERRORLOG_AND_ERRORMSG(ACL_ERROR_GE_FORMAT_INVALID, error.c_str()); | |||||
return false; | return false; | ||||
} | } | ||||
} | } | ||||
@@ -86,8 +86,10 @@ Status TransShapeToFracZz(const ShapeVector &src_shape, DataType data_type, Shap | |||||
hw_shape.push_back(DIM_DEFAULT_VALUE); | hw_shape.push_back(DIM_DEFAULT_VALUE); | ||||
hw_shape.push_back(src_shape[kNdDimIndexN]); | hw_shape.push_back(src_shape[kNdDimIndexN]); | ||||
if (!IsShapeValid(dst_shape)) { | if (!IsShapeValid(dst_shape)) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check dst shape %s", | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][DSTShape]Failed, dst shape %s", | |||||
ShapeToString(dst_shape).c_str()); | ShapeToString(dst_shape).c_str()); | ||||
REPORT_CALL_ERROR("E19999", "Failed to check dst shape %s", | |||||
ShapeToString(dst_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
return SUCCESS; | return SUCCESS; | ||||
@@ -106,8 +108,10 @@ Status TransShapeToFracZz(const ShapeVector &src_shape, DataType data_type, Shap | |||||
hw_shape.push_back(src_shape[size - kNdDimCountBackwardsWH]); | hw_shape.push_back(src_shape[size - kNdDimCountBackwardsWH]); | ||||
hw_shape.push_back(src_shape[size - kNdDimCountBackwardsW]); | hw_shape.push_back(src_shape[size - kNdDimCountBackwardsW]); | ||||
if (!IsShapeValid(dst_shape)) { | if (!IsShapeValid(dst_shape)) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check dst shape %s", | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][DSTShape]Failed, dst shape %s", | |||||
ShapeToString(dst_shape).c_str()); | ShapeToString(dst_shape).c_str()); | ||||
REPORT_CALL_ERROR("E19999", "Failed to check dst shape %s", | |||||
ShapeToString(dst_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
return SUCCESS; | return SUCCESS; | ||||
@@ -118,10 +122,18 @@ Status CheckShapeRelation(const TransArgs &args, ShapeVector &hw_shape) { | |||||
ShapeVector expect_src_shape; | ShapeVector expect_src_shape; | ||||
auto ret = TransShapeToFracZz(args.dst_shape, args.src_data_type, expect_src_shape, hw_shape); | auto ret = TransShapeToFracZz(args.dst_shape, args.src_data_type, expect_src_shape, hw_shape); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
GELOGE(ret, "Trans shape from %s to %s, shape %s to %s, data type %s failed", | |||||
GELOGE(ret, "[Trans][ShapeToFracZz] Failed from %s to %s, shape %s to %s, data type %s", | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), | TypeUtils::FormatToSerialString(args.dst_format).c_str(), | ||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), ShapeToString(args.dst_shape).c_str(), | |||||
ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), | |||||
ShapeToString(args.src_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failed to trans shape from %s to %s, shape %s to %s, data type %s", | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), | |||||
ShapeToString(args.src_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
return ret; | return ret; | ||||
} | } | ||||
if (!IsTransShapeSrcCorrect(args, expect_src_shape)) { | if (!IsTransShapeSrcCorrect(args, expect_src_shape)) { | ||||
@@ -140,9 +152,14 @@ Status TransFormatFromNdToFracZz(const TransArgs &args, TransResult &result, con | |||||
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size](), std::default_delete<uint8_t[]>()); | std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size](), std::default_delete<uint8_t[]>()); | ||||
if (dst == nullptr) { | if (dst == nullptr) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld", | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), dst_size); | |||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "[Allocate][DSTMemory]Failed to allcoate memory " | |||||
"for dst buf %ld when trans format from %s to %s", | |||||
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failed to allcoate memory for dst buf %ld " | |||||
"when trans format from %s to %s", | |||||
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
return ACL_ERROR_GE_MEMORY_ALLOCATION; | return ACL_ERROR_GE_MEMORY_ALLOCATION; | ||||
} | } | ||||
// The src&dst_shape can be written as times*H*W & times*H1*W1*H0*W0, respectively. dst_shape_size >= kDimNum4D | // The src&dst_shape can be written as times*H*W & times*H1*W1*H0*W0, respectively. dst_shape_size >= kDimNum4D | ||||
@@ -179,7 +196,11 @@ Status TransFormatFromNdToFracZz(const TransArgs &args, TransResult &result, con | |||||
auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset, | auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset, | ||||
static_cast<size_t>(size * w0)); | static_cast<size_t>(size * w0)); | ||||
if (ret != EOK) { | if (ret != EOK) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "Failed to operate the dst memory at offset %ld, error-code %d", dst_offset, ret); | |||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Operate][DSTMemory]Failed at offset %ld, " | |||||
"error-code %d", | |||||
dst_offset, ret); | |||||
REPORT_CALL_ERROR("E19999", "Failed to operate dst memory at offset %ld, error-code %d", | |||||
dst_offset, ret); | |||||
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | ||||
} | } | ||||
} | } | ||||
@@ -195,7 +216,11 @@ Status TransFormatFromNdToFracZz(const TransArgs &args, TransResult &result, con | |||||
auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset, | auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset, | ||||
static_cast<size_t>(size)); | static_cast<size_t>(size)); | ||||
if (ret != EOK) { | if (ret != EOK) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "Failed to operate the dst memory at offset %ld, error-code %d", dst_offset, ret); | |||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Operate][DSTMemory]Failed at offset %ld, " | |||||
"error-code %d", | |||||
dst_offset, ret); | |||||
REPORT_CALL_ERROR("E19999", "Failed to operate dst memory at offset %ld, error-code %d", | |||||
dst_offset, ret); | |||||
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | ||||
} | } | ||||
} | } | ||||
@@ -217,9 +242,14 @@ Status TransFormatFromFracZzToNd(const TransArgs &args, TransResult &result, con | |||||
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size](), std::default_delete<uint8_t[]>()); | std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size](), std::default_delete<uint8_t[]>()); | ||||
if (dst == nullptr) { | if (dst == nullptr) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld", | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), dst_size); | |||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "[Allocate][DSTMemory]Failed to allcoate memory " | |||||
"for dst buf %ld when trans format from %s to %s", | |||||
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failed to allcoate memory for dst buf %ld " | |||||
"when trans format from %s to %s", | |||||
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
return ACL_ERROR_GE_MEMORY_ALLOCATION; | return ACL_ERROR_GE_MEMORY_ALLOCATION; | ||||
} | } | ||||
@@ -257,7 +287,11 @@ Status TransFormatFromFracZzToNd(const TransArgs &args, TransResult &result, con | |||||
auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset, | auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset, | ||||
static_cast<size_t>(size * w0)); | static_cast<size_t>(size * w0)); | ||||
if (ret != EOK) { | if (ret != EOK) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "Failed to operate the dst memory at offset %ld, error-code %d", dst_offset, ret); | |||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Operate][DSTMemory]Failed at offset %ld, " | |||||
"error-code %d", | |||||
dst_offset, ret); | |||||
REPORT_CALL_ERROR("E19999", "Failed to operate dst memory at offset %ld, error-code %d", | |||||
dst_offset, ret); | |||||
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | ||||
} | } | ||||
} | } | ||||
@@ -273,7 +307,11 @@ Status TransFormatFromFracZzToNd(const TransArgs &args, TransResult &result, con | |||||
auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset, | auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset, | ||||
static_cast<size_t>(size)); | static_cast<size_t>(size)); | ||||
if (ret != EOK) { | if (ret != EOK) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "Failed to operate the dst memory at offset %ld, error-code %d", dst_offset, ret); | |||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Operate][DSTMemory]Failed at offset %ld, " | |||||
"error-code %d", | |||||
dst_offset, ret); | |||||
REPORT_CALL_ERROR("E19999", "Failed to operate dst memory at offset %ld, error-code %d", | |||||
dst_offset, ret); | |||||
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | ||||
} | } | ||||
} | } | ||||
@@ -288,17 +326,39 @@ Status TransFormatFromFracZzToNd(const TransArgs &args, TransResult &result, con | |||||
Status FormatTransferFractalZz::TransFormat(const TransArgs &args, TransResult &result) { | Status FormatTransferFractalZz::TransFormat(const TransArgs &args, TransResult &result) { | ||||
if (!IsDataTypeSupport(args.src_data_type)) { | if (!IsDataTypeSupport(args.src_data_type)) { | ||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "Not support trans format from %s to %s, src shape %s, dst shape %s, data type %s", | |||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, | |||||
"[Check][Datatype]Failed, not support trans format from %s to %s, " | |||||
"src shape %s, dst shape %s, data type %s", | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | TypeUtils::FormatToSerialString(args.src_format).c_str(), | ||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), ShapeToString(args.src_shape).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), | |||||
ShapeToString(args.src_shape).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
REPORT_INNER_ERROR("E19999", "Check datatype failed, not support trans format " | |||||
"from %s to %s, src shape %s, dst shape %s, data type %s", | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), | |||||
ShapeToString(args.src_shape).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
return ACL_ERROR_GE_DATATYPE_INVALID; | return ACL_ERROR_GE_DATATYPE_INVALID; | ||||
} | } | ||||
if (!CheckShape(args.src_format, args.src_shape) || !IsShapeValid(args.dst_shape)) { | if (!CheckShape(args.src_format, args.src_shape) || !IsShapeValid(args.dst_shape)) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Not support trans format from %s to %s, src shape %s, dst shape %s, data type %s", | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, | |||||
"[Check][Shape]Failed, not support trans format from %s to %s, " | |||||
"src shape %s, dst shape %s, data type %s", | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | TypeUtils::FormatToSerialString(args.src_format).c_str(), | ||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), ShapeToString(args.src_shape).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), | |||||
ShapeToString(args.src_shape).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Check shape failed, not support trans format from %s to %s, " | |||||
"src shape %s, dst shape %s, data type %s", | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), | |||||
ShapeToString(args.src_shape).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
GELOGD("Begin to trans format from %s to %s, src shape %s, dst shape %s, data type %s", | GELOGD("Begin to trans format from %s to %s, src shape %s, dst shape %s, data type %s", | ||||
@@ -321,16 +381,34 @@ Status FormatTransferFractalZz::TransShape(Format src_format, const ShapeVector | |||||
Format dst_format, ShapeVector &dst_shape) { | Format dst_format, ShapeVector &dst_shape) { | ||||
if (!IsDataTypeSupport(data_type)) { | if (!IsDataTypeSupport(data_type)) { | ||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, | GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, | ||||
"Not support trans format from %s to %s, src shape %s, data type %s", | |||||
TypeUtils::FormatToSerialString(src_format).c_str(), TypeUtils::FormatToSerialString(dst_format).c_str(), | |||||
ShapeToString(src_shape).c_str(), TypeUtils::DataTypeToSerialString(data_type).c_str()); | |||||
"[Check][Datatype]Failed, not support trans format from %s to %s, " | |||||
"src shape %s, data type %s", | |||||
TypeUtils::FormatToSerialString(src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(dst_format).c_str(), | |||||
ShapeToString(src_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(data_type).c_str()); | |||||
REPORT_INNER_ERROR("E19999", "Check datatype failed, not support trans format from %s to %s, " | |||||
"src shape %s, data type %s", | |||||
TypeUtils::FormatToSerialString(src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(dst_format).c_str(), | |||||
ShapeToString(src_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(data_type).c_str()); | |||||
return ACL_ERROR_GE_DATATYPE_INVALID; | return ACL_ERROR_GE_DATATYPE_INVALID; | ||||
} | } | ||||
if (!CheckShape(src_format, src_shape)) { | if (!CheckShape(src_format, src_shape)) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, | GELOGE(ACL_ERROR_GE_SHAPE_INVALID, | ||||
"Not support trans format from %s to %s, src shape %s, data type %s", | |||||
TypeUtils::FormatToSerialString(src_format).c_str(), TypeUtils::FormatToSerialString(dst_format).c_str(), | |||||
ShapeToString(src_shape).c_str(), TypeUtils::DataTypeToSerialString(data_type).c_str()); | |||||
"[Check][Shape]Failed, not support trans format from %s to %s, " | |||||
"src shape %s, data type %s", | |||||
TypeUtils::FormatToSerialString(src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(dst_format).c_str(), | |||||
ShapeToString(src_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(data_type).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Check shape failed, not support trans format from %s to %s, " | |||||
"src shape %s, data type %s", | |||||
TypeUtils::FormatToSerialString(src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(dst_format).c_str(), | |||||
ShapeToString(src_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(data_type).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
ShapeVector hw_shape; | ShapeVector hw_shape; | ||||
@@ -339,18 +417,39 @@ Status FormatTransferFractalZz::TransShape(Format src_format, const ShapeVector | |||||
Status FormatTransferFractalZzND::TransFormat(const TransArgs &args, TransResult &result) { | Status FormatTransferFractalZzND::TransFormat(const TransArgs &args, TransResult &result) { | ||||
if (!IsDataTypeSupport(args.src_data_type)) { | if (!IsDataTypeSupport(args.src_data_type)) { | ||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "Not support trans format from %s to %s, src shape %s, dst shape %s, data type %s", | |||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, | |||||
"[Check][Datatype]Failed, not support trans format from %s to %s, " | |||||
"src shape %s, dst shape %s, data type %s", | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | TypeUtils::FormatToSerialString(args.src_format).c_str(), | ||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), ShapeToString(args.src_shape).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), | |||||
ShapeToString(args.src_shape).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
REPORT_INNER_ERROR("E19999", "Check datatype Failed, not support trans format from %s to %s, " | |||||
"src shape %s, dst shape %s, data type %s", | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), | |||||
ShapeToString(args.src_shape).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
return ACL_ERROR_GE_DATATYPE_INVALID; | return ACL_ERROR_GE_DATATYPE_INVALID; | ||||
} | } | ||||
if (!IsShapeValid(args.src_shape) || !CheckShape(args.dst_format, args.dst_shape)) { | if (!IsShapeValid(args.src_shape) || !CheckShape(args.dst_format, args.dst_shape)) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Not support trans format from %s to %s, src shape %s, dst shape %s, data type %s", | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Failed, not support trans format " | |||||
"from %s to %s, src shape %s, dst shape %s, data type %s", | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | TypeUtils::FormatToSerialString(args.src_format).c_str(), | ||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), ShapeToString(args.src_shape).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), | |||||
ShapeToString(args.src_shape).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Check shape failed, not support trans format from %s to %s, " | |||||
"src shape %s, dst shape %s, data type %s", | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), | |||||
ShapeToString(args.src_shape).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
GELOGD("Begin to trans format from %s to %s, src shape %s, dst shape %s, data type %s", | GELOGD("Begin to trans format from %s to %s, src shape %s, dst shape %s, data type %s", | ||||
@@ -41,16 +41,26 @@ Status CheckArgsForFracZToHwcn(const TransArgs &args) { | |||||
return ACL_ERROR_GE_FORMAT_INVALID; | return ACL_ERROR_GE_FORMAT_INVALID; | ||||
} | } | ||||
if (!CheckDataTypeSupported(args.src_data_type)) { | if (!CheckDataTypeSupported(args.src_data_type)) { | ||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "Failed to trans shape from FORMAT_FRACTAL_Z to HWCN, invalid data type %s", | |||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "[Check][DataType]Failed, " | |||||
"shape from FORMAT_FRACTAL_Z to HWCN, invalid data type %s", | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | ||||
REPORT_INNER_ERROR("E19999", "Failed to trans shape from FORMAT_FRACTAL_Z to HWCN, " | |||||
"invalid data type %s", | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
return ACL_ERROR_GE_DATATYPE_INVALID; | return ACL_ERROR_GE_DATATYPE_INVALID; | ||||
} | } | ||||
if (!CheckShapeValid(src_shape, kFracZDimsNum)) { | if (!CheckShapeValid(src_shape, kFracZDimsNum)) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check src shape %s", ShapeToString(src_shape).c_str()); | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, src shape %s", | |||||
ShapeToString(src_shape).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Src shape %s check invalid", | |||||
ShapeToString(src_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
if (!CheckShapeValid(dst_shape, kHwcnDimsNum)) { | if (!CheckShapeValid(dst_shape, kHwcnDimsNum)) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check dst shape %s", ShapeToString(dst_shape).c_str()); | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, dst shape %s", | |||||
ShapeToString(dst_shape).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Dst shape %s check invalid", | |||||
ShapeToString(dst_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
int64_t c0 = GetCubeSizeByDataType(args.src_data_type); | int64_t c0 = GetCubeSizeByDataType(args.src_data_type); | ||||
@@ -66,7 +76,7 @@ Status CheckArgsForFracZToHwcn(const TransArgs &args) { | |||||
FmtToStr(ShapeToString(dst_shape)); | FmtToStr(ShapeToString(dst_shape)); | ||||
GE_ERRORLOG_AND_ERRORMSG(ACL_ERROR_GE_SHAPE_INVALID, error.c_str()); | GE_ERRORLOG_AND_ERRORMSG(ACL_ERROR_GE_SHAPE_INVALID, error.c_str()); | ||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | |||||
} | |||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
@@ -74,9 +84,17 @@ Status CheckArgsForFracZToHwcn(const TransArgs &args) { | |||||
Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const int size, const int64_t total_size) { | Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const int size, const int64_t total_size) { | ||||
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>()); | std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>()); | ||||
if (dst == nullptr) { | if (dst == nullptr) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld, shape %s", | |||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, | |||||
"[Allocate][DSTMemory]Failed, memory for dst buf %ld, shape %s " | |||||
"when trans format from %s to %s", | |||||
total_size, ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | TypeUtils::FormatToSerialString(args.src_format).c_str(), | ||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), total_size, ShapeToString(args.dst_shape).c_str()); | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failed to alloc the memory for dst buf %ld, shape %s " | |||||
"when trans format from %s to %s", | |||||
total_size, ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
return ACL_ERROR_GE_MEMORY_ALLOCATION; | return ACL_ERROR_GE_MEMORY_ALLOCATION; | ||||
} | } | ||||
@@ -114,9 +132,12 @@ Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const in | |||||
static_cast<size_t>(size)); | static_cast<size_t>(size)); | ||||
if (ret != EOK) { | if (ret != EOK) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, | GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, | ||||
"Failed to copy data from FracZ offset %ld to HWCN[%ld, %ld, %ld, %ld] " | |||||
"offset %ld, err-code %d", | |||||
"[Operate][Memory]Failed to copy data from FracZ offset %ld to " | |||||
"HWCN[%ld, %ld, %ld, %ld] offset %ld, err-code %d", | |||||
src_offset, h_idx, w_idx, c_idx, n_idx, dst_offset, ret); | src_offset, h_idx, w_idx, c_idx, n_idx, dst_offset, ret); | ||||
REPORT_CALL_ERROR("E19999", "Failed to copy data from FracZ offset %ld to " | |||||
"HWCN[%ld, %ld, %ld, %ld], offset %ld, err-code %d", | |||||
src_offset, h_idx, w_idx, c_idx, n_idx, dst_offset, ret); | |||||
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | ||||
} | } | ||||
} | } | ||||
@@ -142,9 +163,12 @@ Status FormatTransferFracZHwcn::TransFormat(const TransArgs &args, TransResult & | |||||
result.length = static_cast<size_t>(total_size); | result.length = static_cast<size_t>(total_size); | ||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Get %ld total size from dst shape %s, src shape %s", total_size, | |||||
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str()); | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Get][ShapeSize]Failed, " | |||||
"total size %ld from dst shape %s, src shape %s", total_size, | |||||
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failed to get total size %ld from " | |||||
"dst shape %s, src shape %s", total_size, | |||||
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
GELOGD("Begin to trans format from FracZ to HWCN, src shape %s, data type %s, dst shape %s, memory size %ld", | GELOGD("Begin to trans format from FracZ to HWCN, src shape %s, data type %s, dst shape %s, memory size %ld", | ||||
@@ -152,9 +176,16 @@ Status FormatTransferFracZHwcn::TransFormat(const TransArgs &args, TransResult & | |||||
ShapeToString(args.dst_shape).c_str(), total_size); | ShapeToString(args.dst_shape).c_str(), total_size); | ||||
ret = GetDstDataAfterTrans(args, result, size, total_size); | ret = GetDstDataAfterTrans(args, result, size, total_size); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
GELOGE(ret, "Failed to get data after trans, src shape %s, data type %s, dst shape %s, memory size %ld", | |||||
ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), total_size); | |||||
GELOGE(ret, "[Get][Data]Failed after trans, src shape %s, " | |||||
"data type %s, dst shape %s, memory size %ld, error_code %u", | |||||
ShapeToString(args.src_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), total_size, ret); | |||||
REPORT_CALL_ERROR("E19999", "Failed to get data after trans, src shape %s, " | |||||
"data type %s, dst shape %s, memory size %ld, error_code %u", | |||||
ShapeToString(args.src_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), total_size, ret); | |||||
return ret; | return ret; | ||||
} | } | ||||
return SUCCESS; | return SUCCESS; | ||||
@@ -37,20 +37,30 @@ Status CheckArgsForFracZToNchw(const TransArgs &args) { | |||||
std::string error = "Dose not support trans format from " + | std::string error = "Dose not support trans format from " + | ||||
FmtToStr(TypeUtils::FormatToSerialString(args.src_format)) + " to " + | FmtToStr(TypeUtils::FormatToSerialString(args.src_format)) + " to " + | ||||
FmtToStr(TypeUtils::FormatToSerialString(args.dst_format)); | FmtToStr(TypeUtils::FormatToSerialString(args.dst_format)); | ||||
GE_ERRORLOG_AND_ERRORMSG(UNSUPPORTED, error.c_str()); | |||||
GE_ERRORLOG_AND_ERRORMSG(ACL_ERROR_GE_FORMAT_INVALID, error.c_str()); | |||||
return ACL_ERROR_GE_FORMAT_INVALID; | return ACL_ERROR_GE_FORMAT_INVALID; | ||||
} | } | ||||
if (!CheckDataTypeSupported(args.src_data_type)) { | if (!CheckDataTypeSupported(args.src_data_type)) { | ||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "Failed to trans shape from FORMAT_FRACTAL_Z to NCHW, invalid data type %s", | |||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "[Check][DataType]Failed, " | |||||
"shape from FORMAT_FRACTAL_Z to NCHW, invalid data type %s", | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | ||||
REPORT_INNER_ERROR("E19999", "Failed to trans shape from FORMAT_FRACTAL_Z to NCHW, " | |||||
"invalid data type %s", | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
return ACL_ERROR_GE_DATATYPE_INVALID; | return ACL_ERROR_GE_DATATYPE_INVALID; | ||||
} | } | ||||
if (!CheckShapeValid(src_shape, kFracZDimsNum)) { | if (!CheckShapeValid(src_shape, kFracZDimsNum)) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check src shape %s", ShapeToString(src_shape).c_str()); | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, src shape %s", | |||||
ShapeToString(src_shape).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Src shape %s check invalid", | |||||
ShapeToString(src_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
if (!CheckShapeValid(dst_shape, kNchwDimsNum)) { | if (!CheckShapeValid(dst_shape, kNchwDimsNum)) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check dst shape %s", ShapeToString(dst_shape).c_str()); | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, dst shape %s", | |||||
ShapeToString(dst_shape).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Dst shape %s check invalid", | |||||
ShapeToString(dst_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
int64_t c0 = GetCubeSizeByDataType(args.src_data_type); | int64_t c0 = GetCubeSizeByDataType(args.src_data_type); | ||||
@@ -59,10 +69,15 @@ Status CheckArgsForFracZToNchw(const TransArgs &args) { | |||||
} | } | ||||
int64_t c1 = Ceil(dst_shape.at(kNchwC), c0); | int64_t c1 = Ceil(dst_shape.at(kNchwC), c0); | ||||
int64_t n0 = Ceil(dst_shape.at(kNchwN), static_cast<int64_t>(kNiSize)); | int64_t n0 = Ceil(dst_shape.at(kNchwN), static_cast<int64_t>(kNiSize)); | ||||
if (src_shape.at(kFracZHWC1) != dst_shape.at(kNchwH) * dst_shape.at(kNchwW) * c1 || src_shape.at(kFracZC0) != c0 || | |||||
src_shape.at(kFracZNi) != kNiSize || src_shape.at(kFracZN0) != n0) { | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check relationship between src and dst shape, src shape %s, dst shape %s", | |||||
if (src_shape.at(kFracZHWC1) != dst_shape.at(kNchwH) * dst_shape.at(kNchwW) * c1 || | |||||
src_shape.at(kFracZC0) != c0 || src_shape.at(kFracZNi) != kNiSize || src_shape.at(kFracZN0) != n0) { | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, | |||||
"[Check][Shape]Failed to check relationship between src and dst shape, " | |||||
"src shape %s, dst shape %s", | |||||
ShapeToString(src_shape).c_str(), ShapeToString(dst_shape).c_str()); | ShapeToString(src_shape).c_str(), ShapeToString(dst_shape).c_str()); | ||||
REPORT_INNER_ERROR("E19999", "Failed to check relationship between src and dst shape, " | |||||
"src shape %s, dst shape %s", | |||||
ShapeToString(src_shape).c_str(), ShapeToString(dst_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
@@ -72,9 +87,17 @@ Status CheckArgsForFracZToNchw(const TransArgs &args) { | |||||
Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const int size, const int64_t total_size) { | Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const int size, const int64_t total_size) { | ||||
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>()); | std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>()); | ||||
if (dst == nullptr) { | if (dst == nullptr) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld, shape %s", | |||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, | |||||
"[Allocate][DSTMemory]Failed, memory for dst buf %ld, shape %s " | |||||
"when trans format from %s to %s", | |||||
total_size, ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | TypeUtils::FormatToSerialString(args.src_format).c_str(), | ||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), total_size, ShapeToString(args.dst_shape).c_str()); | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failed to alloc the memory for dst buf %ld, shape %s " | |||||
"when trans format from %s to %s", | |||||
total_size, ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
return ACL_ERROR_GE_MEMORY_ALLOCATION; | return ACL_ERROR_GE_MEMORY_ALLOCATION; | ||||
} | } | ||||
@@ -112,9 +135,12 @@ Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const in | |||||
static_cast<size_t>(size)); | static_cast<size_t>(size)); | ||||
if (ret != EOK) { | if (ret != EOK) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, | GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, | ||||
"Failed to copy data from FracZ offset %ld to NCHW[%ld, %ld, %ld, %ld] offset %ld, " | |||||
"err-code %d", | |||||
"[Operate][Memory]Failed to copy data from FracZ offset %ld to " | |||||
"NCHW[%ld, %ld, %ld, %ld] offset %ld, err-code %d", | |||||
src_offset, n_idx, c_idx, h_idx, w_idx, dst_offset, ret); | src_offset, n_idx, c_idx, h_idx, w_idx, dst_offset, ret); | ||||
REPORT_CALL_ERROR("E19999","Failed to copy data from FracZ offset %ld to " | |||||
"NCHW[%ld, %ld, %ld, %ld] offset %ld, err-code %d", | |||||
src_offset, n_idx, c_idx, h_idx, w_idx, dst_offset, ret ); | |||||
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | ||||
} | } | ||||
} | } | ||||
@@ -141,8 +167,12 @@ Status FormatTransferFracZNchw::TransFormat(const TransArgs &args, TransResult & | |||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Get %ld total size from dst shape %s, src shape %s", total_size, | |||||
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str()); | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Get][ShapeSize]Failed, total size %ld from dst shape %s, " | |||||
"src shape %s", total_size, | |||||
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failed to get total size %ld from dst shape %s, src shape %s", | |||||
total_size, | |||||
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
GELOGD("Begin to trans format from FracZ to NCHW, src shape %s, data type %s, dst shape %s, memory size %ld", | GELOGD("Begin to trans format from FracZ to NCHW, src shape %s, data type %s, dst shape %s, memory size %ld", | ||||
@@ -151,9 +181,16 @@ Status FormatTransferFracZNchw::TransFormat(const TransArgs &args, TransResult & | |||||
ret = GetDstDataAfterTrans(args, result, size, total_size); | ret = GetDstDataAfterTrans(args, result, size, total_size); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
GELOGE(ret, "Failed to get data after trans, src shape %s, data type %s, dst shape %s, memory size %ld", | |||||
ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | |||||
GELOGE(ret, "[Get][Data]Failed, after trans, src shape %s, data type %s, " | |||||
"dst shape %s, memory size %ld", | |||||
ShapeToString(args.src_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), total_size); | ShapeToString(args.dst_shape).c_str(), total_size); | ||||
REPORT_CALL_ERROR("E19999", "Failed to get data after trans, src shape %s, " | |||||
"data type %s, dst shape %s, memory size %ld", | |||||
ShapeToString(args.src_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), total_size); | |||||
return ret; | return ret; | ||||
} | } | ||||
return SUCCESS; | return SUCCESS; | ||||
@@ -37,33 +37,48 @@ Status CheckArgsForFracZToNhwc(const TransArgs &args) { | |||||
std::string error = "Dose not support trans format from " + | std::string error = "Dose not support trans format from " + | ||||
FmtToStr(TypeUtils::FormatToSerialString(args.src_format)) + " to " + | FmtToStr(TypeUtils::FormatToSerialString(args.src_format)) + " to " + | ||||
FmtToStr(TypeUtils::FormatToSerialString(args.dst_format)); | FmtToStr(TypeUtils::FormatToSerialString(args.dst_format)); | ||||
GE_ERRORLOG_AND_ERRORMSG(UNSUPPORTED, error.c_str()); | |||||
return UNSUPPORTED; | |||||
GE_ERRORLOG_AND_ERRORMSG(ACL_ERROR_GE_FORMAT_INVALID, error.c_str()); | |||||
return ACL_ERROR_GE_FORMAT_INVALID; | |||||
} | } | ||||
if (!CheckDataTypeSupported(args.src_data_type)) { | if (!CheckDataTypeSupported(args.src_data_type)) { | ||||
GELOGE(UNSUPPORTED, "Failed to trans shape from FORMAT_FRACTAL_Z to NHWC, invalid data type %s", | |||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "[Check][DataType]Failed, " | |||||
"shape from FORMAT_FRACTAL_Z to NCHW, invalid data type %s", | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | ||||
return UNSUPPORTED; | |||||
REPORT_INNER_ERROR("E19999", "Failed to trans shape from FORMAT_FRACTAL_Z to NCHW, " | |||||
"invalid data type %s", | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
return ACL_ERROR_GE_DATATYPE_INVALID; | |||||
} | } | ||||
if (!CheckShapeValid(src_shape, kFracZDimsNum)) { | if (!CheckShapeValid(src_shape, kFracZDimsNum)) { | ||||
GELOGE(PARAM_INVALID, "Failed to check src shape %s", ShapeToString(src_shape).c_str()); | |||||
return PARAM_INVALID; | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, src shape %s", | |||||
ShapeToString(src_shape).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Src shape %s check invalid", | |||||
ShapeToString(src_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | |||||
} | } | ||||
if (!CheckShapeValid(dst_shape, kNhwcDimsNum)) { | if (!CheckShapeValid(dst_shape, kNhwcDimsNum)) { | ||||
GELOGE(PARAM_INVALID, "Failed to check dst shape %s", ShapeToString(dst_shape).c_str()); | |||||
return PARAM_INVALID; | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, dst shape %s", | |||||
ShapeToString(dst_shape).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Dst shape %s check invalid", | |||||
ShapeToString(dst_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | |||||
} | } | ||||
int64_t c0 = GetCubeSizeByDataType(args.src_data_type); | int64_t c0 = GetCubeSizeByDataType(args.src_data_type); | ||||
if (c0 < 0) { | if (c0 < 0) { | ||||
return PARAM_INVALID; | |||||
return ACL_ERROR_GE_DATATYPE_INVALID; | |||||
} | } | ||||
int64_t c1 = Ceil(dst_shape.at(kNhwcC), c0); | int64_t c1 = Ceil(dst_shape.at(kNhwcC), c0); | ||||
int64_t n0 = Ceil(dst_shape.at(kNhwcN), static_cast<int64_t>(kNiSize)); | int64_t n0 = Ceil(dst_shape.at(kNhwcN), static_cast<int64_t>(kNiSize)); | ||||
if (src_shape.at(kFracZHWC1) != dst_shape.at(kNhwcH) * dst_shape.at(kNhwcW) * c1 || src_shape.at(kFracZC0) != c0 || | |||||
src_shape.at(kFracZNi) != kNiSize || src_shape.at(kFracZN0) != n0) { | |||||
GELOGE(PARAM_INVALID, "Failed to check relationship between src and dst shape, src shape %s, dst shape %s", | |||||
if (src_shape.at(kFracZHWC1) != dst_shape.at(kNhwcH) * dst_shape.at(kNhwcW) * c1 || | |||||
src_shape.at(kFracZC0) != c0 || src_shape.at(kFracZNi) != kNiSize || src_shape.at(kFracZN0) != n0) { | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, | |||||
"[Check][Shape]Failed to check relationship between src and dst shape, " | |||||
"src shape %s, dst shape %s", | |||||
ShapeToString(src_shape).c_str(), ShapeToString(dst_shape).c_str()); | ShapeToString(src_shape).c_str(), ShapeToString(dst_shape).c_str()); | ||||
return PARAM_INVALID; | |||||
REPORT_INNER_ERROR("E19999", "Failed to check relationship between src and dst shape, " | |||||
"src shape %s, dst shape %s", | |||||
ShapeToString(src_shape).c_str(), ShapeToString(dst_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | |||||
} | } | ||||
return SUCCESS; | return SUCCESS; | ||||
@@ -72,10 +87,18 @@ Status CheckArgsForFracZToNhwc(const TransArgs &args) { | |||||
Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, int size, int64_t total_size) { | Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, int size, int64_t total_size) { | ||||
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>()); | std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>()); | ||||
if (dst == nullptr) { | if (dst == nullptr) { | ||||
GELOGE(OUT_OF_MEMORY, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld, shape %s", | |||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, | |||||
"[Allocate][DSTMemory]Failed, memory for dst buf %ld, " | |||||
"shape %s when trans format from %s to %s", | |||||
total_size, ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | TypeUtils::FormatToSerialString(args.src_format).c_str(), | ||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), total_size, ShapeToString(args.dst_shape).c_str()); | |||||
return OUT_OF_MEMORY; | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failed to alloc the memory for dst buf %ld, " | |||||
"shape %s when trans format from %s to %s", | |||||
total_size, ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
return ACL_ERROR_GE_MEMORY_ALLOCATION; | |||||
} | } | ||||
auto n0 = args.src_shape.at(kFracZN0); | auto n0 = args.src_shape.at(kFracZN0); | ||||
@@ -111,10 +134,14 @@ Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, int size | |||||
auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset, | auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset, | ||||
static_cast<size_t>(size)); | static_cast<size_t>(size)); | ||||
if (ret != EOK) { | if (ret != EOK) { | ||||
GELOGE(INTERNAL_ERROR, | |||||
"Failed to copy data from FracZ offset %ld to HHWC[%ld, %ld, %ld, %ld] offset %ld, err-code %d", | |||||
src_offset, n_idx, h_idx, w_idx, c_idx, dst_offset, ret); | |||||
return INTERNAL_ERROR; | |||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, | |||||
"[Operate][Memory]Failed to copy data from FracZ offset %ld to " | |||||
"NCHW[%ld, %ld, %ld, %ld] offset %ld, err-code %d", | |||||
src_offset, n_idx, c_idx, h_idx, w_idx, dst_offset, ret); | |||||
REPORT_CALL_ERROR("E19999","Failed to copy data from FracZ offset %ld to " | |||||
"NCHW[%ld, %ld, %ld, %ld] offset %ld, err-code %d", | |||||
src_offset, n_idx, c_idx, h_idx, w_idx, dst_offset, ret); | |||||
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -127,8 +154,9 @@ Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, int size | |||||
} // namespace | } // namespace | ||||
Status FormatTransferFracZNhwc::TransFormat(const TransArgs &args, TransResult &result) { | Status FormatTransferFracZNhwc::TransFormat(const TransArgs &args, TransResult &result) { | ||||
if (CheckArgsForFracZToNhwc(args) != SUCCESS) { | |||||
return PARAM_INVALID; | |||||
Status ret = CheckArgsForFracZToNhwc(args); | |||||
if (ret != SUCCESS) { | |||||
return ret; | |||||
} | } | ||||
int size = GetSizeByDataType(args.src_data_type); | int size = GetSizeByDataType(args.src_data_type); | ||||
auto total_size = GetItemNumByShape(args.dst_shape) * size; | auto total_size = GetItemNumByShape(args.dst_shape) * size; | ||||
@@ -139,18 +167,30 @@ Status FormatTransferFracZNhwc::TransFormat(const TransArgs &args, TransResult & | |||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
GELOGE(INTERNAL_ERROR, "Get %ld total size from dst shape %s, src shape %s", total_size, | |||||
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str()); | |||||
return PARAM_INVALID; | |||||
GELOGE(ACL_ERROR_GE_PARAM_INVALID, "[Get][ShapeSize]Failed, total size %ld from dst shape %s, " | |||||
"src shape %s", total_size, | |||||
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failed to get total size %ld from dst shape %s, src shape %s", | |||||
total_size, | |||||
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str()); | |||||
return ACL_ERROR_GE_PARAM_INVALID; | |||||
} | } | ||||
GELOGD("Begin to trans format from FracZ to NHWC, src shape %s, data type %s, dst shape %s, memory size %ld", | GELOGD("Begin to trans format from FracZ to NHWC, src shape %s, data type %s, dst shape %s, memory size %ld", | ||||
ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | ||||
ShapeToString(args.dst_shape).c_str(), total_size); | ShapeToString(args.dst_shape).c_str(), total_size); | ||||
if (GetDstDataAfterTrans(args, result, size, total_size) != SUCCESS) { | |||||
GELOGE(INTERNAL_ERROR, "Failed to get data after trans, src shape %s, data type %s, dst shape %s, memory size %ld", | |||||
ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), total_size); | |||||
return INTERNAL_ERROR; | |||||
ret = GetDstDataAfterTrans(args, result, size, total_size); | |||||
if (ret != SUCCESS) { | |||||
GELOGE(ret, "[Get][Data]Failed, after trans, src shape %s, data type %s, " | |||||
"dst shape %s, memory size %ld, error_code %u", | |||||
ShapeToString(args.src_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), total_size, ret); | |||||
REPORT_CALL_ERROR("E19999","Failed to get data after trans, src shape %s, data type %s, " | |||||
"dst shape %s, memory size %ld, error_code %u", | |||||
ShapeToString(args.src_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), total_size, ret); | |||||
return ret; | |||||
} | } | ||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
@@ -158,7 +198,7 @@ Status FormatTransferFracZNhwc::TransFormat(const TransArgs &args, TransResult & | |||||
Status FormatTransferFracZNhwc::TransShape(Format src_format, const std::vector<int64_t> &src_shape, DataType data_type, | Status FormatTransferFracZNhwc::TransShape(Format src_format, const std::vector<int64_t> &src_shape, DataType data_type, | ||||
Format dst_format, std::vector<int64_t> &dst_shape) { | Format dst_format, std::vector<int64_t> &dst_shape) { | ||||
GELOGD("The shape derivation from FracZ to NHWC is not unique. Trans shape in this direction is not supported"); | GELOGD("The shape derivation from FracZ to NHWC is not unique. Trans shape in this direction is not supported"); | ||||
return UNSUPPORTED; | |||||
return ACL_ERROR_GE_FORMAT_INVALID; | |||||
} | } | ||||
REGISTER_FORMAT_TRANSFER(FormatTransferFracZNhwc, FORMAT_FRACTAL_Z, FORMAT_NHWC) | REGISTER_FORMAT_TRANSFER(FormatTransferFracZNhwc, FORMAT_FRACTAL_Z, FORMAT_NHWC) | ||||
@@ -43,8 +43,10 @@ Status TransShapeHwcnToC1hwncoc0(const DataType &data_type, const std::vector<in | |||||
dst_shape.push_back(cube_size); | dst_shape.push_back(cube_size); | ||||
dst_shape.push_back(cube_size); | dst_shape.push_back(cube_size); | ||||
if (!CheckShapeValid(dst_shape, kC1hwncoc0DimsNum)) { | if (!CheckShapeValid(dst_shape, kC1hwncoc0DimsNum)) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check dst shape %s", | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, dst shape %s", | |||||
ShapeToString(dst_shape).c_str()); | ShapeToString(dst_shape).c_str()); | ||||
REPORT_CALL_ERROR("E19999", "Dst shape %s check invalid", | |||||
ShapeToString(dst_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
return SUCCESS; | return SUCCESS; | ||||
@@ -59,16 +61,26 @@ Status CheckArgsForHwcnToC1hwncoc0(const TransArgs &args) { | |||||
return ACL_ERROR_GE_FORMAT_INVALID; | return ACL_ERROR_GE_FORMAT_INVALID; | ||||
} | } | ||||
if (!CheckDataTypeSupported(args.src_data_type)) { | if (!CheckDataTypeSupported(args.src_data_type)) { | ||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "Failed to trans shape from HWCN to C1HWNCoC0, invalid data type %s", | |||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "[Trans][Shape]Failed, " | |||||
"shape from HWCN to C1HWNCoC0, invalid data type %s", | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | ||||
REPORT_INNER_ERROR("E19999", "Failed to trans shape from HWCN to C1HWNCoC0, " | |||||
"invalid data type %s", | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
return ACL_ERROR_GE_DATATYPE_INVALID; | return ACL_ERROR_GE_DATATYPE_INVALID; | ||||
} | } | ||||
if (!CheckShapeValid(args.src_shape, kHwcnDimsNum)) { | if (!CheckShapeValid(args.src_shape, kHwcnDimsNum)) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check src shape %s", ShapeToString(args.src_shape).c_str()); | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, src shape %s", | |||||
ShapeToString(args.src_shape).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Src shape %s check invalid", | |||||
ShapeToString(args.src_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
if (!CheckShapeValid(args.dst_shape, kC1hwncoc0DimsNum)) { | if (!CheckShapeValid(args.dst_shape, kC1hwncoc0DimsNum)) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check dst shape %s", ShapeToString(args.dst_shape).c_str()); | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, dst shape %s", | |||||
ShapeToString(args.dst_shape).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Dst shape %s check invalid", | |||||
ShapeToString(args.dst_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
std::vector<int64_t> expect_dst_shape; | std::vector<int64_t> expect_dst_shape; | ||||
@@ -78,10 +90,14 @@ Status CheckArgsForHwcnToC1hwncoc0(const TransArgs &args) { | |||||
} | } | ||||
if (args.dst_shape != expect_dst_shape) { | if (args.dst_shape != expect_dst_shape) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, | GELOGE(ACL_ERROR_GE_SHAPE_INVALID, | ||||
"Failed to trans format, src and dst shape are not compatible. src shape %s, dst shape %s, " | |||||
"[Trans][Shape]Failed, src shape %s and dst shape %s are not compatible. " | |||||
"expect dst shape %s", | "expect dst shape %s", | ||||
ShapeToString(args.src_shape).c_str(), ShapeToString(args.dst_shape).c_str(), | ShapeToString(args.src_shape).c_str(), ShapeToString(args.dst_shape).c_str(), | ||||
ShapeToString(expect_dst_shape).c_str()); | ShapeToString(expect_dst_shape).c_str()); | ||||
REPORT_INNER_ERROR("E19999", "Failed to trans format, src shape %s and dst shape %s " | |||||
"are not compatible. expect dst shape %s", | |||||
ShapeToString(args.src_shape).c_str(), ShapeToString(args.dst_shape).c_str(), | |||||
ShapeToString(expect_dst_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
@@ -91,9 +107,16 @@ Status CheckArgsForHwcnToC1hwncoc0(const TransArgs &args) { | |||||
Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const int size, const int64_t total_size) { | Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const int size, const int64_t total_size) { | ||||
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>()); | std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>()); | ||||
if (dst == nullptr) { | if (dst == nullptr) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld, shape %s", | |||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "[Allocate][DSTMemory]Failed, " | |||||
"memory for dst buf %ld, shape %s when trans format from %s to %s", | |||||
total_size, ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | TypeUtils::FormatToSerialString(args.src_format).c_str(), | ||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), total_size, ShapeToString(args.dst_shape).c_str()); | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failed to alloc the memory for dst buf %ld, " | |||||
"shape %s when trans format from %s to %s", | |||||
total_size, ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
return ACL_ERROR_GE_MEMORY_ALLOCATION; | return ACL_ERROR_GE_MEMORY_ALLOCATION; | ||||
} | } | ||||
@@ -135,11 +158,17 @@ Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const in | |||||
auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset, | auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset, | ||||
static_cast<size_t>(size)); | static_cast<size_t>(size)); | ||||
if (ret != EOK) { | if (ret != EOK) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, | |||||
"Failed to copy data from HWCN[%ld, %ld, %ld, %ld] offset %ld to " | |||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Copy][Data]Failed, " | |||||
"data from HWCN[%ld, %ld, %ld, %ld] offset %ld to " | |||||
"C1HWNCoC0[%ld, %ld, %ld, %ld, %ld, %ld] offset %ld, err-code %d", | "C1HWNCoC0[%ld, %ld, %ld, %ld, %ld, %ld] offset %ld, err-code %d", | ||||
h_idx, w_idx, c_idx, n_idx, src_offset, c1_idx, h_idx, w_idx, n_idx, co_idx, c0_idx, | |||||
dst_offset, ret); | |||||
h_idx, w_idx, c_idx, n_idx, src_offset, c1_idx, h_idx, w_idx, | |||||
n_idx, co_idx, c0_idx, dst_offset, ret); | |||||
REPORT_CALL_ERROR("E19999", "Failed to copy data from " | |||||
"HWCN[%ld, %ld, %ld, %ld] offset %ld " | |||||
"to, C1HWNCoC0[%ld, %ld, %ld, %ld, %ld, %ld] " | |||||
"offset %ld, err-code %d", | |||||
h_idx, w_idx, c_idx, n_idx, src_offset, c1_idx, h_idx, w_idx, | |||||
n_idx, co_idx, c0_idx, dst_offset, ret); | |||||
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | ||||
} | } | ||||
} else { | } else { | ||||
@@ -147,14 +176,18 @@ Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const in | |||||
memset_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), 0, static_cast<size_t>(size)); | memset_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), 0, static_cast<size_t>(size)); | ||||
if (ret != EOK) { | if (ret != EOK) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, | GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, | ||||
"Failed to set to 0 to C1HWNCoC0[%ld, %ld, %ld, %ld, %ld, %ld] offset %ld, " | |||||
"err-code %d", | |||||
"[Operate][Memory]Failed to set to 0 to " | |||||
"C1HWNCoC0[%ld, %ld, %ld, %ld, %ld, %ld] offset %ld, err-code %d", | |||||
c1_idx, h_idx, w_idx, n_idx, co_idx, c0_idx, dst_offset, ret); | c1_idx, h_idx, w_idx, n_idx, co_idx, c0_idx, dst_offset, ret); | ||||
REPORT_CALL_ERROR("E19999", "Failed to set to 0 to " | |||||
"C1HWNCoC0[%ld, %ld, %ld, %ld, %ld, %ld] offset %ld, " | |||||
"err-code %d", | |||||
c1_idx, h_idx, w_idx, n_idx, co_idx, c0_idx, dst_offset, ret); | |||||
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
} | |||||
} | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -179,8 +212,12 @@ Status FormatTransferHwcnC1hwncoc0::TransFormat(const TransArgs &args, TransResu | |||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Get %ld total size from dst shape %s, src shape %s", total_size, | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Get][ShapeSize]Failed, total size %ld from dst shape %s, " | |||||
"src shape %s", total_size, | |||||
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str()); | ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str()); | ||||
REPORT_CALL_ERROR("E19999", "Failed to get total size %ld from dst shape %s, src shape %s", | |||||
total_size, | |||||
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
GELOGD("Begin to trans format from HWCN to C1HWNCoC0, src shape %s, data type %s, dst shape %s, memory size %ld", | GELOGD("Begin to trans format from HWCN to C1HWNCoC0, src shape %s, data type %s, dst shape %s, memory size %ld", | ||||
@@ -189,9 +226,16 @@ Status FormatTransferHwcnC1hwncoc0::TransFormat(const TransArgs &args, TransResu | |||||
ret = GetDstDataAfterTrans(args, result, size, total_size); | ret = GetDstDataAfterTrans(args, result, size, total_size); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
GELOGE(ret, "Failed to get data after trans, src shape %s, data type %s, dst shape %s, memory size %ld", | |||||
ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), total_size); | |||||
GELOGE(ret, "[Get][Data]Failed, after trans, src shape %s, data type %s, " | |||||
"dst shape %s, memory size %ld, error_code %u", | |||||
ShapeToString(args.src_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), total_size, ret); | |||||
REPORT_CALL_ERROR("E19999", "Failed to get data after trans, src shape %s, data type %s, " | |||||
"dst shape %s, memory size %ld, error_code %u", | |||||
ShapeToString(args.src_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), total_size, ret); | |||||
return ret; | return ret; | ||||
} | } | ||||
return SUCCESS; | return SUCCESS; | ||||
@@ -201,8 +245,10 @@ Status FormatTransferHwcnC1hwncoc0::TransShape(Format src_format, const std::vec | |||||
DataType data_type, Format dst_format, std::vector<int64_t> &dst_shape) { | DataType data_type, Format dst_format, std::vector<int64_t> &dst_shape) { | ||||
if (src_format == FORMAT_HWCN && CheckDataTypeSupported(data_type)) { | if (src_format == FORMAT_HWCN && CheckDataTypeSupported(data_type)) { | ||||
if (!CheckShapeValid(src_shape, kHwcnDimsNum)) { | if (!CheckShapeValid(src_shape, kHwcnDimsNum)) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check src shape %s", | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, src shape %s", | |||||
ShapeToString(src_shape).c_str()); | ShapeToString(src_shape).c_str()); | ||||
REPORT_CALL_ERROR("E19999", "Src shape %s check invalid", | |||||
ShapeToString(src_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
return TransShapeHwcnToC1hwncoc0(data_type, src_shape, dst_shape); | return TransShapeHwcnToC1hwncoc0(data_type, src_shape, dst_shape); | ||||
@@ -37,33 +37,49 @@ Status CheckArgsForNc1hwc0ToNchw(const TransArgs &args) { | |||||
std::string error = "Dose not support trans format from " + | std::string error = "Dose not support trans format from " + | ||||
FmtToStr(TypeUtils::FormatToSerialString(args.src_format)) + " to " + | FmtToStr(TypeUtils::FormatToSerialString(args.src_format)) + " to " + | ||||
FmtToStr(TypeUtils::FormatToSerialString(args.dst_format)); | FmtToStr(TypeUtils::FormatToSerialString(args.dst_format)); | ||||
GE_ERRORLOG_AND_ERRORMSG(UNSUPPORTED, error.c_str()); | |||||
return UNSUPPORTED; | |||||
GE_ERRORLOG_AND_ERRORMSG(ACL_ERROR_GE_FORMAT_INVALID, error.c_str()); | |||||
return ACL_ERROR_GE_FORMAT_INVALID; | |||||
} | } | ||||
if (!CheckDataTypeSupported(args.src_data_type)) { | if (!CheckDataTypeSupported(args.src_data_type)) { | ||||
GELOGE(UNSUPPORTED, "Failed to trans shape from NC1HWC0 to NCHW, invalid data type %s", | |||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "[Check][DataType]Failed, shape from NC1HWC0 to NCHW, " | |||||
"invalid data type %s", | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | ||||
return UNSUPPORTED; | |||||
REPORT_INNER_ERROR("E19999", "Failed to trans shape from NC1HWC0 to NCHW, invalid data type %s", | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
return ACL_ERROR_GE_DATATYPE_INVALID; | |||||
} | } | ||||
if (!CheckShapeValid(args.src_shape, kNc1hwc0DimsNum)) { | if (!CheckShapeValid(args.src_shape, kNc1hwc0DimsNum)) { | ||||
GELOGE(PARAM_INVALID, "Failed to check src shape %s", ShapeToString(args.src_shape).c_str()); | |||||
return PARAM_INVALID; | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, src shape %s", | |||||
ShapeToString(args.src_shape).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Src shape %s check invalid", | |||||
ShapeToString(args.src_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | |||||
} | } | ||||
if (!CheckShapeValid(args.dst_shape, kNchwDimsNum)) { | if (!CheckShapeValid(args.dst_shape, kNchwDimsNum)) { | ||||
GELOGE(PARAM_INVALID, "Failed to check dst shape %s", ShapeToString(args.dst_shape).c_str()); | |||||
return PARAM_INVALID; | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, dst shape %s", | |||||
ShapeToString(args.dst_shape).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Dst shape %s check invalid", | |||||
ShapeToString(args.dst_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | |||||
} | } | ||||
int64_t c0 = GetCubeSizeByDataType(args.src_data_type); | int64_t c0 = GetCubeSizeByDataType(args.src_data_type); | ||||
if (c0 <= 0) { | if (c0 <= 0) { | ||||
GELOGE(PARAM_INVALID, "Failed to get cube size, the data type is invalid"); | |||||
return PARAM_INVALID; | |||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "[Get][Cube]Failed, the data type %s is invalid", | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failed to get cube size, the data tyep %s is invalid", | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
return ACL_ERROR_GE_DATATYPE_INVALID; | |||||
} | } | ||||
if (src_shape.at(kNc1hwc0H) != dst_shape.at(kNchwH) || src_shape.at(kNc1hwc0W) != dst_shape.at(kNchwW) || | if (src_shape.at(kNc1hwc0H) != dst_shape.at(kNchwH) || src_shape.at(kNc1hwc0W) != dst_shape.at(kNchwW) || | ||||
src_shape.at(kNc1hwc0N) != dst_shape.at(kNchwN) || src_shape.at(kNc1hwc0C0) != c0 || | src_shape.at(kNc1hwc0N) != dst_shape.at(kNchwN) || src_shape.at(kNc1hwc0C0) != c0 || | ||||
src_shape.at(kNc1hwc0C1) != (Ceil(dst_shape.at(kNchwC), c0))) { | src_shape.at(kNc1hwc0C1) != (Ceil(dst_shape.at(kNchwC), c0))) { | ||||
GELOGE(PARAM_INVALID, "Failed to check relationship between src and dst shape, src shape %s, dst shape %s", | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Failed to check relationship between " | |||||
"src shape %s and dst shape %s", | |||||
ShapeToString(src_shape).c_str(), ShapeToString(dst_shape).c_str()); | ShapeToString(src_shape).c_str(), ShapeToString(dst_shape).c_str()); | ||||
return PARAM_INVALID; | |||||
REPORT_INNER_ERROR("E19999", "Failed to check relationship between src shape %s " | |||||
"and dst shape %s", | |||||
ShapeToString(src_shape).c_str(), ShapeToString(dst_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | |||||
} | } | ||||
return SUCCESS; | return SUCCESS; | ||||
@@ -72,10 +88,17 @@ Status CheckArgsForNc1hwc0ToNchw(const TransArgs &args) { | |||||
Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const int size, const int64_t total_size) { | Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const int size, const int64_t total_size) { | ||||
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>()); | std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>()); | ||||
if (dst == nullptr) { | if (dst == nullptr) { | ||||
GELOGE(OUT_OF_MEMORY, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld, shape %s", | |||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "[Allocate][DSTMemory]Failed, " | |||||
"memory for dst buf %ld, shape %s when trans format from %s to %s", | |||||
total_size, ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | TypeUtils::FormatToSerialString(args.src_format).c_str(), | ||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), total_size, ShapeToString(args.dst_shape).c_str()); | |||||
return OUT_OF_MEMORY; | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failed to alloc the memory for dst buf %ld, " | |||||
"shape %s when trans format from %s to %s", | |||||
total_size, ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
return ACL_ERROR_GE_MEMORY_ALLOCATION; | |||||
} | } | ||||
auto h = args.src_shape.at(kNc1hwc0H); | auto h = args.src_shape.at(kNc1hwc0H); | ||||
@@ -109,11 +132,17 @@ Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const in | |||||
auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset, | auto ret = memcpy_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), args.data + src_offset, | ||||
static_cast<size_t>(size)); | static_cast<size_t>(size)); | ||||
if (ret != EOK) { | if (ret != EOK) { | ||||
GELOGE(INTERNAL_ERROR, | |||||
"Failed to copy data from NC1HWC0[%ld, %ld, %ld, %ld, %ld] offset %ld to NCHW[%ld, %ld, %ld, %ld]" | |||||
" offset %ld, err-code %d", | |||||
n_idx, c1_idx, h_idx, w_idx, c0_idx, src_offset, n_idx, c_idx, h_idx, w_idx, dst_offset, ret); | |||||
return INTERNAL_ERROR; | |||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Copy][Data]Failed, data from " | |||||
"NC1HWC0[%ld, %ld, %ld, %ld, %ld] " | |||||
"src offset %ld to NCHW[%ld, %ld, %ld, %ld], dst offset %ld, err-code %d", | |||||
n_idx, c1_idx, h_idx, w_idx, c0_idx, src_offset, n_idx, | |||||
c_idx, h_idx, w_idx, dst_offset, ret); | |||||
REPORT_CALL_ERROR("E19999", "Failed to copy data from NC1HWC0[%ld, %ld, %ld, %ld, %ld] " | |||||
"src offset %ld to NCHW[%ld, %ld, %ld, %ld], dst offset %ld, " | |||||
"err-code %d", | |||||
n_idx, c1_idx, h_idx, w_idx, c0_idx, src_offset, n_idx, | |||||
c_idx, h_idx, w_idx, dst_offset, ret); | |||||
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -126,8 +155,9 @@ Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const in | |||||
} // namespace | } // namespace | ||||
Status FormatTransferNc1hwc0Nchw::TransFormat(const TransArgs &args, TransResult &result) { | Status FormatTransferNc1hwc0Nchw::TransFormat(const TransArgs &args, TransResult &result) { | ||||
if (CheckArgsForNc1hwc0ToNchw(args) != SUCCESS) { | |||||
return PARAM_INVALID; | |||||
Status ret = CheckArgsForNc1hwc0ToNchw(args); | |||||
if (ret != SUCCESS) { | |||||
return ret; | |||||
} | } | ||||
int size = GetSizeByDataType(args.src_data_type); | int size = GetSizeByDataType(args.src_data_type); | ||||
auto total_size = GetItemNumByShape(args.dst_shape) * size; | auto total_size = GetItemNumByShape(args.dst_shape) * size; | ||||
@@ -138,18 +168,30 @@ Status FormatTransferNc1hwc0Nchw::TransFormat(const TransArgs &args, TransResult | |||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
GELOGE(INTERNAL_ERROR, "Get %ld total size from dst shape %s, src shape %s", total_size, | |||||
GELOGE(ACL_ERROR_GE_PARAM_INVALID, "[Get][ShapeSize]Failed, total size %ld from dst shape %s, " | |||||
"src shape %s", total_size, | |||||
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str()); | ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str()); | ||||
return PARAM_INVALID; | |||||
REPORT_CALL_ERROR("E19999", "Failed to get total size %ld from dst shape %s, src shape %s", | |||||
total_size, | |||||
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str()); | |||||
return ACL_ERROR_GE_PARAM_INVALID; | |||||
} | } | ||||
GELOGD("Begin to trans format from NC1HWC0 to NCHW, src shape %s, data type %s, dst shape %s, memory size %ld", | GELOGD("Begin to trans format from NC1HWC0 to NCHW, src shape %s, data type %s, dst shape %s, memory size %ld", | ||||
ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | ||||
ShapeToString(args.dst_shape).c_str(), total_size); | ShapeToString(args.dst_shape).c_str(), total_size); | ||||
if (GetDstDataAfterTrans(args, result, size, total_size) != SUCCESS) { | |||||
GELOGE(INTERNAL_ERROR, "Failed to get data after trans, src shape %s, data type %s, dst shape %s, memory size %ld", | |||||
ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | |||||
ret = GetDstDataAfterTrans(args, result, size, total_size); | |||||
if (ret != SUCCESS) { | |||||
GELOGE(ret, "[Get][Data]Failed, after trans, src shape %s, data type %s, " | |||||
"dst shape %s, memory size %ld", | |||||
ShapeToString(args.src_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), total_size); | ShapeToString(args.dst_shape).c_str(), total_size); | ||||
return INTERNAL_ERROR; | |||||
REPORT_CALL_ERROR("E19999", "Failed to get data after trans, src shape %s, data type %s, " | |||||
"dst shape %s, memory size %ld", | |||||
ShapeToString(args.src_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), total_size); | |||||
return ret; | |||||
} | } | ||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
@@ -157,7 +199,7 @@ Status FormatTransferNc1hwc0Nchw::TransFormat(const TransArgs &args, TransResult | |||||
Status FormatTransferNc1hwc0Nchw::TransShape(Format src_format, const std::vector<int64_t> &src_shape, | Status FormatTransferNc1hwc0Nchw::TransShape(Format src_format, const std::vector<int64_t> &src_shape, | ||||
DataType data_type, Format dst_format, std::vector<int64_t> &dst_shape) { | DataType data_type, Format dst_format, std::vector<int64_t> &dst_shape) { | ||||
GELOGD("The shape derivation from NC1HWC0 to NCHW is not unique. Trans shape in this direction is not supported"); | GELOGD("The shape derivation from NC1HWC0 to NCHW is not unique. Trans shape in this direction is not supported"); | ||||
return UNSUPPORTED; | |||||
return ACL_ERROR_GE_FORMAT_INVALID; | |||||
} | } | ||||
REGISTER_FORMAT_TRANSFER(FormatTransferNc1hwc0Nchw, FORMAT_NC1HWC0, FORMAT_NCHW) | REGISTER_FORMAT_TRANSFER(FormatTransferNc1hwc0Nchw, FORMAT_NC1HWC0, FORMAT_NCHW) | ||||
@@ -41,28 +41,44 @@ Status CheckArgsForNc1hwc0ToNhwc(const TransArgs &args) { | |||||
return ACL_ERROR_GE_FORMAT_INVALID; | return ACL_ERROR_GE_FORMAT_INVALID; | ||||
} | } | ||||
if (!CheckDataTypeSupported(args.src_data_type)) { | if (!CheckDataTypeSupported(args.src_data_type)) { | ||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "Failed to trans shape from NC1HWC0 to NHWC, invalid data type %s", | |||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "[Check][DataType]Failed, shape from NC1HWC0 to NHWC, " | |||||
"invalid data type %s", | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | ||||
REPORT_INNER_ERROR("E19999", "Failed to trans shape from NC1HWC0 to NHWC, invalid data type %s", | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
return ACL_ERROR_GE_DATATYPE_INVALID; | return ACL_ERROR_GE_DATATYPE_INVALID; | ||||
} | } | ||||
if (!CheckShapeValid(args.src_shape, kNc1hwc0DimsNum)) { | if (!CheckShapeValid(args.src_shape, kNc1hwc0DimsNum)) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check src shape %s", ShapeToString(args.src_shape).c_str()); | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, src shape %s", | |||||
ShapeToString(args.src_shape).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Src shape %s check invalid", | |||||
ShapeToString(args.src_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
if (!CheckShapeValid(args.dst_shape, kNhwcDimsNum)) { | if (!CheckShapeValid(args.dst_shape, kNhwcDimsNum)) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check dst shape %s", ShapeToString(args.dst_shape).c_str()); | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, dst shape %s", | |||||
ShapeToString(args.dst_shape).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Dst shape %s check invalid", | |||||
ShapeToString(args.dst_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
int64_t c0 = GetCubeSizeByDataType(args.src_data_type); | int64_t c0 = GetCubeSizeByDataType(args.src_data_type); | ||||
if (c0 <= 0) { | if (c0 <= 0) { | ||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "Failed to get cube size, the data type is invalid"); | |||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "[Get][Cube]Failed, the data type %s is invalid", | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failed to get cube size, the data type %s is invalid", | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
return ACL_ERROR_GE_DATATYPE_INVALID; | return ACL_ERROR_GE_DATATYPE_INVALID; | ||||
} | } | ||||
if (src_shape.at(kNc1hwc0H) != dst_shape.at(kNhwcH) || src_shape.at(kNc1hwc0W) != dst_shape.at(kNhwcW) || | if (src_shape.at(kNc1hwc0H) != dst_shape.at(kNhwcH) || src_shape.at(kNc1hwc0W) != dst_shape.at(kNhwcW) || | ||||
src_shape.at(kNc1hwc0N) != dst_shape.at(kNhwcN) || src_shape.at(kNc1hwc0C0) != c0 || | src_shape.at(kNc1hwc0N) != dst_shape.at(kNhwcN) || src_shape.at(kNc1hwc0C0) != c0 || | ||||
src_shape.at(kNc1hwc0C1) != (Ceil(dst_shape.at(kNhwcC), c0))) { | src_shape.at(kNc1hwc0C1) != (Ceil(dst_shape.at(kNhwcC), c0))) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check relationship between src and dst shape, src shape %s, dst shape %s", | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Failed to check relationship between " | |||||
"src shape %s and dst shape %s", | |||||
ShapeToString(src_shape).c_str(), ShapeToString(dst_shape).c_str()); | ShapeToString(src_shape).c_str(), ShapeToString(dst_shape).c_str()); | ||||
REPORT_INNER_ERROR("E19999", "Failed to check relationship between src shape %s " | |||||
"and dst shape %s", | |||||
ShapeToString(src_shape).c_str(), ShapeToString(dst_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
@@ -72,9 +88,16 @@ Status CheckArgsForNc1hwc0ToNhwc(const TransArgs &args) { | |||||
Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const int size, const int64_t total_size) { | Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const int size, const int64_t total_size) { | ||||
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>()); | std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>()); | ||||
if (dst == nullptr) { | if (dst == nullptr) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld, shape %s", | |||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "[Allocate][DSTMemory]Failed, memory for dst buf %ld, " | |||||
"shape %s when trans format from %s to %s", | |||||
total_size, ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | TypeUtils::FormatToSerialString(args.src_format).c_str(), | ||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), total_size, ShapeToString(args.dst_shape).c_str()); | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failed to alloc the memory for dst buf %ld, " | |||||
"shape %s when trans format from %s to %s", | |||||
total_size, ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
return ACL_ERROR_GE_MEMORY_ALLOCATION; | return ACL_ERROR_GE_MEMORY_ALLOCATION; | ||||
} | } | ||||
@@ -110,9 +133,14 @@ Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const in | |||||
static_cast<size_t>(size)); | static_cast<size_t>(size)); | ||||
if (ret != EOK) { | if (ret != EOK) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, | GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, | ||||
"Failed to copy data from NC1HWC0[%ld, %ld, %ld, %ld, %ld] offset %ld to NHWC[%ld, %ld, %ld, %ld]" | |||||
" offset %ld, err-code %d", | |||||
n_idx, c1_idx, h_idx, w_idx, c0_idx, src_offset, n_idx, c_idx, h_idx, w_idx, dst_offset, ret); | |||||
"[Copy][Data]Failed, data from NC1HWC0[%ld, %ld, %ld, %ld, %ld] " | |||||
"offset %ld to NHWC[%ld, %ld, %ld, %ld] offset %ld, err-code %d", | |||||
n_idx, c1_idx, h_idx, w_idx, c0_idx, src_offset, n_idx, c_idx, | |||||
h_idx, w_idx, dst_offset, ret); | |||||
REPORT_CALL_ERROR("E19999", "Failed to copy data from NC1HWC0[%ld, %ld, %ld, %ld, %ld] " | |||||
"offset %ld to NHWC[%ld, %ld, %ld, %ld] offset %ld, err-code %d", | |||||
n_idx, c1_idx, h_idx, w_idx, c0_idx, src_offset, n_idx, c_idx, | |||||
h_idx, w_idx, dst_offset, ret); | |||||
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | ||||
} | } | ||||
} | } | ||||
@@ -139,19 +167,31 @@ Status FormatTransferNc1hwc0Nhwc::TransFormat(const TransArgs &args, TransResult | |||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Get %ld total size from dst shape %s, src shape %s", total_size, | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Get][ShapeSize]Failed, total size %ld from dst shape %s, " | |||||
"src shape %s", total_size, | |||||
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str()); | ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str()); | ||||
REPORT_CALL_ERROR("E19999", "Failed to get total size %ld from dst shape %s, src shape %s", | |||||
total_size, | |||||
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
GELOGD("Begin to trans format from NC1HWC0 to NCHW, src shape %s, data type %s, dst shape %s, memory size %ld", | |||||
GELOGD("[Trans][Format]Begin to trans format from NC1HWC0 to NCHW, " | |||||
"src shape %s, data type %s, dst shape %s, memory size %ld", | |||||
ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | ||||
ShapeToString(args.dst_shape).c_str(), total_size); | ShapeToString(args.dst_shape).c_str(), total_size); | ||||
ret = GetDstDataAfterTrans(args, result, size, total_size); | ret = GetDstDataAfterTrans(args, result, size, total_size); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
GELOGE(ret, "Failed to get data after trans, src shape %s, data type %s, dst shape %s, memory size %ld", | |||||
ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), total_size); | |||||
GELOGE(ret, "[Get][Data]Failed, after trans, src shape %s, data type %s, " | |||||
"dst shape %s, memory size %ld, error_code %u", | |||||
ShapeToString(args.src_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), total_size, ret); | |||||
REPORT_CALL_ERROR("E19999", "[Get][Data]Failed, after trans, src shape %s, " | |||||
"data type %s, dst shape %s, memory size %ld, error_code %u", | |||||
ShapeToString(args.src_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), total_size, ret); | |||||
return ret; | return ret; | ||||
} | } | ||||
return SUCCESS; | return SUCCESS; | ||||
@@ -59,8 +59,9 @@ Status TransShape(int64_t n, int64_t c, int64_t h, int64_t w, DataType data_type | |||||
dst_shape.push_back(c0); | dst_shape.push_back(c0); | ||||
if (!IsShapeValid(dst_shape)) { | if (!IsShapeValid(dst_shape)) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check dst shape %s", | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, dst shape %s", | |||||
ShapeToString(dst_shape).c_str()); | ShapeToString(dst_shape).c_str()); | ||||
REPORT_CALL_ERROR("E19999", "Dst shape %s check invalid", ShapeToString(dst_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
return SUCCESS; | return SUCCESS; | ||||
@@ -94,7 +95,13 @@ Status TransFormatFromNchwToFzC04(const TransArgs &args, TransResult &result) { | |||||
std::vector<int64_t> expect_shape = {n, h, w, c}; | std::vector<int64_t> expect_shape = {n, h, w, c}; | ||||
auto ret = ge::formats::Transpose(data, args.src_shape, args.src_data_type, perm_arg_1, trans_result_1); | auto ret = ge::formats::Transpose(data, args.src_shape, args.src_data_type, perm_arg_1, trans_result_1); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
GELOGE(ret, "Failed to Transpose from NCHW to HWCN"); | |||||
GELOGE(ret, "[Trans][Formats]Failed from NCHW to HWCN, src_shape %s, src_data_type %s", | |||||
ShapeToString(args.src_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failede to trans formats from NCHW to HWCN, src_shape %s, " | |||||
"src_data_type %s", | |||||
ShapeToString(args.src_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
return ret; | return ret; | ||||
} | } | ||||
@@ -104,7 +111,9 @@ Status TransFormatFromNchwToFzC04(const TransArgs &args, TransResult &result) { | |||||
// check size it should be same with original | // check size it should be same with original | ||||
size_t expect_size = n * c * h * w * size; // before has do check about mul | size_t expect_size = n * c * h * w * size; // before has do check about mul | ||||
if (trans_result_1.length != expect_size) { | if (trans_result_1.length != expect_size) { | ||||
GELOGE(ACL_ERROR_GE_PARAM_INVALID, "size is not match after transpose!"); | |||||
GELOGE(ACL_ERROR_GE_PARAM_INVALID, "[Check][Shape]size %zu is not match expect size %zu " | |||||
"after transpose", | |||||
trans_result_1.length, expect_size); | |||||
return ACL_ERROR_GE_PARAM_INVALID; | return ACL_ERROR_GE_PARAM_INVALID; | ||||
} | } | ||||
@@ -118,19 +127,32 @@ Status TransFormatFromNchwToFzC04(const TransArgs &args, TransResult &result) { | |||||
// data overflow check totally | // data overflow check totally | ||||
GE_IF_BOOL_EXEC(!CheckInt64MulOverflow(h_o, w_o), | GE_IF_BOOL_EXEC(!CheckInt64MulOverflow(h_o, w_o), | ||||
GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "int64 mul overflow.A[%ld], B[%ld]", h_o, w_o); | |||||
GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "[Check][Shape]Failed, " | |||||
"int64 mul overflow.A[%ld], B[%ld]", h_o, w_o); | |||||
REPORT_CALL_ERROR("E19999", "Check shape failed, int64 mul overflow.A[%ld], " | |||||
"B[%ld]", h_o, w_o); | |||||
return ACL_ERROR_GE_INTERNAL_ERROR); | return ACL_ERROR_GE_INTERNAL_ERROR); | ||||
GE_IF_BOOL_EXEC(!CheckInt64MulOverflow(n_o, c_o), | GE_IF_BOOL_EXEC(!CheckInt64MulOverflow(n_o, c_o), | ||||
GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "int64 mul overflow.A[%ld], B[%ld]", n_o, c_o); | |||||
GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "[Check][Shape]Failed, " | |||||
"int64 mul overflow.A[%ld], B[%ld]", n_o, c_o); | |||||
REPORT_CALL_ERROR("E19999", "Check shape failed, int64 mul overflow.A[%ld], " | |||||
"B[%ld]", n_o, c_o); | |||||
return ACL_ERROR_GE_INTERNAL_ERROR); | return ACL_ERROR_GE_INTERNAL_ERROR); | ||||
auto t1 = h_o * w_o; | auto t1 = h_o * w_o; | ||||
auto t2 = n_o * c_o; | auto t2 = n_o * c_o; | ||||
GE_IF_BOOL_EXEC(!CheckInt64MulOverflow(t1, t2), GELOGE(INTERNAL_ERROR, "int64 mul overflow.A[%ld], B[%ld]", t1, t2); | |||||
GE_IF_BOOL_EXEC(!CheckInt64MulOverflow(t1, t2), | |||||
GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "[Check][Shape]Failed, " | |||||
"int64 mul overflow.A[%ld], B[%ld]", t1, t2); | |||||
REPORT_CALL_ERROR("E19999", "Check shape failed, " | |||||
"int64 mul overflow.A[%ld], B[%ld]", t1, t2); | |||||
return ACL_ERROR_GE_INTERNAL_ERROR); | return ACL_ERROR_GE_INTERNAL_ERROR); | ||||
int64_t total_ele_cnt = n_o * c_o * h_o * w_o; | int64_t total_ele_cnt = n_o * c_o * h_o * w_o; | ||||
GE_IF_BOOL_EXEC(!CheckInt64MulOverflow(total_ele_cnt, size), | GE_IF_BOOL_EXEC(!CheckInt64MulOverflow(total_ele_cnt, size), | ||||
GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "int64 mul overflow.A[%ld], B[%d]", total_ele_cnt, size); | |||||
GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "[Check][Shape]Failed, " | |||||
"int64 mul overflow.A[%ld], B[%d]", total_ele_cnt, size); | |||||
REPORT_CALL_ERROR("E19999", "Check shape failed, int64 mul overflow.A[%ld], " | |||||
"B[%d]", total_ele_cnt, size); | |||||
return ACL_ERROR_GE_INTERNAL_ERROR); | return ACL_ERROR_GE_INTERNAL_ERROR); | ||||
int64_t dst_size = total_ele_cnt * size; | int64_t dst_size = total_ele_cnt * size; | ||||
if (dst_size == 0) { | if (dst_size == 0) { | ||||
@@ -140,14 +162,21 @@ Status TransFormatFromNchwToFzC04(const TransArgs &args, TransResult &result) { | |||||
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size], std::default_delete<uint8_t[]>()); | std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[dst_size], std::default_delete<uint8_t[]>()); | ||||
if (dst == nullptr) { | if (dst == nullptr) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld", | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), dst_size); | |||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to alloc the memory for dst buf %ld " | |||||
"when trans format from %s to %s", | |||||
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failed to alloc the memory for dst buf %ld " | |||||
"when trans format from %s to %s", | |||||
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
return ACL_ERROR_GE_MEMORY_ALLOCATION; | return ACL_ERROR_GE_MEMORY_ALLOCATION; | ||||
} | } | ||||
auto retMem = memset_s(dst.get(), dst_size, 0, dst_size); | auto retMem = memset_s(dst.get(), dst_size, 0, dst_size); | ||||
if (retMem != EOK) { | if (retMem != EOK) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "memst failed!"); | |||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Set][Memory]Failed, dst buf %ld, error_code %d", | |||||
dst_size, retMem); | |||||
REPORT_CALL_ERROR("E19999", "Set memory failed, dst buf %ld, error_code %d", dst_size, retMem); | |||||
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | ||||
} | } | ||||
// copy data | // copy data | ||||
@@ -159,7 +188,10 @@ Status TransFormatFromNchwToFzC04(const TransArgs &args, TransResult &result) { | |||||
for (auto k = 0; k < n; k++) { | for (auto k = 0; k < n; k++) { | ||||
ret = memcpy_s(p_d + k * stride, protectSize, p_s + k * block, block); | ret = memcpy_s(p_d + k * stride, protectSize, p_s + k * block, block); | ||||
if (ret != EOK) { | if (ret != EOK) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "memcpy_s failed!"); | |||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Set][Memcpy]Failed, block %zu, stride %zu, " | |||||
"protect_size %ld, error_code %d", block, stride, protectSize, ret); | |||||
REPORT_CALL_ERROR("E19999", "[Set][Memcpy]Failed, block %zu, stride %zu, " | |||||
"protect_size %ld, error_code %d", block, stride, protectSize, ret); | |||||
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | ||||
} | } | ||||
protectSize = protectSize - block; | protectSize = protectSize - block; | ||||
@@ -169,7 +201,8 @@ Status TransFormatFromNchwToFzC04(const TransArgs &args, TransResult &result) { | |||||
std::vector<int64_t> perm_arg_2 = {2, 0, 1, 3}; | std::vector<int64_t> perm_arg_2 = {2, 0, 1, 3}; | ||||
ret = ge::formats::Transpose(dst.get(), shape_o, args.src_data_type, perm_arg_2, result); | ret = ge::formats::Transpose(dst.get(), shape_o, args.src_data_type, perm_arg_2, result); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
GELOGE(ret, "Failed to Transpose from NCHW to HWCN"); | |||||
GELOGE(ret, "[Trans][Formats]Failed from NCHW to HWCN, error_code %u", ret); | |||||
REPORT_CALL_ERROR("E19999", "Failed to trans formats from NCHW to HWCN, error_code %u", ret); | |||||
return ret; | return ret; | ||||
} | } | ||||
@@ -190,7 +223,8 @@ Status PaddingNC(const TransArgs &args, TransArgs &args_tmp, std::shared_ptr<uin | |||||
auto w = src_shape.at(kNchwW); | auto w = src_shape.at(kNchwW); | ||||
if (c > kMaxDimsNumC) { | if (c > kMaxDimsNumC) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Invalie dim c num[%lu].It should be in (0,4]", c); | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Invalid dim c num[%lu]. " | |||||
"It should be in (0,4]", c); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
@@ -205,20 +239,33 @@ Status PaddingNC(const TransArgs &args, TransArgs &args_tmp, std::shared_ptr<uin | |||||
// data overflow check | // data overflow check | ||||
GE_IF_BOOL_EXEC(!CheckInt64MulOverflow(h_o, w_o), | GE_IF_BOOL_EXEC(!CheckInt64MulOverflow(h_o, w_o), | ||||
GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "int64 mul overflow.A[%ld], B[%ld]", h_o, w_o); | |||||
GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "[Check][Shape]Failed, " | |||||
"int64 mul overflow.A[%ld], B[%ld]", h_o, w_o); | |||||
REPORT_CALL_ERROR("E19999", "Check shape failed, int64 mul overflow.A[%ld], " | |||||
"B[%ld]", h_o, w_o); | |||||
return ACL_ERROR_GE_INTERNAL_ERROR); | return ACL_ERROR_GE_INTERNAL_ERROR); | ||||
GE_IF_BOOL_EXEC(!CheckInt64MulOverflow(n_o, c_o), | GE_IF_BOOL_EXEC(!CheckInt64MulOverflow(n_o, c_o), | ||||
GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "int64 mul overflow.A[%ld], B[%ld]", n_o, c_o); | |||||
GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "[Check][Shape]Failed, " | |||||
"int64 mul overflow.A[%ld], B[%ld]", n_o, c_o); | |||||
REPORT_CALL_ERROR("E19999", "Check shape failed, int64 mul overflow.A[%ld], " | |||||
"B[%ld]", n_o, c_o); | |||||
return ACL_ERROR_GE_INTERNAL_ERROR); | return ACL_ERROR_GE_INTERNAL_ERROR); | ||||
auto t1 = h_o * w_o; | auto t1 = h_o * w_o; | ||||
auto t2 = n_o * c_o; | auto t2 = n_o * c_o; | ||||
GE_IF_BOOL_EXEC(!CheckInt64MulOverflow(t1, t2), GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "int64 mul overflow.A[%ld], B[%ld]", t1, t2); | |||||
GE_IF_BOOL_EXEC(!CheckInt64MulOverflow(t1, t2), | |||||
GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "[Check][Shape]Failed, " | |||||
"int64 mul overflow.A[%ld], B[%ld]", t1, t2); | |||||
REPORT_CALL_ERROR("E19999", "Check shape failed, int64 mul overflow.A[%ld], " | |||||
"B[%ld]", t1, t2); | |||||
return ACL_ERROR_GE_INTERNAL_ERROR); | return ACL_ERROR_GE_INTERNAL_ERROR); | ||||
int64_t total_ele_cnt = n_o * c_o * h_o * w_o; | int64_t total_ele_cnt = n_o * c_o * h_o * w_o; | ||||
int size = GetSizeByDataType(args.src_data_type); | int size = GetSizeByDataType(args.src_data_type); | ||||
GE_IF_BOOL_EXEC(!CheckInt64MulOverflow(total_ele_cnt, size), | GE_IF_BOOL_EXEC(!CheckInt64MulOverflow(total_ele_cnt, size), | ||||
GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "int64 mul overflow.A[%ld], B[%d]", total_ele_cnt, size); | |||||
GELOGE(ACL_ERROR_GE_INTERNAL_ERROR, "[Check][Shape]Failed, " | |||||
"int64 mul overflow.A[%ld], B[%d]", total_ele_cnt, size); | |||||
REPORT_CALL_ERROR("E19999", "Check shape failed, int64 mul overflow.A[%ld], " | |||||
"B[%d]", total_ele_cnt, size); | |||||
return ACL_ERROR_GE_INTERNAL_ERROR); | return ACL_ERROR_GE_INTERNAL_ERROR); | ||||
int64_t dst_size = total_ele_cnt * size; | int64_t dst_size = total_ele_cnt * size; | ||||
@@ -228,14 +275,21 @@ Status PaddingNC(const TransArgs &args, TransArgs &args_tmp, std::shared_ptr<uin | |||||
dst.reset(new (std::nothrow) uint8_t[dst_size], std::default_delete<uint8_t[]>()); | dst.reset(new (std::nothrow) uint8_t[dst_size], std::default_delete<uint8_t[]>()); | ||||
if (dst == nullptr) { | if (dst == nullptr) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld", | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), dst_size); | |||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to alloc the memory for dst buf %ld when " | |||||
"trans format from %s to %s", | |||||
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failed to alloc the memory for dst buf %ld when " | |||||
"trans format from %s to %s", | |||||
dst_size, TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
return ACL_ERROR_GE_MEMORY_ALLOCATION; | return ACL_ERROR_GE_MEMORY_ALLOCATION; | ||||
} | } | ||||
auto ret = memset_s(dst.get(), dst_size, 0, dst_size); | auto ret = memset_s(dst.get(), dst_size, 0, dst_size); | ||||
if (ret != EOK) { | if (ret != EOK) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "memst failed!"); | |||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Set][Memory]Failed, dst buf %ld, error_code %d", | |||||
dst_size, ret); | |||||
REPORT_CALL_ERROR("E19999", "Set memory failed, dst buf %ld, error_code %d", dst_size, ret); | |||||
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | ||||
} | } | ||||
@@ -249,7 +303,10 @@ Status PaddingNC(const TransArgs &args, TransArgs &args_tmp, std::shared_ptr<uin | |||||
ret = memcpy_s(p_d + (i * c_o * h_o * w_o + j * h_o * w_o) * size, protectSize, | ret = memcpy_s(p_d + (i * c_o * h_o * w_o + j * h_o * w_o) * size, protectSize, | ||||
p_s + (i * c * h * w + j * h * w) * size, block); | p_s + (i * c * h * w + j * h * w) * size, block); | ||||
if (ret != EOK) { | if (ret != EOK) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "memcpy_s failed!"); | |||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, "[Set][Memcpy]Failed, block %zu, " | |||||
"protect_size %ld, error_code %d", block, protectSize, ret); | |||||
REPORT_CALL_ERROR("E19999", "[Set][Memcpy]Failed, block %zu, protect_size %ld, " | |||||
"error_code %d", block, protectSize, ret); | |||||
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | ||||
} | } | ||||
protectSize = protectSize - block; | protectSize = protectSize - block; | ||||
@@ -270,12 +327,14 @@ Status FormatTransferNchwToFZC04::TransFormat(const TransArgs &args, TransResult | |||||
std::shared_ptr<uint8_t> dst = nullptr; | std::shared_ptr<uint8_t> dst = nullptr; | ||||
auto ret = PaddingNC(args, args_tmp, dst); | auto ret = PaddingNC(args, args_tmp, dst); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
GELOGE(ret, "Padding in NC axis failed!"); | |||||
GELOGE(ret, "[Padding][NCAxis]Failed, error_code %u", ret); | |||||
REPORT_CALL_ERROR("E19999", "Padding in NC axis failed, error_code %u", ret); | |||||
return ret; | return ret; | ||||
} | } | ||||
std::vector<int64_t> expect_shape; | std::vector<int64_t> expect_shape; | ||||
ret = TransShape(args_tmp.src_format, args_tmp.src_shape, args_tmp.src_data_type, args_tmp.dst_format, expect_shape); | |||||
ret = TransShape(args_tmp.src_format, args_tmp.src_shape, args_tmp.src_data_type, | |||||
args_tmp.dst_format, expect_shape); | |||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
return ret; | return ret; | ||||
} | } | ||||
@@ -32,12 +32,17 @@ Status TransShapeNchwToNc1hwc0(const std::vector<int64_t> &src_shape, DataType d | |||||
std::vector<int64_t> &dst_shape) { | std::vector<int64_t> &dst_shape) { | ||||
int64_t c0 = GetCubeSizeByDataType(data_type); | int64_t c0 = GetCubeSizeByDataType(data_type); | ||||
if (c0 <= 0) { | if (c0 <= 0) { | ||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "Failed to get cube size, the data type is invalid"); | |||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "[Get][Cube]Failed, the data type %s is invalid", | |||||
TypeUtils::DataTypeToSerialString(data_type).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failed to get cube size, the data type %s is invalid", | |||||
TypeUtils::DataTypeToSerialString(data_type).c_str()); | |||||
return ACL_ERROR_GE_DATATYPE_INVALID; | return ACL_ERROR_GE_DATATYPE_INVALID; | ||||
} | } | ||||
if (!CheckShapeValid(src_shape, kNchwDimsNum)) { | if (!CheckShapeValid(src_shape, kNchwDimsNum)) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check src shape %s", | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, src shape %s", | |||||
ShapeToString(src_shape).c_str()); | ShapeToString(src_shape).c_str()); | ||||
REPORT_CALL_ERROR("E19999", "Src shape %s check invalid", | |||||
ShapeToString(src_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
dst_shape.clear(); | dst_shape.clear(); | ||||
@@ -47,8 +52,10 @@ Status TransShapeNchwToNc1hwc0(const std::vector<int64_t> &src_shape, DataType d | |||||
dst_shape.push_back(src_shape.at(kNchwW)); | dst_shape.push_back(src_shape.at(kNchwW)); | ||||
dst_shape.push_back(c0); | dst_shape.push_back(c0); | ||||
if (!CheckShapeValid(dst_shape, kNc1hwc0DimsNum)) { | if (!CheckShapeValid(dst_shape, kNc1hwc0DimsNum)) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check dst shape %s", | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, dst shape %s", | |||||
ShapeToString(dst_shape).c_str()); | ShapeToString(dst_shape).c_str()); | ||||
REPORT_CALL_ERROR("E19999", "Dst shape %s check invalid", | |||||
ShapeToString(dst_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
return SUCCESS; | return SUCCESS; | ||||
@@ -69,10 +76,17 @@ Status CheckArgsForNchwToNc1hwc0(const TransArgs &args) { | |||||
} | } | ||||
if (expect_5d_shape != args.dst_shape) { | if (expect_5d_shape != args.dst_shape) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, | GELOGE(ACL_ERROR_GE_SHAPE_INVALID, | ||||
"Failed to trans format, the src and dst shape are not compatible. data" | |||||
" type %s, src shape %s, dst shape %s, expect dst shape %s", | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), ShapeToString(args.src_shape).c_str(), | |||||
"[Trans][Format]Failed, the src and dst shape are not compatible. " | |||||
"data type %s, src shape %s, dst shape %s, expect dst shape %s", | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | |||||
ShapeToString(args.src_shape).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), ShapeToString(expect_5d_shape).c_str()); | ShapeToString(args.dst_shape).c_str(), ShapeToString(expect_5d_shape).c_str()); | ||||
REPORT_INNER_ERROR("E19999", "Failed to trans formats, the src and dst shape are not " | |||||
"compatible. data type %s, src shape %s, dst shape %s, expect dst shape %s", | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | |||||
ShapeToString(args.src_shape).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), | |||||
ShapeToString(expect_5d_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
@@ -83,10 +97,16 @@ Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const in | |||||
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>()); | std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>()); | ||||
if (dst == nullptr) { | if (dst == nullptr) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, | GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, | ||||
"Failed to trans format from %s to %s, can not alloc the memory for" | |||||
" dst buf %ld, shape %s", | |||||
"[Allcoate][Memory]Failed to alloc the memory for dst buf %ld, " | |||||
"shape %s when trans format from %s to %s", | |||||
total_size, ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | TypeUtils::FormatToSerialString(args.src_format).c_str(), | ||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), total_size, ShapeToString(args.dst_shape).c_str()); | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failed to alloc the memory for dst buf %ld, " | |||||
"shape %s when trans format from %s to %s", | |||||
total_size, ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
return ACL_ERROR_GE_MEMORY_ALLOCATION; | return ACL_ERROR_GE_MEMORY_ALLOCATION; | ||||
} | } | ||||
@@ -97,7 +117,10 @@ Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const in | |||||
int64_t c0 = GetCubeSizeByDataType(args.src_data_type); | int64_t c0 = GetCubeSizeByDataType(args.src_data_type); | ||||
if (c0 <= 0) { | if (c0 <= 0) { | ||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "The c0 is invalid %ld", c0); | |||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "[Check][Shape]The c0 is invalid %ld, data_type %s", | |||||
c0, TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Check shape failed, the c0 is invalid %ld, data_type %s", | |||||
c0, TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
return ACL_ERROR_GE_DATATYPE_INVALID; | return ACL_ERROR_GE_DATATYPE_INVALID; | ||||
} | } | ||||
int64_t c1 = (c - 1) / c0 + 1; | int64_t c1 = (c - 1) / c0 + 1; | ||||
@@ -130,9 +153,13 @@ Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const in | |||||
static_cast<size_t>(size)); | static_cast<size_t>(size)); | ||||
if (ret != EOK) { | if (ret != EOK) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, | GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, | ||||
"Failed to copy data from NCHW[%ld] offset %ld to " | |||||
"NC1HWC0[%ld, %ld, %ld, %ld, %ld] offset %ld, err-code %d", | |||||
"[Operate][Memory]Failed to copy data from NCHW[%ld] offset %ld " | |||||
"to NC1HWC0[%ld, %ld, %ld, %ld, %ld] offset %ld, err-code %d", | |||||
srcIdx, src_offset, n_idx, c1_idx, h_idx, w_idx, c0_idx, dst_offset, ret); | srcIdx, src_offset, n_idx, c1_idx, h_idx, w_idx, c0_idx, dst_offset, ret); | ||||
REPORT_CALL_ERROR("E19999", "Failed to copy data from NCHW[%ld] offset %ld " | |||||
"to NC1HWC0[%ld, %ld, %ld, %ld, %ld] offset %ld, err-code %d", | |||||
srcIdx, src_offset, n_idx, c1_idx, h_idx, w_idx, c0_idx, | |||||
dst_offset, ret); | |||||
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | ||||
} | } | ||||
} else { | } else { | ||||
@@ -140,9 +167,12 @@ Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const in | |||||
memset_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), 0, static_cast<size_t>(size)); | memset_s(dst.get() + dst_offset, static_cast<size_t>(protected_size), 0, static_cast<size_t>(size)); | ||||
if (ret != EOK) { | if (ret != EOK) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, | GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, | ||||
"Failed to set to 0 to " | |||||
"NC1HWC0[%ld, %ld, %ld, %ld, %ld] offset %ld, err-code %d", | |||||
"[Operate][Memory]Failed to set to 0 to NC1HWC0[%ld, %ld, %ld, %ld, %ld] " | |||||
"offset %ld, err-code %d", | |||||
n_idx, c1_idx, h_idx, w_idx, c0_idx, dst_offset, ret); | n_idx, c1_idx, h_idx, w_idx, c0_idx, dst_offset, ret); | ||||
REPORT_CALL_ERROR("E19999", "Failed to set to 0 to " | |||||
"NC1HWC0[%ld, %ld, %ld, %ld, %ld] offset %ld, err-code %d", | |||||
n_idx, c1_idx, h_idx, w_idx, c0_idx, dst_offset, ret); | |||||
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | ||||
} | } | ||||
} | } | ||||
@@ -173,8 +203,12 @@ Status FormatTransferNchwNc1hwc0::TransFormat(const TransArgs &args, TransResult | |||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Get %ld total size from dst shape %s, src shape %s", total_size, | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Get][Shape]Failed, total size %ld from dst shape %s, " | |||||
"src shape %s", total_size, | |||||
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str()); | ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str()); | ||||
REPORT_CALL_ERROR("E19999", "Failed to get total size %ld from dst shape %s, src shape %s", | |||||
total_size, | |||||
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
GELOGD( | GELOGD( | ||||
@@ -184,9 +218,16 @@ Status FormatTransferNchwNc1hwc0::TransFormat(const TransArgs &args, TransResult | |||||
ShapeToString(args.dst_shape).c_str(), total_size); | ShapeToString(args.dst_shape).c_str(), total_size); | ||||
ret = GetDstDataAfterTrans(args, result, size, total_size); | ret = GetDstDataAfterTrans(args, result, size, total_size); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
GELOGE(ret, "Failed to get data after trans, src shape %s, data type %s, dst shape %s, memory size %ld", | |||||
ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), total_size); | |||||
GELOGE(ret, "[Get][Data]Failed, after trans, src shape %s, data type %s, " | |||||
"dst shape %s, memory size %ld, error_code %u", | |||||
ShapeToString(args.src_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), total_size, ret); | |||||
REPORT_CALL_ERROR("E19999", "Failed to get data after trans, src shape %s, data type %s, " | |||||
"dst shape %s, memory size %ld, error_code %u", | |||||
ShapeToString(args.src_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), total_size, ret); | |||||
return ret; | return ret; | ||||
} | } | ||||
return SUCCESS; | return SUCCESS; | ||||
@@ -34,7 +34,10 @@ Status TransShapeNhwcToNc1hwc0(const std::vector<int64_t> &src_shape, DataType d | |||||
std::vector<int64_t> &dst_shape) { | std::vector<int64_t> &dst_shape) { | ||||
int64_t c0 = GetCubeSizeByDataType(data_type); | int64_t c0 = GetCubeSizeByDataType(data_type); | ||||
if (c0 <= 0) { | if (c0 <= 0) { | ||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "Failed to get cube size, the data type is invalid"); | |||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "[Get][Cube]Failed, the data type %s is invalid", | |||||
TypeUtils::DataTypeToSerialString(data_type).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failed to get cube size, the data type %s is invalid", | |||||
TypeUtils::DataTypeToSerialString(data_type).c_str()); | |||||
return ACL_ERROR_GE_DATATYPE_INVALID; | return ACL_ERROR_GE_DATATYPE_INVALID; | ||||
} | } | ||||
dst_shape.clear(); | dst_shape.clear(); | ||||
@@ -44,8 +47,10 @@ Status TransShapeNhwcToNc1hwc0(const std::vector<int64_t> &src_shape, DataType d | |||||
dst_shape.push_back(src_shape.at(kNhwcW)); | dst_shape.push_back(src_shape.at(kNhwcW)); | ||||
dst_shape.push_back(c0); | dst_shape.push_back(c0); | ||||
if (!CheckShapeValid(dst_shape, kNc1hwc0DimsNum)) { | if (!CheckShapeValid(dst_shape, kNc1hwc0DimsNum)) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check dst shape %s", | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, dst shape %s", | |||||
ShapeToString(dst_shape).c_str()); | ShapeToString(dst_shape).c_str()); | ||||
REPORT_CALL_ERROR("E19999", "Dst shape %s check invalid", | |||||
ShapeToString(dst_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
return SUCCESS; | return SUCCESS; | ||||
@@ -60,16 +65,25 @@ Status CheckArgsForNhwcToNc1hwc0(const TransArgs &args) { | |||||
return ACL_ERROR_GE_FORMAT_INVALID; | return ACL_ERROR_GE_FORMAT_INVALID; | ||||
} | } | ||||
if (!CheckDataTypeSupported(args.src_data_type)) { | if (!CheckDataTypeSupported(args.src_data_type)) { | ||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "Failed to trans shape from NHWC to NC1HWC0, invalid data type %s", | |||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "[Check][DataType]Failed from NHWC to NC1HWC0, " | |||||
"invalid data type %s", | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | ||||
REPORT_INNER_ERROR("E19999", "Failed to trans shape from NHWC to NC1HWC0, invalid data type %s", | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str()); | |||||
return ACL_ERROR_GE_DATATYPE_INVALID; | return ACL_ERROR_GE_DATATYPE_INVALID; | ||||
} | } | ||||
if (!CheckShapeValid(args.src_shape, kNhwcDimsNum)) { | if (!CheckShapeValid(args.src_shape, kNhwcDimsNum)) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check src shape %s", ShapeToString(args.src_shape).c_str()); | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, src shape %s", | |||||
ShapeToString(args.src_shape).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Src shape %s check invalid", | |||||
ShapeToString(args.src_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
if (!CheckShapeValid(args.dst_shape, kNc1hwc0DimsNum)) { | if (!CheckShapeValid(args.dst_shape, kNc1hwc0DimsNum)) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check dst shape %s", ShapeToString(args.dst_shape).c_str()); | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, dst shape %s", | |||||
ShapeToString(args.dst_shape).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Dst shape %s check valid", | |||||
ShapeToString(args.dst_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
std::vector<int64_t> expect_dst_shape; | std::vector<int64_t> expect_dst_shape; | ||||
@@ -79,10 +93,14 @@ Status CheckArgsForNhwcToNc1hwc0(const TransArgs &args) { | |||||
} | } | ||||
if (args.dst_shape != expect_dst_shape) { | if (args.dst_shape != expect_dst_shape) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, | GELOGE(ACL_ERROR_GE_SHAPE_INVALID, | ||||
"Failed to trans format, the src and dst shape are not compatible. src shape %s, dst shape %s, " | |||||
"[Trans][Format]Failed , the src shape %s and dst shape %s are not compatible. " | |||||
"expect dst shape %s", | "expect dst shape %s", | ||||
ShapeToString(args.src_shape).c_str(), ShapeToString(args.dst_shape).c_str(), | ShapeToString(args.src_shape).c_str(), ShapeToString(args.dst_shape).c_str(), | ||||
ShapeToString(expect_dst_shape).c_str()); | ShapeToString(expect_dst_shape).c_str()); | ||||
REPORT_CALL_ERROR("E19999", "Failed to trans format, the src shape %s and " | |||||
"dst shape %s are not compatible. expect dst shape %s", | |||||
ShapeToString(args.src_shape).c_str(), ShapeToString(args.dst_shape).c_str(), | |||||
ShapeToString(expect_dst_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
@@ -92,9 +110,16 @@ Status CheckArgsForNhwcToNc1hwc0(const TransArgs &args) { | |||||
Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const int size, const int64_t total_size) { | Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const int size, const int64_t total_size) { | ||||
std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>()); | std::shared_ptr<uint8_t> dst(new (std::nothrow) uint8_t[total_size], std::default_delete<uint8_t[]>()); | ||||
if (dst == nullptr) { | if (dst == nullptr) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Failed to trans format from %s to %s, can not alloc the memory for dst buf %ld, shape %s", | |||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "[Allcoate][Memory]Failed, memory for dst buf %ld, " | |||||
"shape %s when trans format from %s to %s", | |||||
total_size, ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | TypeUtils::FormatToSerialString(args.src_format).c_str(), | ||||
TypeUtils::FormatToSerialString(args.dst_format).c_str(), total_size, ShapeToString(args.dst_shape).c_str()); | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
REPORT_CALL_ERROR("E19999", "Failed to alloc the memory for dst buf %ld, " | |||||
"shape %s when trans format from %s to %s", | |||||
total_size, ShapeToString(args.dst_shape).c_str(), | |||||
TypeUtils::FormatToSerialString(args.src_format).c_str(), | |||||
TypeUtils::FormatToSerialString(args.dst_format).c_str()); | |||||
return ACL_ERROR_GE_MEMORY_ALLOCATION; | return ACL_ERROR_GE_MEMORY_ALLOCATION; | ||||
} | } | ||||
@@ -132,17 +157,27 @@ Status GetDstDataAfterTrans(const TransArgs &args, TransResult &result, const in | |||||
auto ret = memcpy_s(dst.get() + dst_offset, protected_size, args.data + src_offset, size); | auto ret = memcpy_s(dst.get() + dst_offset, protected_size, args.data + src_offset, size); | ||||
if (ret != EOK) { | if (ret != EOK) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, | GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, | ||||
"Failed to copy data from NHWC[%ld, %ld, %ld, %ld] offset %ld to " | |||||
"NC1HWC0[%ld, %ld, %ld, %ld, %ld] offset %ld err-code %d", | |||||
n_idx, h_idx, w_idx, c_idx, src_offset, n_idx, c1_idx, h_idx, w_idx, c0_idx, dst_offset, ret); | |||||
"[Operate][Memory]Failed to copy data from NHWC[%ld, %ld, %ld, %ld] " | |||||
"offset %ld to NC1HWC0[%ld, %ld, %ld, %ld, %ld] offset %ld err-code %d", | |||||
n_idx, h_idx, w_idx, c_idx, src_offset, | |||||
n_idx, c1_idx, h_idx, w_idx, c0_idx, dst_offset, ret); | |||||
REPORT_CALL_ERROR("E19999", "Failed to copy data from NHWC[%ld, %ld, %ld, %ld] " | |||||
"offset %ld to " | |||||
"NC1HWC0[%ld, %ld, %ld, %ld, %ld] offset %ld err-code %d", | |||||
n_idx, h_idx, w_idx, c_idx, src_offset, | |||||
n_idx, c1_idx, h_idx, w_idx, c0_idx, dst_offset, ret); | |||||
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | ||||
} | } | ||||
} else { | } else { | ||||
auto ret = memset_s(dst.get() + dst_offset, protected_size, 0, size); | auto ret = memset_s(dst.get() + dst_offset, protected_size, 0, size); | ||||
if (ret != EOK) { | if (ret != EOK) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, | GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, | ||||
"Failed to set 0 to NC1HWC0[%ld, %ld, %ld, %ld, %ld] offset %ld base err-code %d", n_idx, c1_idx, | |||||
h_idx, w_idx, c0_idx, dst_offset, ret); | |||||
"[Operate][Memory]Failed to set 0 to " | |||||
"NC1HWC0[%ld, %ld, %ld, %ld, %ld] offset %ld base err-code %d", | |||||
n_idx, c1_idx, h_idx, w_idx, c0_idx, dst_offset, ret); | |||||
REPORT_CALL_ERROR("E19999", "Failed to set 0 to " | |||||
"NC1HWC0[%ld, %ld, %ld, %ld, %ld] offset %ld base err-code %d", | |||||
n_idx, c1_idx, h_idx, w_idx, c0_idx, dst_offset, ret); | |||||
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | ||||
} | } | ||||
} | } | ||||
@@ -171,8 +206,12 @@ Status FormatTransferNhwcNc1hwc0::TransFormat(const TransArgs &args, TransResult | |||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "Get %ld total size from dst shape %s, src shape %s", total_size, | |||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "[Get][ShapeSize]Failed, " | |||||
"total size %ld from dst shape %s, src shape %s", total_size, | |||||
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str()); | ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str()); | ||||
REPORT_CALL_ERROR("E19999", "[Get][Shape]Failed, total size %ld from " | |||||
"dst shape %s, src shape %s", total_size, | |||||
ShapeToString(args.dst_shape).c_str(), ShapeToString(args.src_shape).c_str()); | |||||
return ACL_ERROR_GE_DATATYPE_INVALID; | return ACL_ERROR_GE_DATATYPE_INVALID; | ||||
} | } | ||||
GELOGD("Begin to trans format from NHWC to NC1HWC0, src shape %s, data type %s, dst shape %s, memory size %ld", | GELOGD("Begin to trans format from NHWC to NC1HWC0, src shape %s, data type %s, dst shape %s, memory size %ld", | ||||
@@ -181,9 +220,16 @@ Status FormatTransferNhwcNc1hwc0::TransFormat(const TransArgs &args, TransResult | |||||
ret = GetDstDataAfterTrans(args, result, size, total_size); | ret = GetDstDataAfterTrans(args, result, size, total_size); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
GELOGE(ret, "Failed to get data after trans, src shape %s, data type %s, dst shape %s, memory size %ld", | |||||
ShapeToString(args.src_shape).c_str(), TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), total_size); | |||||
GELOGE(ret, "[Get][Data]Failed, after trans, src shape %s, data type %s, " | |||||
"dst shape %s, memory size %ld, error_code %u", | |||||
ShapeToString(args.src_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), total_size, ret); | |||||
REPORT_CALL_ERROR("E19999", "Failed to get data after trans, src shape %s, data type %s, " | |||||
"dst shape %s, memory size %ld, error_code %u", | |||||
ShapeToString(args.src_shape).c_str(), | |||||
TypeUtils::DataTypeToSerialString(args.src_data_type).c_str(), | |||||
ShapeToString(args.dst_shape).c_str(), total_size, ret); | |||||
return ret; | return ret; | ||||
} | } | ||||
return SUCCESS; | return SUCCESS; | ||||
@@ -193,8 +239,10 @@ Status FormatTransferNhwcNc1hwc0::TransShape(Format src_format, const std::vecto | |||||
DataType data_type, Format dst_format, std::vector<int64_t> &dst_shape) { | DataType data_type, Format dst_format, std::vector<int64_t> &dst_shape) { | ||||
if (src_format == FORMAT_NHWC && CheckDataTypeSupported(data_type)) { | if (src_format == FORMAT_NHWC && CheckDataTypeSupported(data_type)) { | ||||
if (!CheckShapeValid(src_shape, kNhwcDimsNum)) { | if (!CheckShapeValid(src_shape, kNhwcDimsNum)) { | ||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "Failed to check src shape %s", | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Check][Shape]Value is invalid, src shape %s", | |||||
ShapeToString(src_shape).c_str()); | ShapeToString(src_shape).c_str()); | ||||
REPORT_CALL_ERROR("E19999", "Src shape %s check invalid", | |||||
ShapeToString(src_shape).c_str()); | |||||
return ACL_ERROR_GE_SHAPE_INVALID; | return ACL_ERROR_GE_SHAPE_INVALID; | ||||
} | } | ||||
return TransShapeNhwcToNc1hwc0(src_shape, data_type, dst_shape); | return TransShapeNhwcToNc1hwc0(src_shape, data_type, dst_shape); | ||||
@@ -50,21 +50,21 @@ std::map<Format, std::map<Format, std::vector<int64_t>>> perm_args{ | |||||
bool IsShapeArgValid(const std::vector<int64_t> &src_shape, const std::vector<int64_t> &perm_arg) { | bool IsShapeArgValid(const std::vector<int64_t> &src_shape, const std::vector<int64_t> &perm_arg) { | ||||
if (src_shape.empty()) { | if (src_shape.empty()) { | ||||
std::string error = "Failed to transpose, empty src shape"; | std::string error = "Failed to transpose, empty src shape"; | ||||
GE_ERRORLOG_AND_ERRORMSG(PARAM_INVALID, error.c_str()); | |||||
GELOGE(PARAM_INVALID, "Failed to transpose, empty src shape"); | |||||
GE_ERRORLOG_AND_ERRORMSG(ACL_ERROR_GE_SHAPE_INVALID, error.c_str()); | |||||
GELOGE(ACL_ERROR_GE_SHAPE_INVALID, "[Trans][Shape]Failed, empty src shape"); | |||||
return false; | return false; | ||||
} | } | ||||
for (auto dim : src_shape) { | for (auto dim : src_shape) { | ||||
if (dim < 0) { | if (dim < 0) { | ||||
std::string error = "Failed to transpose, negative dim in src shape " + FmtToStr(ShapeToString(src_shape)); | std::string error = "Failed to transpose, negative dim in src shape " + FmtToStr(ShapeToString(src_shape)); | ||||
GE_ERRORLOG_AND_ERRORMSG(PARAM_INVALID, error.c_str()); | |||||
GE_ERRORLOG_AND_ERRORMSG(ACL_ERROR_GE_SHAPE_INVALID, error.c_str()); | |||||
return false; | return false; | ||||
} | } | ||||
} | } | ||||
if (perm_arg.size() != src_shape.size()) { | if (perm_arg.size() != src_shape.size()) { | ||||
std::string error = "Failed to transpose, the size of src shape" + FmtToStr(src_shape.size()) + | std::string error = "Failed to transpose, the size of src shape" + FmtToStr(src_shape.size()) + | ||||
" and perm arg" + FmtToStr(perm_arg.size()) + " are different"; | " and perm arg" + FmtToStr(perm_arg.size()) + " are different"; | ||||
GE_ERRORLOG_AND_ERRORMSG(PARAM_INVALID, error.c_str()); | |||||
GE_ERRORLOG_AND_ERRORMSG(ACL_ERROR_GE_SHAPE_INVALID, error.c_str()); | |||||
return false; | return false; | ||||
} | } | ||||
@@ -73,7 +73,7 @@ bool IsShapeArgValid(const std::vector<int64_t> &src_shape, const std::vector<in | |||||
if (perm < 0 || static_cast<size_t>(perm) >= perm_arg.size() || ++exists[perm] > 1) { | if (perm < 0 || static_cast<size_t>(perm) >= perm_arg.size() || ++exists[perm] > 1) { | ||||
std::string error = "Failed to transpose, duplicated perm arg " + FmtToStr(perm) + | std::string error = "Failed to transpose, duplicated perm arg " + FmtToStr(perm) + | ||||
", perm arg " + FmtToStr(JoinToString(perm_arg)); | ", perm arg " + FmtToStr(JoinToString(perm_arg)); | ||||
GE_ERRORLOG_AND_ERRORMSG(PARAM_INVALID, error.c_str()); | |||||
GE_ERRORLOG_AND_ERRORMSG(ACL_ERROR_GE_PARAM_INVALID, error.c_str()); | |||||
return false; | return false; | ||||
} | } | ||||
} | } | ||||
@@ -82,12 +82,14 @@ bool IsShapeArgValid(const std::vector<int64_t> &src_shape, const std::vector<in | |||||
bool IsTransposeArgValid(const uint8_t *src, const std::vector<int64_t> &src_shape, DataType src_data_type, | bool IsTransposeArgValid(const uint8_t *src, const std::vector<int64_t> &src_shape, DataType src_data_type, | ||||
const std::vector<int64_t> &perm_arg) { | const std::vector<int64_t> &perm_arg) { | ||||
if (src == nullptr) { | if (src == nullptr) { | ||||
GELOGE(PARAM_INVALID, "Failed to transpose, the src is null"); | |||||
GELOGE(ACL_ERROR_GE_PARAM_INVALID, "[Trans][Param]Failed, the src is null"); | |||||
return false; | return false; | ||||
} | } | ||||
if (GetSizeByDataType(src_data_type) < 0) { | if (GetSizeByDataType(src_data_type) < 0) { | ||||
GELOGE(UNSUPPORTED, "Failed to transpose, the data type %s is not support", | |||||
GELOGE(ACL_ERROR_GE_DATATYPE_INVALID, "[Trans][Param]Failed, the data type %s is not support", | |||||
TypeUtils::DataTypeToSerialString(src_data_type).c_str()); | TypeUtils::DataTypeToSerialString(src_data_type).c_str()); | ||||
REPORT_CALL_ERROR("E19999", "Failed to transpose, the data type %s is not support", | |||||
TypeUtils::DataTypeToSerialString(src_data_type).c_str()); | |||||
return false; | return false; | ||||
} | } | ||||
return IsShapeArgValid(src_shape, perm_arg); | return IsShapeArgValid(src_shape, perm_arg); | ||||
@@ -173,10 +175,15 @@ Status Transpose(const uint8_t *src, const std::vector<int64_t> &src_shape, Data | |||||
static_cast<size_t>(data_size)); | static_cast<size_t>(data_size)); | ||||
if (ret != EOK) { | if (ret != EOK) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, | GELOGE(ACL_ERROR_GE_MEMORY_OPERATE_FAILED, | ||||
"Failed to transpose, src shape %s, perm arg %s, dst shape %s, " | |||||
"[Operate][Memory]Failed to transpose, src shape %s, perm arg %s, dst shape %s, " | |||||
"failed to write to dst offset %ld, current dim offset %s", | "failed to write to dst offset %ld, current dim offset %s", | ||||
ShapeToString(src_shape).c_str(), ShapeToString(perm_arg).c_str(), ShapeToString(dst_shape).c_str(), | ShapeToString(src_shape).c_str(), ShapeToString(perm_arg).c_str(), ShapeToString(dst_shape).c_str(), | ||||
dst_offset_bytes, ShapeToString(dst_indexes).c_str()); | dst_offset_bytes, ShapeToString(dst_indexes).c_str()); | ||||
REPORT_CALL_ERROR("E19999", "Failed to transpose, src shape %s, perm arg %s, dst shape %s, " | |||||
"failed to write to dst offset %ld, current dim offset %s", | |||||
ShapeToString(src_shape).c_str(), ShapeToString(perm_arg).c_str(), | |||||
ShapeToString(dst_shape).c_str(), | |||||
dst_offset_bytes, ShapeToString(dst_indexes).c_str()); | |||||
return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | return ACL_ERROR_GE_MEMORY_OPERATE_FAILED; | ||||
} | } | ||||
AddOne(dst_shape, dst_indexes); | AddOne(dst_shape, dst_indexes); | ||||
@@ -44,7 +44,12 @@ GE_FUNC_DEV_VISIBILITY GE_FUNC_HOST_VISIBILITY Status TransFormat(const TransArg | |||||
auto src_shape_size = GetItemNumByShape(args.src_shape); | auto src_shape_size = GetItemNumByShape(args.src_shape); | ||||
if (args.data == nullptr && src_shape_size != 0) { | if (args.data == nullptr && src_shape_size != 0) { | ||||
GELOGE(ACL_ERROR_GE_PARAM_INVALID, "Invalid input null data"); | |||||
GELOGE(ACL_ERROR_GE_PARAM_INVALID, "[Check][Shape]Failed, input data is null " | |||||
"or shape size not euqal to 0, src_shape %s", | |||||
ShapeToString(args.src_shape).c_str()); | |||||
REPORT_CALL_ERROR("E19999","Failed to check shape, input data is null " | |||||
"or shape size not equal to 0, src_shape %s", | |||||
ShapeToString(args.src_shape).c_str()); | |||||
return ACL_ERROR_GE_PARAM_INVALID; | return ACL_ERROR_GE_PARAM_INVALID; | ||||
} | } | ||||
@@ -82,7 +87,8 @@ GE_FUNC_DEV_VISIBILITY GE_FUNC_HOST_VISIBILITY Status TransDataType(const CastAr | |||||
} | } | ||||
if (args.data == nullptr && args.src_data_size != 0) { | if (args.data == nullptr && args.src_data_size != 0) { | ||||
GELOGE(ACL_ERROR_GE_PARAM_INVALID, "Invalid input null data"); | |||||
GELOGE(ACL_ERROR_GE_PARAM_INVALID, "[Check][Param]Failed, input data is null " | |||||
"or data size not equal to 0, src_data_size %ld", args.src_data_size); | |||||
return ACL_ERROR_GE_PARAM_INVALID; | return ACL_ERROR_GE_PARAM_INVALID; | ||||
} | } | ||||
@@ -87,12 +87,13 @@ Status ModelHelper::SaveSizeToModelDef(const GeModelPtr &ge_model) { | |||||
std::shared_ptr<ModelTaskDef> model_task_def = ge_model->GetModelTaskDefPtr(); | std::shared_ptr<ModelTaskDef> model_task_def = ge_model->GetModelTaskDefPtr(); | ||||
if (model_task_def == nullptr) { | if (model_task_def == nullptr) { | ||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Create model task def ptr failed"); | |||||
return ACL_ERROR_GE_MEMORY_ALLOCATION; | |||||
GELOGD("SaveSizeToModelDef task_info_size is 0."); | |||||
om_info.push_back(0); | |||||
} else { | |||||
size_t partition_task_size = model_task_def->ByteSizeLong(); | |||||
GELOGD("SaveSizeToModelDef task_info_size is %zu", partition_task_size); | |||||
om_info.push_back(partition_task_size); | |||||
} | } | ||||
size_t partition_task_size = model_task_def->ByteSizeLong(); | |||||
GELOGD("SaveSizeToModelDef task_info_size is %zu", partition_task_size); | |||||
om_info.push_back(partition_task_size); | |||||
GE_CHK_BOOL_EXEC(ge::AttrUtils::SetListInt(*(ge_model.get()), "om_info_list", om_info), | GE_CHK_BOOL_EXEC(ge::AttrUtils::SetListInt(*(ge_model.get()), "om_info_list", om_info), | ||||
GELOGE(FAILED, "SetListInt of om_info_list failed."); | GELOGE(FAILED, "SetListInt of om_info_list failed."); | ||||
@@ -598,6 +599,7 @@ Status ModelHelper::GenerateGeRootModel(OmFileLoadHelper &om_load_helper) { | |||||
is_first_model = false; | is_first_model = false; | ||||
root_model_->SetRootGraph(GraphUtils::GetComputeGraph(cur_model->GetGraph())); | root_model_->SetRootGraph(GraphUtils::GetComputeGraph(cur_model->GetGraph())); | ||||
root_model_->SetModelId(cur_model->GetModelId()); | root_model_->SetModelId(cur_model->GetModelId()); | ||||
root_model_->SetModelName(cur_model->GetName()); | |||||
model_ = cur_model; | model_ = cur_model; | ||||
continue; | continue; | ||||
} | } | ||||
@@ -416,8 +416,7 @@ Status OmFileSaveHelper::SaveRootModel(const SaveParam &save_param, const char * | |||||
if (is_offline) { | if (is_offline) { | ||||
ret = FileSaver::SaveToFile(output_file, model_header_, model_partition_tabels, all_model_partitions); | ret = FileSaver::SaveToFile(output_file, model_header_, model_partition_tabels, all_model_partitions); | ||||
} else { | } else { | ||||
GELOGW("do not support save ge root model to buff now"); | |||||
return FAILED; | |||||
ret = FileSaver::SaveToBuffWithFileHeader(model_header_, model_partition_tabels, all_model_partitions, model); | |||||
} | } | ||||
if (ret == SUCCESS) { | if (ret == SUCCESS) { | ||||
GELOGD("Save model success without encrypt."); | GELOGD("Save model success without encrypt."); | ||||
@@ -24,6 +24,7 @@ | |||||
#include "graph/types.h" | #include "graph/types.h" | ||||
#include "runtime/base.h" | #include "runtime/base.h" | ||||
#include "graph/load/model_manager/davinci_model.h" | #include "graph/load/model_manager/davinci_model.h" | ||||
#include "mmpa/mmpa_api.h" | |||||
namespace { | namespace { | ||||
const char *const kTrainingTrace = "training_trace"; | const char *const kTrainingTrace = "training_trace"; | ||||
@@ -31,7 +32,6 @@ const char *const kFpPoint = "fp_point"; | |||||
const char *const kBpPoint = "bp_point"; | const char *const kBpPoint = "bp_point"; | ||||
#ifdef DAVINCI_SUPPORT_PROFILING | #ifdef DAVINCI_SUPPORT_PROFILING | ||||
const size_t kReportMaxLen = 2048; | |||||
const int32_t kMaxDeviceNum = 256; | const int32_t kMaxDeviceNum = 256; | ||||
const uint32_t kInteval = 2; | const uint32_t kInteval = 2; | ||||
const std::string kConfigNumsdev = "devNums"; | const std::string kConfigNumsdev = "devNums"; | ||||
@@ -47,6 +47,10 @@ const std::string kOptype = "op_type"; | |||||
const std::string kBlockDim = "block_dims"; | const std::string kBlockDim = "block_dims"; | ||||
const std::string kTaskId = "task_id"; | const std::string kTaskId = "task_id"; | ||||
const std::string kStreamId = "stream_id"; | const std::string kStreamId = "stream_id"; | ||||
const std::string kThreadId = "thread_id"; | |||||
const std::string kIndexId = "index_id"; | |||||
const std::string kTimeStamp = "time_stamp"; | |||||
const std::string kTagId = "tag_id"; | |||||
const std::string kShapeType = "shape_type"; | const std::string kShapeType = "shape_type"; | ||||
const std::string kCurIterNum = "cur_iter_num"; | const std::string kCurIterNum = "cur_iter_num"; | ||||
const std::string kTaskType = "task_type"; | const std::string kTaskType = "task_type"; | ||||
@@ -287,27 +291,80 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY void ProfilingManager::Profilin | |||||
#endif | #endif | ||||
} | } | ||||
FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status ProfilingManager::ProfileStepInfo( | |||||
uint64_t index_id, uint64_t model_id, uint16_t tag_id, rtStream_t stream, int32_t device_id) { | |||||
#ifdef DAVINCI_SUPPORT_PROFILING | |||||
rtError_t rt_ret = RT_ERROR_NONE; | |||||
#ifndef ONLY_COMPILE_OPEN_SRC | |||||
GELOGD("Profiling Step Info TraceTask execute async start, index_id = %lu, model_id = %lu, tag_id = %u", | |||||
index_id, model_id, tag_id); | |||||
rt_ret = rtProfilerTraceEx(index_id, model_id, tag_id, stream); | |||||
if (rt_ret != RT_ERROR_NONE) { | |||||
GELOGE(RT_FAILED, "[Call][rtProfilerTraceEx] failed, ret: 0x%X", rt_ret); | |||||
return RT_ERROR_TO_GE_STATUS(rt_ret); | |||||
} | |||||
GELOGD("Profiling Step Info TraceTask execute async success, index_id = %lu, model_id = %lu, tag_id = %u", | |||||
index_id, model_id, tag_id); | |||||
#endif | |||||
mmTimespec timespec = mmGetTickCount(); | |||||
// 1000 ^ 3 converts second to nanosecond | |||||
int64_t time = timespec.tv_sec * 1000 * 1000 * 1000 + timespec.tv_nsec; | |||||
uint32_t task_id = 0; | |||||
uint32_t stream_id = 0; | |||||
rt_ret = rtGetTaskIdAndStreamID(&task_id, &stream_id); | |||||
if (rt_ret != RT_ERROR_NONE) { | |||||
GELOGE(RT_FAILED, "[Get][RtsInfo] task_id and stream_id failed, ret: 0x%X.", rt_ret); | |||||
return RT_ERROR_TO_GE_STATUS(rt_ret); | |||||
} | |||||
GELOGD("Get profiling args, task_id[%u], stream_id[%u]", task_id, stream_id); | |||||
Json step_info; | |||||
step_info[kIndexId] = index_id; | |||||
step_info[kModelId] = model_id; | |||||
step_info[kTimeStamp] = time; | |||||
step_info[kTagId] = tag_id; | |||||
step_info[kTaskId] = task_id; | |||||
step_info[kStreamId] = stream_id; | |||||
step_info[kThreadId] = mmGetTid(); | |||||
std::string reported_data; | |||||
try { | |||||
reported_data = step_info.dump(kInteval, ' ', false, Json::error_handler_t::ignore); | |||||
} catch (std::exception &e) { | |||||
GELOGE(FAILED, "Failed to convert JSON to string, reason: %s.", e.what()); | |||||
} catch (...) { | |||||
GELOGE(FAILED, "Failed to convert JSON to string."); | |||||
} | |||||
reported_data.append(",") | |||||
.append("\n"); | |||||
ReportData(device_id, reported_data, "step_info"); | |||||
#endif | |||||
return SUCCESS; | |||||
} | |||||
FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY void ProfilingManager::ReportData( | FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY void ProfilingManager::ReportData( | ||||
const int32_t &device_id, const string &data, const string &tag_name) { | const int32_t &device_id, const string &data, const string &tag_name) { | ||||
#ifdef DAVINCI_SUPPORT_PROFILING | #ifdef DAVINCI_SUPPORT_PROFILING | ||||
ReporterData reporter_data{}; | ReporterData reporter_data{}; | ||||
int ret = -1; | int ret = -1; | ||||
int32_t cb_ret = -1; | int32_t cb_ret = -1; | ||||
size_t index = data.size() / kReportMaxLen; | |||||
size_t report_max_len = reporter_max_len_; | |||||
size_t index = data.size() / report_max_len; | |||||
if (index >= 1) { | if (index >= 1) { | ||||
reporter_data.deviceId = device_id; | reporter_data.deviceId = device_id; | ||||
ret = memcpy_s(reporter_data.tag, MSPROF_ENGINE_MAX_TAG_LEN + 1, tag_name.c_str(), tag_name.size()); | ret = memcpy_s(reporter_data.tag, MSPROF_ENGINE_MAX_TAG_LEN + 1, tag_name.c_str(), tag_name.size()); | ||||
GE_IF_BOOL_EXEC(ret != EOK, GELOGE(ret, "Report data tag [%s] memcpy error!", tag_name.c_str()); return;); | GE_IF_BOOL_EXEC(ret != EOK, GELOGE(ret, "Report data tag [%s] memcpy error!", tag_name.c_str()); return;); | ||||
for (size_t i = 0; i < index; ++i) { | for (size_t i = 0; i < index; ++i) { | ||||
reporter_data.data = (unsigned char *)data.c_str() + kReportMaxLen * i; | |||||
reporter_data.dataLen = kReportMaxLen; | |||||
reporter_data.data = (unsigned char *)data.c_str() + report_max_len * i; | |||||
reporter_data.dataLen = report_max_len; | |||||
cb_ret = CallMsprofReport(reporter_data); | cb_ret = CallMsprofReport(reporter_data); | ||||
GE_IF_BOOL_EXEC(cb_ret != 0, GELOGE(cb_ret, "Reporter data [%s] failed, ret:%d", tag_name.c_str(), cb_ret); | GE_IF_BOOL_EXEC(cb_ret != 0, GELOGE(cb_ret, "Reporter data [%s] failed, ret:%d", tag_name.c_str(), cb_ret); | ||||
return;); | return;); | ||||
} | } | ||||
reporter_data.dataLen = data.size() - kReportMaxLen * index; | |||||
reporter_data.dataLen = data.size() - report_max_len * index; | |||||
if (reporter_data.dataLen != 0) { | if (reporter_data.dataLen != 0) { | ||||
reporter_data.data = (unsigned char *)data.c_str() + kReportMaxLen * index; | |||||
reporter_data.data = (unsigned char *)data.c_str() + report_max_len * index; | |||||
cb_ret = CallMsprofReport(reporter_data); | cb_ret = CallMsprofReport(reporter_data); | ||||
GE_IF_BOOL_EXEC(cb_ret != 0, GELOGE(cb_ret, "Reporter data [%s] failed, ret:%d", tag_name.c_str(), cb_ret); | GE_IF_BOOL_EXEC(cb_ret != 0, GELOGE(cb_ret, "Reporter data [%s] failed, ret:%d", tag_name.c_str(), cb_ret); | ||||
return;); | return;); | ||||
@@ -745,15 +802,32 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY bool ProfilingManager::Profilin | |||||
return execute_model_prof_on; | return execute_model_prof_on; | ||||
} | } | ||||
FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status ProfilingManager::PluginInit() const { | |||||
FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status ProfilingManager::PluginInit() { | |||||
if (prof_cb_.msprofReporterCallback == nullptr) { | if (prof_cb_.msprofReporterCallback == nullptr) { | ||||
GELOGE(ge::PARAM_INVALID, "MsprofReporterCallback callback is nullptr."); | GELOGE(ge::PARAM_INVALID, "MsprofReporterCallback callback is nullptr."); | ||||
return ge::PARAM_INVALID; | return ge::PARAM_INVALID; | ||||
} | } | ||||
return prof_cb_.msprofReporterCallback( | |||||
int32_t cb_ret = prof_cb_.msprofReporterCallback( | |||||
static_cast<uint32_t>(MsprofReporterModuleId::MSPROF_MODULE_FRAMEWORK), | static_cast<uint32_t>(MsprofReporterModuleId::MSPROF_MODULE_FRAMEWORK), | ||||
static_cast<uint32_t>(MsprofReporterCallbackType::MSPROF_REPORTER_INIT), | static_cast<uint32_t>(MsprofReporterCallbackType::MSPROF_REPORTER_INIT), | ||||
nullptr, 0); | nullptr, 0); | ||||
if (cb_ret != MSPROF_ERROR_NONE) { | |||||
REPORT_CALL_ERROR("E19999", "Profiling reporter init failed, ret = %d.", cb_ret); | |||||
GELOGE(INTERNAL_ERROR, "[Init][ProfilingReporter] profiling init failed, ret = %d.", cb_ret); | |||||
return INTERNAL_ERROR; | |||||
} | |||||
cb_ret = prof_cb_.msprofReporterCallback( | |||||
static_cast<uint32_t>(MsprofReporterModuleId::MSPROF_MODULE_FRAMEWORK), | |||||
static_cast<uint32_t>(MsprofReporterCallbackType::MSPROF_REPORTER_DATA_MAX_LEN), | |||||
&reporter_max_len_, sizeof(uint32_t)); | |||||
if (cb_ret != MSPROF_ERROR_NONE) { | |||||
REPORT_CALL_ERROR("E19999", "Get profiling reporter data max len failed, ret = %d.", cb_ret); | |||||
GELOGE(INTERNAL_ERROR, "[Init][ProfilingReporter] Get profiling reporter data max len failed, ret = %d.", cb_ret); | |||||
return INTERNAL_ERROR; | |||||
} | |||||
return SUCCESS; | |||||
} | } | ||||
FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY void ProfilingManager::PluginUnInit() const { | FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY void ProfilingManager::PluginUnInit() const { | ||||
@@ -27,6 +27,7 @@ | |||||
#include "framework/common/ge_types.h" | #include "framework/common/ge_types.h" | ||||
#include "external/register/register_types.h" | #include "external/register/register_types.h" | ||||
#include "toolchain/prof_callback.h" | #include "toolchain/prof_callback.h" | ||||
#include "runtime/stream.h" | |||||
using std::map; | using std::map; | ||||
using std::string; | using std::string; | ||||
@@ -88,7 +89,7 @@ class FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY ProfilingManager { | |||||
void ProfilingTaskDescInfo(uint32_t model_id, const std::vector<TaskDescInfo> &task_desc_info, | void ProfilingTaskDescInfo(uint32_t model_id, const std::vector<TaskDescInfo> &task_desc_info, | ||||
const int32_t &device_id); | const int32_t &device_id); | ||||
void ProfilingOpInputOutInfo(const TaskDescInfo &task, Json &task_json); | void ProfilingOpInputOutInfo(const TaskDescInfo &task, Json &task_json); | ||||
Status PluginInit() const; | |||||
Status PluginInit(); | |||||
void PluginUnInit() const; | void PluginUnInit() const; | ||||
Status CallMsprofReport(ReporterData &reporter_data) const; | Status CallMsprofReport(ReporterData &reporter_data) const; | ||||
struct MsprofCallback &GetMsprofCallback() { return prof_cb_; } | struct MsprofCallback &GetMsprofCallback() { return prof_cb_; } | ||||
@@ -97,6 +98,7 @@ class FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY ProfilingManager { | |||||
void GetFpBpPoint(std::string &fp_point, std::string &bp_point); | void GetFpBpPoint(std::string &fp_point, std::string &bp_point); | ||||
void GetOpInputOutputInfo(const OpDescPtr &op, TaskDescInfo &task_desc_info) const; | void GetOpInputOutputInfo(const OpDescPtr &op, TaskDescInfo &task_desc_info) const; | ||||
void ReportData(const int32_t &device_id, const std::string &data, const std::string &tag_name); | void ReportData(const int32_t &device_id, const std::string &data, const std::string &tag_name); | ||||
Status ProfileStepInfo(uint64_t index_id, uint64_t model_id, uint16_t tag_id, rtStream_t stream, int32_t device_id); | |||||
private: | private: | ||||
Status InitFromOptions(const Options &options, MsprofGeOptions &prof_conf); | Status InitFromOptions(const Options &options, MsprofGeOptions &prof_conf); | ||||
Status ParseOptions(const std::string &options); | Status ParseOptions(const std::string &options); | ||||
@@ -119,6 +121,7 @@ class FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY ProfilingManager { | |||||
MsprofCallback prof_cb_; | MsprofCallback prof_cb_; | ||||
std::string fp_point_; | std::string fp_point_; | ||||
std::string bp_point_; | std::string bp_point_; | ||||
uint32_t reporter_max_len_ = 0; | |||||
}; | }; | ||||
} // namespace ge | } // namespace ge | ||||
#endif // GE_COMMON_PROFILING_PROFILING_MANAGER_H_ | #endif // GE_COMMON_PROFILING_PROFILING_MANAGER_H_ |
@@ -88,6 +88,7 @@ message AippOpParams { | |||||
int32 right_padding_size = 69; | int32 right_padding_size = 69; | ||||
int32 top_padding_size = 70; | int32 top_padding_size = 70; | ||||
int32 bottom_padding_size = 71; | int32 bottom_padding_size = 71; | ||||
float padding_value = 72; | |||||
int32 mean_chn_0 = 10; | int32 mean_chn_0 = 10; | ||||
int32 mean_chn_1 = 11; | int32 mean_chn_1 = 11; | ||||
@@ -15,6 +15,8 @@ | |||||
*/ | */ | ||||
#include "common/tbe_kernel_store.h" | #include "common/tbe_kernel_store.h" | ||||
#include "graph/utils/attr_utils.h" | |||||
#include "graph/debug/ge_attr_define.h" | |||||
namespace ge { | namespace ge { | ||||
@@ -31,6 +33,15 @@ void TBEKernelStore::LoadTBEKernelBinToOpDesc(const std::shared_ptr<ge::OpDesc> | |||||
GE_IF_BOOL_EXEC(!op_desc->SetExtAttr(ge::OP_EXTATTR_NAME_TBE_KERNEL, kernel_bin), | GE_IF_BOOL_EXEC(!op_desc->SetExtAttr(ge::OP_EXTATTR_NAME_TBE_KERNEL, kernel_bin), | ||||
GELOGW("LoadKernelTBEBinToOpDesc: SetExtAttr for kernel_bin failed");) | GELOGW("LoadKernelTBEBinToOpDesc: SetExtAttr for kernel_bin failed");) | ||||
GELOGI("Load tbe kernel:%s, %zu", kernel_bin->GetName().c_str(), kernel_bin->GetBinDataSize()); | GELOGI("Load tbe kernel:%s, %zu", kernel_bin->GetName().c_str(), kernel_bin->GetBinDataSize()); | ||||
std::string atomic_kernel_name; | |||||
(void) AttrUtils::GetStr(op_desc, ATOMIC_ATTR_TBE_KERNEL_NAME, atomic_kernel_name); | |||||
if (!atomic_kernel_name.empty()) { | |||||
GELOGI("Get atomic kernel name is %s.", atomic_kernel_name.c_str()); | |||||
auto atomic_kernel_bin = FindKernel(atomic_kernel_name); | |||||
GE_IF_BOOL_EXEC(!op_desc->SetExtAttr(EXT_ATTR_ATOMIC_TBE_KERNEL, atomic_kernel_bin), | |||||
GELOGW("LoadKernelTBEBinToOpDesc: SetExtAttr for atomic kernel_bin failed");) | |||||
} | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -90,6 +90,8 @@ REGISTER_OPTYPE_DEFINE(DEPCONVOLUTION, "ConvolutionDepthwise"); | |||||
REGISTER_OPTYPE_DEFINE(DROPOUT, "Dropout"); | REGISTER_OPTYPE_DEFINE(DROPOUT, "Dropout"); | ||||
REGISTER_OPTYPE_DEFINE(DROPOUTGENMASK, "DropOutGenMask"); | REGISTER_OPTYPE_DEFINE(DROPOUTGENMASK, "DropOutGenMask"); | ||||
REGISTER_OPTYPE_DEFINE(DROPOUTDOMASK, "DropOutDoMask"); | REGISTER_OPTYPE_DEFINE(DROPOUTDOMASK, "DropOutDoMask"); | ||||
REGISTER_OPTYPE_DEFINE(DROPOUTDOMASKV3, "DropOutDoMaskV3"); | |||||
REGISTER_OPTYPE_DEFINE(DROPOUTDOMASKV3D, "DropOutDoMaskV3D"); | |||||
REGISTER_OPTYPE_DEFINE(CONCAT, "Concat"); | REGISTER_OPTYPE_DEFINE(CONCAT, "Concat"); | ||||
REGISTER_OPTYPE_DEFINE(ROIPOOLING, "ROIPooling"); | REGISTER_OPTYPE_DEFINE(ROIPOOLING, "ROIPooling"); | ||||
REGISTER_OPTYPE_DEFINE(PROPOSAL, "Proposal"); | REGISTER_OPTYPE_DEFINE(PROPOSAL, "Proposal"); | ||||
@@ -8,6 +8,7 @@ set(PROTO_LIST | |||||
) | ) | ||||
protobuf_generate(ge PROTO_SRCS PROTO_HDRS ${PROTO_LIST}) | protobuf_generate(ge PROTO_SRCS PROTO_HDRS ${PROTO_LIST}) | ||||
protobuf_generate(ge_static PROTO_STATIC_SRCS PROTO_STATIC_HDRS ${PROTO_LIST}) | |||||
set(SRC_LIST | set(SRC_LIST | ||||
"ge_executor.cc" | "ge_executor.cc" | ||||
@@ -15,6 +16,7 @@ set(SRC_LIST | |||||
"../common/ge/plugin_manager.cc" | "../common/ge/plugin_manager.cc" | ||||
"../common/ge/op_tiling_manager.cc" | "../common/ge/op_tiling_manager.cc" | ||||
"../common/dump/dump_properties.cc" | "../common/dump/dump_properties.cc" | ||||
"../common/dump/exception_dumper.cc" | |||||
"../common/dump/dump_manager.cc" | "../common/dump/dump_manager.cc" | ||||
"../common/dump/dump_op.cc" | "../common/dump/dump_op.cc" | ||||
"../common/dump/opdebug_register.cc" | "../common/dump/opdebug_register.cc" | ||||
@@ -162,7 +164,7 @@ set(SRC_LIST | |||||
) | ) | ||||
######## libge_executor.a ######## | ######## libge_executor.a ######## | ||||
add_library(ge_executor STATIC ${SRC_LIST} ${PROTO_HDRS}) | |||||
add_library(ge_executor STATIC ${SRC_LIST} ${PROTO_STATIC_HDRS}) | |||||
target_compile_options(ge_executor PRIVATE | target_compile_options(ge_executor PRIVATE | ||||
$<$<OR:$<STREQUAL:${TARGET_SYSTEM_NAME},Linux>,$<STREQUAL:${TARGET_SYSTEM_NAME},Android>>:-fvisibility=hidden -O2 -Werror -Wno-deprecated-declarations -fno-common> | $<$<OR:$<STREQUAL:${TARGET_SYSTEM_NAME},Linux>,$<STREQUAL:${TARGET_SYSTEM_NAME},Android>>:-fvisibility=hidden -O2 -Werror -Wno-deprecated-declarations -fno-common> | ||||
@@ -178,6 +180,7 @@ target_compile_definitions(ge_executor PRIVATE | |||||
google=ascend_private | google=ascend_private | ||||
$<IF:$<STREQUAL:${TARGET_SYSTEM_NAME},Windows>,OS_TYPE=WIN,OS_TYPE=0> | $<IF:$<STREQUAL:${TARGET_SYSTEM_NAME},Windows>,OS_TYPE=WIN,OS_TYPE=0> | ||||
$<$<STREQUAL:${TARGET_SYSTEM_NAME},Windows>:SECUREC_USING_STD_SECURE_LIB=0 NOMINMAX> | $<$<STREQUAL:${TARGET_SYSTEM_NAME},Windows>:SECUREC_USING_STD_SECURE_LIB=0 NOMINMAX> | ||||
$<$<STREQUAL:${ENABLE_OPEN_SRC},True>:ONLY_COMPILE_OPEN_SRC> | |||||
LOG_CPP | LOG_CPP | ||||
) | ) | ||||
@@ -191,7 +194,7 @@ target_include_directories(ge_executor SYSTEM PRIVATE | |||||
${METADEF_DIR}/inc/external/graph | ${METADEF_DIR}/inc/external/graph | ||||
${METADEF_DIR}/inc/graph | ${METADEF_DIR}/inc/graph | ||||
${CMAKE_BINARY_DIR} | ${CMAKE_BINARY_DIR} | ||||
${CMAKE_BINARY_DIR}/proto/ge | |||||
${CMAKE_BINARY_DIR}/proto/ge_static | |||||
#### yellow zone #### | #### yellow zone #### | ||||
${GE_CODE_DIR}/../inc | ${GE_CODE_DIR}/../inc | ||||
${GE_CODE_DIR}/../inc/cce | ${GE_CODE_DIR}/../inc/cce | ||||
@@ -212,6 +215,7 @@ target_link_libraries(ge_executor PRIVATE | |||||
add_library(ge_executor_shared SHARED ${SRC_LIST} ${PROTO_HDRS}) | add_library(ge_executor_shared SHARED ${SRC_LIST} ${PROTO_HDRS}) | ||||
target_compile_options(ge_executor_shared PRIVATE | target_compile_options(ge_executor_shared PRIVATE | ||||
-fno-common | |||||
-Werror | -Werror | ||||
-O2 | -O2 | ||||
-Wno-deprecated-declarations | -Wno-deprecated-declarations | ||||
@@ -223,6 +227,7 @@ target_compile_definitions(ge_executor_shared PRIVATE | |||||
DAVINCI_SUPPORT_PROFILING | DAVINCI_SUPPORT_PROFILING | ||||
google=ascend_private | google=ascend_private | ||||
FUNC_VISIBILITY | FUNC_VISIBILITY | ||||
$<$<STREQUAL:${ENABLE_OPEN_SRC},True>:ONLY_COMPILE_OPEN_SRC> | |||||
) | ) | ||||
target_include_directories(ge_executor_shared PRIVATE | target_include_directories(ge_executor_shared PRIVATE | ||||
@@ -30,6 +30,8 @@ | |||||
#include "single_op/single_op_manager.h" | #include "single_op/single_op_manager.h" | ||||
#include "graph/load/model_manager/davinci_model.h" | #include "graph/load/model_manager/davinci_model.h" | ||||
#include "opskernel_manager/ops_kernel_builder_manager.h" | #include "opskernel_manager/ops_kernel_builder_manager.h" | ||||
#include "graph/opsproto_manager.h" | |||||
#include "ge_local_engine/engine/host_cpu_engine.h" | |||||
using std::string; | using std::string; | ||||
using std::vector; | using std::vector; | ||||
@@ -199,6 +201,33 @@ bool IsDynmaicDimsSizeMatchModel(const vector<uint64_t> cur_dynamic_dims, | |||||
namespace ge { | namespace ge { | ||||
bool GeExecutor::isInit_ = false; | bool GeExecutor::isInit_ = false; | ||||
static void InitOpsProtoManager() { | |||||
string opsproto_path; | |||||
const char *path_env = std::getenv("ASCEND_OPP_PATH"); | |||||
if (path_env != nullptr) { | |||||
string path = path_env; | |||||
string file_path = RealPath(path.c_str()); | |||||
if (file_path.empty()) { | |||||
GELOGE(FAILED, "[Check][EnvPath]ASCEND_OPP_PATH path [%s] is invalid.", path.c_str()); | |||||
REPORT_INPUT_ERROR("E68016", {"ASCEND_OPP_PATH", path}); | |||||
return; | |||||
} | |||||
opsproto_path = (path + "/op_proto/custom/" + ":") + (path + "/op_proto/built-in/"); | |||||
GELOGI("Get opsproto so path from env : %s", path.c_str()); | |||||
} else { | |||||
string path_base = PluginManager::GetPath(); | |||||
GELOGI("path_base is %s", path_base.c_str()); | |||||
path_base = path_base.substr(0, path_base.rfind('/')); | |||||
path_base = path_base.substr(0, path_base.rfind('/') + 1); | |||||
opsproto_path = (path_base + "ops/op_proto/custom/" + ":") + (path_base + "ops/op_proto/built-in/"); | |||||
} | |||||
GELOGI("Get opsproto path is %s", opsproto_path.c_str()); | |||||
OpsProtoManager *manager = OpsProtoManager::Instance(); | |||||
map<string, string> option_tmp; | |||||
option_tmp.emplace(std::pair<string, string>(string("ge.opsProtoLibPath"), opsproto_path)); | |||||
(void)manager->Initialize(option_tmp); | |||||
} | |||||
GeExecutor::GeExecutor() {} | GeExecutor::GeExecutor() {} | ||||
Status GeExecutor::Initialize() { | Status GeExecutor::Initialize() { | ||||
@@ -208,6 +237,16 @@ Status GeExecutor::Initialize() { | |||||
return ge::SUCCESS; | return ge::SUCCESS; | ||||
} | } | ||||
OpTilingManager::GetInstance().LoadSo(); | |||||
Status init_hostcpu_engine_status = HostCpuEngine::GetInstance().Initialize(); | |||||
if (init_hostcpu_engine_status != SUCCESS) { | |||||
GELOGE(init_hostcpu_engine_status, "Failed to initialize HostCpuEngine"); | |||||
return init_hostcpu_engine_status; | |||||
} | |||||
InitOpsProtoManager(); | |||||
std::vector<rtMemType_t> mem_type(1, RT_MEMORY_HBM); | std::vector<rtMemType_t> mem_type(1, RT_MEMORY_HBM); | ||||
mem_type.push_back(RT_MEMORY_P2P_DDR); | mem_type.push_back(RT_MEMORY_P2P_DDR); | ||||
auto ret = MemManager::Instance().Initialize(mem_type); | auto ret = MemManager::Instance().Initialize(mem_type); | ||||
@@ -88,6 +88,7 @@ message AippOpParams { | |||||
int32 right_padding_size = 69; | int32 right_padding_size = 69; | ||||
int32 top_padding_size = 70; | int32 top_padding_size = 70; | ||||
int32 bottom_padding_size = 71; | int32 bottom_padding_size = 71; | ||||
float padding_value = 72; | |||||
int32 mean_chn_0 = 10; | int32 mean_chn_0 = 10; | ||||
int32 mean_chn_1 = 11; | int32 mean_chn_1 = 11; | ||||
@@ -114,6 +114,7 @@ OMG_HOST_SRC_FILES := \ | |||||
graph/passes/atomic_addr_clean_pass.cc \ | graph/passes/atomic_addr_clean_pass.cc \ | ||||
graph/passes/mark_same_addr_pass.cc \ | graph/passes/mark_same_addr_pass.cc \ | ||||
graph/passes/mark_graph_unknown_status_pass.cc \ | graph/passes/mark_graph_unknown_status_pass.cc \ | ||||
graph/passes/mark_node_unknown_shape_pass.cc \ | |||||
graph/passes/mark_agnostic_pass.cc \ | graph/passes/mark_agnostic_pass.cc \ | ||||
graph/common/omg_util.cc \ | graph/common/omg_util.cc \ | ||||
graph/common/bcast.cc \ | graph/common/bcast.cc \ | ||||
@@ -222,6 +223,7 @@ OMG_HOST_SRC_FILES := \ | |||||
graph/passes/hccl_group_pass.cc \ | graph/passes/hccl_group_pass.cc \ | ||||
graph/passes/memcpy_addr_async_pass.cc \ | graph/passes/memcpy_addr_async_pass.cc \ | ||||
graph/passes/set_input_output_offset_pass.cc \ | graph/passes/set_input_output_offset_pass.cc \ | ||||
graph/passes/buffer_pool_memory_pass.cc \ | |||||
OMG_DEVICE_SRC_FILES := $(OMG_HOST_SRC_FILES) | OMG_DEVICE_SRC_FILES := $(OMG_HOST_SRC_FILES) | ||||
@@ -20,6 +20,8 @@ set(OPS_KERNEL_SRC_LIST | |||||
) | ) | ||||
protobuf_generate(ge PROTO_SRCS PROTO_HDRS ${PROTO_LIST}) | protobuf_generate(ge PROTO_SRCS PROTO_HDRS ${PROTO_LIST}) | ||||
protobuf_generate(ge_ops_shared PROTO_OPS_SHARED_SRCS PROTO_OPS_SHARED_HDRS ${PROTO_LIST}) | |||||
protobuf_generate(ge_ops_static PROTO_OPS_STATIC_SRCS PROTO_OPS_STATIC_HDRS ${PROTO_LIST}) | |||||
############ libge_local_engine.so ############ | ############ libge_local_engine.so ############ | ||||
add_library(ge_local_engine SHARED ${SRC_LIST} ${PROTO_HDRS}) | add_library(ge_local_engine SHARED ${SRC_LIST} ${PROTO_HDRS}) | ||||
@@ -119,7 +121,7 @@ set_target_properties(atc_ge_local_engine PROPERTIES | |||||
) | ) | ||||
############ libge_local_opskernel_builder.so ############ | ############ libge_local_opskernel_builder.so ############ | ||||
add_library(ge_local_opskernel_builder SHARED ${OPS_KERNEL_SRC_LIST} ${PROTO_HDRS}) | |||||
add_library(ge_local_opskernel_builder SHARED ${OPS_KERNEL_SRC_LIST} ${PROTO_OPS_SHARED_HDRS}) | |||||
target_compile_options(ge_local_opskernel_builder PRIVATE | target_compile_options(ge_local_opskernel_builder PRIVATE | ||||
-Werror | -Werror | ||||
@@ -143,7 +145,7 @@ target_include_directories(ge_local_opskernel_builder PRIVATE | |||||
${METADEF_DIR}/inc/external/graph | ${METADEF_DIR}/inc/external/graph | ||||
${METADEF_DIR}/inc/graph | ${METADEF_DIR}/inc/graph | ||||
${CMAKE_BINARY_DIR} | ${CMAKE_BINARY_DIR} | ||||
${CMAKE_BINARY_DIR}/proto/ge | |||||
${CMAKE_BINARY_DIR}/proto/ge_ops_shared | |||||
#### yellow zone #### | #### yellow zone #### | ||||
${GE_CODE_DIR}/../inc | ${GE_CODE_DIR}/../inc | ||||
#### blue zone #### | #### blue zone #### | ||||
@@ -166,7 +168,7 @@ target_link_libraries(ge_local_opskernel_builder PRIVATE | |||||
) | ) | ||||
############ atclib/libge_local_opskernel_builder.so ############ | ############ atclib/libge_local_opskernel_builder.so ############ | ||||
add_library(atc_ge_local_opskernel_builder SHARED ${OPS_KERNEL_SRC_LIST} ${PROTO_HDRS}) | |||||
add_library(atc_ge_local_opskernel_builder SHARED ${OPS_KERNEL_SRC_LIST} ${PROTO_OPS_SHARED_HDRS}) | |||||
target_compile_options(atc_ge_local_opskernel_builder PRIVATE | target_compile_options(atc_ge_local_opskernel_builder PRIVATE | ||||
-Werror | -Werror | ||||
@@ -190,7 +192,7 @@ target_include_directories(atc_ge_local_opskernel_builder PRIVATE | |||||
${METADEF_DIR}/inc/external/graph | ${METADEF_DIR}/inc/external/graph | ||||
${METADEF_DIR}/inc/graph | ${METADEF_DIR}/inc/graph | ||||
${CMAKE_BINARY_DIR} | ${CMAKE_BINARY_DIR} | ||||
${CMAKE_BINARY_DIR}/proto/ge | |||||
${CMAKE_BINARY_DIR}/proto/ge_ops_shared | |||||
#### yellow zone #### | #### yellow zone #### | ||||
${GE_CODE_DIR}/../inc | ${GE_CODE_DIR}/../inc | ||||
#### blue zone #### | #### blue zone #### | ||||
@@ -218,7 +220,7 @@ set_target_properties(atc_ge_local_opskernel_builder PROPERTIES | |||||
) | ) | ||||
############ libge_local_opskernel_builder.a ############ | ############ libge_local_opskernel_builder.a ############ | ||||
add_library(ge_local_opskernel_builder_static STATIC ${OPS_KERNEL_SRC_LIST} ${PROTO_HDRS}) | |||||
add_library(ge_local_opskernel_builder_static STATIC ${OPS_KERNEL_SRC_LIST} ${PROTO_OPS_STATIC_HDRS}) | |||||
target_compile_options(ge_local_opskernel_builder_static PRIVATE | target_compile_options(ge_local_opskernel_builder_static PRIVATE | ||||
-Werror | -Werror | ||||
@@ -243,7 +245,7 @@ target_include_directories(ge_local_opskernel_builder_static PRIVATE | |||||
${METADEF_DIR}/inc/external/graph | ${METADEF_DIR}/inc/external/graph | ||||
${METADEF_DIR}/inc/graph | ${METADEF_DIR}/inc/graph | ||||
${CMAKE_BINARY_DIR} | ${CMAKE_BINARY_DIR} | ||||
${CMAKE_BINARY_DIR}/proto/ge | |||||
${CMAKE_BINARY_DIR}/proto/ge_ops_static | |||||
#### yellow zone #### | #### yellow zone #### | ||||
${GE_CODE_DIR}/../inc | ${GE_CODE_DIR}/../inc | ||||
#### blue zone #### | #### blue zone #### | ||||
@@ -38,6 +38,7 @@ REGISTER_OP_CREATOR(ExpandDims, GeDeletedOp); | |||||
REGISTER_OP_CREATOR(Reshape, GeDeletedOp); | REGISTER_OP_CREATOR(Reshape, GeDeletedOp); | ||||
REGISTER_OP_CREATOR(ReFormat, GeDeletedOp); | REGISTER_OP_CREATOR(ReFormat, GeDeletedOp); | ||||
REGISTER_OP_CREATOR(Squeeze, GeDeletedOp); | REGISTER_OP_CREATOR(Squeeze, GeDeletedOp); | ||||
REGISTER_OP_CREATOR(Unsqueeze, GeDeletedOp); | |||||
REGISTER_OP_CREATOR(Size, GeDeletedOp); | REGISTER_OP_CREATOR(Size, GeDeletedOp); | ||||
REGISTER_OP_CREATOR(Shape, GeDeletedOp); | REGISTER_OP_CREATOR(Shape, GeDeletedOp); | ||||
REGISTER_OP_CREATOR(ShapeN, GeDeletedOp); | REGISTER_OP_CREATOR(ShapeN, GeDeletedOp); | ||||
@@ -114,6 +114,7 @@ LIBGE_LOCAL_SRC_FILES := \ | |||||
graph/passes/atomic_addr_clean_pass.cc \ | graph/passes/atomic_addr_clean_pass.cc \ | ||||
graph/passes/mark_same_addr_pass.cc \ | graph/passes/mark_same_addr_pass.cc \ | ||||
graph/passes/mark_graph_unknown_status_pass.cc \ | graph/passes/mark_graph_unknown_status_pass.cc \ | ||||
graph/passes/mark_node_unknown_shape_pass.cc \ | |||||
graph/passes/mark_agnostic_pass.cc \ | graph/passes/mark_agnostic_pass.cc \ | ||||
graph/partition/dynamic_shape_partition.cc \ | graph/partition/dynamic_shape_partition.cc \ | ||||
graph/partition/stage_partition.cc \ | graph/partition/stage_partition.cc \ | ||||
@@ -246,6 +247,7 @@ LIBGE_LOCAL_SRC_FILES := \ | |||||
graph/passes/end_of_sequence_add_control_pass.cc \ | graph/passes/end_of_sequence_add_control_pass.cc \ | ||||
graph/passes/memcpy_addr_async_pass.cc \ | graph/passes/memcpy_addr_async_pass.cc \ | ||||
graph/passes/set_input_output_offset_pass.cc \ | graph/passes/set_input_output_offset_pass.cc \ | ||||
graph/passes/buffer_pool_memory_pass.cc \ | |||||
graph/preprocess/graph_preprocess.cc \ | graph/preprocess/graph_preprocess.cc \ | ||||
graph/preprocess/insert_op/ge_aipp_op.cc \ | graph/preprocess/insert_op/ge_aipp_op.cc \ | ||||
graph/preprocess/insert_op/util_insert_aipp_op.cc \ | graph/preprocess/insert_op/util_insert_aipp_op.cc \ | ||||
@@ -16,14 +16,12 @@ | |||||
#include "ge_runtime/task/label_goto_task.h" | #include "ge_runtime/task/label_goto_task.h" | ||||
#include "ge_runtime/task/task_factory.h" | #include "ge_runtime/task/task_factory.h" | ||||
#include "framework/common/util.h" | |||||
namespace ge { | namespace ge { | ||||
namespace model_runner { | namespace model_runner { | ||||
LabelGotoTask::LabelGotoTask(const ModelContext &model_context, const std::shared_ptr<LabelGotoTaskInfo> &task_info) | LabelGotoTask::LabelGotoTask(const ModelContext &model_context, const std::shared_ptr<LabelGotoTaskInfo> &task_info) | ||||
: TaskRepeater<LabelGotoTaskInfo>(model_context, task_info), | |||||
task_info_(task_info), | |||||
stream_(nullptr), | |||||
label_(nullptr) { | |||||
: TaskRepeater<LabelGotoTaskInfo>(model_context, task_info), task_info_(task_info) { | |||||
if (task_info_ == nullptr) { | if (task_info_ == nullptr) { | ||||
GELOGW("task_info_ is null!"); | GELOGW("task_info_ is null!"); | ||||
return; | return; | ||||
@@ -42,29 +40,78 @@ LabelGotoTask::LabelGotoTask(const ModelContext &model_context, const std::share | |||||
label_ = label_list[label_id]; | label_ = label_list[label_id]; | ||||
} | } | ||||
LabelGotoTask::~LabelGotoTask() {} | |||||
LabelGotoTask::~LabelGotoTask() { | |||||
GE_FREE_RT_LOG(label_info_); | |||||
GE_FREE_RT_LOG(index_value_); | |||||
} | |||||
bool LabelGotoTask::Distribute() { | bool LabelGotoTask::Distribute() { | ||||
GELOGI("LabelGotoTask Distribute start."); | GELOGI("LabelGotoTask Distribute start."); | ||||
if (!CheckParamValid()) { | |||||
return false; | |||||
} | |||||
const std::vector<void *> label_list = { label_ }; | |||||
rtError_t rt_ret = rtMalloc(&index_value_, sizeof(uint64_t), RT_MEMORY_HBM); | |||||
if (rt_ret != RT_ERROR_NONE) { | |||||
GELOGE(RT_FAILED, "Call rt api failed, ret: %#x", rt_ret); | |||||
return false; | |||||
} | |||||
uint64_t branch_index = 0; | |||||
rt_ret = rtMemcpy(index_value_, sizeof(uint64_t), &branch_index, sizeof(uint64_t), RT_MEMCPY_HOST_TO_DEVICE); | |||||
if (rt_ret != RT_ERROR_NONE) { | |||||
GELOGE(RT_FAILED, "Call rt api failed, ret: %#x", rt_ret); | |||||
return false; | |||||
} | |||||
uint32_t label_info_size = sizeof(rtLabelDevInfo) * label_list.size(); | |||||
rt_ret = rtMalloc(&label_info_, label_info_size, RT_MEMORY_HBM); | |||||
if (rt_ret != RT_ERROR_NONE) { | |||||
GELOGE(RT_FAILED, "Call rt api failed, ret: %#x", rt_ret); | |||||
return false; | |||||
} | |||||
rt_ret = rtLabelListCpy(label_list.data(), label_list.size(), label_info_, label_info_size); | |||||
if (rt_ret != RT_ERROR_NONE) { | |||||
GELOGE(RT_FAILED, "Call rt api failed, ret: %#x", rt_ret); | |||||
return false; | |||||
} | |||||
rt_ret = rtLabelSwitchByIndex(index_value_, label_list.size(), label_info_, stream_); | |||||
if (rt_ret != RT_ERROR_NONE) { | |||||
GELOGE(RT_FAILED, "Call rt api failed, ret: %#x", rt_ret); | |||||
return false; | |||||
} | |||||
GELOGI("DistributeTask end."); | |||||
return true; | |||||
} | |||||
bool LabelGotoTask::CheckParamValid() { | |||||
if (stream_ == nullptr) { | if (stream_ == nullptr) { | ||||
GELOGE(PARAM_INVALID, "stream is null!"); | GELOGE(PARAM_INVALID, "stream is null!"); | ||||
return false; | return false; | ||||
} | } | ||||
if (label_ == nullptr) { | if (label_ == nullptr) { | ||||
GELOGE(PARAM_INVALID, "label is null!"); | GELOGE(PARAM_INVALID, "label is null!"); | ||||
return false; | return false; | ||||
} | } | ||||
rtError_t rt_ret = rtLabelGotoEx(label_, stream_); | |||||
if (rt_ret != RT_ERROR_NONE) { | |||||
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | |||||
if (label_info_ != nullptr) { | |||||
GELOGE(PARAM_INVALID, "label_info_ has dirty data."); | |||||
return false; | |||||
} | |||||
if (index_value_ != nullptr) { | |||||
GELOGE(PARAM_INVALID, "index_value_ has dirty data."); | |||||
return false; | return false; | ||||
} | } | ||||
GELOGI("DistributeTask end."); | |||||
return true; | return true; | ||||
} | } | ||||
REGISTER_TASK(TaskInfoType::LABEL_GOTO, LabelGotoTask, LabelGotoTaskInfo); | REGISTER_TASK(TaskInfoType::LABEL_GOTO, LabelGotoTask, LabelGotoTaskInfo); | ||||
} // namespace model_runner | } // namespace model_runner | ||||
} // namespace ge | } // namespace ge |
@@ -31,9 +31,13 @@ class LabelGotoTask : public TaskRepeater<LabelGotoTaskInfo> { | |||||
bool Distribute() override; | bool Distribute() override; | ||||
private: | private: | ||||
bool CheckParamValid(); | |||||
std::shared_ptr<LabelGotoTaskInfo> task_info_; | std::shared_ptr<LabelGotoTaskInfo> task_info_; | ||||
void *stream_; | |||||
void *label_; | |||||
void *stream_{nullptr}; | |||||
void *label_{nullptr}; | |||||
void *label_info_{nullptr}; | |||||
void *index_value_{nullptr}; | |||||
}; | }; | ||||
} // namespace model_runner | } // namespace model_runner | ||||
} // namespace ge | } // namespace ge | ||||
@@ -36,6 +36,7 @@ | |||||
#include "graph/utils/type_utils.h" | #include "graph/utils/type_utils.h" | ||||
#include "init/gelib.h" | #include "init/gelib.h" | ||||
#include "model/ge_model.h" | #include "model/ge_model.h" | ||||
#include "analyzer/analyzer.h" | |||||
using std::map; | using std::map; | ||||
using std::string; | using std::string; | ||||
@@ -50,9 +51,14 @@ const char *const kFileNameSuffix = "online"; | |||||
const char *const kAicpuAllshape = "_AllShape"; | const char *const kAicpuAllshape = "_AllShape"; | ||||
constexpr char const *kAttrSupportDynamicShape = "support_dynamicshape"; | constexpr char const *kAttrSupportDynamicShape = "support_dynamicshape"; | ||||
const int64_t kDynamicDimValue = -2; | const int64_t kDynamicDimValue = -2; | ||||
const int kDefaultDeviceId = 0; | |||||
const int kDefaultJobId = 0; | |||||
const int32_t kFuzzBuildPattern = 1; | |||||
std::map<ge::OpEngineType, std::string> engine_type_map{ | std::map<ge::OpEngineType, std::string> engine_type_map{ | ||||
{ge::ENGINE_SYS, kEngineNameDefault}, {ge::ENGINE_AICORE, kAIcoreEngine}, {ge::ENGINE_VECTOR, kVectorEngine}}; | |||||
{ge::ENGINE_SYS, kEngineNameDefault}, | |||||
{ge::ENGINE_AICORE, kAIcoreEngine}, | |||||
{ge::ENGINE_VECTOR, kVectorEngine}}; | |||||
bool ContainsDynamicInpus(const ge::OpDesc &op_desc) { | bool ContainsDynamicInpus(const ge::OpDesc &op_desc) { | ||||
for (auto &tensor_desc : op_desc.GetAllInputsDescPtr()) { | for (auto &tensor_desc : op_desc.GetAllInputsDescPtr()) { | ||||
@@ -63,6 +69,10 @@ bool ContainsDynamicInpus(const ge::OpDesc &op_desc) { | |||||
} | } | ||||
return false; | return false; | ||||
} | } | ||||
// if optional in/out, format is format_reserved and dtype is dt_undefined | |||||
bool IsOptional(const ge::GeTensorDesc &tensor_desc) { | |||||
return tensor_desc.GetFormat() == ge::FORMAT_RESERVED && tensor_desc.GetDataType() == ge::DT_UNDEFINED; | |||||
} | |||||
} // namespace | } // namespace | ||||
namespace ge { | namespace ge { | ||||
@@ -83,8 +93,9 @@ static Status CheckEngineTypeSupport(const NodePtr &node, OpEngineType engine_ty | |||||
} else { | } else { | ||||
ErrorManager::GetInstance().ATCReportErrMessage("E14001", {"opname", "optype", "value", "reason"}, | ErrorManager::GetInstance().ATCReportErrMessage("E14001", {"opname", "optype", "value", "reason"}, | ||||
{op_desc->GetName(), op_desc->GetType(), "engine type", | {op_desc->GetName(), op_desc->GetType(), "engine type", | ||||
"it only support kEngineNameDefault/kAIcoreEngine/kVectorEngine"}); | |||||
GELOGE(FAILED, "CheckEngineType: engine type: %d not support", static_cast<int>(engine_type)); | |||||
"it only support default/AIcoreEngine/VectorEngine"}); | |||||
GELOGE(FAILED, "[Check][EngineType]value:%d not support, " | |||||
"only support default/AIcoreEngine/VectorEngine now", static_cast<int>(engine_type)); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -149,7 +160,7 @@ static Status CheckEngineTypeSupport(const NodePtr &node, OpEngineType engine_ty | |||||
} | } | ||||
static Status AddInputs(const ComputeGraphPtr &graph, const NodePtr &node, const GeTensorDesc &tensor, int32_t index, | static Status AddInputs(const ComputeGraphPtr &graph, const NodePtr &node, const GeTensorDesc &tensor, int32_t index, | ||||
bool attr) { | |||||
bool attr, int32_t &data_index) { | |||||
GE_CHECK_NOTNULL_EXEC(graph, return PARAM_INVALID); | GE_CHECK_NOTNULL_EXEC(graph, return PARAM_INVALID); | ||||
GE_CHECK_NOTNULL_EXEC(node, return PARAM_INVALID); | GE_CHECK_NOTNULL_EXEC(node, return PARAM_INVALID); | ||||
@@ -188,17 +199,21 @@ static Status AddInputs(const ComputeGraphPtr &graph, const NodePtr &node, const | |||||
(void)AttrUtils::SetBool(data_op, "_is_single_op", true); | (void)AttrUtils::SetBool(data_op, "_is_single_op", true); | ||||
GE_CHK_BOOL_EXEC(data_op->AddInputDesc(tensor) == GRAPH_SUCCESS, return FAILED, "Add input desc fail."); | |||||
GE_CHK_BOOL_EXEC(data_op->AddOutputDesc(tensor) == GRAPH_SUCCESS, return FAILED, "Add output desc fail."); | |||||
if (attr) { | |||||
GE_CHK_BOOL_EXEC(AttrUtils::SetInt(data_op, ATTR_NAME_INDEX, index), return FAILED, "Set index fail."); | |||||
GE_CHK_BOOL_EXEC(data_op->AddInputDesc(tensor) == GRAPH_SUCCESS, return FAILED, | |||||
"[Add][InputDesc]fail for node:%s", data_op->GetName().c_str()); | |||||
GE_CHK_BOOL_EXEC(data_op->AddOutputDesc(tensor) == GRAPH_SUCCESS, return FAILED, | |||||
"[Add][OutputDesc]fail for node:%s", data_op->GetName().c_str()); | |||||
if (attr && !is_const) { | |||||
GE_CHK_BOOL_EXEC(AttrUtils::SetInt(data_op, ATTR_NAME_INDEX, data_index), return FAILED, | |||||
"[Set][Attr:%s]fail for node:%s", ATTR_NAME_INDEX.c_str(), data_op->GetName().c_str()); | |||||
++data_index; | |||||
} | } | ||||
ge::NodePtr arg_node = graph->AddNode(data_op); | ge::NodePtr arg_node = graph->AddNode(data_op); | ||||
GE_CHK_BOOL_EXEC(arg_node != nullptr, return FAILED, "Insert Data node fail."); | |||||
GE_CHK_BOOL_EXEC(arg_node != nullptr, return FAILED, "Insert Data node fail"); | |||||
GE_CHK_STATUS(GraphUtils::AddEdge(arg_node->GetOutDataAnchor(0), node->GetInDataAnchor(index)), | GE_CHK_STATUS(GraphUtils::AddEdge(arg_node->GetOutDataAnchor(0), node->GetInDataAnchor(index)), | ||||
"Add edge[%s->%s] fail.", data_op->GetName().c_str(), node->GetName().c_str()); | |||||
"[Add][Edge]fail from node:%s to node:%s", data_op->GetName().c_str(), node->GetName().c_str()); | |||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
@@ -213,20 +228,23 @@ static Status AddOutputs(const ComputeGraphPtr &graph, const NodePtr &node, cons | |||||
for (const auto &out_desc : outputs) { | for (const auto &out_desc : outputs) { | ||||
GeTensorDesc tensor = out_desc.GetTensorDesc(); | GeTensorDesc tensor = out_desc.GetTensorDesc(); | ||||
TensorUtils::SetInputTensor(tensor, true); | TensorUtils::SetInputTensor(tensor, true); | ||||
GE_CHK_BOOL_EXEC(op_desc->AddInputDesc(tensor) == GRAPH_SUCCESS, return FAILED, "Add input desc fail"); | |||||
GE_CHK_BOOL_EXEC(op_desc->AddInputDesc(tensor) == GRAPH_SUCCESS, return FAILED, | |||||
"[Add][InputDesc]fail for node:%s", op_desc->GetName().c_str()); | |||||
TensorUtils::SetInputTensor(tensor, false); | TensorUtils::SetInputTensor(tensor, false); | ||||
TensorUtils::SetOutputTensor(tensor, true); | TensorUtils::SetOutputTensor(tensor, true); | ||||
GE_CHK_BOOL_EXEC(op_desc->AddOutputDesc(tensor) == GRAPH_SUCCESS, return FAILED, "Add output desc fail"); | |||||
GE_CHK_BOOL_EXEC(op_desc->AddOutputDesc(tensor) == GRAPH_SUCCESS, return FAILED, | |||||
"[Add][OutputDesc]fail for node:%s", op_desc->GetName().c_str()); | |||||
count++; | count++; | ||||
} | } | ||||
GE_CHECK_NOTNULL_EXEC(graph, return PARAM_INVALID); | GE_CHECK_NOTNULL_EXEC(graph, return PARAM_INVALID); | ||||
ge::NodePtr out_node = graph->AddNode(op_desc); | ge::NodePtr out_node = graph->AddNode(op_desc); | ||||
GE_CHK_BOOL_EXEC(out_node != nullptr, return FAILED, "Insert Output node fail."); | |||||
GE_CHK_BOOL_EXEC(out_node != nullptr, return FAILED, | |||||
"[Add][Node:%s]fail in graph:%u", op_desc->GetName().c_str(), graph->GetGraphID()); | |||||
GE_CHECK_NOTNULL_EXEC(node, return PARAM_INVALID); | GE_CHECK_NOTNULL_EXEC(node, return PARAM_INVALID); | ||||
for (int32_t i = 0; i < count; ++i) { | for (int32_t i = 0; i < count; ++i) { | ||||
GE_CHK_STATUS(GraphUtils::AddEdge(node->GetOutDataAnchor(i), out_node->GetInDataAnchor(i)), | GE_CHK_STATUS(GraphUtils::AddEdge(node->GetOutDataAnchor(i), out_node->GetInDataAnchor(i)), | ||||
"Add edge[%s->%s] fail.", node->GetName().c_str(), out_node->GetName().c_str()); | |||||
"[Add][Edge]fail from node:%s to node:%s", node->GetName().c_str(), out_node->GetName().c_str()); | |||||
} | } | ||||
return SUCCESS; | return SUCCESS; | ||||
@@ -283,13 +301,44 @@ static Status ResetTensorVecShape(const vector<GeTensor> &inputs, vector<GeTenso | |||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
static Status GetFuzzBuildAttrs(const OpDescPtr &op_desc, const GeRootModelPtr &ge_root_model, | |||||
GeAttrValue::LIST_NAMED_ATTRS &fuzz_build_attrs) { | |||||
GELOGD("Start get fuzz build attrs of %s.", op_desc->GetName().c_str()); | |||||
GE_CHECK_NOTNULL(ge_root_model->GetRootGraph()); | |||||
for (const auto &node : ge_root_model->GetRootGraph()->GetAllNodes()) { | |||||
GE_CHECK_NOTNULL(node); | |||||
GE_CHECK_NOTNULL(node->GetOpDesc()); | |||||
GELOGD("Delete fuzz build attr of %s after build.", node->GetName().c_str()); | |||||
node->GetOpDesc()->DelAttr(ATTR_NAME_FUZZ_BUILD); | |||||
} | |||||
(void)AttrUtils::GetListNamedAttrs(op_desc, ATTR_NAME_FUZZ_BUILD_RES_ATTRS, fuzz_build_attrs); | |||||
if (!fuzz_build_attrs.empty()) { | |||||
GELOGD("%s has split, get ATTR_NAME_FUZZ_BUILD_RES_ATTRS directly.", op_desc->GetName().c_str()); | |||||
return SUCCESS; | |||||
} else { | |||||
GELOGW("%s build with fuzz build pattern, but not set ATTR_NAME_FUZZ_BUILD_RES_ATTRS.", op_desc->GetName().c_str()); | |||||
} | |||||
return SUCCESS; | |||||
} | |||||
static bool HasShapeRange(const vector<GeTensor> &inputs) { | |||||
for (const auto &input : inputs) { | |||||
vector<pair<int64_t, int64_t>> shape_range; | |||||
(void)input.GetTensorDesc().GetShapeRange(shape_range); | |||||
if (!shape_range.empty()) { | |||||
GELOGD("Has set shape range."); | |||||
return true; | |||||
} | |||||
} | |||||
return false; | |||||
} | |||||
class GeGenerator::Impl { | class GeGenerator::Impl { | ||||
public: | public: | ||||
Impl(OmgContext &omg_context) : omg_context_(omg_context) {} | Impl(OmgContext &omg_context) : omg_context_(omg_context) {} | ||||
~Impl() = default; | ~Impl() = default; | ||||
Status BuildModel(const Graph &graph, const vector<GeTensor> &inputs, GeRootModelPtr &ge_models); | Status BuildModel(const Graph &graph, const vector<GeTensor> &inputs, GeRootModelPtr &ge_models); | ||||
Status SaveModel(const string &file_name_prefix, GeModelPtr &models, ModelBufferData &model); | Status SaveModel(const string &file_name_prefix, GeModelPtr &models, ModelBufferData &model); | ||||
Status SaveRootModel(const string &file_name_prefix, GeRootModelPtr &model, ModelBufferData &model_buff); | Status SaveRootModel(const string &file_name_prefix, GeRootModelPtr &model, ModelBufferData &model_buff); | ||||
@@ -554,6 +603,42 @@ bool GeGenerator::Impl::SetOmSystemInfo(AttrHolder &obj) { | |||||
return true; | return true; | ||||
} | } | ||||
Status GeGenerator::SetModelNameForDump(const GeRootModelPtr &ge_root_model) { | |||||
bool is_unknown_shape = false; | |||||
Status ret = ge_root_model->CheckIsUnknownShape(is_unknown_shape); | |||||
if (ret != SUCCESS) { | |||||
GELOGE(FAILED, "[Check][IsUnknownShape]Check root model is unknown shape failed, model id:%u", | |||||
ge_root_model->GetModelId()); | |||||
REPORT_CALL_ERROR("E19999", "Check root model is unknown shape failed, model id:%u", | |||||
ge_root_model->GetModelId()); | |||||
return FAILED; | |||||
} | |||||
GeModelPtr model_root = nullptr; | |||||
if (is_unknown_shape) { | |||||
model_root = MakeShared<GeModel>(); | |||||
GE_CHECK_NOTNULL(model_root); | |||||
model_root->SetGraph(GraphUtils::CreateGraphFromComputeGraph(ge_root_model->GetRootGraph())); | |||||
ge_root_model->SetSubgraphInstanceNameToModel(ge_root_model->GetRootGraph()->GetName(), model_root); | |||||
} | |||||
ModelHelper model_helper; | |||||
string model_name; | |||||
GE_CHECK_NOTNULL(ge_root_model->GetRootGraph()); | |||||
Status name_ret = model_helper.GetModelNameFromMergedGraphName(ge_root_model->GetRootGraph()->GetName(), | |||||
model_name); | |||||
if (name_ret != SUCCESS) { | |||||
ErrorManager::GetInstance().ATCReportErrMessage("E10000", {"parameter"}, {"output"}); | |||||
GELOGE(FAILED, "[Check][GetModelNameStep]Get model_name failed. Param --output is invalid, root graph name: %s", | |||||
ge_root_model->GetRootGraph()->GetName().c_str()); | |||||
return PARAM_INVALID; | |||||
} | |||||
map<string, GeModelPtr> name_to_ge_model = ge_root_model->GetSubgraphInstanceNameToModel(); | |||||
GeModelPtr &ge_model = name_to_ge_model[ge_root_model->GetRootGraph()->GetName()]; | |||||
GE_CHECK_NOTNULL(ge_model); | |||||
ge_model->SetName(model_name); | |||||
return SUCCESS; | |||||
} | |||||
Status GeGenerator::GenerateModel(const Graph &graph, const string &file_name_prefix, const vector<GeTensor> &inputs, | Status GeGenerator::GenerateModel(const Graph &graph, const string &file_name_prefix, const vector<GeTensor> &inputs, | ||||
ModelBufferData &model, bool is_offline) { | ModelBufferData &model, bool is_offline) { | ||||
rtContext_t ctx = nullptr; | rtContext_t ctx = nullptr; | ||||
@@ -588,20 +673,10 @@ Status GeGenerator::GenerateModel(const Graph &graph, const string &file_name_pr | |||||
} | } | ||||
GE_CHECK_NOTNULL(ge_root_model); | GE_CHECK_NOTNULL(ge_root_model); | ||||
GE_CHECK_NOTNULL(ge_root_model->GetRootGraph()); | |||||
ModelHelper model_helper; | |||||
string model_name = ""; | |||||
Status name_ret = model_helper.GetModelNameFromMergedGraphName(ge_root_model->GetRootGraph()->GetName(), | |||||
model_name); | |||||
if (name_ret != SUCCESS) { | |||||
ErrorManager::GetInstance().ATCReportErrMessage("E10000", {"parameter"}, {"output"}); | |||||
GELOGE(FAILED, "Get model_name failed. Param --output is invalid."); | |||||
return PARAM_INVALID; | |||||
ret = SetModelNameForDump(ge_root_model); | |||||
if (ret != SUCCESS) { | |||||
return ret; | |||||
} | } | ||||
map<string, GeModelPtr> name_to_ge_model = ge_root_model->GetSubgraphInstanceNameToModel(); | |||||
GeModelPtr &ge_model = name_to_ge_model[ge_root_model->GetRootGraph()->GetName()]; | |||||
GE_RETURN_WITH_LOG_IF_FALSE(ge_model != nullptr, "ge_model cannot be null"); | |||||
ge_model->SetName(model_name); | |||||
ret = impl_->SaveRootModel(file_name_prefix, ge_root_model, model); | ret = impl_->SaveRootModel(file_name_prefix, ge_root_model, model); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
GELOGE(ret, "Save model failed"); | GELOGE(ret, "Save model failed"); | ||||
@@ -654,6 +729,34 @@ namespace { | |||||
} | } | ||||
} | } | ||||
bool GeGenerator::CheckNoAicore(const ComputeGraphPtr &graph) { | |||||
for (const auto &node : graph->GetDirectNode()) { | |||||
if (node == nullptr) { | |||||
continue; | |||||
} | |||||
auto op_desc = node->GetOpDesc(); | |||||
if (op_desc == nullptr) { | |||||
continue; | |||||
} | |||||
if (op_desc->GetOpEngineName() == kAIcoreEngine) { | |||||
return false; | |||||
} | |||||
} | |||||
return true; | |||||
} | |||||
void GeGenerator::RemoveConst(const vector<GeTensor> &inputs, vector<GeTensor> &outputs) { | |||||
for (auto &input : inputs) { | |||||
GeTensorDesc input_desc = input.GetTensorDesc(); | |||||
bool is_const = false; | |||||
(void)AttrUtils::GetBool(input_desc, CONST_ATTR_NAME_INPUT, is_const); | |||||
bool is_optional = IsOptional(input_desc); | |||||
if (!is_optional && !is_const) { | |||||
outputs.emplace_back(input); | |||||
} | |||||
} | |||||
} | |||||
Status GeGenerator::CheckForSingleOp(OpDescPtr &op_desc, const vector<GeTensor> &inputs, | Status GeGenerator::CheckForSingleOp(OpDescPtr &op_desc, const vector<GeTensor> &inputs, | ||||
const vector<GeTensor> &outputs) { | const vector<GeTensor> &outputs) { | ||||
GE_CHECK_NOTNULL_EXEC(op_desc, return PARAM_INVALID); | GE_CHECK_NOTNULL_EXEC(op_desc, return PARAM_INVALID); | ||||
@@ -676,7 +779,8 @@ Status GeGenerator::CheckForSingleOp(OpDescPtr &op_desc, const vector<GeTensor> | |||||
Status GeGenerator::BuildSingleOp(OpDescPtr &op_desc, const vector<GeTensor> &inputs, const vector<GeTensor> &outputs, | Status GeGenerator::BuildSingleOp(OpDescPtr &op_desc, const vector<GeTensor> &inputs, const vector<GeTensor> &outputs, | ||||
const string &model_file_name, OpEngineType engine_type, ModelBufferData &model_buff, | const string &model_file_name, OpEngineType engine_type, ModelBufferData &model_buff, | ||||
bool is_offline) { | |||||
bool is_offline, int32_t compile_flag) { | |||||
GELOGD("Inputs size is %zu, outputs size is %zu.", inputs.size(), outputs.size()); | |||||
GE_CHECK_NOTNULL_EXEC(impl_, return PARAM_INVALID); | GE_CHECK_NOTNULL_EXEC(impl_, return PARAM_INVALID); | ||||
impl_->is_offline_ = is_offline; | impl_->is_offline_ = is_offline; | ||||
if (!is_offline) { | if (!is_offline) { | ||||
@@ -698,6 +802,16 @@ Status GeGenerator::BuildSingleOp(OpDescPtr &op_desc, const vector<GeTensor> &in | |||||
OpDescPtr op_desc_tmp = AttrUtils::CloneOpDesc(op_desc); | OpDescPtr op_desc_tmp = AttrUtils::CloneOpDesc(op_desc); | ||||
GE_CHECK_NOTNULL(op_desc_tmp); | GE_CHECK_NOTNULL(op_desc_tmp); | ||||
bool fuzz_compile_flag = false; | |||||
if (!HasShapeRange(inputs) && compile_flag == kFuzzBuildPattern) { | |||||
fuzz_compile_flag = true; | |||||
} | |||||
if (!AttrUtils::SetBool(op_desc, ATTR_NAME_FUZZ_BUILD, fuzz_compile_flag)) { | |||||
GELOGE(FAILED, "[Set][ATTR_NAME_FUZZ_BUILD] Failed to set attr for %s.", op_desc->GetName().c_str()); | |||||
return FAILED; | |||||
} | |||||
impl_->omg_context_.fuzz_compile_flag = fuzz_compile_flag; | |||||
// 1. Create ComputeGraph. | // 1. Create ComputeGraph. | ||||
string name = ge::CurrentTimeInStr() + "_" + model_file_name; | string name = ge::CurrentTimeInStr() + "_" + model_file_name; | ||||
Graph graph; | Graph graph; | ||||
@@ -710,7 +824,7 @@ Status GeGenerator::BuildSingleOp(OpDescPtr &op_desc, const vector<GeTensor> &in | |||||
auto node = comp_graph->FindNode(op_desc->GetName()); | auto node = comp_graph->FindNode(op_desc->GetName()); | ||||
Status ret = CheckEngineTypeSupport(node, engine_type); | Status ret = CheckEngineTypeSupport(node, engine_type); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
GELOGE(ret, "check engine type failed."); | |||||
GELOGE(ret, "[Check][EngineType]value:%d for node:%s not support", engine_type, node->GetName().c_str()); | |||||
return ret; | return ret; | ||||
} | } | ||||
} | } | ||||
@@ -718,7 +832,9 @@ Status GeGenerator::BuildSingleOp(OpDescPtr &op_desc, const vector<GeTensor> &in | |||||
GELOGI("ATC parser success in single op build."); | GELOGI("ATC parser success in single op build."); | ||||
GeRootModelPtr ge_root_model = nullptr; | GeRootModelPtr ge_root_model = nullptr; | ||||
GE_CHK_STATUS_RET_NOLOG(impl_->BuildModel(graph, inputs, ge_root_model)); | |||||
vector<GeTensor> data_inputs; | |||||
RemoveConst(inputs, data_inputs); | |||||
GE_CHK_STATUS_RET_NOLOG(impl_->BuildModel(graph, data_inputs, ge_root_model)); | |||||
map<string, GeAttrValue> op_attrs = op_desc_tmp->GetAllAttrs(); | map<string, GeAttrValue> op_attrs = op_desc_tmp->GetAllAttrs(); | ||||
GE_CHECK_NOTNULL(ge_root_model); | GE_CHECK_NOTNULL(ge_root_model); | ||||
GE_CHECK_NOTNULL(ge_root_model->GetRootGraph()); | GE_CHECK_NOTNULL(ge_root_model->GetRootGraph()); | ||||
@@ -734,7 +850,7 @@ Status GeGenerator::BuildSingleOp(OpDescPtr &op_desc, const vector<GeTensor> &in | |||||
bool all_shape = false; | bool all_shape = false; | ||||
(void)AttrUtils::GetBool(op_desc, kAicpuAllshape, all_shape); | (void)AttrUtils::GetBool(op_desc, kAicpuAllshape, all_shape); | ||||
if (all_shape) { | |||||
if (all_shape && CheckNoAicore(root_graph)) { | |||||
GELOGD("Get aicpu all_shape kernel!"); | GELOGD("Get aicpu all_shape kernel!"); | ||||
vector<GeTensor> inputs_dynamic; | vector<GeTensor> inputs_dynamic; | ||||
vector<GeTensor> outputs_dynamic; | vector<GeTensor> outputs_dynamic; | ||||
@@ -742,6 +858,19 @@ Status GeGenerator::BuildSingleOp(OpDescPtr &op_desc, const vector<GeTensor> &in | |||||
GE_CHK_STATUS_RET_NOLOG(ResetTensorVecShape(outputs, outputs_dynamic)); | GE_CHK_STATUS_RET_NOLOG(ResetTensorVecShape(outputs, outputs_dynamic)); | ||||
GE_CHK_STATUS_RET_NOLOG( | GE_CHK_STATUS_RET_NOLOG( | ||||
impl_->SaveParams(ge_model, op_desc_tmp->GetType(), op_attrs, inputs_dynamic, outputs_dynamic)); | impl_->SaveParams(ge_model, op_desc_tmp->GetType(), op_attrs, inputs_dynamic, outputs_dynamic)); | ||||
} else if (fuzz_compile_flag) { | |||||
GELOGD("Get fuzz build result of %s.", op_desc->GetName().c_str()); | |||||
(void)AttrUtils::SetInt(ge_model, ATTR_NAME_BUILD_MODE, fuzz_compile_flag); | |||||
GeAttrValue::LIST_NAMED_ATTRS fuzz_build_attrs; | |||||
if (GetFuzzBuildAttrs(op_desc, ge_root_model, fuzz_build_attrs) != SUCCESS) { | |||||
GELOGE(FAILED, "[Get][FuzzRet]Failed to get fuzz build result of %s.", op_desc->GetName().c_str()); | |||||
return FAILED; | |||||
} | |||||
if (!fuzz_build_attrs.empty()) { | |||||
GE_CHK_BOOL_EXEC(AttrUtils::SetListNamedAttrs(ge_model, ATTR_NAME_FUZZ_BUILD_RES_ATTRS, fuzz_build_attrs), | |||||
return FAILED, "Set ATTR_NAME_FUZZ_BUILD_RES_ATTRS failed."); | |||||
} | |||||
GE_CHK_STATUS_RET_NOLOG(impl_->SaveParams(ge_model, op_desc_tmp->GetType(), op_attrs, inputs, outputs)); | |||||
} else { | } else { | ||||
GE_CHK_STATUS_RET_NOLOG(impl_->SaveParams(ge_model, op_desc_tmp->GetType(), op_attrs, inputs, outputs)); | GE_CHK_STATUS_RET_NOLOG(impl_->SaveParams(ge_model, op_desc_tmp->GetType(), op_attrs, inputs, outputs)); | ||||
} | } | ||||
@@ -757,15 +886,17 @@ Status GeGenerator::BuildSingleOp(OpDescPtr &op_desc, const vector<GeTensor> &in | |||||
* @param [in] vector<GeTensor> &inputs: Operator input data description information. | * @param [in] vector<GeTensor> &inputs: Operator input data description information. | ||||
* @param [in] vector<GeTensor> &outputs: Operator output data description information. | * @param [in] vector<GeTensor> &outputs: Operator output data description information. | ||||
* @param [in] const string &model_file_name: Offline model filename. | * @param [in] const string &model_file_name: Offline model filename. | ||||
* @param [in] compile_flag: op build flag from atc | |||||
* @return SUCCESS handle successfully / others handle failed | * @return SUCCESS handle successfully / others handle failed | ||||
*/ | */ | ||||
Status GeGenerator::BuildSingleOpModel(OpDescPtr &op_desc, const vector<GeTensor> &inputs, | Status GeGenerator::BuildSingleOpModel(OpDescPtr &op_desc, const vector<GeTensor> &inputs, | ||||
const vector<GeTensor> &outputs, const string &model_file_name) { | |||||
const vector<GeTensor> &outputs, const string &model_file_name, | |||||
int32_t compile_flag) { | |||||
ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther); | ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther); | ||||
GELOGI("Start to build single op offline model, input size: %zu, output size: %zu", inputs.size(), outputs.size()); | GELOGI("Start to build single op offline model, input size: %zu, output size: %zu", inputs.size(), outputs.size()); | ||||
ModelBufferData model_buff; | ModelBufferData model_buff; | ||||
OpEngineType engine_type = ENGINE_SYS; | OpEngineType engine_type = ENGINE_SYS; | ||||
Status status = BuildSingleOp(op_desc, inputs, outputs, model_file_name, engine_type, model_buff, true); | |||||
Status status = BuildSingleOp(op_desc, inputs, outputs, model_file_name, engine_type, model_buff, true, compile_flag); | |||||
GELOGI("Finish build single offline model, status: %u", status); | GELOGI("Finish build single offline model, status: %u", status); | ||||
return status; | return status; | ||||
} | } | ||||
@@ -777,9 +908,11 @@ Status GeGenerator::BuildSingleOpModel(OpDescPtr &op_desc, const vector<GeTensor | |||||
* @param [in] vector<GeTensor> &inputs: Operator input data description information. | * @param [in] vector<GeTensor> &inputs: Operator input data description information. | ||||
* @param [in] vector<GeTensor> &outputs: Operator output data description information. | * @param [in] vector<GeTensor> &outputs: Operator output data description information. | ||||
* @param [in] engine_type: specific engine. | * @param [in] engine_type: specific engine. | ||||
* @param [in] compile_flag: op build flag, compile flag by acl | |||||
* @param [out] ModelBufferData &Model_buff: Model_buff: model buffer of the op. | * @param [out] ModelBufferData &Model_buff: Model_buff: model buffer of the op. | ||||
* @return SUCCESS handle successfully / others handle failed | * @return SUCCESS handle successfully / others handle failed | ||||
*/ | */ | ||||
Status GeGenerator::BuildSingleOpModel(OpDescPtr &op_desc, const vector<GeTensor> &inputs, | Status GeGenerator::BuildSingleOpModel(OpDescPtr &op_desc, const vector<GeTensor> &inputs, | ||||
const vector<GeTensor> &outputs, OpEngineType engine_type, | const vector<GeTensor> &outputs, OpEngineType engine_type, | ||||
ModelBufferData &model_buff) { | ModelBufferData &model_buff) { | ||||
@@ -790,6 +923,17 @@ Status GeGenerator::BuildSingleOpModel(OpDescPtr &op_desc, const vector<GeTensor | |||||
return status; | return status; | ||||
} | } | ||||
Status GeGenerator::BuildSingleOpModel(OpDescPtr &op_desc, const vector<GeTensor> &inputs, | |||||
const vector<GeTensor> &outputs, OpEngineType engine_type, int32_t compile_flag, | |||||
ModelBufferData &model_buff) { | |||||
ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther); | |||||
GELOGI("Start to build single op online, input size: %zu, output size: %zu", inputs.size(), outputs.size()); | |||||
Status status = BuildSingleOp(op_desc, inputs, outputs, kFileNameSuffix, engine_type, model_buff, false, | |||||
compile_flag); | |||||
GELOGI("Finish build single online model, status: %u", status); | |||||
return status; | |||||
} | |||||
Status GeGenerator::BuildSingleOpGraph(OpDescPtr &op_desc, const vector<GeTensor> &inputs, | Status GeGenerator::BuildSingleOpGraph(OpDescPtr &op_desc, const vector<GeTensor> &inputs, | ||||
const vector<GeTensor> &outputs, std::string graph_name, Graph &graph) { | const vector<GeTensor> &outputs, std::string graph_name, Graph &graph) { | ||||
ge::ComputeGraphPtr compute_graph = MakeShared<ComputeGraph>(graph_name); | ge::ComputeGraphPtr compute_graph = MakeShared<ComputeGraph>(graph_name); | ||||
@@ -801,18 +945,19 @@ Status GeGenerator::BuildSingleOpGraph(OpDescPtr &op_desc, const vector<GeTensor | |||||
// 2. Create InputData node. | // 2. Create InputData node. | ||||
int32_t arg_index = 0; | int32_t arg_index = 0; | ||||
int32_t data_index = 0; | |||||
if (inputs.empty()) { | if (inputs.empty()) { | ||||
for (const auto &input_desc : op_desc->GetAllInputsDescPtr()) { | for (const auto &input_desc : op_desc->GetAllInputsDescPtr()) { | ||||
GE_CHECK_NOTNULL_EXEC(input_desc, return INTERNAL_ERROR); | GE_CHECK_NOTNULL_EXEC(input_desc, return INTERNAL_ERROR); | ||||
if (!IsNeedConnectInputOpForSingleOp(*input_desc)) { | if (!IsNeedConnectInputOpForSingleOp(*input_desc)) { | ||||
continue; | continue; | ||||
} | } | ||||
GE_CHK_STATUS_RET_NOLOG(AddInputs(compute_graph, op_node, *input_desc, arg_index, false)); | |||||
GE_CHK_STATUS_RET_NOLOG(AddInputs(compute_graph, op_node, *input_desc, arg_index, false, data_index)); | |||||
arg_index++; | arg_index++; | ||||
} | } | ||||
} else { | } else { | ||||
for (const auto &in_desc : inputs) { | for (const auto &in_desc : inputs) { | ||||
GE_CHK_STATUS_RET_NOLOG(AddInputs(compute_graph, op_node, in_desc.GetTensorDesc(), arg_index, true)); | |||||
GE_CHK_STATUS_RET_NOLOG(AddInputs(compute_graph, op_node, in_desc.GetTensorDesc(), arg_index, true, data_index)); | |||||
arg_index++; | arg_index++; | ||||
} | } | ||||
} | } | ||||
@@ -871,13 +1016,12 @@ Status GeGenerator::Impl::SaveRootModel(const string &file_name_prefix, GeRootMo | |||||
"ge root model has no sub model") | "ge root model has no sub model") | ||||
GeModelPtr model_root = nullptr; | GeModelPtr model_root = nullptr; | ||||
if (is_unknown_shape) { | if (is_unknown_shape) { | ||||
model_root = make_shared<GeModel>(); | |||||
model_root->SetGraph(GraphUtils::CreateGraphFromComputeGraph(ge_root_model->GetRootGraph())); | |||||
ge_root_model->SetSubgraphInstanceNameToModel(ge_root_model->GetRootGraph()->GetName(), model_root); | |||||
model_root->SetName(ge_root_model->GetRootGraph()->GetName()); | |||||
auto name_to_ge_model = ge_root_model->GetSubgraphInstanceNameToModel(); | |||||
model_root = name_to_ge_model[ge_root_model->GetRootGraph()->GetName()]; | |||||
} else { | } else { | ||||
model_root = ge_root_model->GetSubgraphInstanceNameToModel().begin()->second; | model_root = ge_root_model->GetSubgraphInstanceNameToModel().begin()->second; | ||||
} | } | ||||
GE_CHECK_NOTNULL(model_root); | |||||
// set atc version | // set atc version | ||||
if (!SetAtcVersionInfo(*(model_root.get()))) { | if (!SetAtcVersionInfo(*(model_root.get()))) { | ||||
GELOGW("SetPackageVersionInfo of atc failed!"); | GELOGW("SetPackageVersionInfo of atc failed!"); | ||||
@@ -915,6 +1059,13 @@ Status GeGenerator::Impl::BuildModel(const Graph &graph, const vector<GeTensor> | |||||
static std::atomic<uint64_t> atomic_session_id(0); | static std::atomic<uint64_t> atomic_session_id(0); | ||||
auto session_id = atomic_session_id.fetch_add(1); | auto session_id = atomic_session_id.fetch_add(1); | ||||
// This is a temporary add for graph with variable | |||||
auto version = static_cast<int32_t>(SessionVersion::ClOUD_VERSION); | |||||
ret = VarManager::Instance(session_id)->Init(version, session_id, kDefaultDeviceId, kDefaultJobId); | |||||
GELOGI("Start init var instance, session_id %lu", session_id); | |||||
if (ret != SUCCESS) { | |||||
GELOGW("Failed init var instance, session_id %lu", session_id); | |||||
} | |||||
if (is_singleop_unregistered_) { | if (is_singleop_unregistered_) { | ||||
ret = graph_manager_.BuildGraphForUnregisteredOp(graph_id, inputs, ge_root_model, session_id); | ret = graph_manager_.BuildGraphForUnregisteredOp(graph_id, inputs, ge_root_model, session_id); | ||||
} else { | } else { | ||||
@@ -924,13 +1075,13 @@ Status GeGenerator::Impl::BuildModel(const Graph &graph, const vector<GeTensor> | |||||
ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther); | ErrorManager::GetInstance().SetStage(ErrorMessage::kModelCompile, ErrorMessage::kOther); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
GELOGE(GE_GENERATOR_GRAPH_MANAGER_BUILD_GRAPH_FAILED, "GraphManager build graph fail, graph id: %u", graph_id); | GELOGE(GE_GENERATOR_GRAPH_MANAGER_BUILD_GRAPH_FAILED, "GraphManager build graph fail, graph id: %u", graph_id); | ||||
VarManagerPool::Instance().RemoveVarManager(session_id); | |||||
return GE_GENERATOR_GRAPH_MANAGER_BUILD_GRAPH_FAILED; | |||||
ret = GE_GENERATOR_GRAPH_MANAGER_BUILD_GRAPH_FAILED; | |||||
} | } | ||||
RtContextUtil::GetInstance().DestroyRtContexts(session_id); | |||||
Analyzer::GetInstance()->DestroySessionJsonObject(session_id); | |||||
VarManagerPool::Instance().RemoveVarManager(session_id); | VarManagerPool::Instance().RemoveVarManager(session_id); | ||||
return SUCCESS; | |||||
return ret; | |||||
} | } | ||||
Status GeGenerator::Impl::GenerateInfershapeGraph(const Graph &graph) { | Status GeGenerator::Impl::GenerateInfershapeGraph(const Graph &graph) { | ||||
@@ -77,6 +77,8 @@ Status HandleSubgraphNode(NodePtr &src_node, OutDataAnchorPtr &src_out_anchor) { | |||||
Status HandleSubgraphDataNode(NodePtr &src_node, OutDataAnchorPtr &src_out_anchor) { | Status HandleSubgraphDataNode(NodePtr &src_node, OutDataAnchorPtr &src_out_anchor) { | ||||
uint32_t index = 0; | uint32_t index = 0; | ||||
if (!AttrUtils::GetInt(src_node->GetOpDesc(), ATTR_NAME_PARENT_NODE_INDEX, index)) { | if (!AttrUtils::GetInt(src_node->GetOpDesc(), ATTR_NAME_PARENT_NODE_INDEX, index)) { | ||||
REPORT_INNER_ERROR("E19999", "get attr:%s failed from node:%s", | |||||
ATTR_NAME_PARENT_NODE_INDEX.c_str(), src_node->GetName().c_str()); | |||||
GELOGE(FAILED, "Get attr ATTR_NAME_PARENT_NODE_INDEX failed, node:%s.", src_node->GetName().c_str()); | GELOGE(FAILED, "Get attr ATTR_NAME_PARENT_NODE_INDEX failed, node:%s.", src_node->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -109,6 +111,8 @@ Status GraphBuilder::CalcOpParam(const ge::ComputeGraphPtr &graph) { | |||||
GE_CHECK_NOTNULL(graph); | GE_CHECK_NOTNULL(graph); | ||||
auto instance_ptr = ge::GELib::GetInstance(); | auto instance_ptr = ge::GELib::GetInstance(); | ||||
if (instance_ptr == nullptr || !instance_ptr->InitFlag()) { | if (instance_ptr == nullptr || !instance_ptr->InitFlag()) { | ||||
REPORT_INNER_ERROR("E19999", "check gelib instance null, graph:%s", | |||||
graph->GetName().c_str()); | |||||
GELOGE(GE_CLI_GE_NOT_INITIALIZED, "GraphBuilder: GE is not initialized"); | GELOGE(GE_CLI_GE_NOT_INITIALIZED, "GraphBuilder: GE is not initialized"); | ||||
return GE_CLI_GE_NOT_INITIALIZED; | return GE_CLI_GE_NOT_INITIALIZED; | ||||
} | } | ||||
@@ -121,6 +125,8 @@ Status GraphBuilder::CalcOpParam(const ge::ComputeGraphPtr &graph) { | |||||
(void)instance_ptr->DNNEngineManagerObj().GetDNNEngineName(node_ptr); | (void)instance_ptr->DNNEngineManagerObj().GetDNNEngineName(node_ptr); | ||||
kernel_lib_name = node_ptr->GetOpDesc()->GetOpKernelLibName(); | kernel_lib_name = node_ptr->GetOpDesc()->GetOpKernelLibName(); | ||||
if (kernel_lib_name.empty()) { | if (kernel_lib_name.empty()) { | ||||
REPORT_INNER_ERROR("E19999", "op kernel lib is empty in node:%s(%s)", | |||||
node_ptr->GetName().c_str(), node_ptr->GetType().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Get node:%s(%s) kernel lib failed.", node_ptr->GetName().c_str(), | GELOGE(INTERNAL_ERROR, "Get node:%s(%s) kernel lib failed.", node_ptr->GetName().c_str(), | ||||
node_ptr->GetType().c_str()); | node_ptr->GetType().c_str()); | ||||
return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
@@ -129,12 +135,16 @@ Status GraphBuilder::CalcOpParam(const ge::ComputeGraphPtr &graph) { | |||||
auto ret = SetInputSize(node_ptr); | auto ret = SetInputSize(node_ptr); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Set node:%s(%s) inputDesc size failed", | |||||
node_ptr->GetName().c_str(), node_ptr->GetType().c_str()); | |||||
GELOGE(ret, "Set node inputDesc size failed, node name is %s", node_ptr->GetName().c_str()); | GELOGE(ret, "Set node inputDesc size failed, node name is %s", node_ptr->GetName().c_str()); | ||||
return ret; | return ret; | ||||
} | } | ||||
ret = OpsKernelBuilderManager::Instance().CalcOpRunningParam(*node_ptr); | ret = OpsKernelBuilderManager::Instance().CalcOpRunningParam(*node_ptr); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Call Calculate op:%s(%s) running param failed", | |||||
node_ptr->GetName().c_str(), node_ptr->GetType().c_str()); | |||||
GELOGE(ret, "Calculate op running param failed, node name is %s", node_ptr->GetName().c_str()); | GELOGE(ret, "Calculate op running param failed, node name is %s", node_ptr->GetName().c_str()); | ||||
return ret; | return ret; | ||||
} | } | ||||
@@ -191,6 +201,7 @@ Status GraphBuilder::UpdateParentNodeOutputSize(const ge::ComputeGraphPtr &graph | |||||
Status GraphBuilder::Build(ComputeGraphPtr &comp_graph, GeRootModelPtr &ge_root_model_ptr, uint64_t session_id) { | Status GraphBuilder::Build(ComputeGraphPtr &comp_graph, GeRootModelPtr &ge_root_model_ptr, uint64_t session_id) { | ||||
if (comp_graph == nullptr) { | if (comp_graph == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "check compute_graph nullptr, session_id:%lu", session_id); | |||||
GELOGE(GE_GRAPH_PARAM_NULLPTR, "Graph build comp_graph is null."); | GELOGE(GE_GRAPH_PARAM_NULLPTR, "Graph build comp_graph is null."); | ||||
return GE_GRAPH_PARAM_NULLPTR; | return GE_GRAPH_PARAM_NULLPTR; | ||||
} | } | ||||
@@ -302,6 +313,8 @@ Status GraphBuilder::SetConstantInputOffset(ComputeGraphPtr &comp_graph) { | |||||
std::vector<GeTensorPtr> weights = OpDescUtils::MutableWeights(peer_node); | std::vector<GeTensorPtr> weights = OpDescUtils::MutableWeights(peer_node); | ||||
if (weights.empty()) { | if (weights.empty()) { | ||||
REPORT_INNER_ERROR("E19999", "check weights size of node %s(%s) is empty", | |||||
node->GetName().c_str(), node->GetType().c_str()); | |||||
GELOGE(FAILED, "weights size of node %s is empty", node->GetName().c_str()); | GELOGE(FAILED, "weights size of node %s is empty", node->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -382,54 +395,6 @@ Status GraphBuilder::BuildForHostCpuGraph(ComputeGraphPtr &comp_graph, GeModelPt | |||||
return BuildForUnknownShapeGraph(comp_graph, ge_model_ptr, session_id); | return BuildForUnknownShapeGraph(comp_graph, ge_model_ptr, session_id); | ||||
} | } | ||||
static Status InsertMemcpyNode(const ComputeGraphPtr &graph, const OutDataAnchorPtr &out_anchor, | |||||
const std::vector<InDataAnchorPtr> &in_anchors, const std::string &name) { | |||||
GE_CHECK_NOTNULL(out_anchor); | |||||
NodePtr in_node = out_anchor->GetOwnerNode(); | |||||
GE_CHECK_NOTNULL(in_node); | |||||
OpDescBuilder op_desc_builder(name, MEMCPYADDRASYNC); | |||||
OpDescPtr op_desc = op_desc_builder.AddInput("x", in_node->GetOpDesc()->GetOutputDesc(0)) | |||||
.AddOutput("y", in_node->GetOpDesc()->GetOutputDesc(0)) | |||||
.Build(); | |||||
(void)AttrUtils::SetBool(op_desc, ATTR_NO_NEED_CONSTANT_FOLDING, false); | |||||
if (GraphUtils::InsertNodeAfter(out_anchor, in_anchors, graph->AddNode(op_desc)) != GRAPH_SUCCESS) { | |||||
GELOGE(FAILED, "Insert IDENTITY node %s after %s failed.", name.c_str(), in_node->GetName().c_str()); | |||||
return FAILED; | |||||
} | |||||
return SUCCESS; | |||||
} | |||||
static Status GenerateTaskForConstant(const std::shared_ptr<ComputeGraph> &graph) { | |||||
for (auto &node : graph->GetDirectNode()) { | |||||
// CONSTANT not generate task, so insert IDENTITY between CONSTANT and NETOUTPUT | |||||
auto op_desc = node->GetOpDesc(); | |||||
if (op_desc == nullptr) { | |||||
continue; | |||||
} | |||||
auto op_type = op_desc->GetType(); | |||||
if (op_type == NETOUTPUT) { | |||||
for (InDataAnchorPtr &in_data_anchor : node->GetAllInDataAnchors()) { | |||||
const OutDataAnchorPtr &peer_out_anchor = in_data_anchor->GetPeerOutAnchor(); | |||||
GE_IF_BOOL_EXEC(peer_out_anchor == nullptr, continue); | |||||
NodePtr in_node = peer_out_anchor->GetOwnerNode(); | |||||
GE_CHECK_NOTNULL(in_node); | |||||
std::string in_node_op_type = in_node->GetType(); | |||||
if (in_node_op_type == CONSTANT) { | |||||
GELOGD("Insert MemcpyAsync node between %s and %s.", in_node->GetName().c_str(), node->GetName().c_str()); | |||||
std::string name = node->GetName() + "_input_" + std::to_string(in_data_anchor->GetIdx()) + "_Memcpy"; | |||||
if (InsertMemcpyNode(graph, peer_out_anchor, {in_data_anchor}, name) != SUCCESS) { | |||||
GELOGE(FAILED, "Insert memcpy between %s and %s failed.", | |||||
in_node->GetName().c_str(), node->GetName().c_str()); | |||||
return FAILED; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
return SUCCESS; | |||||
} | |||||
Status GraphBuilder::MarkFpBpProfilingTaskAttr(ComputeGraphPtr &com_graph) { | Status GraphBuilder::MarkFpBpProfilingTaskAttr(ComputeGraphPtr &com_graph) { | ||||
bool original_unknown_shape_flag = com_graph->GetGraphUnknownFlag(); | bool original_unknown_shape_flag = com_graph->GetGraphUnknownFlag(); | ||||
com_graph->SetGraphUnknownFlag(false); | com_graph->SetGraphUnknownFlag(false); | ||||
@@ -466,6 +431,8 @@ Status GraphBuilder::MarkFpBpProfilingTaskAttr(ComputeGraphPtr &com_graph) { | |||||
GELOGI("The all reduce node of dynamic graph is %s, idx %u", op_desc->GetName().c_str(), node_index); | GELOGI("The all reduce node of dynamic graph is %s, idx %u", op_desc->GetName().c_str(), node_index); | ||||
(void)ge::AttrUtils::SetBool(op_desc, ATTR_NAME_INSERT_BP_PROFILILNG_TASK, true); | (void)ge::AttrUtils::SetBool(op_desc, ATTR_NAME_INSERT_BP_PROFILILNG_TASK, true); | ||||
GE_IF_BOOL_EXEC(TypeUtils::CheckUint64MulOverflow(i, kProfilingArStep), | GE_IF_BOOL_EXEC(TypeUtils::CheckUint64MulOverflow(i, kProfilingArStep), | ||||
REPORT_INNER_ERROR("E19999", "Multiply result is out of range when calc profiling ar log id " | |||||
"for node:%s(%s)", op_desc->GetName().c_str(), op_desc->GetType().c_str()); | |||||
GELOGE(FAILED, "Multiply result is out of range."); | GELOGE(FAILED, "Multiply result is out of range."); | ||||
return FAILED); | return FAILED); | ||||
int64_t log_id = i * kProfilingArStep + kProfilingArStartLogid; | int64_t log_id = i * kProfilingArStep + kProfilingArStartLogid; | ||||
@@ -512,9 +479,6 @@ Status GraphBuilder::BuildForDynamicShapeGraph(ComputeGraphPtr &comp_graph, | |||||
!sub_graph->GetParentGraph()->GetGraphUnknownFlag()) { | !sub_graph->GetParentGraph()->GetGraphUnknownFlag()) { | ||||
continue; | continue; | ||||
} | } | ||||
GE_CHK_STATUS_RET(GenerateTaskForConstant(sub_graph), "Generate task For constant node in subgraph failed."); | |||||
if (sub_graph->GetGraphUnknownFlag()) { | if (sub_graph->GetGraphUnknownFlag()) { | ||||
// unknown shape build flow | // unknown shape build flow | ||||
GE_CHK_STATUS_RET(BuildForUnknownShapeGraph(sub_graph, ge_model_ptr, session_id), | GE_CHK_STATUS_RET(BuildForUnknownShapeGraph(sub_graph, ge_model_ptr, session_id), | ||||
@@ -545,16 +509,19 @@ Status GraphBuilder::GetTaskInfo(const ge::ModelBuilder &builder, const ModelPtr | |||||
int64_t memory_size = 0; | int64_t memory_size = 0; | ||||
if (!AttrUtils::GetInt(model_ptr, ATTR_MODEL_MEMORY_SIZE, memory_size)) { | if (!AttrUtils::GetInt(model_ptr, ATTR_MODEL_MEMORY_SIZE, memory_size)) { | ||||
REPORT_INNER_ERROR("E19999", "Get Attr:%s fail in model", ATTR_MODEL_MEMORY_SIZE.c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Get memory size fail."); | GELOGE(INTERNAL_ERROR, "Get memory size fail."); | ||||
return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
} | } | ||||
int64_t p2p_memory_size = 0; | int64_t p2p_memory_size = 0; | ||||
if (!AttrUtils::GetInt(model_ptr, ATTR_MODEL_P2P_MEMORY_SIZE, p2p_memory_size)) { | if (!AttrUtils::GetInt(model_ptr, ATTR_MODEL_P2P_MEMORY_SIZE, p2p_memory_size)) { | ||||
REPORT_INNER_ERROR("E19999", "Get Attr:%s fail in model", ATTR_MODEL_P2P_MEMORY_SIZE.c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Get p2p memory size fail."); | GELOGE(INTERNAL_ERROR, "Get p2p memory size fail."); | ||||
return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
} | } | ||||
int64_t weight_size = 0; | int64_t weight_size = 0; | ||||
if (!AttrUtils::GetInt(model_ptr, ATTR_MODEL_WEIGHT_SIZE, weight_size)) { | if (!AttrUtils::GetInt(model_ptr, ATTR_MODEL_WEIGHT_SIZE, weight_size)) { | ||||
REPORT_INNER_ERROR("E19999", "Get Attr:%s fail in model", ATTR_MODEL_WEIGHT_SIZE.c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Get weight memory size fail."); | GELOGE(INTERNAL_ERROR, "Get weight memory size fail."); | ||||
return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
} | } | ||||
@@ -664,6 +631,7 @@ Status GraphBuilder::SetInputSize(const ge::NodePtr &node_ptr) { | |||||
Status GraphBuilder::UpdateDataInputSize(const ge::NodePtr &node_ptr) { | Status GraphBuilder::UpdateDataInputSize(const ge::NodePtr &node_ptr) { | ||||
const auto &op_desc = node_ptr->GetOpDesc(); | const auto &op_desc = node_ptr->GetOpDesc(); | ||||
if (op_desc == nullptr) { | if (op_desc == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "check op_desc is nullptr"); | |||||
GELOGE(FAILED, "Op desc is nullptr."); | GELOGE(FAILED, "Op desc is nullptr."); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -681,6 +649,8 @@ Status GraphBuilder::UpdateDataInputSize(const ge::NodePtr &node_ptr) { | |||||
int64_t real_dim_size = 0; | int64_t real_dim_size = 0; | ||||
ge::graphStatus graph_status = TensorUtils::GetTensorSizeInBytes(output_desc, real_dim_size); | ge::graphStatus graph_status = TensorUtils::GetTensorSizeInBytes(output_desc, real_dim_size); | ||||
if (graph_status != GRAPH_SUCCESS) { | if (graph_status != GRAPH_SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Get tensor size in bytes failed for op:%s(%s) index:0", | |||||
op_desc->GetName().c_str(), op_desc->GetType().c_str()); | |||||
GELOGE(FAILED, "Get tensor size in bytes failed."); | GELOGE(FAILED, "Get tensor size in bytes failed."); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -688,6 +658,8 @@ Status GraphBuilder::UpdateDataInputSize(const ge::NodePtr &node_ptr) { | |||||
ge::GeTensorDesc input_desc = op_desc->GetInputDesc(0); | ge::GeTensorDesc input_desc = op_desc->GetInputDesc(0); | ||||
ge::TensorUtils::SetSize(input_desc, real_dim_size); | ge::TensorUtils::SetSize(input_desc, real_dim_size); | ||||
if (op_desc->UpdateInputDesc(0, input_desc) != GRAPH_SUCCESS) { | if (op_desc->UpdateInputDesc(0, input_desc) != GRAPH_SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Update input desc size failed for op:%s(%s) index:0", | |||||
op_desc->GetName().c_str(), op_desc->GetType().c_str()); | |||||
GELOGE(FAILED, "Update input desc size failed."); | GELOGE(FAILED, "Update input desc size failed."); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -716,6 +688,8 @@ Status GraphBuilder::CalcDynShapeRootGraphDataSize(const ge::OpDescPtr &op_desc) | |||||
int64_t real_dim_size = 0; | int64_t real_dim_size = 0; | ||||
ge::graphStatus graph_status = TensorUtils::GetTensorSizeInBytes(output_desc, real_dim_size); | ge::graphStatus graph_status = TensorUtils::GetTensorSizeInBytes(output_desc, real_dim_size); | ||||
if (graph_status != GRAPH_SUCCESS) { | if (graph_status != GRAPH_SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Get tensor size in bytes failed for op:%s(%s) index:0 ", | |||||
op_desc->GetName().c_str(), op_desc->GetType().c_str()); | |||||
GELOGE(FAILED, "Get tensor size in bytes failed."); | GELOGE(FAILED, "Get tensor size in bytes failed."); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -723,6 +697,8 @@ Status GraphBuilder::CalcDynShapeRootGraphDataSize(const ge::OpDescPtr &op_desc) | |||||
ge::TensorUtils::SetSize(output_desc, real_dim_size); | ge::TensorUtils::SetSize(output_desc, real_dim_size); | ||||
GELOGI("Update dynamic shape graph data output size to [%ld].", real_dim_size); | GELOGI("Update dynamic shape graph data output size to [%ld].", real_dim_size); | ||||
if (op_desc->UpdateOutputDesc(0, output_desc) != GRAPH_SUCCESS) { | if (op_desc->UpdateOutputDesc(0, output_desc) != GRAPH_SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Update output desc size failed for op:%s(%s) index:0 ", | |||||
op_desc->GetName().c_str(), op_desc->GetType().c_str()); | |||||
GELOGE(FAILED, "Update dynamic shape graph data output desc size failed."); | GELOGE(FAILED, "Update dynamic shape graph data output desc size failed."); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -740,6 +716,8 @@ Status GraphBuilder::SecondPartition(ge::ComputeGraphPtr &comp_graph) { | |||||
GE_CHK_STATUS_RET(ret, "Graph partition Failed."); | GE_CHK_STATUS_RET(ret, "Graph partition Failed."); | ||||
const auto &graph_2_subgraphlist = graph_partitioner_.GetSubGraphMap(); | const auto &graph_2_subgraphlist = graph_partitioner_.GetSubGraphMap(); | ||||
if (graph_2_subgraphlist.find(comp_graph) == graph_2_subgraphlist.end()) { | if (graph_2_subgraphlist.find(comp_graph) == graph_2_subgraphlist.end()) { | ||||
REPORT_INNER_ERROR("E19999", "find subgraphlis in graph:%s failed", | |||||
comp_graph->GetName().c_str()); | |||||
GELOGE(FAILED, "Find subgraph failed."); | GELOGE(FAILED, "Find subgraph failed."); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -768,6 +746,9 @@ Status GraphBuilder::AddOutputMemTypeForNode(const NodePtr &node) { | |||||
mem_type); | mem_type); | ||||
if (!AttrUtils::SetInt(src_desc->MutableOutputDesc(src_out_anchor->GetIdx()), ATTR_OUTPUT_MEMORY_TYPE, | if (!AttrUtils::SetInt(src_desc->MutableOutputDesc(src_out_anchor->GetIdx()), ATTR_OUTPUT_MEMORY_TYPE, | ||||
mem_type)) { | mem_type)) { | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s for node:%s(%s) out_index:%u failed", | |||||
ATTR_OUTPUT_MEMORY_TYPE.c_str(), src_desc->GetName().c_str(), src_desc->GetType().c_str(), | |||||
src_out_anchor->GetIdx()); | |||||
GELOGE(INTERNAL_ERROR, "Set out_memory_type attr for [%s:%d] failed.", src_desc->GetName().c_str(), | GELOGE(INTERNAL_ERROR, "Set out_memory_type attr for [%s:%d] failed.", src_desc->GetName().c_str(), | ||||
src_out_anchor->GetIdx()); | src_out_anchor->GetIdx()); | ||||
return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
@@ -28,6 +28,7 @@ LabelAllocator::LabelAllocator(const ComputeGraphPtr &graph) : compute_graph_(gr | |||||
Status LabelAllocator::AssignFunctionalLabels() { | Status LabelAllocator::AssignFunctionalLabels() { | ||||
if (compute_graph_ == nullptr) { | if (compute_graph_ == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "check param compute_graph nullptr"); | |||||
GELOGE(INTERNAL_ERROR, "ComputeGraph not set, Assign labels failed."); | GELOGE(INTERNAL_ERROR, "ComputeGraph not set, Assign labels failed."); | ||||
return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
} | } | ||||
@@ -46,11 +47,15 @@ Status LabelAllocator::AssignFunctionalLabels() { | |||||
for (auto node : functional_nodes) { | for (auto node : functional_nodes) { | ||||
LabelMakerPtr maker = LabelMakerFactory::Instance().Create(node->GetType(), compute_graph_, node); | LabelMakerPtr maker = LabelMakerFactory::Instance().Create(node->GetType(), compute_graph_, node); | ||||
if (maker == nullptr) { | if (maker == nullptr) { | ||||
REPORT_CALL_ERROR("E19999", "Check Node:%s(%s) label maker not registed", | |||||
node->GetName().c_str(), node->GetType().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Node: %s label maker not registed.", node->GetType().c_str()); | GELOGE(INTERNAL_ERROR, "Node: %s label maker not registed.", node->GetType().c_str()); | ||||
return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
} | } | ||||
if (maker->Run(label_index) != SUCCESS) { | if (maker->Run(label_index) != SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Node:%s(%s) run label maker failed", | |||||
node->GetName().c_str(), node->GetType().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Node: %s run label maker failed.", node->GetType().c_str()); | GELOGE(INTERNAL_ERROR, "Node: %s run label maker failed.", node->GetType().c_str()); | ||||
return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
} | } | ||||
@@ -63,6 +68,7 @@ Status LabelAllocator::AssignFunctionalLabels() { | |||||
bool LabelAllocator::CollectFunctionalNode(ComputeGraphPtr &graph, std::set<NodePtr> &functional_nodes) { | bool LabelAllocator::CollectFunctionalNode(ComputeGraphPtr &graph, std::set<NodePtr> &functional_nodes) { | ||||
if (graph == nullptr) { | if (graph == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "check param compute_graph nullptr"); | |||||
GELOGE(INTERNAL_ERROR, "Sub ComputeGraph is null."); | GELOGE(INTERNAL_ERROR, "Sub ComputeGraph is null."); | ||||
return false; | return false; | ||||
} | } | ||||
@@ -74,12 +80,16 @@ bool LabelAllocator::CollectFunctionalNode(ComputeGraphPtr &graph, std::set<Node | |||||
NodePtr func_node = graph->GetParentNode(); | NodePtr func_node = graph->GetParentNode(); | ||||
if (func_node == nullptr) { | if (func_node == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "Parent node not set in node:%s(%s), graph:%s", | |||||
func_node->GetName().c_str(), func_node->GetType().c_str(), graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Parent functional node not set: %s.", graph->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "Parent functional node not set: %s.", graph->GetName().c_str()); | ||||
return false; | return false; | ||||
} | } | ||||
ComputeGraphPtr owner_graph = func_node->GetOwnerComputeGraph(); | ComputeGraphPtr owner_graph = func_node->GetOwnerComputeGraph(); | ||||
if (owner_graph == nullptr) { | if (owner_graph == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "ComputeGraph owner not set in node:%s(%s), graph:%s", | |||||
func_node->GetName().c_str(), func_node->GetType().c_str(), graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "ComputeGraph owner not set: %s.", func_node->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "ComputeGraph owner not set: %s.", func_node->GetName().c_str()); | ||||
return false; | return false; | ||||
} | } | ||||
@@ -33,13 +33,21 @@ using std::queue; | |||||
namespace ge { | namespace ge { | ||||
LogicalStreamPass::LogicalStreamPass(const string &name) : name_(name) {} | LogicalStreamPass::LogicalStreamPass(const string &name) : name_(name) {} | ||||
const string &LogicalStreamPass::GetName() const { return name_; } | |||||
const string &LogicalStreamPass::GetName() const { | |||||
return name_; | |||||
} | |||||
bool LogicalStreamPass::IsEngineSkip(const Subgraph &subgraph) const { return subgraph.engine_conf.skip_assign_stream; } | |||||
bool LogicalStreamPass::IsEngineSkip(const Subgraph &subgraph) const { | |||||
return subgraph.engine_conf.skip_assign_stream; | |||||
} | |||||
bool LogicalStreamPass::IsEngineAttach(const Subgraph &subgraph) const { return subgraph.engine_conf.attach; } | |||||
bool LogicalStreamPass::IsEngineAttach(const Subgraph &subgraph) const { | |||||
return subgraph.engine_conf.attach; | |||||
} | |||||
bool LogicalStreamPass::IsEngineIndependent(const Subgraph &subgraph) const { return subgraph.engine_conf.independent; } | |||||
bool LogicalStreamPass::IsEngineIndependent(const Subgraph &subgraph) const { | |||||
return subgraph.engine_conf.independent; | |||||
} | |||||
bool LogicalStreamPass::HasStreamLabel(const Subgraph &subgraph) const { | bool LogicalStreamPass::HasStreamLabel(const Subgraph &subgraph) const { | ||||
return !subgraph.subgraph_info.GetStreamLabel().empty(); | return !subgraph.subgraph_info.GetStreamLabel().empty(); | ||||
@@ -60,14 +68,14 @@ Status AssignByLabelPass::Run(ComputeGraphPtr graph, const vector<SubgraphPtr> & | |||||
// Subgraphs of the same stream_label are assigned to the same stream, | // Subgraphs of the same stream_label are assigned to the same stream, | ||||
// and different stream_labels are assigned new streams. | // and different stream_labels are assigned new streams. | ||||
auto iter = label_streams.find(stream_label); | auto iter = label_streams.find(stream_label); | ||||
if (iter != label_streams.end()) { | |||||
subgraph->stream_id = iter->second; | |||||
} else { | |||||
if (iter == label_streams.end()) { | |||||
subgraph->stream_id = next_stream; | subgraph->stream_id = next_stream; | ||||
GELOGI("Assign new stream %ld for label %s.", next_stream, stream_label.c_str()); | |||||
GELOGI("[Assign][NewStreamId] %ld for label %s.", next_stream, stream_label.c_str()); | |||||
label_streams.emplace(stream_label, next_stream); | label_streams.emplace(stream_label, next_stream); | ||||
++next_stream; | |||||
next_stream++; | |||||
} else { | |||||
subgraph->stream_id = iter->second; | |||||
} | } | ||||
changed = true; | changed = true; | ||||
} | } | ||||
@@ -92,15 +100,15 @@ Status IndependentStreamPass::Run(ComputeGraphPtr graph, const vector<SubgraphPt | |||||
const string &stream_label = subgraph->subgraph_info.GetStreamLabel(); | const string &stream_label = subgraph->subgraph_info.GetStreamLabel(); | ||||
auto &label_streams = engine_streams[engine]; | auto &label_streams = engine_streams[engine]; | ||||
auto iter = label_streams.find(stream_label); | auto iter = label_streams.find(stream_label); | ||||
if (iter != label_streams.end()) { | |||||
subgraph->stream_id = iter->second; | |||||
} else { | |||||
if (iter == label_streams.end()) { | |||||
subgraph->stream_id = next_stream; | subgraph->stream_id = next_stream; | ||||
GELOGI("Assign new independent stream %ld for engine %s (label: %s).", next_stream, engine.c_str(), | |||||
GELOGI("[Assign][NewStreamId:independent] %ld for engine %s (label: %s).", next_stream, engine.c_str(), | |||||
stream_label.c_str()); | stream_label.c_str()); | ||||
label_streams.emplace(stream_label, next_stream); | label_streams.emplace(stream_label, next_stream); | ||||
++next_stream; | |||||
next_stream++; | |||||
} else { | |||||
subgraph->stream_id = iter->second; | |||||
} | } | ||||
changed = true; | changed = true; | ||||
} | } | ||||
@@ -121,14 +129,16 @@ Status AssignByDependencyPass::Run(ComputeGraphPtr graph, const vector<SubgraphP | |||||
} | } | ||||
SubgraphPtr reusable_subgraph = GetReusableSubgraph(subgraph, end_subgraph_map, pld_subgraph_map); | SubgraphPtr reusable_subgraph = GetReusableSubgraph(subgraph, end_subgraph_map, pld_subgraph_map); | ||||
if (reusable_subgraph != nullptr) { | |||||
if (reusable_subgraph == nullptr) { | |||||
(void)AssignNewStream(subgraph); | |||||
} else { | |||||
if (HasAssignedStream(*reusable_subgraph)) { | if (HasAssignedStream(*reusable_subgraph)) { | ||||
subgraph->stream_id = reusable_subgraph->stream_id; | subgraph->stream_id = reusable_subgraph->stream_id; | ||||
} else { | } else { | ||||
int64_t stream_id = AssignNewStream(reusable_subgraph); | int64_t stream_id = AssignNewStream(reusable_subgraph); | ||||
subgraph->stream_id = stream_id; | subgraph->stream_id = stream_id; | ||||
GELOGI("Reusable subgraph %s has not been assigned a stream, now assign new stream %ld.", | |||||
reusable_subgraph->name.c_str(), stream_id); | |||||
GELOGI("[Assign][NewStreamId] %ld for Reusable subgraph %s cause has not been assigned before.", | |||||
stream_id, reusable_subgraph->name.c_str()); | |||||
} | } | ||||
if (reusable_subgraph->reused_subgraph != nullptr) { | if (reusable_subgraph->reused_subgraph != nullptr) { | ||||
@@ -137,11 +147,10 @@ Status AssignByDependencyPass::Run(ComputeGraphPtr graph, const vector<SubgraphP | |||||
subgraph->reused_subgraph = reusable_subgraph; | subgraph->reused_subgraph = reusable_subgraph; | ||||
reused_subgraphs_.emplace_back(subgraph, reusable_subgraph); | reused_subgraphs_.emplace_back(subgraph, reusable_subgraph); | ||||
GELOGI("Subgraph %s of engine %s reuses stream of subgraph %s of engine %s.", subgraph->name.c_str(), | |||||
GELOGI("[Reuse][Stream]Subgraph %s of engine %s reuses stream of subgraph %s of engine %s.", | |||||
subgraph->name.c_str(), | |||||
subgraph->engine_conf.id.c_str(), reusable_subgraph->name.c_str(), | subgraph->engine_conf.id.c_str(), reusable_subgraph->name.c_str(), | ||||
reusable_subgraph->engine_conf.id.c_str()); | reusable_subgraph->engine_conf.id.c_str()); | ||||
} else { | |||||
(void)AssignNewStream(subgraph); | |||||
} | } | ||||
changed = true; | changed = true; | ||||
} | } | ||||
@@ -191,13 +200,15 @@ bool AssignByDependencyPass::CouldReuse(const SubgraphPtr &subgraph, const Subgr | |||||
auto iter = pld_subgraph_map.find(end_pld_pair.second); | auto iter = pld_subgraph_map.find(end_pld_pair.second); | ||||
if (iter != pld_subgraph_map.end()) { | if (iter != pld_subgraph_map.end()) { | ||||
const SubgraphPtr &pred_subgraph_succ = iter->second; | const SubgraphPtr &pred_subgraph_succ = iter->second; | ||||
if (pred_subgraph_succ != subgraph && pred_subgraph_succ->engine_conf.id == pred_subgraph->engine_conf.id) { | |||||
if ((pred_subgraph_succ != subgraph) && | |||||
(pred_subgraph_succ->engine_conf.id == pred_subgraph->engine_conf.id)) { | |||||
return false; | return false; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
if ((subgraph->engine_conf.id == pred_subgraph->engine_conf.id) || IsEngineAttach(*subgraph)) { | |||||
if ((subgraph->engine_conf.id == pred_subgraph->engine_conf.id) || | |||||
IsEngineAttach(*subgraph)) { | |||||
return true; | return true; | ||||
} | } | ||||
@@ -249,7 +260,7 @@ int64_t AssignByDependencyPass::AssignNewStream(SubgraphPtr subgraph) { | |||||
engine_stream_num_[engine_name] = stream_id + 1; | engine_stream_num_[engine_name] = stream_id + 1; | ||||
} | } | ||||
GELOGI("Subgraph %s assigns new temp stream %ld (engine: %s).", subgraph->name.c_str(), stream_id, | |||||
GELOGI("[Assign][NewStreamId:temp]id:%ld for Subgraph %s (engine: %s).", stream_id, subgraph->name.c_str(), | |||||
engine_name.c_str()); | engine_name.c_str()); | ||||
return stream_id; | return stream_id; | ||||
@@ -282,7 +293,7 @@ void AssignByDependencyPass::UpdateAssignedSubgraphs(Context &context) { | |||||
GELOGI("Subgraph %s of engine %s reuses default stream %ld.", subgraph->name.c_str(), | GELOGI("Subgraph %s of engine %s reuses default stream %ld.", subgraph->name.c_str(), | ||||
subgraph->engine_conf.id.c_str(), context.default_stream); | subgraph->engine_conf.id.c_str(), context.default_stream); | ||||
} else { | } else { | ||||
GELOGI("Stream of subgraph %s has been updated to %ld.", subgraph->name.c_str(), subgraph->stream_id); | |||||
GELOGI("[Update][StreamId]id:%ld for subgraph %s.", subgraph->stream_id, subgraph->name.c_str()); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -293,7 +304,7 @@ void AssignByDependencyPass::UpdateReusedSubgraphs() { | |||||
auto &cur_subgraph = item.first; | auto &cur_subgraph = item.first; | ||||
auto &reused_graph = item.second; | auto &reused_graph = item.second; | ||||
cur_subgraph->stream_id = reused_graph->stream_id; | cur_subgraph->stream_id = reused_graph->stream_id; | ||||
GELOGI("Stream of subgraph %s has been updated to %ld.", cur_subgraph->name.c_str(), cur_subgraph->stream_id); | |||||
GELOGI("[Update][StreamId]id:%ld for subgraph %s.", cur_subgraph->stream_id, cur_subgraph->name.c_str()); | |||||
} | } | ||||
} | } | ||||
@@ -309,6 +320,8 @@ Status SingleStreamPass::Run(ComputeGraphPtr graph, const vector<SubgraphPtr> &s | |||||
if (!HasAssignedStream(*subgraph)) { | if (!HasAssignedStream(*subgraph)) { | ||||
const string &stream_label = subgraph->subgraph_info.GetStreamLabel(); | const string &stream_label = subgraph->subgraph_info.GetStreamLabel(); | ||||
if (!stream_label.empty()) { | if (!stream_label.empty()) { | ||||
REPORT_INNER_ERROR("E19999", "Stream labels are not supported in SingleStream mode " | |||||
"(subgraph: %s, stream label: %s)", subgraph->name.c_str(), stream_label.c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Stream labels are not supported (subgraph: %s, stream label: %s).", | GELOGE(INTERNAL_ERROR, "Stream labels are not supported (subgraph: %s, stream label: %s).", | ||||
subgraph->name.c_str(), stream_label.c_str()); | subgraph->name.c_str(), stream_label.c_str()); | ||||
return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
@@ -326,11 +339,13 @@ Status NodeStreamUpdatePass::Run(ComputeGraphPtr graph, const vector<SubgraphPtr | |||||
const string &engine_name = subgraph->engine_conf.id; | const string &engine_name = subgraph->engine_conf.id; | ||||
if (!IsEngineSkip(*subgraph) && !HasAssignedStream(*subgraph)) { | if (!IsEngineSkip(*subgraph) && !HasAssignedStream(*subgraph)) { | ||||
REPORT_INNER_ERROR("E19999", "Subgraph %s has not yet been assigned a stream (engine: %s)", | |||||
subgraph->name.c_str(), engine_name.c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Subgraph %s has not yet been assigned a stream (engine: %s).", subgraph->name.c_str(), | GELOGE(INTERNAL_ERROR, "Subgraph %s has not yet been assigned a stream (engine: %s).", subgraph->name.c_str(), | ||||
engine_name.c_str()); | engine_name.c_str()); | ||||
return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
} else { | } else { | ||||
GELOGI("Subgraph %s is assigned stream %ld (engine: %s).", subgraph->name.c_str(), subgraph->stream_id, | |||||
GELOGI("[Assign][StreamId] %ld for Subgraph %s (engine: %s).", subgraph->stream_id, subgraph->name.c_str(), | |||||
engine_name.c_str()); | engine_name.c_str()); | ||||
} | } | ||||
} | } | ||||
@@ -353,12 +368,12 @@ Status NodeStreamUpdatePass::Run(ComputeGraphPtr graph, const vector<SubgraphPtr | |||||
GELOGD("Node %s of type %s in subgraph %s is assigned parent stream %ld (engine: %s).", node->GetName().c_str(), | GELOGD("Node %s of type %s in subgraph %s is assigned parent stream %ld (engine: %s).", node->GetName().c_str(), | ||||
node->GetType().c_str(), subgraph->name.c_str(), context.default_stream, engine_name.c_str()); | node->GetType().c_str(), subgraph->name.c_str(), context.default_stream, engine_name.c_str()); | ||||
} else if (IsEngineSkip(*subgraph) && node->GetInNodes().empty()) { | } else if (IsEngineSkip(*subgraph) && node->GetInNodes().empty()) { | ||||
GELOGD("Node %s of type %s in subgraph %s doesn't need to assign a stream (engine: %s).", | |||||
GELOGD("[Skip][StreamIdAssign]Node %s of type %s in subgraph %s doesn't need (engine: %s).", | |||||
node->GetName().c_str(), node->GetType().c_str(), subgraph->name.c_str(), engine_name.c_str()); | node->GetName().c_str(), node->GetType().c_str(), subgraph->name.c_str(), engine_name.c_str()); | ||||
} else { | } else { | ||||
node->GetOpDesc()->SetStreamId(stream_id); | node->GetOpDesc()->SetStreamId(stream_id); | ||||
GELOGD("Node %s of type %s in subgraph %s is assigned stream %ld (engine: %s).", node->GetName().c_str(), | |||||
node->GetType().c_str(), subgraph->name.c_str(), stream_id, engine_name.c_str()); | |||||
GELOGD("[Assign][StreamId]id:%ld for Node %s of type %s in subgraph %s (engine: %s).", stream_id, | |||||
node->GetName().c_str(), node->GetType().c_str(), subgraph->name.c_str(), engine_name.c_str()); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -366,6 +381,48 @@ Status NodeStreamUpdatePass::Run(ComputeGraphPtr graph, const vector<SubgraphPtr | |||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
Status UpdateForParallelGroupPass::Run(ComputeGraphPtr graph, const vector<SubgraphPtr> &subgraphs, Context &context) { | |||||
std::map<int, vector<OpDescPtr>> stream_op_map; | |||||
for (const SubgraphPtr &subgraph : subgraphs) { | |||||
auto compute_graph = subgraph->subgraph_info.GetSubGraph(); | |||||
for (const NodePtr &node : compute_graph->GetDirectNode()) { | |||||
OpDescPtr op_desc = node->GetOpDesc(); | |||||
GE_CHECK_NOTNULL(op_desc); | |||||
if (op_desc->HasAttr(ATTR_NAME_PARALLEL_GROUP)) { | |||||
int64_t op_desc_stream_id = op_desc->GetStreamId(); | |||||
stream_op_map[op_desc_stream_id].push_back(op_desc); | |||||
} | |||||
} | |||||
} | |||||
for (const auto &itr : stream_op_map) { | |||||
if (itr.first == kInvalidStream) { | |||||
continue; | |||||
} | |||||
std::map<std::string, int64_t> group_2_stream_id; | |||||
for (const auto &op_desc : itr.second) { | |||||
std::string group_name; | |||||
if (!AttrUtils::GetStr(op_desc, ATTR_NAME_PARALLEL_GROUP, group_name)) { | |||||
GELOGE(FAILED, "[GetAttr][OpDesc]Get node %s ATTR_NAME_PARALLEL_GROUP failed.", op_desc->GetName().c_str()); | |||||
REPORT_INNER_ERROR("E19999", "Get node %s ATTR_NAME_PARALLEL_GROUP failed.", op_desc->GetName().c_str()); | |||||
return FAILED; | |||||
} | |||||
const auto &itr = group_2_stream_id.find(group_name); | |||||
int64_t new_stream_id = kInvalidStream; | |||||
int64_t old_stream_id = op_desc->GetStreamId(); | |||||
if (itr != group_2_stream_id.end()) { | |||||
new_stream_id = itr->second; | |||||
} else { | |||||
new_stream_id = context.next_stream++; | |||||
group_2_stream_id[group_name] = new_stream_id; | |||||
} | |||||
op_desc->SetStreamId(new_stream_id); | |||||
GELOGD("Node %s assigned stream %ld from stream %ld.", | |||||
op_desc->GetName().c_str(), new_stream_id, old_stream_id); | |||||
} | |||||
} | |||||
return SUCCESS; | |||||
} | |||||
int64_t UpdateForSkippedEnginePass::GetSingleInoutStream(const NodePtr &node) const { | int64_t UpdateForSkippedEnginePass::GetSingleInoutStream(const NodePtr &node) const { | ||||
set<int64_t> stream_ids; | set<int64_t> stream_ids; | ||||
@@ -387,8 +444,8 @@ int64_t UpdateForSkippedEnginePass::GetSingleInoutStream(const NodePtr &node) co | |||||
if (stream_ids.size() == 1) { | if (stream_ids.size() == 1) { | ||||
int64_t stream_id = *(stream_ids.begin()); | int64_t stream_id = *(stream_ids.begin()); | ||||
GELOGI("The stream of all input and output nodes of node %s (type: %s) is %ld.", node->GetName().c_str(), | |||||
node->GetType().c_str(), stream_id); | |||||
GELOGI("[Get][SingleStreamId]The stream of all input and output nodes of node %s (type: %s) is %ld.", | |||||
node->GetName().c_str(), node->GetType().c_str(), stream_id); | |||||
return stream_id; | return stream_id; | ||||
} | } | ||||
@@ -406,7 +463,7 @@ Status UpdateForSkippedEnginePass::Run(ComputeGraphPtr graph, const vector<Subgr | |||||
auto op_desc = node->GetOpDesc(); | auto op_desc = node->GetOpDesc(); | ||||
GE_CHECK_NOTNULL(op_desc); | GE_CHECK_NOTNULL(op_desc); | ||||
auto stream_id = op_desc->GetStreamId(); | auto stream_id = op_desc->GetStreamId(); | ||||
if (stream_id != kInvalidStream && !HasStreamLabel(*subgraph)) { | |||||
if ((stream_id != kInvalidStream) && !HasStreamLabel(*subgraph)) { | |||||
ops_without_label.emplace(op_desc); | ops_without_label.emplace(op_desc); | ||||
} | } | ||||
} | } | ||||
@@ -427,8 +484,8 @@ Status UpdateForSkippedEnginePass::Run(ComputeGraphPtr graph, const vector<Subgr | |||||
int64_t inout_stream = GetSingleInoutStream(node); | int64_t inout_stream = GetSingleInoutStream(node); | ||||
if (inout_stream != kInvalidStream) { | if (inout_stream != kInvalidStream) { | ||||
op_desc->SetStreamId(inout_stream); | op_desc->SetStreamId(inout_stream); | ||||
GELOGI("Node %s of type %s reassign to stream %ld from stream %ld.", node->GetName().c_str(), | |||||
node->GetType().c_str(), inout_stream, stream_id); | |||||
GELOGI("[Reassign][StreamId]%ld for Node %s of type %s from stream %ld.", | |||||
inout_stream, node->GetName().c_str(), node->GetType().c_str(), stream_id); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -455,7 +512,7 @@ Status AllReduceParallelPass::Run(ComputeGraphPtr graph, const vector<SubgraphPt | |||||
return NOT_CHANGED; | return NOT_CHANGED; | ||||
} | } | ||||
GELOGI("AllReduceParallelPass is enabled."); | |||||
GELOGI("[Run][AllReduceParallelPass] start"); | |||||
GE_DUMP(graph, "BeforeAllReduceParallel"); | GE_DUMP(graph, "BeforeAllReduceParallel"); | ||||
// All successors of HcomAllReduce. | // All successors of HcomAllReduce. | ||||
@@ -463,7 +520,7 @@ Status AllReduceParallelPass::Run(ComputeGraphPtr graph, const vector<SubgraphPt | |||||
for (const NodePtr &node : graph->GetDirectNode()) { | for (const NodePtr &node : graph->GetDirectNode()) { | ||||
if (!IsHcomNode(node->GetType()) || | if (!IsHcomNode(node->GetType()) || | ||||
node->GetInDataNodes().size() <= 1) { | |||||
(node->GetInDataNodes().size() <= 1)) { | |||||
continue; | continue; | ||||
} | } | ||||
@@ -565,7 +622,7 @@ Status LogicalStreamAllocator::Assign(const ComputeGraphPtr &root_graph, const G | |||||
RefreshContinuousStreams(root_graph); | RefreshContinuousStreams(root_graph); | ||||
stream_num = context_.next_stream; | stream_num = context_.next_stream; | ||||
GELOGI("Assigned logical stream num: %ld.", stream_num); | |||||
GELOGI("[Assign][LogicalStream] At last, stream num: %ld.", stream_num); | |||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
@@ -575,7 +632,7 @@ Status LogicalStreamAllocator::DoAssign(const ComputeGraphPtr &graph, const Grap | |||||
GE_CHECK_NOTNULL(graph); | GE_CHECK_NOTNULL(graph); | ||||
NodePtr parent_node = graph->GetParentNode(); | NodePtr parent_node = graph->GetParentNode(); | ||||
if (parent_node == nullptr || parent_node->GetOpDesc() == nullptr) { | |||||
if ((parent_node == nullptr) || (parent_node->GetOpDesc() == nullptr)) { | |||||
context_.default_stream = kInvalidStream; | context_.default_stream = kInvalidStream; | ||||
} else { | } else { | ||||
context_.default_stream = parent_node->GetOpDesc()->GetStreamId(); | context_.default_stream = parent_node->GetOpDesc()->GetStreamId(); | ||||
@@ -583,6 +640,8 @@ Status LogicalStreamAllocator::DoAssign(const ComputeGraphPtr &graph, const Grap | |||||
auto iter = subgraph_map.find(graph); | auto iter = subgraph_map.find(graph); | ||||
if (iter == subgraph_map.end()) { | if (iter == subgraph_map.end()) { | ||||
REPORT_INNER_ERROR("E19999", "Graph %s not found in subgraph_map when do logical stream assign ", | |||||
graph->GetName().c_str()); | |||||
GELOGE(FAILED, "Graph %s not found.", graph->GetName().c_str()); | GELOGE(FAILED, "Graph %s not found.", graph->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -597,7 +656,7 @@ Status LogicalStreamAllocator::DoAssign(const ComputeGraphPtr &graph, const Grap | |||||
return status; | return status; | ||||
} | } | ||||
GELOGD("Subgraphs of graph %s:", graph->GetName().c_str()); | |||||
GELOGD("[Show][Subgraphs] in graph %s", graph->GetName().c_str()); | |||||
for (const auto &subgraph : subgraphs) { | for (const auto &subgraph : subgraphs) { | ||||
if (subgraph != nullptr) { | if (subgraph != nullptr) { | ||||
GELOGD("subgraph: %s", subgraph->name.c_str()); | GELOGD("subgraph: %s", subgraph->name.c_str()); | ||||
@@ -622,6 +681,8 @@ Status LogicalStreamAllocator::ConvertSubgraphs(const vector<SubGraphInfoPtr> &s | |||||
const string &engine_name = subgraph_info->GetEngineName(); | const string &engine_name = subgraph_info->GetEngineName(); | ||||
auto engine_conf_iter = engine_confs.find(engine_name); | auto engine_conf_iter = engine_confs.find(engine_name); | ||||
if ((engine_conf_iter == engine_confs.end()) || (engine_conf_iter->second == nullptr)) { | if ((engine_conf_iter == engine_confs.end()) || (engine_conf_iter->second == nullptr)) { | ||||
REPORT_INNER_ERROR("E19999", "Engine conf of subgraph %s not found (engine name: %s)", | |||||
subgraph_name.c_str(), engine_name.c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Engine conf of subgraph %s not found (engine name: %s).", subgraph_name.c_str(), | GELOGE(INTERNAL_ERROR, "Engine conf of subgraph %s not found (engine name: %s).", subgraph_name.c_str(), | ||||
engine_name.c_str()); | engine_name.c_str()); | ||||
@@ -655,6 +716,7 @@ Status LogicalStreamAllocator::RunPasses(const ComputeGraphPtr &graph, const vec | |||||
passes.emplace_back(MakeShared<IndependentStreamPass>()); | passes.emplace_back(MakeShared<IndependentStreamPass>()); | ||||
passes.emplace_back(MakeShared<AssignByDependencyPass>()); | passes.emplace_back(MakeShared<AssignByDependencyPass>()); | ||||
passes.emplace_back(MakeShared<NodeStreamUpdatePass>()); | passes.emplace_back(MakeShared<NodeStreamUpdatePass>()); | ||||
passes.emplace_back(MakeShared<UpdateForParallelGroupPass>()); | |||||
passes.emplace_back(MakeShared<AllReduceParallelPass>()); | passes.emplace_back(MakeShared<AllReduceParallelPass>()); | ||||
passes.emplace_back(MakeShared<UpdateForSkippedEnginePass>()); | passes.emplace_back(MakeShared<UpdateForSkippedEnginePass>()); | ||||
} | } | ||||
@@ -664,10 +726,11 @@ Status LogicalStreamAllocator::RunPasses(const ComputeGraphPtr &graph, const vec | |||||
Status status = pass->Run(graph, subgraphs, context_); | Status status = pass->Run(graph, subgraphs, context_); | ||||
if (status == SUCCESS) { | if (status == SUCCESS) { | ||||
GELOGD("Stream pass %s return SUCCESS.", pass->GetName().c_str()); | |||||
GELOGD("[Show][Status]Stream pass %s return SUCCESS.", pass->GetName().c_str()); | |||||
} else if (status == NOT_CHANGED) { | } else if (status == NOT_CHANGED) { | ||||
GELOGD("Stream pass %s return NOT_CHANGED.", pass->GetName().c_str()); | |||||
GELOGD("[Show][Status]Stream pass %s return NOT_CHANGED.", pass->GetName().c_str()); | |||||
} else { | } else { | ||||
REPORT_CALL_ERROR("E19999", "Stream pass %s run failed.", pass->GetName().c_str()); | |||||
GELOGE(status, "Stream pass %s failed.", pass->GetName().c_str()); | GELOGE(status, "Stream pass %s failed.", pass->GetName().c_str()); | ||||
return status; | return status; | ||||
} | } | ||||
@@ -686,7 +749,7 @@ void LogicalStreamAllocator::RefreshContinuousStreams(const ComputeGraphPtr &gra | |||||
auto op_desc = node->GetOpDesc(); | auto op_desc = node->GetOpDesc(); | ||||
if (op_desc != nullptr) { | if (op_desc != nullptr) { | ||||
int64_t stream_id = op_desc->GetStreamId(); | int64_t stream_id = op_desc->GetStreamId(); | ||||
if (stream_id != kInvalidStream && stream_id < stream_num) { | |||||
if ((stream_id != kInvalidStream) && (stream_id < stream_num)) { | |||||
stream_has_node[stream_id] = true; | stream_has_node[stream_id] = true; | ||||
} | } | ||||
} | } | ||||
@@ -695,10 +758,10 @@ void LogicalStreamAllocator::RefreshContinuousStreams(const ComputeGraphPtr &gra | |||||
context_.next_stream = 0; | context_.next_stream = 0; | ||||
vector<int64_t> old_to_new_streams(stream_num, kInvalidStream); | vector<int64_t> old_to_new_streams(stream_num, kInvalidStream); | ||||
for (size_t old_stream = 0; old_stream < stream_has_node.size(); ++old_stream) { | |||||
for (size_t old_stream = 0; old_stream < stream_has_node.size(); old_stream++) { | |||||
if (stream_has_node[old_stream]) { | if (stream_has_node[old_stream]) { | ||||
old_to_new_streams[old_stream] = context_.next_stream; | old_to_new_streams[old_stream] = context_.next_stream; | ||||
++context_.next_stream; | |||||
context_.next_stream++; | |||||
} | } | ||||
} | } | ||||
@@ -706,7 +769,7 @@ void LogicalStreamAllocator::RefreshContinuousStreams(const ComputeGraphPtr &gra | |||||
auto op_desc = node->GetOpDesc(); | auto op_desc = node->GetOpDesc(); | ||||
if (op_desc != nullptr) { | if (op_desc != nullptr) { | ||||
int64_t stream_id = op_desc->GetStreamId(); | int64_t stream_id = op_desc->GetStreamId(); | ||||
if (stream_id != kInvalidStream && stream_id < stream_num) { | |||||
if ((stream_id != kInvalidStream) && (stream_id < stream_num)) { | |||||
op_desc->SetStreamId(old_to_new_streams[stream_id]); | op_desc->SetStreamId(old_to_new_streams[stream_id]); | ||||
} | } | ||||
} | } | ||||
@@ -149,6 +149,13 @@ class NodeStreamUpdatePass : public LogicalStreamPass { | |||||
Status Run(ComputeGraphPtr graph, const std::vector<SubgraphPtr> &subgraphs, Context &context) override; | Status Run(ComputeGraphPtr graph, const std::vector<SubgraphPtr> &subgraphs, Context &context) override; | ||||
}; | }; | ||||
// assign stream by parallel group | |||||
class UpdateForParallelGroupPass : public LogicalStreamPass { | |||||
public: | |||||
STREAM_PASS_DEFAULT_FUNC(UpdateForParallelGroupPass); | |||||
Status Run(ComputeGraphPtr graph, const std::vector<SubgraphPtr> &subgraphs, Context &context) override; | |||||
}; | |||||
// Update the stream of subgraphs to nodes. | // Update the stream of subgraphs to nodes. | ||||
class UpdateForSkippedEnginePass : public LogicalStreamPass { | class UpdateForSkippedEnginePass : public LogicalStreamPass { | ||||
public: | public: | ||||
@@ -70,7 +70,10 @@ Status BinaryBlockMemAssigner::GetMemoryRanges(vector<int64_t> &range_ceils) { | |||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
if ((all_memory_size.front() <= 0) || (log(kLogBase) == 0)) { | if ((all_memory_size.front() <= 0) || (log(kLogBase) == 0)) { | ||||
GELOGE(FAILED, "Memory size:%ld is invalid.", all_memory_size.front()); | |||||
GELOGE(FAILED, "[Check][MemRangeStep]first mem_range_step:%ld less than 0,invalid," | |||||
"maybe has dynamic shape in graph", all_memory_size.front()); | |||||
REPORT_INNER_ERROR("E19999", "first mem_range_step:%ld less than 0,invalid," | |||||
"maybe has dynamic shape in graph", all_memory_size.front()); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
// Memory size is 512 aligned, so it is not necessary to take less than 512 | // Memory size is 512 aligned, so it is not necessary to take less than 512 | ||||
@@ -81,12 +84,18 @@ Status BinaryBlockMemAssigner::GetMemoryRanges(vector<int64_t> &range_ceils) { | |||||
GELOGD("Range number: %zu", range_number); | GELOGD("Range number: %zu", range_number); | ||||
vector<vector<int64_t>> ranges(range_number); | vector<vector<int64_t>> ranges(range_number); | ||||
GE_CHK_BOOL_EXEC((range_number != 0), return PARAM_INVALID, "range_number can't be 0."); | |||||
GE_CHK_BOOL_EXEC((range_number != 0), | |||||
REPORT_INNER_ERROR("E19999", "inner data[range_number] is 0, judge invalid"); | |||||
return PARAM_INVALID, | |||||
"[Check][RangeNumber]inner data is 0, judge invalid."); | |||||
size_t range_number_limit = all_memory_size.size() / range_number; | size_t range_number_limit = all_memory_size.size() / range_number; | ||||
int64_t range_ceil = min_memory_size; | int64_t range_ceil = min_memory_size; | ||||
for (size_t i = 1; i <= range_number; i++) { | for (size_t i = 1; i <= range_number; i++) { | ||||
GE_IF_BOOL_EXEC(TypeUtils::CheckUint64MulOverflow(static_cast<uint64_t>(range_ceil), kRangeCeilInterval), | GE_IF_BOOL_EXEC(TypeUtils::CheckUint64MulOverflow(static_cast<uint64_t>(range_ceil), kRangeCeilInterval), | ||||
GELOGE(FAILED, "Multiply result is out of range."); | |||||
GELOGE(FAILED, "[Check][MemRangeCeil]Multiply result is out of range," | |||||
"range_ceil:%ld, interval:%u", range_ceil, kRangeCeilInterval); | |||||
REPORT_INNER_ERROR("E19999", "process mem_range_ceil,multiply result out of range," | |||||
"range_ceil:%ld, interval:%u", range_ceil, kRangeCeilInterval); | |||||
return FAILED); | return FAILED); | ||||
range_ceil *= kRangeCeilInterval; // The block size of each interval is doubled every time. | range_ceil *= kRangeCeilInterval; // The block size of each interval is doubled every time. | ||||
for (auto iter = all_memory_size.begin(); iter != all_memory_size.end();) { | for (auto iter = all_memory_size.begin(); iter != all_memory_size.end();) { | ||||
@@ -30,6 +30,7 @@ | |||||
#include "graph/utils/node_utils.h" | #include "graph/utils/node_utils.h" | ||||
#include "graph/utils/op_desc_utils.h" | #include "graph/utils/op_desc_utils.h" | ||||
#include "graph/utils/tensor_utils.h" | #include "graph/utils/tensor_utils.h" | ||||
#include "graph/utils/type_utils.h" | |||||
#include "graph/debug/ge_attr_define.h" | #include "graph/debug/ge_attr_define.h" | ||||
@@ -429,17 +430,14 @@ void SetLastUsedInputMemAttr(NodePtr &node, int input_index) { | |||||
} | } | ||||
auto node_op_desc = node->GetOpDesc(); | auto node_op_desc = node->GetOpDesc(); | ||||
if (node_op_desc != nullptr) { | if (node_op_desc != nullptr) { | ||||
auto input_desc = node_op_desc->GetInputDesc(input_index); | |||||
if (!ge::AttrUtils::SetInt(input_desc, ATTR_NAME_IS_END_OF_INPUTMEM_LIFECYCLE, true)) { | |||||
auto input_desc = node_op_desc->MutableInputDesc(input_index); | |||||
if (!ge::AttrUtils::SetInt(*input_desc, ATTR_NAME_IS_END_OF_INPUTMEM_LIFECYCLE, true)) { | |||||
GELOGW("Set %s input[%d] ATTR_NAME_IS_END_OF_INPUTMEM_LIFECYCLE to true failed.", node_op_desc->GetName().c_str(), | GELOGW("Set %s input[%d] ATTR_NAME_IS_END_OF_INPUTMEM_LIFECYCLE to true failed.", node_op_desc->GetName().c_str(), | ||||
input_index); | input_index); | ||||
return; | return; | ||||
} | } | ||||
GELOGD("Set %s input[%d] ATTR_NAME_IS_END_OF_INPUTMEM_LIFECYCLE to true success.", node_op_desc->GetName().c_str(), | GELOGD("Set %s input[%d] ATTR_NAME_IS_END_OF_INPUTMEM_LIFECYCLE to true success.", node_op_desc->GetName().c_str(), | ||||
input_index); | input_index); | ||||
if (node_op_desc->UpdateInputDesc(input_index, input_desc) != GRAPH_SUCCESS) { | |||||
GELOGW("Update %s input[%d] desc failed.", node_op_desc->GetName().c_str(), input_index); | |||||
} | |||||
} | } | ||||
} | } | ||||
@@ -457,7 +455,16 @@ Status GetNoAlignSize(const ge::OpDesc &desc, uint32_t index, size_t &size) { | |||||
DataType data_type = output_op_desc->GetDataType(); | DataType data_type = output_op_desc->GetDataType(); | ||||
graphStatus graph_status = TensorUtils::CalcTensorMemSize(shape, format, data_type, tensor_size); | graphStatus graph_status = TensorUtils::CalcTensorMemSize(shape, format, data_type, tensor_size); | ||||
if (graph_status != GRAPH_SUCCESS) { | if (graph_status != GRAPH_SUCCESS) { | ||||
GELOGE(graph_status, "CalcTensorMemSize failed!"); | |||||
GELOGE(graph_status, "[Calculate][TensorSize]shape:%s, format:%s, data_type:%s, op:%s, out_index:%u", | |||||
shape.ToString().c_str(), | |||||
TypeUtils::FormatToSerialString(format).c_str(), | |||||
TypeUtils::DataTypeToSerialString(data_type).c_str(), | |||||
desc.GetName().c_str(), index); | |||||
REPORT_CALL_ERROR("E19999", "CalcTensorMemSize fail, shape:%s, format:%s, data_type:%s, op:%s, out_index:%u", | |||||
shape.ToString().c_str(), | |||||
TypeUtils::FormatToSerialString(format).c_str(), | |||||
TypeUtils::DataTypeToSerialString(data_type).c_str(), | |||||
desc.GetName().c_str(), index); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
size = static_cast<size_t>(tensor_size); | size = static_cast<size_t>(tensor_size); | ||||
@@ -498,7 +505,7 @@ BlockMemAssigner::BlockMemAssigner(ComputeGraphPtr compute_graph, const map<stri | |||||
symbol_to_anchors_(symbol_to_anchors), anchor_to_symbol_(anchor_to_symbol), life_time_(0) {} | symbol_to_anchors_(symbol_to_anchors), anchor_to_symbol_(anchor_to_symbol), life_time_(0) {} | ||||
BlockMemAssigner::~BlockMemAssigner() { | BlockMemAssigner::~BlockMemAssigner() { | ||||
GELOGD("blocks_store_ size : %lu", blocks_store_.size()); | |||||
GELOGD("[Destruct][BlockMemAssigner]blocks_store_ size : %lu", blocks_store_.size()); | |||||
for (MemoryBlock *memory_block : blocks_store_) { | for (MemoryBlock *memory_block : blocks_store_) { | ||||
GE_DELETE_NEW_SINGLE(memory_block); | GE_DELETE_NEW_SINGLE(memory_block); | ||||
} | } | ||||
@@ -583,11 +590,16 @@ void BlockMemAssigner::GetOutAndWorkSpaceMem(vector<int64_t> &all_memory_size) { | |||||
} | } | ||||
for (auto &out_anchor : n->GetAllOutDataAnchors()) { | for (auto &out_anchor : n->GetAllOutDataAnchors()) { | ||||
GeTensorDesc output_desc = node_op_desc->GetOutputDesc(out_anchor->GetIdx()); | |||||
auto output_desc = node_op_desc->GetOutputDescPtr(out_anchor->GetIdx()); | |||||
int64_t size = 0; | int64_t size = 0; | ||||
GE_IF_BOOL_EXEC(ge::TensorUtils::GetSize(output_desc, size) != SUCCESS, GELOGI("Get size failed")); | |||||
GE_IF_BOOL_EXEC(size < 0, GELOGE(FAILED, "Node:%s size:%ld is invalid, maybe it is unknown shape node.", | |||||
node_op_desc->GetName().c_str(), size); | |||||
GE_IF_BOOL_EXEC(ge::TensorUtils::GetSize(*output_desc, size) != SUCCESS, GELOGI("Get size failed")); | |||||
GE_IF_BOOL_EXEC(size < 0, | |||||
GELOGE(FAILED, "[Check][TensorSize]tensor_size:%ld is invalid, " | |||||
"maybe it is unknown shape node, Node_name:%s", | |||||
size, node_op_desc->GetName().c_str()); | |||||
REPORT_INNER_ERROR("E19999", "tensor_size:%ld is invalid, " | |||||
"maybe it is unknown shape node, Node_name:%s", | |||||
size, node_op_desc->GetName().c_str()); | |||||
return;); | return;); | ||||
batch_all_memory_size[batch_label].emplace_back(size); | batch_all_memory_size[batch_label].emplace_back(size); | ||||
if (batch_total_size.find(batch_label) == batch_total_size.end()) { | if (batch_total_size.find(batch_label) == batch_total_size.end()) { | ||||
@@ -678,22 +690,34 @@ bool BlockMemAssigner::IsOutNodeSetContinuousInput(const NodePtr &n, uint32_t ou | |||||
if (static_cast<size_t>(out_index) < n->GetAllOutDataAnchors().size()) { | if (static_cast<size_t>(out_index) < n->GetAllOutDataAnchors().size()) { | ||||
auto out_anchor = n->GetOutDataAnchor(out_index); | auto out_anchor = n->GetOutDataAnchor(out_index); | ||||
GE_IF_BOOL_EXEC(out_anchor == nullptr, | GE_IF_BOOL_EXEC(out_anchor == nullptr, | ||||
GELOGE(FAILED, "Node[%s] output[%u] anchor is null.", n->GetName().c_str(), out_index); | |||||
GELOGE(FAILED, "[Check][Anchor]Node[%s] output[%u] anchor is null.", | |||||
n->GetName().c_str(), out_index); | |||||
REPORT_INNER_ERROR("E19999", "output anchor is null, node_name: %s output_index: %u.", | |||||
n->GetName().c_str(), out_index); | |||||
return false;); | return false;); | ||||
for (auto const &peer_in_anchor : out_anchor->GetPeerInDataAnchors()) { | for (auto const &peer_in_anchor : out_anchor->GetPeerInDataAnchors()) { | ||||
GE_IF_BOOL_EXEC(peer_in_anchor == nullptr, | GE_IF_BOOL_EXEC(peer_in_anchor == nullptr, | ||||
GELOGE(FAILED, "Node[%s] output[%u] peer_in_anchor 0 is null.", n->GetName().c_str(), out_index); | |||||
GELOGE(FAILED, "[Check][Anchor]Node[%s] output[%u] peer_in_anchor 0 is null.", | |||||
n->GetName().c_str(), out_index); | |||||
REPORT_INNER_ERROR("E19999", "output anchor peer is null, node_name: %s output_index: %u.", | |||||
n->GetName().c_str(), out_index); | |||||
return false;); | return false;); | ||||
auto peer_node = peer_in_anchor->GetOwnerNode(); | auto peer_node = peer_in_anchor->GetOwnerNode(); | ||||
GE_IF_BOOL_EXEC(peer_node == nullptr, | GE_IF_BOOL_EXEC(peer_node == nullptr, | ||||
GELOGE(FAILED, "Node[%s] output[%u] node is null.", n->GetName().c_str(), out_index); | |||||
GELOGE(FAILED, "[Check][Node]Node[%s] output[%u] peer node is null.", | |||||
n->GetName().c_str(), out_index); | |||||
REPORT_INNER_ERROR("E19999", "output anchor peer node is null, node_name: %s output_index: %u.", | |||||
n->GetName().c_str(), out_index); | |||||
return false;); | return false;); | ||||
// Get the continuous input type of the node, default is false | // Get the continuous input type of the node, default is false | ||||
bool is_input_continuous = false; | bool is_input_continuous = false; | ||||
auto peer_in_node_desc = peer_node->GetOpDesc(); | auto peer_in_node_desc = peer_node->GetOpDesc(); | ||||
GE_IF_BOOL_EXEC(peer_in_node_desc == nullptr, | GE_IF_BOOL_EXEC(peer_in_node_desc == nullptr, | ||||
GELOGE(FAILED, "Node[%s] output[%u] nodedesc is null.", n->GetName().c_str(), out_index); | |||||
GELOGE(FAILED, "[Check][OpDesc]Node[%s] output[%u] nodedesc is null.", | |||||
n->GetName().c_str(), out_index); | |||||
REPORT_INNER_ERROR("E19999", "output anchor peer op_desc is null, node_name:%s output_index:%u.", | |||||
n->GetName().c_str(), out_index); | |||||
return false;); | return false;); | ||||
// If GetBool fail, is_input_continuous is false. | // If GetBool fail, is_input_continuous is false. | ||||
@@ -793,7 +817,10 @@ bool BlockMemAssigner::IsContinuousMemoryReuse(const NodePtr &n, const NodePtr & | |||||
if ((in_anchor == nullptr) || (in_anchor->GetPeerOutAnchor() == nullptr) || | if ((in_anchor == nullptr) || (in_anchor->GetPeerOutAnchor() == nullptr) || | ||||
(in_anchor->GetPeerOutAnchor()->GetOwnerNode() == nullptr) || | (in_anchor->GetPeerOutAnchor()->GetOwnerNode() == nullptr) || | ||||
(in_anchor->GetPeerOutAnchor()->GetOwnerNode()->GetOpDesc() == nullptr)) { | (in_anchor->GetPeerOutAnchor()->GetOwnerNode()->GetOpDesc() == nullptr)) { | ||||
GELOGE(FAILED, "Node[%s] output[%u] peer input node desc is null.", n->GetName().c_str(), out_index); | |||||
GELOGE(FAILED, "[Check][OpDesc]Node[%s] output[%u] peer input node desc is null.", | |||||
n->GetName().c_str(), out_index); | |||||
REPORT_INNER_ERROR("E19999", "get output anchor peer op_desc fail, node_name: %s output_index: %u.", | |||||
n->GetName().c_str(), out_index); | |||||
return false; | return false; | ||||
} | } | ||||
auto peer_out_node_desc = in_anchor->GetPeerOutAnchor()->GetOwnerNode()->GetOpDesc(); | auto peer_out_node_desc = in_anchor->GetPeerOutAnchor()->GetOwnerNode()->GetOpDesc(); | ||||
@@ -1077,7 +1104,10 @@ MemoryBlock *BlockMemAssigner::ApplyMemory(size_t block_size, size_t real_size, | |||||
OpMemoryType mem_type, const NodePtr &n, uint32_t out_index, | OpMemoryType mem_type, const NodePtr &n, uint32_t out_index, | ||||
const vector<bool> &workspace_reuse_flag, const bool is_op_reuse_mem, | const vector<bool> &workspace_reuse_flag, const bool is_op_reuse_mem, | ||||
const bool continuous, int64_t memory_type) { | const bool continuous, int64_t memory_type) { | ||||
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(n == nullptr, return nullptr, "Input parameter n is null."); | |||||
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG( | |||||
n == nullptr, | |||||
REPORT_INNER_ERROR("E19999", "Input parameter n(type:node_ptr) is null, apply memory failed"); | |||||
return nullptr, "[Check][Param]Input parameter n(type:node_ptr) is null."); | |||||
auto node_op_desc = n->GetOpDesc(); | auto node_op_desc = n->GetOpDesc(); | ||||
GE_IF_BOOL_EXEC(node_op_desc == nullptr, return nullptr); | GE_IF_BOOL_EXEC(node_op_desc == nullptr, return nullptr); | ||||
std::string batch_label; | std::string batch_label; | ||||
@@ -1129,7 +1159,12 @@ MemoryBlock *BlockMemAssigner::ApplyMemory(size_t block_size, size_t real_size, | |||||
} | } | ||||
auto block = new (std::nothrow) MemoryBlock(block_size, node_op_desc->GetStreamId(), is_reuse_memory, memory_type); | auto block = new (std::nothrow) MemoryBlock(block_size, node_op_desc->GetStreamId(), is_reuse_memory, memory_type); | ||||
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(block == nullptr, return nullptr, "new an object failed."); | |||||
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG( | |||||
block == nullptr, | |||||
REPORT_INNER_ERROR("E19999", "new a memoryblock object failed. node_name:%s out_index:%u", | |||||
n->GetName().c_str(), out_index); | |||||
return nullptr, | |||||
"[New][Object]new MemoryBlock failed, node_name:%s out_index:%u", n->GetName().c_str(), out_index); | |||||
// Data and netoutput need zero copy block | // Data and netoutput need zero copy block | ||||
block->is_zero_copy_ = IsZeroCopyBlock(n, continuous); | block->is_zero_copy_ = IsZeroCopyBlock(n, continuous); | ||||
@@ -1188,9 +1223,15 @@ void BlockMemAssigner::ContinuousOutRefCheck(bool &isAllOutputRef, bool &isOutpu | |||||
Status BlockMemAssigner::ApplyContinuousMemory(const NodePtr &n, const vector<int64_t> &ranges, | Status BlockMemAssigner::ApplyContinuousMemory(const NodePtr &n, const vector<int64_t> &ranges, | ||||
const bool is_op_reuse_mem) { | const bool is_op_reuse_mem) { | ||||
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(n == nullptr, return INTERNAL_ERROR, "input node is null."); | |||||
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG( | |||||
n == nullptr, | |||||
REPORT_INNER_ERROR("E19999", "Input parameter n(type:node_ptr) is null"); | |||||
return INTERNAL_ERROR, "[check][param]Input parameter n(type:NodePtr) is null."); | |||||
auto node_op_desc = n->GetOpDesc(); | auto node_op_desc = n->GetOpDesc(); | ||||
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(node_op_desc == nullptr, return INTERNAL_ERROR, "node_op_desc is null."); | |||||
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG( | |||||
node_op_desc == nullptr, | |||||
REPORT_INNER_ERROR("E19999", "Input parameter n(type:OpDescPtr) is null"); | |||||
return INTERNAL_ERROR, "[Check][Param]Input parameter n(type:OpDescPtr) is null"); | |||||
// continuous output support ref only when all output ref input | // continuous output support ref only when all output ref input | ||||
bool isAllOutputRef = true; | bool isAllOutputRef = true; | ||||
@@ -1204,7 +1245,9 @@ Status BlockMemAssigner::ApplyContinuousMemory(const NodePtr &n, const vector<in | |||||
} | } | ||||
if (!isAllOutputRef && isOutputHasRef) { | if (!isAllOutputRef && isOutputHasRef) { | ||||
GELOGE(INTERNAL_ERROR, "continuous output node ref part input, not support this situation, node_name:%s", | |||||
REPORT_INNER_ERROR("E19999", "continuous output node ref part input, not support now. node_name:%s", | |||||
n->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "[Check][OutRefStatus]continuous output node ref part input, not support, node_name:%s", | |||||
n->GetName().c_str()); | n->GetName().c_str()); | ||||
return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
} | } | ||||
@@ -1215,7 +1258,9 @@ Status BlockMemAssigner::ApplyContinuousMemory(const NodePtr &n, const vector<in | |||||
for (uint32_t index = 0; index < static_cast<uint32_t>(node_op_desc->GetOutputsSize()); index++) { | for (uint32_t index = 0; index < static_cast<uint32_t>(node_op_desc->GetOutputsSize()); index++) { | ||||
auto output_op_desc = node_op_desc->GetOutputDescPtr(index); | auto output_op_desc = node_op_desc->GetOutputDescPtr(index); | ||||
if (output_op_desc == nullptr) { | if (output_op_desc == nullptr) { | ||||
GELOGE(INTERNAL_ERROR, "Get output desc failed, node_name:%s, output_index:%u", n->GetName().c_str(), index); | |||||
REPORT_INNER_ERROR("E19999", "get output_desc failed, node_name:%s, output_index:%u", | |||||
n->GetName().c_str(), index); | |||||
GELOGE(INTERNAL_ERROR, "[Get][OutputDesc]node_name:%s, output_index:%u", n->GetName().c_str(), index); | |||||
return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
} | } | ||||
@@ -1226,7 +1271,9 @@ Status BlockMemAssigner::ApplyContinuousMemory(const NodePtr &n, const vector<in | |||||
int64_t size = 0; | int64_t size = 0; | ||||
if (ge::TensorUtils::GetSize(*output_op_desc, size) != SUCCESS) { | if (ge::TensorUtils::GetSize(*output_op_desc, size) != SUCCESS) { | ||||
GELOGE(INTERNAL_ERROR, "Get size failed, node_name:%s, output_index:%u", n->GetName().c_str(), index); | |||||
REPORT_CALL_ERROR("E19999", "get tensor_size failed, node_name:%s, output_index:%u", | |||||
n->GetName().c_str(), index); | |||||
GELOGE(INTERNAL_ERROR, "[Get][TensorSize]node_name:%s, output_index:%u", n->GetName().c_str(), index); | |||||
return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
} | } | ||||
size_t align_size = static_cast<size_t>(size); | size_t align_size = static_cast<size_t>(size); | ||||
@@ -1266,7 +1313,9 @@ Status BlockMemAssigner::ApplyContinuousMemory(const NodePtr &n, const vector<in | |||||
block->last_continuous_block_ = true; | block->last_continuous_block_ = true; | ||||
++(block->ref_count_); | ++(block->ref_count_); | ||||
} else { | } else { | ||||
GELOGE(INTERNAL_ERROR, "node apply continuous output memory failed. node_name:%s", n->GetName().c_str()); | |||||
REPORT_CALL_ERROR("E19999", "apply continuousMemory failed, node_name:%s, total_size:%ld", | |||||
n->GetName().c_str(), total_size); | |||||
GELOGE(INTERNAL_ERROR, "[Apply][ContinuousMemory]node_name:%s, total_size:%ld", n->GetName().c_str(), total_size); | |||||
return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
} | } | ||||
return SUCCESS; | return SUCCESS; | ||||
@@ -1274,25 +1323,44 @@ Status BlockMemAssigner::ApplyContinuousMemory(const NodePtr &n, const vector<in | |||||
MemoryBlock *BlockMemAssigner::ApplyOutMemory(const NodePtr &n, uint32_t index, const vector<int64_t> &ranges, | MemoryBlock *BlockMemAssigner::ApplyOutMemory(const NodePtr &n, uint32_t index, const vector<int64_t> &ranges, | ||||
const bool is_op_reuse_mem, const bool continuous) { | const bool is_op_reuse_mem, const bool continuous) { | ||||
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(n == nullptr, return nullptr, "input node is null."); | |||||
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG( | |||||
n == nullptr, | |||||
REPORT_INNER_ERROR("E19999", "Input parameter n(type:NodePtr) is null"); | |||||
return nullptr, "[Check][Param]Input parameter n(type:NodePtr) is null"); | |||||
auto node_op_desc = n->GetOpDesc(); | auto node_op_desc = n->GetOpDesc(); | ||||
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(node_op_desc == nullptr, return nullptr, "node_op_desc is null."); | |||||
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG( | |||||
node_op_desc == nullptr, | |||||
REPORT_INNER_ERROR("E19999", "Input parameter n(type:OpDescPtr) is null"); | |||||
return nullptr, "[Check][Param]Input parameter n(type:OpDescPtr) is null"); | |||||
MemoryBlock *block = nullptr; | MemoryBlock *block = nullptr; | ||||
NodeIndexIO node_index_io(n, index, kOut); | NodeIndexIO node_index_io(n, index, kOut); | ||||
int64_t size = 0; | int64_t size = 0; | ||||
auto output_op_desc = node_op_desc->GetOutputDescPtr(index); | auto output_op_desc = node_op_desc->GetOutputDescPtr(index); | ||||
GE_IF_BOOL_EXEC(output_op_desc == nullptr, return nullptr); | |||||
GE_IF_BOOL_EXEC( | |||||
output_op_desc == nullptr, | |||||
REPORT_INNER_ERROR("E19999", "get output_desc failed, node_name:%s, output_index:%u", | |||||
n->GetName().c_str(), index); | |||||
GELOGE(FAILED, "[Get][OutputDesc]node_name:%s, output_index:%u", n->GetName().c_str(), index); | |||||
return nullptr); | |||||
GE_IF_BOOL_EXEC(ge::TensorUtils::GetSize(*output_op_desc, size) != SUCCESS, GELOGI("Get size failed")); | GE_IF_BOOL_EXEC(ge::TensorUtils::GetSize(*output_op_desc, size) != SUCCESS, GELOGI("Get size failed")); | ||||
size_t no_align_size = 0; | size_t no_align_size = 0; | ||||
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(GetNoAlignSize(*node_op_desc, index, no_align_size) != SUCCESS, | |||||
return nullptr, "Get no align size failed"); | |||||
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG( | |||||
GetNoAlignSize(*node_op_desc, index, no_align_size) != SUCCESS, | |||||
REPORT_CALL_ERROR("E19999", "Get no align size failed, node_name:%s, output_index:%u", | |||||
n->GetName().c_str(), index); | |||||
return nullptr, | |||||
"[Get][TensorSize]Get no align size, node_name:%s, output_index:%u", n->GetName().c_str(), index); | |||||
std::string symbol; | std::string symbol; | ||||
bool reuse_input = false; | bool reuse_input = false; | ||||
if (IsSymbolExist(node_index_io, symbol)) { | if (IsSymbolExist(node_index_io, symbol)) { | ||||
block = symbol_blocks_[symbol]; | block = symbol_blocks_[symbol]; | ||||
GE_IF_BOOL_EXEC(block == nullptr, GELOGE(FAILED, "Node %s ref block is nullptr.", node_op_desc->GetName().c_str()); | |||||
return nullptr); | |||||
GE_IF_BOOL_EXEC(block == nullptr, | |||||
REPORT_INNER_ERROR("E19999", "get ref block failed, node_name:%s, symbol:%s", | |||||
node_op_desc->GetName().c_str(), node_index_io.ToString().c_str()); | |||||
GELOGE(FAILED, "[Get][RefBlock]node_name:%s, symbol:%s", | |||||
node_op_desc->GetName().c_str(), node_index_io.ToString().c_str()); | |||||
return nullptr); | |||||
// reduce old size | // reduce old size | ||||
size_t align_size = block->Size(); | size_t align_size = block->Size(); | ||||
AlignMemOffset(align_size); | AlignMemOffset(align_size); | ||||
@@ -1335,12 +1403,28 @@ MemoryBlock *BlockMemAssigner::ApplyOutMemory(const NodePtr &n, uint32_t index, | |||||
vector<bool> workspace_reuse_flag; | vector<bool> workspace_reuse_flag; | ||||
block = ApplyMemory(block_size, size, no_align_size, kOutput, n, index, | block = ApplyMemory(block_size, size, no_align_size, kOutput, n, index, | ||||
workspace_reuse_flag, is_op_reuse_mem, continuous, memory_type); | workspace_reuse_flag, is_op_reuse_mem, continuous, memory_type); | ||||
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG( | |||||
block == nullptr, | |||||
REPORT_CALL_ERROR("E19999", "apply out Memory failed, node_name:%s, block_size:%ld, out_index:%u", | |||||
n->GetName().c_str(), block_size, index); | |||||
return nullptr, | |||||
"[Apply][Memory]node_name:%s, block_size:%ld, out_index:%u", | |||||
n->GetName().c_str(), block_size, index); | |||||
} | } | ||||
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(block == nullptr, return nullptr, "Block is nullptr."); | |||||
int out_count = 0; | int out_count = 0; | ||||
GE_IF_BOOL_EXEC(index >= n->GetAllOutDataAnchors().size(), GELOGE(FAILED, "index is out of range."); return nullptr); | |||||
GE_IF_BOOL_EXEC( | |||||
index >= n->GetAllOutDataAnchors().size(), | |||||
REPORT_INNER_ERROR("E19999", "out index:%u exceed out_size:%lu, node_name:%s", | |||||
index, n->GetAllOutDataAnchors().size(), n->GetName().c_str()); | |||||
GELOGE(FAILED, "[Check][OutIndex]index:%u exceed out_size:%lu, node_name:%s", | |||||
index, n->GetAllOutDataAnchors().size(), n->GetName().c_str()); | |||||
return nullptr); | |||||
auto out_data_anchor = n->GetOutDataAnchor(index); | auto out_data_anchor = n->GetOutDataAnchor(index); | ||||
GE_IF_BOOL_EXEC(out_data_anchor == nullptr, GELOGE(FAILED, "Out data anchor is nullptr."); return nullptr); | |||||
GE_IF_BOOL_EXEC( | |||||
out_data_anchor == nullptr, | |||||
REPORT_INNER_ERROR("E19999", "out anchor is null, index:%u, node_name:%s", index, n->GetName().c_str()); | |||||
GELOGE(FAILED, "[Check][OutAnchor]is null, index:%u, node_name:%s", index, n->GetName().c_str()); | |||||
return nullptr); | |||||
for (const auto &in_anchor : out_data_anchor->GetPeerInDataAnchors()) { | for (const auto &in_anchor : out_data_anchor->GetPeerInDataAnchors()) { | ||||
auto owner_node = in_anchor->GetOwnerNode(); | auto owner_node = in_anchor->GetOwnerNode(); | ||||
auto op_desc = owner_node->GetOpDesc(); | auto op_desc = owner_node->GetOpDesc(); | ||||
@@ -1546,8 +1630,14 @@ Status BlockMemAssigner::AssignOutputMemoryWithReuse(const NodePtr &node, vector | |||||
GELOGD("Assign memory node[%s], output size[%zu], output memory type size[%zu]", op_desc->GetName().c_str(), | GELOGD("Assign memory node[%s], output size[%zu], output memory type size[%zu]", op_desc->GetName().c_str(), | ||||
op_desc->GetOutputsSize(), memorys_type.size()); | op_desc->GetOutputsSize(), memorys_type.size()); | ||||
if (has_mem_type_attr && (memorys_type.size() != op_desc->GetOutputsSize())) { | if (has_mem_type_attr && (memorys_type.size() != op_desc->GetOutputsSize())) { | ||||
GELOGE(INTERNAL_ERROR, "fusion: node[%s], output memory size err[outputsize:%zu, memorysize:%zu]", | |||||
op_desc->GetName().c_str(), op_desc->GetOutputsSize(), memorys_type.size()); | |||||
REPORT_INNER_ERROR("E19999", "Attr[%s] size:%zu not equal to node output size:%zu, node_name:%s", | |||||
ATTR_NAME_OUTPUT_MEM_TYPE_LIST.c_str(), memorys_type.size(), | |||||
op_desc->GetOutputsSize(), op_desc->GetName().c_str()); | |||||
GELOGE( | |||||
INTERNAL_ERROR, | |||||
"[Check][MemTypeAttr]Attr %s size:%zu not equal to node output size:%zu, node_name:%s", | |||||
ATTR_NAME_OUTPUT_MEM_TYPE_LIST.c_str(), memorys_type.size(), | |||||
op_desc->GetOutputsSize(), op_desc->GetName().c_str()); | |||||
return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
} | } | ||||
@@ -1565,12 +1655,15 @@ Status BlockMemAssigner::AssignOutputMemoryWithReuse(const NodePtr &node, vector | |||||
bool is_atomic = false; | bool is_atomic = false; | ||||
// If GetBool fail, is_atomic is false. | // If GetBool fail, is_atomic is false. | ||||
(void)ge::AttrUtils::GetBool(op_desc, ATOMIC_ATTR_IS_ATOMIC_NODE, is_atomic); | (void)ge::AttrUtils::GetBool(op_desc, ATOMIC_ATTR_IS_ATOMIC_NODE, is_atomic); | ||||
bool is_buffer_pool_mem_supported = (op_desc->HasAttr(ATTR_NAME_BUFFER_POOL_ID)) && | |||||
(op_desc->HasAttr(ATTR_NAME_BUFFER_POOL_SIZE)) && (!root_unknown_shape_flag_); | |||||
// Allocate memory for the current node and release node memory of the same size in the workspace | // Allocate memory for the current node and release node memory of the same size in the workspace | ||||
GE_IF_BOOL_EXEC(ge_disable_reuse_mem_env_ != "1", | GE_IF_BOOL_EXEC(ge_disable_reuse_mem_env_ != "1", | ||||
for (auto iter = stream_workspace_blocks_.begin(); iter != stream_workspace_blocks_.end(); | for (auto iter = stream_workspace_blocks_.begin(); iter != stream_workspace_blocks_.end(); | ||||
++iter) { ReleaseMemorys(iter->second[stream_id], reusable_blocks_[iter->first][stream_id]); | ++iter) { ReleaseMemorys(iter->second[stream_id], reusable_blocks_[iter->first][stream_id]); | ||||
iter->second[stream_id].clear();}); | iter->second[stream_id].clear();}); | ||||
if (IsContinuousOutput(node)) { | |||||
bool need_apply_continuous_memory = IsContinuousOutput(node) && (!is_buffer_pool_mem_supported); | |||||
if (need_apply_continuous_memory) { | |||||
return ApplyContinuousMemory(node, ranges, is_op_reuse_mem_); | return ApplyContinuousMemory(node, ranges, is_op_reuse_mem_); | ||||
} | } | ||||
for (uint32_t i = 0; i < static_cast<uint32_t>(op_desc->GetOutputsSize()); i++) { | for (uint32_t i = 0; i < static_cast<uint32_t>(op_desc->GetOutputsSize()); i++) { | ||||
@@ -1604,7 +1697,7 @@ Status BlockMemAssigner::AssignOutputMemoryWithReuse(const NodePtr &node, vector | |||||
GE_IF_BOOL_EXEC(!no_need_assign_memory, | GE_IF_BOOL_EXEC(!no_need_assign_memory, | ||||
no_need_assign_memory = IsAtomicOutputMemory(node, i, is_atomic, out_node_set_continuous_input);); | no_need_assign_memory = IsAtomicOutputMemory(node, i, is_atomic, out_node_set_continuous_input);); | ||||
} | } | ||||
no_need_assign_memory = (no_need_assign_memory || IsKnownSubgraphData(node)); | |||||
no_need_assign_memory = (no_need_assign_memory || IsKnownSubgraphData(node) || is_buffer_pool_mem_supported); | |||||
if (no_need_assign_memory) { | if (no_need_assign_memory) { | ||||
zero_memory_list_.emplace_back(node, kOutput, i, false); | zero_memory_list_.emplace_back(node, kOutput, i, false); | ||||
continue; | continue; | ||||
@@ -1645,11 +1738,18 @@ Status BlockMemAssigner::AssignOutputMemoryWithReuse(const NodePtr &node, vector | |||||
/// | /// | ||||
void BlockMemAssigner::AssignMemoryWithReuse(vector<int64_t> &ranges) { | void BlockMemAssigner::AssignMemoryWithReuse(vector<int64_t> &ranges) { | ||||
(void)ge::GetContext().GetOption(OPTION_EXEC_DISABLE_REUSED_MEMORY, ge_disable_reuse_mem_env_); | (void)ge::GetContext().GetOption(OPTION_EXEC_DISABLE_REUSED_MEMORY, ge_disable_reuse_mem_env_); | ||||
GELOGD("Reuse memory %s", ge_disable_reuse_mem_env_ == "1" ? "close" : "open"); | |||||
GEEVENT("Reuse memory %s", ge_disable_reuse_mem_env_ == "1" ? "close" : "open"); | |||||
string op_no_reuse_mem_str; | string op_no_reuse_mem_str; | ||||
const char *op_no_reuse_mem = std::getenv(OP_NO_REUSE_MEM); | const char *op_no_reuse_mem = std::getenv(OP_NO_REUSE_MEM); | ||||
GE_IF_BOOL_EXEC(op_no_reuse_mem != nullptr, op_no_reuse_mem_str = string(op_no_reuse_mem); | GE_IF_BOOL_EXEC(op_no_reuse_mem != nullptr, op_no_reuse_mem_str = string(op_no_reuse_mem); | ||||
CheckAndGetOpReuseEnv(op_no_reuse_mem_str, op_no_reuse_mem_vec_, op_reuse_env_valid_);); | CheckAndGetOpReuseEnv(op_no_reuse_mem_str, op_no_reuse_mem_vec_, op_reuse_env_valid_);); | ||||
auto root_graph = GraphUtils::FindRootGraph(compute_graph_); | |||||
if (root_graph == nullptr) { | |||||
GELOGE(INTERNAL_ERROR, "[Check][RootGraph]Root graph is nullptr, graph:%s.", compute_graph_->GetName().c_str()); | |||||
REPORT_INNER_ERROR("E19999", "Root graph is nullptr, graph:%s.", compute_graph_->GetName().c_str()); | |||||
return; | |||||
} | |||||
root_unknown_shape_flag_ = root_graph->GetGraphUnknownFlag(); | |||||
for (NodePtr &n : compute_graph_->GetAllNodes()) { | for (NodePtr &n : compute_graph_->GetAllNodes()) { | ||||
auto node_op_desc = n->GetOpDesc(); | auto node_op_desc = n->GetOpDesc(); | ||||
@@ -1673,8 +1773,12 @@ void BlockMemAssigner::AssignMemoryWithReuse(vector<int64_t> &ranges) { | |||||
temp.size(), tvm_workspace_memory_type.size()); | temp.size(), tvm_workspace_memory_type.size()); | ||||
if (has_tvm_workspace_mem_type_attr && (temp.size() != tvm_workspace_memory_type.size())) { | if (has_tvm_workspace_mem_type_attr && (temp.size() != tvm_workspace_memory_type.size())) { | ||||
GELOGE(INTERNAL_ERROR, "fusion: node[%s], tvm workspace memory size error![v_temp:%zu, workspace:%zu]", | |||||
n->GetName().c_str(), temp.size(), tvm_workspace_memory_type.size()); | |||||
REPORT_INNER_ERROR("E19999", "Attr[%s]size:%zu is not equal to workspace size:%zu, node_name:%s", | |||||
TVM_ATTR_NAME_WORKSPACE_TYPE.c_str(), tvm_workspace_memory_type.size(), | |||||
temp.size(), n->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "[Check][Attr]Attr %s size:%zu is not equal to workspace size:%zu, node_name:%s", | |||||
TVM_ATTR_NAME_WORKSPACE_TYPE.c_str(), tvm_workspace_memory_type.size(), | |||||
temp.size(), n->GetName().c_str()); | |||||
return; | return; | ||||
} | } | ||||
for (size_t i = 0; i < temp.size(); i++) { | for (size_t i = 0; i < temp.size(); i++) { | ||||
@@ -2031,7 +2135,7 @@ void SetBlockOpMemOffset(MemoryBlock *block, int32_t child_block_level) { | |||||
child_block_level++; | child_block_level++; | ||||
for (MemoryBlock *child_block : block->ChildBlockList()) { | for (MemoryBlock *child_block : block->ChildBlockList()) { | ||||
SetBlockOpMemOffset(child_block, child_block_level); | |||||
SetBlockOpMemOffset(child_block, child_block_level); | |||||
} | } | ||||
} | } | ||||
@@ -2059,7 +2163,7 @@ void BlockMemAssigner::SetOpMemOffset(bool is_zero_copy) { | |||||
Status BlockMemAssigner::Assign() { | Status BlockMemAssigner::Assign() { | ||||
vector<int64_t> ranges; | vector<int64_t> ranges; | ||||
if (GetMemoryRanges(ranges) != SUCCESS) { | if (GetMemoryRanges(ranges) != SUCCESS) { | ||||
GELOGE(FAILED, "GetMemoryRanges Fail!"); | |||||
GELOGE(FAILED, "[Get][MemoryRanges] Fail!"); | |||||
return FAILED; | return FAILED; | ||||
} | } | ||||
GE_IF_BOOL_EXEC(ranges.empty(), return SUCCESS); | GE_IF_BOOL_EXEC(ranges.empty(), return SUCCESS); | ||||
@@ -2083,8 +2187,12 @@ bool BlockMemAssigner::GetWorkSpaceMemoryType(const NodePtr &node, size_t index, | |||||
bool has_workspace_mem_type_attr = | bool has_workspace_mem_type_attr = | ||||
ge::AttrUtils::GetListInt(op_desc, TVM_ATTR_NAME_WORKSPACE_TYPE, workspace_memory_type); | ge::AttrUtils::GetListInt(op_desc, TVM_ATTR_NAME_WORKSPACE_TYPE, workspace_memory_type); | ||||
if (has_workspace_mem_type_attr && (workspace_memory_type.size() <= index)) { | if (has_workspace_mem_type_attr && (workspace_memory_type.size() <= index)) { | ||||
GELOGE(INTERNAL_ERROR, "node[%s], workspace_memory size error![index:%zu, workspace:%zu]", | |||||
node->GetName().c_str(), index, workspace_memory_type.size()); | |||||
REPORT_INNER_ERROR("E19999", "get workspace mem_type failed, " | |||||
"index %zu invalid, bigger than attr %s size:%zu, node_name:%s", | |||||
index, TVM_ATTR_NAME_WORKSPACE_TYPE.c_str(), | |||||
workspace_memory_type.size(), node->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "[Get][WorkspaceMemType]index %zu invalid, bigger than attr %s size:%zu, node_name:%s", | |||||
index, TVM_ATTR_NAME_WORKSPACE_TYPE.c_str(), workspace_memory_type.size(), node->GetName().c_str()); | |||||
return false; | return false; | ||||
} | } | ||||
memory_type = has_workspace_mem_type_attr ? workspace_memory_type[index] : RT_MEMORY_HBM; | memory_type = has_workspace_mem_type_attr ? workspace_memory_type[index] : RT_MEMORY_HBM; | ||||
@@ -494,6 +494,8 @@ class BlockMemAssigner : public MemAssigner { | |||||
/// @ [stream2][nodeid] | /// @ [stream2][nodeid] | ||||
/// | /// | ||||
DependStreamLife total_node_depend_stream_life_; | DependStreamLife total_node_depend_stream_life_; | ||||
bool root_unknown_shape_flag_ = false; | |||||
}; | }; | ||||
} // namespace ge | } // namespace ge | ||||
#endif // GE_GRAPH_BUILD_MEMORY_BLOCK_MEM_ASSIGNER_H_ | #endif // GE_GRAPH_BUILD_MEMORY_BLOCK_MEM_ASSIGNER_H_ |
@@ -0,0 +1,234 @@ | |||||
/** | |||||
* Copyright 2020 Huawei Technologies Co., Ltd | |||||
* | |||||
* Licensed under the Apache License, Version 2.0 (the "License"); | |||||
* you may not use this file except in compliance with the License. | |||||
* You may obtain a copy of the License at | |||||
* | |||||
* http://www.apache.org/licenses/LICENSE-2.0 | |||||
* | |||||
* Unless required by applicable law or agreed to in writing, software | |||||
* distributed under the License is distributed on an "AS IS" BASIS, | |||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
* See the License for the specific language governing permissions and | |||||
* limitations under the License. | |||||
*/ | |||||
#include "graph/build/memory/buffer_pool_mem_assigner.h" | |||||
#include "graph/common/omg_util.h" | |||||
#include "graph/utils/tensor_utils.h" | |||||
#include "framework/common/util.h" | |||||
#include "graph/compute_graph.h" | |||||
#include "graph/debug/ge_attr_define.h" | |||||
#include "common/math/math_util.h" | |||||
#include "common/util/error_manager/error_manager.h" | |||||
namespace ge { | |||||
namespace { | |||||
const size_t kBufferPoolNodeMemInfoLength = 2; | |||||
const uint32_t kBufferPoolNodeOutputSizeIndex = 0; | |||||
const uint32_t kBufferPoolNodeOutputOffsetIndex = 1; | |||||
} // namespace | |||||
Status BufferPoolMemAssigner::Assign() { | |||||
if (compute_graph_ == nullptr) { | |||||
GELOGE(PARAM_INVALID, "[Check][Graph]Graph is nullptr"); | |||||
REPORT_INNER_ERROR("E19999", "Input graph is nullptr"); | |||||
return PARAM_INVALID; | |||||
} | |||||
Status ret = InitAssigner(compute_graph_); | |||||
if (ret != SUCCESS) { | |||||
GELOGE(FAILED, "[Init][Assigner]Graph:%s.", compute_graph_->GetName().c_str()); | |||||
return FAILED; | |||||
} | |||||
ret = AssignOutput(); | |||||
if (ret != SUCCESS) { | |||||
GELOGE(FAILED, "[Assign][Output]Graph:%s.", compute_graph_->GetName().c_str()); | |||||
return FAILED; | |||||
} | |||||
return SUCCESS; | |||||
} | |||||
Status BufferPoolMemAssigner::GetOutputMemoryType(const NodePtr &node, size_t idx, int64_t &memory_type) { | |||||
GE_CHECK_NOTNULL(node->GetOpDesc()); | |||||
memory_type = RT_MEMORY_HBM; | |||||
std::vector<int64_t> type_list; | |||||
bool has_mem_type = ge::AttrUtils::GetListInt(node->GetOpDesc(), ATTR_NAME_OUTPUT_MEM_TYPE_LIST, type_list); | |||||
if (has_mem_type && (type_list.size() != node->GetOpDesc()->GetOutputsSize() || idx >= type_list.size())) { | |||||
GELOGE(PARAM_INVALID, "[Check][OutputParam]Output param invalid, output size:%zu, mem type size:%zu, index:%zu.", | |||||
node->GetOpDesc()->GetOutputsSize(), type_list.size(), idx); | |||||
REPORT_INNER_ERROR("E19999", "Output param invalid, output size:%zu, mem type size:%zu, index:%zu.", | |||||
node->GetOpDesc()->GetOutputsSize(), type_list.size(), idx); | |||||
return PARAM_INVALID; | |||||
} | |||||
memory_type = has_mem_type ? type_list[idx] : RT_MEMORY_HBM; | |||||
return SUCCESS; | |||||
} | |||||
Status BufferPoolMemAssigner::InitAssigner(const ComputeGraphPtr &graph) { | |||||
for (const NodePtr &node : graph->GetAllNodes()) { | |||||
int64_t buffer_pool_id = 0; | |||||
int64_t buffer_pool_size = 0; | |||||
bool get_attr = AttrUtils::GetInt(node->GetOpDesc(), ATTR_NAME_BUFFER_POOL_ID, buffer_pool_id); | |||||
get_attr = get_attr && (AttrUtils::GetInt(node->GetOpDesc(), ATTR_NAME_BUFFER_POOL_SIZE, buffer_pool_size)); | |||||
if (get_attr) { | |||||
std::string batch_label; | |||||
(void) AttrUtils::GetStr(node->GetOpDesc(), ATTR_NAME_BATCH_LABEL, batch_label); | |||||
buffer_pool_nodes_[batch_label][buffer_pool_id].emplace_back(node); | |||||
auto iter = buffer_pool_size_[batch_label].find(buffer_pool_id); | |||||
if (iter == buffer_pool_size_[batch_label].end()) { | |||||
buffer_pool_size_[batch_label][buffer_pool_id] = buffer_pool_size; | |||||
} | |||||
Status ret = InitMemOffsetBase(node); | |||||
if (ret != SUCCESS) { | |||||
GELOGE(ret, "[Init][MemOffsetBase]Batch label:%s.", batch_label.c_str()); | |||||
REPORT_INNER_ERROR("E19999", "Failed to init offset base, batch label:%s.", batch_label.c_str()); | |||||
return ret; | |||||
} | |||||
} | |||||
} | |||||
int64_t max_size = 0; | |||||
for (const auto &iter : buffer_pool_size_) { | |||||
std::string batch_label = iter.first; | |||||
int64_t batch_offset = mem_offset_base_; | |||||
for (const auto &buffer_pool : iter.second) { | |||||
int64_t buffer_pool_id = buffer_pool.first; | |||||
int64_t buffer_pool_size = buffer_pool.second; | |||||
buffer_pool_offset_base_[batch_label][buffer_pool_id] = batch_offset; | |||||
FMK_INT64_ADDCHECK(buffer_pool_size, kBufferPoolMemAlignSize); | |||||
AlignMemSize(buffer_pool_size, kBufferPoolMemAlignSize); | |||||
FMK_INT64_ADDCHECK(batch_offset, (buffer_pool_size + kBufferPoolMemAlignSize)); | |||||
batch_offset += (buffer_pool_size + kBufferPoolMemAlignSize); | |||||
} | |||||
int64_t batch_mem_size = batch_offset - mem_offset_base_; | |||||
GELOGI("[Init][Assigner]Get batch mem size, batch label:%s, mem size:%ld.", batch_label.c_str(), batch_mem_size); | |||||
if (max_size < batch_mem_size) { | |||||
max_size = batch_mem_size; | |||||
} | |||||
} | |||||
FMK_INT64_ADDCHECK(mem_offset_base_, max_size); | |||||
mem_offset_ = static_cast<size_t>(mem_offset_base_ + max_size); | |||||
GELOGI("[Init][Assigner]Init buffer pool mem assigner successfully, " | |||||
"mem type:%ld, mem offset base:%ld, mem offset:%zu.", mem_type_, mem_offset_base_, mem_offset_); | |||||
return SUCCESS; | |||||
} | |||||
Status BufferPoolMemAssigner::InitMemOffsetBase(const NodePtr &node) { | |||||
int64_t mem_type; | |||||
Status ret = GetOutputMemoryType(node, static_cast<size_t>(kBufferPoolNodeOutIndex), mem_type); | |||||
if (ret != SUCCESS) { | |||||
GELOGE(ret, "[Get][MemType]Node:%s, index:%u.", node->GetName().c_str(), kBufferPoolNodeOutIndex); | |||||
REPORT_INNER_ERROR("E19999", "Failed to get output memory type, node:%s, index:%u.", | |||||
node->GetName().c_str(), kBufferPoolNodeOutIndex); | |||||
return ret; | |||||
} | |||||
if (mem_type_ != mem_type && init_offset_base_) { | |||||
GELOGE(PARAM_INVALID, "[Check][MemType]The memory type of all buffer pool nodes must be the same, node:%s, " | |||||
"required:%ld, actually: %ld", node->GetName().c_str(), mem_type_, mem_type); | |||||
REPORT_INNER_ERROR("E19999", "The memory type of all buffer pool nodes must be the same, node:%s, " | |||||
"required:%ld, actually: %ld", node->GetName().c_str(), mem_type_, mem_type); | |||||
return PARAM_INVALID; | |||||
} | |||||
if (!init_offset_base_) { | |||||
auto iter = mem_type_to_offset_.find(mem_type); | |||||
if (iter == mem_type_to_offset_.end()) { | |||||
GELOGE(PARAM_INVALID, "[Check][MemType]Memory type is not supported, node:%s, mem type:%ld.", | |||||
node->GetName().c_str(), mem_type); | |||||
REPORT_INNER_ERROR("E19999", "Memory type is not supported, node:%s, mem type:%ld.", | |||||
node->GetName().c_str(), mem_type); | |||||
return PARAM_INVALID; | |||||
} | |||||
mem_offset_base_ = static_cast<int64_t>(iter->second); | |||||
FMK_INT64_ADDCHECK(mem_offset_base_, (kBufferPoolMemAlignSize + kBufferPoolMemAlignSize)); | |||||
AlignMemSize(mem_offset_base_, kBufferPoolMemAlignSize); | |||||
// The HCOM nodes may access the previous 512 bytes. | |||||
mem_offset_base_ += kBufferPoolMemAlignSize; | |||||
mem_type_ = mem_type; | |||||
init_offset_base_ = true; | |||||
GELOGI("[Init][MemOffsetBase]Init offset base:%ld, memory type:%ld", mem_offset_base_, mem_type); | |||||
} | |||||
return SUCCESS; | |||||
} | |||||
Status BufferPoolMemAssigner::AssignOutput() { | |||||
for (auto &batch_pool_nodes_map : buffer_pool_nodes_) { | |||||
std::string batch_label = batch_pool_nodes_map.first; | |||||
for (auto &pool_nodes_map : batch_pool_nodes_map.second) { | |||||
int64_t buffer_pool_id = pool_nodes_map.first; | |||||
auto iter_buffer_id_size = buffer_pool_size_[batch_label].find(buffer_pool_id); | |||||
if (iter_buffer_id_size == buffer_pool_size_[batch_label].end()) { | |||||
GELOGE(INTERNAL_ERROR, "[Get][BufferPoolSize]Pool id:%ld.", buffer_pool_id); | |||||
REPORT_INNER_ERROR("E19999", "Failed to get buffer pool size, pool id:%ld.", buffer_pool_id); | |||||
return INTERNAL_ERROR; | |||||
} | |||||
auto iter_buffer_id_offset = buffer_pool_offset_base_[batch_label].find(buffer_pool_id); | |||||
if (iter_buffer_id_offset == buffer_pool_offset_base_[batch_label].end()) { | |||||
GELOGE(INTERNAL_ERROR, "[Get][BufferPoolBaseOffset]Pool id:%ld.", buffer_pool_id); | |||||
REPORT_INNER_ERROR("E19999", "Failed to get buffer pool base offset, pool id:%ld.", buffer_pool_id); | |||||
return INTERNAL_ERROR; | |||||
} | |||||
int64_t buffer_pool_size = iter_buffer_id_size->second; | |||||
int64_t output_offset_base = iter_buffer_id_offset->second; | |||||
Status ret = AssignOutputInOneBufferPool(batch_label, output_offset_base, pool_nodes_map.second); | |||||
if (ret != SUCCESS) { | |||||
GELOGE(ret, "[Assign][OneBufferPool]Batch label:%s, pool id:%ld, pool size:%ld, offset base:%ld.", | |||||
batch_label.c_str(), buffer_pool_id, buffer_pool_size, output_offset_base); | |||||
REPORT_INNER_ERROR("E19999", "Failed to assign output memory, batch label:%s, " | |||||
"pool id:%ld, pool size:%ld, offset base:%ld.", | |||||
batch_label.c_str(), buffer_pool_id, buffer_pool_size, output_offset_base); | |||||
return ret; | |||||
} | |||||
GELOGI("[Assign][Output]Assign output successfully, batch label:%s, pool id:%ld, pool size:%ld, offset base:%ld.", | |||||
batch_label.c_str(), buffer_pool_id, buffer_pool_size, output_offset_base); | |||||
} | |||||
} | |||||
return SUCCESS; | |||||
} | |||||
Status BufferPoolMemAssigner::AssignOutputInOneBufferPool(const std::string &batch_label, | |||||
int64_t output_offset_base, | |||||
const std::vector<NodePtr> &buffer_pool_nodes) { | |||||
for (const NodePtr &node : buffer_pool_nodes) { | |||||
int64_t output_size = 0; | |||||
Status ret = GetMemorySize(node, output_size); | |||||
if (ret != SUCCESS) { | |||||
GELOGE(ret, "[Get][MemSize]Node:%s.", node->GetName().c_str()); | |||||
REPORT_INNER_ERROR("E19999", "Failed to get output size, node:%s.", node->GetName().c_str()); | |||||
return ret; | |||||
} | |||||
OpDescPtr op_desc = node->GetOpDesc(); | |||||
GE_CHECK_NOTNULL(op_desc); | |||||
vector<int64_t> memory_size_and_offset; | |||||
bool get_attr = AttrUtils::GetListInt(op_desc, ATTR_NAME_BUFFER_POOL_NODE_SIZE_AND_OFFSET, memory_size_and_offset); | |||||
if (!get_attr || memory_size_and_offset.size() != kBufferPoolNodeMemInfoLength) { | |||||
GELOGE(PARAM_INVALID, "[Get][Attr]Node:%s, mem info size:%zu, required size:%zu.", | |||||
node->GetName().c_str(), memory_size_and_offset.size(), kBufferPoolNodeMemInfoLength); | |||||
REPORT_INNER_ERROR("E19999", "Failed to get pool node memory info, node:%s, info size:%zu, required size:%zu.", | |||||
node->GetName().c_str(), memory_size_and_offset.size(), kBufferPoolNodeMemInfoLength); | |||||
return PARAM_INVALID; | |||||
} | |||||
if (output_size != memory_size_and_offset[kBufferPoolNodeOutputSizeIndex]) { | |||||
GELOGE(PARAM_INVALID, "[Check][MemSize]Something wrong with memory size, pre size:%ld, curr size:%ld, node:%s.", | |||||
memory_size_and_offset[kBufferPoolNodeOutputSizeIndex], output_size, node->GetName().c_str()); | |||||
REPORT_INNER_ERROR("E19999", "Something wrong with memory size, pre size:%ld, curr size:%ld, node:%s.", | |||||
memory_size_and_offset[kBufferPoolNodeOutputSizeIndex], output_size, node->GetName().c_str()); | |||||
return PARAM_INVALID; | |||||
} | |||||
int64_t logical_offset = memory_size_and_offset[kBufferPoolNodeOutputOffsetIndex]; | |||||
vector<int64_t> output_list = {(output_offset_base + logical_offset)}; | |||||
op_desc->SetOutputOffset(output_list); | |||||
// log for IMAS tools | |||||
GELOGI("[IMAS]Set %s name[%s] optype[%s] %s[%u] offset to [%ld] streamid[%ld] memtype[%ld] " | |||||
"size[%zu] realsize[%zu] noalignsize[%zu] life time begin[%d] life time end[%d] " | |||||
"child[%d:%d:%d:%d:%d] isref[%d] batch[%s]", | |||||
compute_graph_->GetName().c_str(), op_desc->GetName().c_str(), op_desc->GetType().c_str(), | |||||
"output", kBufferPoolNodeOutIndex, output_list[kBufferPoolNodeOutIndex], op_desc->GetStreamId(), mem_type_, | |||||
static_cast<size_t>(output_size), static_cast<size_t>(output_size), static_cast<size_t>(output_size), | |||||
0, 0, 0, 0, 0, 0, 0, 0, batch_label.c_str()); | |||||
} | |||||
return SUCCESS; | |||||
} | |||||
} // namespace ge |
@@ -0,0 +1,83 @@ | |||||
/** | |||||
* Copyright 2020 Huawei Technologies Co., Ltd | |||||
* | |||||
* Licensed under the Apache License, Version 2.0 (the "License"); | |||||
* you may not use this file except in compliance with the License. | |||||
* You may obtain a copy of the License at | |||||
* | |||||
* http://www.apache.org/licenses/LICENSE-2.0 | |||||
* | |||||
* Unless required by applicable law or agreed to in writing, software | |||||
* distributed under the License is distributed on an "AS IS" BASIS, | |||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
* See the License for the specific language governing permissions and | |||||
* limitations under the License. | |||||
*/ | |||||
#ifndef GE_GRAPH_BUILD_MEMORY_BUFFER_POOL_MEM_ASSIGNER_H_ | |||||
#define GE_GRAPH_BUILD_MEMORY_BUFFER_POOL_MEM_ASSIGNER_H_ | |||||
#include <vector> | |||||
#include <map> | |||||
#include <unordered_map> | |||||
#include "graph/build/memory/mem_assigner.h" | |||||
#include "runtime/mem.h" | |||||
namespace ge { | |||||
class BufferPoolMemAssigner : public MemAssigner { | |||||
public: | |||||
BufferPoolMemAssigner(ComputeGraphPtr compute_graph, const std::map<int64_t, size_t> &mem_type_to_offset) | |||||
: MemAssigner(), compute_graph_(compute_graph), | |||||
mem_type_(0), | |||||
mem_offset_(0), | |||||
mem_offset_base_(0), | |||||
init_offset_base_(false), | |||||
mem_type_to_offset_(mem_type_to_offset) {} | |||||
BufferPoolMemAssigner(const BufferPoolMemAssigner &) = delete; | |||||
BufferPoolMemAssigner &operator=(const BufferPoolMemAssigner &) = delete; | |||||
~BufferPoolMemAssigner() override = default; | |||||
Status Assign() override; | |||||
size_t GetMemOffset() const { return mem_offset_; } | |||||
int64_t GetMemType() const { return mem_type_; } | |||||
private: | |||||
static Status GetOutputMemoryType(const NodePtr &node, size_t idx, int64_t &memory_type); | |||||
Status InitAssigner(const ComputeGraphPtr &graph); | |||||
Status InitMemOffsetBase(const NodePtr &node); | |||||
Status AssignOutput(); | |||||
Status AssignOutputInOneBufferPool(const std::string &batch_label, | |||||
int64_t output_offset_base, | |||||
const std::vector<NodePtr> &buffer_pool_nodes); | |||||
ComputeGraphPtr compute_graph_; | |||||
int64_t mem_type_; | |||||
size_t mem_offset_; | |||||
int64_t mem_offset_base_; | |||||
bool init_offset_base_; | |||||
std::map<int64_t, size_t> mem_type_to_offset_; | |||||
// Use map to ensure that each visit is in the order of pool id | |||||
std::unordered_map<std::string, std::map<int64_t, std::vector<NodePtr>>> buffer_pool_nodes_; | |||||
// Use map to ensure that each visit is in the order of pool id | |||||
std::unordered_map<std::string, std::map<int64_t, int64_t>> buffer_pool_size_; | |||||
std::unordered_map<std::string, std::unordered_map<int64_t, int64_t>> buffer_pool_offset_base_; | |||||
}; | |||||
} // namespace ge | |||||
#endif // GE_GRAPH_BUILD_MEMORY_BUFFER_POOL_MEM_ASSIGNER_H_ |
@@ -110,8 +110,11 @@ class GraphMemoryAssigner { | |||||
ge::Status SetInputOffset(); | ge::Status SetInputOffset(); | ||||
ge::Status UpdateOpInputOffset(const NodePtr &node) const; | ge::Status UpdateOpInputOffset(const NodePtr &node) const; | ||||
ge::Status UpdateRefOpOutputOffset(const NodePtr &node, const std::map<int32_t, int32_t> &out2ins, const int ref_in, | |||||
const int64_t input_offset) const; | |||||
ge::Status CheckOffset(); | ge::Status CheckOffset(); | ||||
ge::Status CheckRefNodeOffset(const NodePtr &node); | |||||
ge::Status AssignReferenceMemory(); | ge::Status AssignReferenceMemory(); | ||||
@@ -125,7 +128,7 @@ class GraphMemoryAssigner { | |||||
ge::Status ReAssignAtomicMemory(bool is_loop_graph); | ge::Status ReAssignAtomicMemory(bool is_loop_graph); | ||||
ge::Status GetAllRef(const NodePtr &node, std::map<int32_t, int32_t> &out2ins); | |||||
ge::Status TryGetNodeRefIndexes(const NodePtr &node, std::map<int32_t, int32_t> &out2ins) const; | |||||
bool AssignContinuousInputMemoryWithAtomicProcessDirectly(const NodePtr &input_continuous_node, | bool AssignContinuousInputMemoryWithAtomicProcessDirectly(const NodePtr &input_continuous_node, | ||||
std::map<NodePtr, uint32_t> &node_2_continuous_type); | std::map<NodePtr, uint32_t> &node_2_continuous_type); | ||||
@@ -188,6 +191,8 @@ class GraphMemoryAssigner { | |||||
void PrintMemoryOffset(); | void PrintMemoryOffset(); | ||||
Status AssignBufferPoolMemory(); | |||||
MemoryOffsetMap memory_offset_; | MemoryOffsetMap memory_offset_; | ||||
ge::ComputeGraphPtr compute_graph_; | ge::ComputeGraphPtr compute_graph_; | ||||
HybridMemAssignerPtr mem_assigner_; | HybridMemAssignerPtr mem_assigner_; | ||||
@@ -42,6 +42,7 @@ Status HybridMemAssigner::AssignMemory(std::unique_ptr<BlockMemAssigner> &block_ | |||||
Status HybridMemAssigner::Assign() { | Status HybridMemAssigner::Assign() { | ||||
if (GraphUtils::GetRefMapping(compute_graph_, symbol_to_anchors_, anchor_to_symbol_) != GRAPH_SUCCESS) { | if (GraphUtils::GetRefMapping(compute_graph_, symbol_to_anchors_, anchor_to_symbol_) != GRAPH_SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Get ref-mapping for graph %s failed", compute_graph_->GetName().c_str()); | |||||
GELOGE(FAILED, "Get ref-mapping for graph %s failed.", compute_graph_->GetName().c_str()); | GELOGE(FAILED, "Get ref-mapping for graph %s failed.", compute_graph_->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -8,6 +8,7 @@ local_lib_src_files := memory_assigner.cc \ | |||||
hybrid_mem_assigner.cc \ | hybrid_mem_assigner.cc \ | ||||
max_block_mem_assigner.cc \ | max_block_mem_assigner.cc \ | ||||
var_mem_assign_util.cc \ | var_mem_assign_util.cc \ | ||||
buffer_pool_mem_assigner.cc \ | |||||
local_lib_inc_path := ${LOCAL_PATH} \ | local_lib_inc_path := ${LOCAL_PATH} \ | ||||
${TOPDIR}inc \ | ${TOPDIR}inc \ | ||||
@@ -53,6 +53,8 @@ Status VarMemAssignUtil::AssignStaticMemory2Node(ge::ComputeGraphPtr &compute_gr | |||||
GE_IF_BOOL_EXEC(ge::AttrUtils::GetStr(n->GetOpDesc(), REF_VAR_SRC_VAR_NAME, ref_var_src_var_name), continue); | GE_IF_BOOL_EXEC(ge::AttrUtils::GetStr(n->GetOpDesc(), REF_VAR_SRC_VAR_NAME, ref_var_src_var_name), continue); | ||||
string node_name = n->GetName(); | string node_name = n->GetName(); | ||||
GE_IF_BOOL_EXEC(n->GetOpDesc()->GetAllOutputsDesc().empty(), | GE_IF_BOOL_EXEC(n->GetOpDesc()->GetAllOutputsDesc().empty(), | ||||
REPORT_INNER_ERROR("E19999", "check node:%s has no OutputDesc", | |||||
n->GetName().c_str()); | |||||
GELOGE(FAILED, "node:%s has no OutputDesc.", n->GetName().c_str()); | GELOGE(FAILED, "node:%s has no OutputDesc.", n->GetName().c_str()); | ||||
return FAILED); | return FAILED); | ||||
ge::ConstGeTensorDescPtr tensor_desc = n->GetOpDesc()->GetOutputDescPtr(0); | ge::ConstGeTensorDescPtr tensor_desc = n->GetOpDesc()->GetOutputDescPtr(0); | ||||
@@ -116,6 +118,8 @@ Status VarMemAssignUtil::SetOutVariableAttr(const ge::NodePtr &node, const ge::N | |||||
GE_CHECK_NOTNULL(node->GetOpDesc()); | GE_CHECK_NOTNULL(node->GetOpDesc()); | ||||
output_list = node->GetOpDesc()->GetOutputOffset(); | output_list = node->GetOpDesc()->GetOutputOffset(); | ||||
if (output_list.empty()) { | if (output_list.empty()) { | ||||
REPORT_INNER_ERROR("E19999", "check node:%s output_offset_list is empty", | |||||
node->GetName().c_str()); | |||||
GELOGE(PARAM_INVALID, "Output_list is empty"); | GELOGE(PARAM_INVALID, "Output_list is empty"); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
} | } | ||||
@@ -126,7 +130,12 @@ Status VarMemAssignUtil::SetOutVariableAttr(const ge::NodePtr &node, const ge::N | |||||
VarManager::Instance(session_id)->GetVarAddr(var_node->GetName(), var_tensor_desc, &dev_ptr, memory_type)); | VarManager::Instance(session_id)->GetVarAddr(var_node->GetName(), var_tensor_desc, &dev_ptr, memory_type)); | ||||
int out_list_size = static_cast<int>(output_list.size()); | int out_list_size = static_cast<int>(output_list.size()); | ||||
GE_CHK_BOOL_RET_STATUS(index < out_list_size, FAILED, "index %d >= output_list.size() %d", index, out_list_size); | |||||
if (index >= out_list_size) { | |||||
REPORT_INNER_ERROR("E19999", "param index:%d >= output_list.size() %d in node %s, check invalid", | |||||
index, out_list_size, node->GetName().c_str()); | |||||
GELOGE(FAILED, "index %d >= output_list.size() %d", index, out_list_size); | |||||
return FAILED; | |||||
} | |||||
output_list[index] = static_cast<int64_t>(reinterpret_cast<intptr_t>(dev_ptr)); | output_list[index] = static_cast<int64_t>(reinterpret_cast<intptr_t>(dev_ptr)); | ||||
GELOGI("Assign node outputOffset[index] is: %ld", output_list[index]); | GELOGI("Assign node outputOffset[index] is: %ld", output_list[index]); | ||||
@@ -168,9 +177,13 @@ Status VarMemAssignUtil::DealBroadCastNode(uint32_t graph_id, const ge::NodePtr | |||||
auto broad_cast_index = static_cast<size_t>(broad_cast_info.idx); | auto broad_cast_index = static_cast<size_t>(broad_cast_info.idx); | ||||
auto input_tensor_desc_ptr_vistor = op_desc->GetAllInputsDescPtr(); | auto input_tensor_desc_ptr_vistor = op_desc->GetAllInputsDescPtr(); | ||||
GE_CHK_BOOL_RET_STATUS(input_tensor_desc_ptr_vistor.size() > broad_cast_index, FAILED, | |||||
"Get broadcast op %s input tensor desc size [%zu] < idx [%d]", node->GetName().c_str(), | |||||
input_tensor_desc_ptr_vistor.size(), broad_cast_info.idx); | |||||
if (input_tensor_desc_ptr_vistor.size() <= broad_cast_index) { | |||||
REPORT_INNER_ERROR("E19999", "Get broadcast op %s input tensor desc size [%zu] < idx [%d]", | |||||
node->GetName().c_str(), input_tensor_desc_ptr_vistor.size(), broad_cast_info.idx); | |||||
GELOGE(FAILED, "Get broadcast op %s input tensor desc size [%zu] < idx [%d]", node->GetName().c_str(), | |||||
input_tensor_desc_ptr_vistor.size(), broad_cast_info.idx); | |||||
return FAILED; | |||||
} | |||||
const ge::GeTensorDescPtr input_tensor_desc = | const ge::GeTensorDescPtr input_tensor_desc = | ||||
input_tensor_desc_ptr_vistor.at(static_cast<size_t>(broad_cast_info.idx)); | input_tensor_desc_ptr_vistor.at(static_cast<size_t>(broad_cast_info.idx)); | ||||
int64_t input_size = 0; | int64_t input_size = 0; | ||||
@@ -298,6 +311,7 @@ Status VarMemAssignUtil::SetOutTransNodeToAssign(const ge::NodePtr &node, const | |||||
} | } | ||||
Status VarMemAssignUtil::AssignMemory2HasRefAttrNode(ge::ComputeGraphPtr &compute_graph) { | Status VarMemAssignUtil::AssignMemory2HasRefAttrNode(ge::ComputeGraphPtr &compute_graph) { | ||||
GraphToNodeMap graph_to_node; | |||||
for (const ge::NodePtr &n : compute_graph->GetAllNodes()) { | for (const ge::NodePtr &n : compute_graph->GetAllNodes()) { | ||||
string ref_var_src_var_name; | string ref_var_src_var_name; | ||||
auto op_desc = n->GetOpDesc(); | auto op_desc = n->GetOpDesc(); | ||||
@@ -305,7 +319,8 @@ Status VarMemAssignUtil::AssignMemory2HasRefAttrNode(ge::ComputeGraphPtr &comput | |||||
for (uint32_t idx = 0; idx < op_desc->GetOutputsSize(); idx += 1) { | for (uint32_t idx = 0; idx < op_desc->GetOutputsSize(); idx += 1) { | ||||
const auto out_desc = op_desc->MutableOutputDesc(idx); | const auto out_desc = op_desc->MutableOutputDesc(idx); | ||||
if (ge::AttrUtils::GetStr(out_desc, REF_VAR_SRC_VAR_NAME, ref_var_src_var_name)) { | if (ge::AttrUtils::GetStr(out_desc, REF_VAR_SRC_VAR_NAME, ref_var_src_var_name)) { | ||||
GE_CHK_STATUS_RET(AssignData2VarRef(n, ref_var_src_var_name, compute_graph->GetSessionID(), idx)); | |||||
GE_CHK_STATUS_RET( | |||||
AssignData2VarRef(n, ref_var_src_var_name, compute_graph->GetSessionID(), idx, graph_to_node)); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -313,16 +328,37 @@ Status VarMemAssignUtil::AssignMemory2HasRefAttrNode(ge::ComputeGraphPtr &comput | |||||
} | } | ||||
Status VarMemAssignUtil::AssignData2VarRef(const ge::NodePtr &has_ref_attr_node, const string &src_var_name, | Status VarMemAssignUtil::AssignData2VarRef(const ge::NodePtr &has_ref_attr_node, const string &src_var_name, | ||||
uint64_t session_id, uint32_t out_index) { | |||||
uint64_t session_id, uint32_t out_index, | |||||
GraphToNodeMap &graph_to_node) { | |||||
// Get ref_var_src_var address | // Get ref_var_src_var address | ||||
auto root_graph = GraphUtils::FindRootGraph(has_ref_attr_node->GetOwnerComputeGraph()); | auto root_graph = GraphUtils::FindRootGraph(has_ref_attr_node->GetOwnerComputeGraph()); | ||||
GE_CHECK_NOTNULL(root_graph); | GE_CHECK_NOTNULL(root_graph); | ||||
ge::NodePtr var_ref_src_var = root_graph->FindNode(src_var_name); | |||||
if (var_ref_src_var == nullptr) { | |||||
// Cache mapping (name to nodeptr) simproves query performance | |||||
auto &name_to_node = graph_to_node[root_graph]; | |||||
if (name_to_node.empty()) { | |||||
for (const ge::NodePtr &n : root_graph->GetDirectNode()) { | |||||
name_to_node.emplace(n->GetName(), n); | |||||
} | |||||
for (auto sub_graph : root_graph->GetAllSubgraphs()) { | |||||
auto &name_to_node_sub = graph_to_node[sub_graph]; | |||||
if (name_to_node_sub.empty()) { | |||||
for (const ge::NodePtr &n : sub_graph->GetDirectNode()) { | |||||
name_to_node_sub.emplace(n->GetName(), n); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
ge::NodePtr var_ref_src_var = nullptr; | |||||
auto it = name_to_node.find(src_var_name); | |||||
if ((it != name_to_node.end()) && (it->second != nullptr)) { | |||||
var_ref_src_var = it->second; | |||||
} else { | |||||
for (auto sub_graph : root_graph->GetAllSubgraphs()) { | for (auto sub_graph : root_graph->GetAllSubgraphs()) { | ||||
auto node_ptr = sub_graph->FindNode(src_var_name); | |||||
if (node_ptr != nullptr) { | |||||
var_ref_src_var = node_ptr; | |||||
auto &name_to_node_sub = graph_to_node[sub_graph]; | |||||
it = name_to_node_sub.find(src_var_name); | |||||
if ((it != name_to_node_sub.end()) && (it->second != nullptr)) { | |||||
var_ref_src_var = it->second; | |||||
break; | break; | ||||
} | } | ||||
} | } | ||||
@@ -22,6 +22,8 @@ | |||||
#include "graph/utils/node_utils.h" | #include "graph/utils/node_utils.h" | ||||
namespace ge { | namespace ge { | ||||
using GraphToNodeMap = std::map<ge::ComputeGraphPtr, std::map<std::string, ge::NodePtr>>; | |||||
class VarMemAssignUtil { | class VarMemAssignUtil { | ||||
public: | public: | ||||
static Status AssignVarMemory(ge::ComputeGraphPtr &compute_graph); | static Status AssignVarMemory(ge::ComputeGraphPtr &compute_graph); | ||||
@@ -47,7 +49,7 @@ class VarMemAssignUtil { | |||||
static Status DealTransNode(const ge::NodePtr &final_trans_node); | static Status DealTransNode(const ge::NodePtr &final_trans_node); | ||||
static Status DealExportTransNode(const ge::NodePtr &node, const ge::NodePtr &final_trans_node); | static Status DealExportTransNode(const ge::NodePtr &node, const ge::NodePtr &final_trans_node); | ||||
static Status AssignData2VarRef(const ge::NodePtr &variable_ref, const std::string &src_var_name, uint64_t session_id, | static Status AssignData2VarRef(const ge::NodePtr &variable_ref, const std::string &src_var_name, uint64_t session_id, | ||||
uint32_t out_index); | |||||
uint32_t out_index, GraphToNodeMap &graph_to_node); | |||||
static Status SetOutTransNodeToAssign(const ge::NodePtr &node, const ge::NodePtr &final_trans_node, size_t index); | static Status SetOutTransNodeToAssign(const ge::NodePtr &node, const ge::NodePtr &final_trans_node, size_t index); | ||||
}; | }; | ||||
@@ -116,11 +116,15 @@ Status ModelBuilder::CalcOutputSize(const ge::NodePtr &n) { | |||||
int64_t size_temp = 0; | int64_t size_temp = 0; | ||||
graphStatus graph_status = TensorUtils::GetTensorMemorySizeInBytes(desc_temp, size_temp); | graphStatus graph_status = TensorUtils::GetTensorMemorySizeInBytes(desc_temp, size_temp); | ||||
if (graph_status != GRAPH_SUCCESS) { | if (graph_status != GRAPH_SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Get tensor size in bytes failed for op:%s(%s) index:%u", | |||||
node_op_desc->GetName().c_str(), node_op_desc->GetType().c_str(), index); | |||||
GELOGE(graph_status, "GetTensorMemorySizeInBytes failed!"); | GELOGE(graph_status, "GetTensorMemorySizeInBytes failed!"); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
TensorUtils::SetSize(desc_temp, size_temp); | TensorUtils::SetSize(desc_temp, size_temp); | ||||
if (node_op_desc->UpdateOutputDesc(index, desc_temp) != SUCCESS) { | if (node_op_desc->UpdateOutputDesc(index, desc_temp) != SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Update Output desc size failed for op:%s(%s) index:%u", | |||||
node_op_desc->GetName().c_str(), node_op_desc->GetType().c_str(), index); | |||||
GELOGE(FAILED, "UpdateOutputDesc failed."); | GELOGE(FAILED, "UpdateOutputDesc failed."); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -197,8 +201,7 @@ void ModelBuilder::SetInputIsConst(const ge::NodePtr &n) { | |||||
} | } | ||||
} | } | ||||
std::string input_const_info = ToString(is_input_const); | |||||
GELOGD("update opdesc:%s InputConst:%s", node_op_desc->GetName().c_str(), input_const_info.c_str()); | |||||
GELOGD("update opdesc:%s InputConst:%s", node_op_desc->GetName().c_str(), ToString(is_input_const).c_str()); | |||||
node_op_desc->SetIsInputConst(is_input_const); | node_op_desc->SetIsInputConst(is_input_const); | ||||
} | } | ||||
@@ -207,11 +210,15 @@ Status ModelBuilder::AdjustConstWeightSize(const ge::NodePtr &node, size_t &mem_ | |||||
if (node->GetType() == CONSTANT) { | if (node->GetType() == CONSTANT) { | ||||
vector<GeTensorPtr> weights = OpDescUtils::MutableWeights(node); | vector<GeTensorPtr> weights = OpDescUtils::MutableWeights(node); | ||||
if (weights.empty()) { | if (weights.empty()) { | ||||
REPORT_INNER_ERROR("E19999", "Check weights size of node %s(%s) is empty", | |||||
node->GetName().c_str(), node->GetType().c_str()); | |||||
GELOGE(FAILED, "weights size of node %s is empty", node->GetName().c_str()); | GELOGE(FAILED, "weights size of node %s is empty", node->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
GeTensorPtr weight = weights[0]; | GeTensorPtr weight = weights[0]; | ||||
if (weight == nullptr) { | if (weight == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "Check weight of node %s(%s) is nullptr", | |||||
node->GetName().c_str(), node->GetType().c_str()); | |||||
GELOGE(FAILED, "weights[0] is null."); | GELOGE(FAILED, "weights[0] is null."); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -353,6 +360,9 @@ Status ModelBuilder::AdjustInputTensorFlag() { | |||||
auto input_desc = owner_node_op_desc->GetInputDesc(in_anchors->GetIdx()); | auto input_desc = owner_node_op_desc->GetInputDesc(in_anchors->GetIdx()); | ||||
ge::TensorUtils::SetInputTensor(input_desc, true); | ge::TensorUtils::SetInputTensor(input_desc, true); | ||||
if (owner_node_op_desc->UpdateInputDesc(in_anchors->GetIdx(), input_desc) != SUCCESS) { | if (owner_node_op_desc->UpdateInputDesc(in_anchors->GetIdx(), input_desc) != SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Update Input desc size failed for op:%s(%s) index:%u", | |||||
owner_node_op_desc->GetName().c_str(), owner_node_op_desc->GetType().c_str(), | |||||
in_anchors->GetIdx()); | |||||
GELOGE(FAILED, "UpdateOutputDesc failed."); | GELOGE(FAILED, "UpdateOutputDesc failed."); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -381,33 +391,51 @@ Status ModelBuilder::BuildModelDef(ge::Model &model) { | |||||
max_mem_offset_ = mem_type_to_mem_offset_[RT_MEMORY_HBM]; | max_mem_offset_ = mem_type_to_mem_offset_[RT_MEMORY_HBM]; | ||||
GE_CHK_BOOL_EXEC(ge::AttrUtils::SetInt(&model, ATTR_MODEL_MEMORY_SIZE, max_mem_offset_), | GE_CHK_BOOL_EXEC(ge::AttrUtils::SetInt(&model, ATTR_MODEL_MEMORY_SIZE, max_mem_offset_), | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s in model failed", | |||||
ATTR_MODEL_MEMORY_SIZE.c_str()); | |||||
GELOGE(FAILED, "SetInt of ATTR_MODEL_MEMORY_SIZE failed."); | GELOGE(FAILED, "SetInt of ATTR_MODEL_MEMORY_SIZE failed."); | ||||
return FAILED); | return FAILED); | ||||
if (mem_type_to_mem_offset_.find(RT_MEMORY_P2P_DDR) != mem_type_to_mem_offset_.end()) { | if (mem_type_to_mem_offset_.find(RT_MEMORY_P2P_DDR) != mem_type_to_mem_offset_.end()) { | ||||
p2p_mem_offset_ = mem_type_to_mem_offset_[RT_MEMORY_P2P_DDR]; | p2p_mem_offset_ = mem_type_to_mem_offset_[RT_MEMORY_P2P_DDR]; | ||||
} | } | ||||
GE_CHK_BOOL_EXEC(ge::AttrUtils::SetInt(&model, ATTR_MODEL_P2P_MEMORY_SIZE, p2p_mem_offset_), | GE_CHK_BOOL_EXEC(ge::AttrUtils::SetInt(&model, ATTR_MODEL_P2P_MEMORY_SIZE, p2p_mem_offset_), | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s in model failed", | |||||
ATTR_MODEL_P2P_MEMORY_SIZE.c_str()); | |||||
GELOGE(FAILED, "SetInt of ATTR_MODEL_P2P_MEMORY_SIZE failed."); | GELOGE(FAILED, "SetInt of ATTR_MODEL_P2P_MEMORY_SIZE failed."); | ||||
return FAILED); | return FAILED); | ||||
GE_CHK_BOOL_EXEC(ge::AttrUtils::SetInt(&model, ATTR_MODEL_WEIGHT_SIZE, weight_offset_), | GE_CHK_BOOL_EXEC(ge::AttrUtils::SetInt(&model, ATTR_MODEL_WEIGHT_SIZE, weight_offset_), | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s in model failed", | |||||
ATTR_MODEL_WEIGHT_SIZE.c_str()); | |||||
GELOGE(FAILED, "SetInt of ATTR_MODEL_WEIGHT_SIZE failed."); | GELOGE(FAILED, "SetInt of ATTR_MODEL_WEIGHT_SIZE failed."); | ||||
return FAILED); | return FAILED); | ||||
GE_CHK_BOOL_EXEC(ge::AttrUtils::SetInt(&model, ATTR_MODEL_STREAM_NUM, stream_num_), | GE_CHK_BOOL_EXEC(ge::AttrUtils::SetInt(&model, ATTR_MODEL_STREAM_NUM, stream_num_), | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s in model failed", | |||||
ATTR_MODEL_STREAM_NUM.c_str()); | |||||
GELOGE(FAILED, "SetInt of ATTR_MODEL_STREAM_NUM failed."); | GELOGE(FAILED, "SetInt of ATTR_MODEL_STREAM_NUM failed."); | ||||
return FAILED); | return FAILED); | ||||
GE_CHK_BOOL_EXEC(ge::AttrUtils::SetInt(&model, ATTR_MODEL_EVENT_NUM, event_num_), | GE_CHK_BOOL_EXEC(ge::AttrUtils::SetInt(&model, ATTR_MODEL_EVENT_NUM, event_num_), | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s in model failed", | |||||
ATTR_MODEL_EVENT_NUM.c_str()); | |||||
GELOGE(FAILED, "SetInt of ATTR_MODEL_EVENT_NUM failed."); | GELOGE(FAILED, "SetInt of ATTR_MODEL_EVENT_NUM failed."); | ||||
return FAILED); | return FAILED); | ||||
GE_CHK_BOOL_EXEC(ge::AttrUtils::SetListInt(&model, ATTR_MODEL_HUGE_STREAM_LIST, huge_streams_), | GE_CHK_BOOL_EXEC(ge::AttrUtils::SetListInt(&model, ATTR_MODEL_HUGE_STREAM_LIST, huge_streams_), | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s in model failed", | |||||
ATTR_MODEL_HUGE_STREAM_LIST.c_str()); | |||||
GELOGE(FAILED, "SetInt of ATTR_MODEL_HUGE_STREAM_LIST failed."); | GELOGE(FAILED, "SetInt of ATTR_MODEL_HUGE_STREAM_LIST failed."); | ||||
return FAILED); | return FAILED); | ||||
GE_CHK_BOOL_EXEC(ge::AttrUtils::SetInt(&model, ATTR_MODEL_LABEL_NUM, label_num_), | GE_CHK_BOOL_EXEC(ge::AttrUtils::SetInt(&model, ATTR_MODEL_LABEL_NUM, label_num_), | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s in model failed", | |||||
ATTR_MODEL_LABEL_NUM.c_str()); | |||||
GELOGE(FAILED, "SetInt of ATTR_MODEL_LABEL_NUM failed."); | GELOGE(FAILED, "SetInt of ATTR_MODEL_LABEL_NUM failed."); | ||||
return FAILED); | return FAILED); | ||||
GE_CHK_BOOL_EXEC(ge::AttrUtils::SetInt(&model, ATTR_MODEL_ZERO_COPY_MEMORY_SIZE, zero_copy_mem_size_), | GE_CHK_BOOL_EXEC(ge::AttrUtils::SetInt(&model, ATTR_MODEL_ZERO_COPY_MEMORY_SIZE, zero_copy_mem_size_), | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s in model failed", | |||||
ATTR_MODEL_ZERO_COPY_MEMORY_SIZE.c_str()); | |||||
GELOGE(FAILED, "SetInt of ATTR_MODEL_ZERO_COPY_MEMORY_SIZE failed."); | GELOGE(FAILED, "SetInt of ATTR_MODEL_ZERO_COPY_MEMORY_SIZE failed."); | ||||
return FAILED); | return FAILED); | ||||
GE_CHK_BOOL_EXEC(ge::AttrUtils::SetListStr(&model, ATTR_MODEL_OUT_NODES_NAME, GetLocalOmgContext().net_out_nodes), | GE_CHK_BOOL_EXEC(ge::AttrUtils::SetListStr(&model, ATTR_MODEL_OUT_NODES_NAME, GetLocalOmgContext().net_out_nodes), | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s in model failed", | |||||
ATTR_MODEL_OUT_NODES_NAME.c_str()); | |||||
GELOGE(FAILED, "SetListStr of ATTR_MODEL_OUT_NODES_NAME failed."); | GELOGE(FAILED, "SetListStr of ATTR_MODEL_OUT_NODES_NAME failed."); | ||||
return FAILED); | return FAILED); | ||||
GELOGI("For model, max_mem_offset_: %zu, p2p_mem_size: %zu, zero_copy_mem_size_: %zu", max_mem_offset_, | GELOGI("For model, max_mem_offset_: %zu, p2p_mem_size: %zu, zero_copy_mem_size_: %zu", max_mem_offset_, | ||||
@@ -415,6 +443,8 @@ Status ModelBuilder::BuildModelDef(ge::Model &model) { | |||||
string fp_ceiling_mode; | string fp_ceiling_mode; | ||||
if (ge::GetContext().GetOption("ge.fpCeilingMode", fp_ceiling_mode) == SUCCESS) { | if (ge::GetContext().GetOption("ge.fpCeilingMode", fp_ceiling_mode) == SUCCESS) { | ||||
if (!ge::AttrUtils::SetStr(&model, ATTR_FP_CEILING_MODE, fp_ceiling_mode)) { | if (!ge::AttrUtils::SetStr(&model, ATTR_FP_CEILING_MODE, fp_ceiling_mode)) { | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s in model failed", | |||||
ATTR_FP_CEILING_MODE.c_str()); | |||||
GELOGE(FAILED, "Failed to set attr ATTR_FP_CEILING_MODE"); | GELOGE(FAILED, "Failed to set attr ATTR_FP_CEILING_MODE"); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -429,22 +459,30 @@ Status ModelBuilder::BuildModelDef(ge::Model &model) { | |||||
int64_t core_type = (ge_core_type == kVectorCore) ? 1 : 0; | int64_t core_type = (ge_core_type == kVectorCore) ? 1 : 0; | ||||
GELOGI("core_type: %ld", core_type); | GELOGI("core_type: %ld", core_type); | ||||
if (!ge::AttrUtils::SetInt(&model, ATTR_MODEL_CORE_TYPE, core_type)) { | if (!ge::AttrUtils::SetInt(&model, ATTR_MODEL_CORE_TYPE, core_type)) { | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s in model failed", | |||||
ATTR_MODEL_CORE_TYPE.c_str()); | |||||
GELOGE(FAILED, "SetInt of ATTR_CORE_TYPE failed."); | GELOGE(FAILED, "SetInt of ATTR_CORE_TYPE failed."); | ||||
} | } | ||||
InitL1FusionOption(); | InitL1FusionOption(); | ||||
GE_CHK_BOOL_EXEC(ge::AttrUtils::SetBool(&model, ATTR_NAME_SWITCH_FOR_L1_FUSION, is_l1_fusion_enable_), | GE_CHK_BOOL_EXEC(ge::AttrUtils::SetBool(&model, ATTR_NAME_SWITCH_FOR_L1_FUSION, is_l1_fusion_enable_), | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s in model failed", | |||||
ATTR_NAME_SWITCH_FOR_L1_FUSION.c_str()); | |||||
GELOGE(FAILED, "SetBool of ATTR_NAME_SWITCH_FOR_L1_FUSION failed."); | GELOGE(FAILED, "SetBool of ATTR_NAME_SWITCH_FOR_L1_FUSION failed."); | ||||
return FAILED); | return FAILED); | ||||
const DumpProperties &dump_properties = DumpManager::GetInstance().GetDumpProperties(session_id_); | const DumpProperties &dump_properties = DumpManager::GetInstance().GetDumpProperties(session_id_); | ||||
bool is_op_debug = dump_properties.IsOpDebugOpen(); | bool is_op_debug = dump_properties.IsOpDebugOpen(); | ||||
if (is_op_debug) { | if (is_op_debug) { | ||||
if (!ge::AttrUtils::SetBool(&model, ATTR_OP_DEBUG_FLAG, is_op_debug)) { | if (!ge::AttrUtils::SetBool(&model, ATTR_OP_DEBUG_FLAG, is_op_debug)) { | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s in model failed", | |||||
ATTR_OP_DEBUG_FLAG.c_str()); | |||||
GELOGE(FAILED, "SetBool of ATTR_OP_DEBUG_FLAG failed."); | GELOGE(FAILED, "SetBool of ATTR_OP_DEBUG_FLAG failed."); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
uint32_t op_debug_mode = dump_properties.GetOpDebugMode(); | uint32_t op_debug_mode = dump_properties.GetOpDebugMode(); | ||||
GELOGI("Get op debug mode:%d", op_debug_mode); | GELOGI("Get op debug mode:%d", op_debug_mode); | ||||
if (!ge::AttrUtils::SetInt(&model, ATTR_OP_DEBUG_MODE, op_debug_mode)) { | if (!ge::AttrUtils::SetInt(&model, ATTR_OP_DEBUG_MODE, op_debug_mode)) { | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s in model failed", | |||||
ATTR_OP_DEBUG_MODE.c_str()); | |||||
GELOGE(FAILED, "SetBool of ATTR_OP_DEBUG_MODE failed."); | GELOGE(FAILED, "SetBool of ATTR_OP_DEBUG_MODE failed."); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -516,6 +554,8 @@ Status ModelBuilder::MergeWeights() { | |||||
// If MutableTensor failed, weight is nullptr. | // If MutableTensor failed, weight is nullptr. | ||||
(void)ge::AttrUtils::MutableTensor(op_desc, ATTR_NAME_WEIGHTS, weight); | (void)ge::AttrUtils::MutableTensor(op_desc, ATTR_NAME_WEIGHTS, weight); | ||||
if (weight == nullptr) { | if (weight == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "Can't get const weight in op:%s(%s)", | |||||
op_desc->GetName().c_str(), op_desc->GetType().c_str()); | |||||
GELOGE(FAILED, "Can't get const op weight, name: %s", node->GetName().c_str()); | GELOGE(FAILED, "Can't get const op weight, name: %s", node->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -538,8 +578,15 @@ Status ModelBuilder::MergeWeights() { | |||||
continue; | continue; | ||||
} | } | ||||
if (weight_data.data() != nullptr) { | if (weight_data.data() != nullptr) { | ||||
GE_IF_BOOL_EXEC(base_addr == nullptr, GELOGE(FAILED, "Base addr is nullptr."); return FAILED); | |||||
GE_IF_BOOL_EXEC(base_addr == nullptr, | |||||
REPORT_INNER_ERROR("E19999", "Check weight in op:%s(%s) is nullptr", | |||||
op_desc->GetName().c_str(), op_desc->GetType().c_str()); | |||||
GELOGE(FAILED, "Base addr is nullptr."); | |||||
return FAILED); | |||||
if (weight_offset_ - offset < weight_data.size()) { | if (weight_offset_ - offset < weight_data.size()) { | ||||
REPORT_INNER_ERROR("E19999", "left weight size not enough for op:%s(%s) left_size:%zu, weight_size:%zu", | |||||
op_desc->GetName().c_str(), op_desc->GetType().c_str(), | |||||
weight_offset_ - offset, weight_data.size()); | |||||
GELOGE(FAILED, "left weight size not enough. left_size:%lu, weight_size:%lu", | GELOGE(FAILED, "left weight size not enough. left_size:%lu, weight_size:%lu", | ||||
weight_offset_ - offset, weight_data.size()); | weight_offset_ - offset, weight_data.size()); | ||||
return FAILED; | return FAILED; | ||||
@@ -551,6 +598,9 @@ Status ModelBuilder::MergeWeights() { | |||||
auto err = memcpy_s(reinterpret_cast<void *>(dst_ptr), SECUREC_MEM_MAX_LEN, reinterpret_cast<void *>(src_ptr), | auto err = memcpy_s(reinterpret_cast<void *>(dst_ptr), SECUREC_MEM_MAX_LEN, reinterpret_cast<void *>(src_ptr), | ||||
SECUREC_MEM_MAX_LEN); | SECUREC_MEM_MAX_LEN); | ||||
if (err != EOK) { | if (err != EOK) { | ||||
REPORT_CALL_ERROR("E19999", "mem copy failed. errret:%u, " | |||||
"dst_ptr:%lx, dst_size:%lu, src_ptr:%lx, src_size:%lu,", | |||||
err, dst_ptr, SECUREC_MEM_MAX_LEN, src_ptr, SECUREC_MEM_MAX_LEN); | |||||
GELOGE(FAILED, "mem copy failed. errret:%u, " | GELOGE(FAILED, "mem copy failed. errret:%u, " | ||||
"dst_ptr:%lx, dst_size:%lu, src_ptr:%lx, src_size:%lu", | "dst_ptr:%lx, dst_size:%lu, src_ptr:%lx, src_size:%lu", | ||||
err, dst_ptr, SECUREC_MEM_MAX_LEN, src_ptr, SECUREC_MEM_MAX_LEN); | err, dst_ptr, SECUREC_MEM_MAX_LEN, src_ptr, SECUREC_MEM_MAX_LEN); | ||||
@@ -562,6 +612,9 @@ Status ModelBuilder::MergeWeights() { | |||||
} | } | ||||
auto err = memcpy_s(reinterpret_cast<void *>(dst_ptr), left_size, reinterpret_cast<void *>(src_ptr), left_size); | auto err = memcpy_s(reinterpret_cast<void *>(dst_ptr), left_size, reinterpret_cast<void *>(src_ptr), left_size); | ||||
if (err != EOK) { | if (err != EOK) { | ||||
REPORT_CALL_ERROR("E19999", "mem copy failed. errret:%u, " | |||||
"dst_ptr:%lx, dst_size:%lu, src_ptr:%lx, src_size:%lu,", | |||||
err, dst_ptr, SECUREC_MEM_MAX_LEN, src_ptr, SECUREC_MEM_MAX_LEN); | |||||
GELOGE(FAILED, "mem copy failed. errret:%u, " | GELOGE(FAILED, "mem copy failed. errret:%u, " | ||||
"dst_ptr:%lx, dst_size:%lu, src_ptr:%lx, src_size:%lu", | "dst_ptr:%lx, dst_size:%lu, src_ptr:%lx, src_size:%lu", | ||||
err, dst_ptr, SECUREC_MEM_MAX_LEN, src_ptr, SECUREC_MEM_MAX_LEN); | err, dst_ptr, SECUREC_MEM_MAX_LEN, src_ptr, SECUREC_MEM_MAX_LEN); | ||||
@@ -574,6 +627,50 @@ Status ModelBuilder::MergeWeights() { | |||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
Status ModelBuilder::SaveAtomicTBEKernel(const OpDescPtr &op_desc) { | |||||
ge::NodePtr atomic_clean_node = nullptr; | |||||
atomic_clean_node = op_desc->TryGetExtAttr("atomic_clean_node_ptr", atomic_clean_node); | |||||
if (atomic_clean_node == nullptr) { | |||||
return SUCCESS; | |||||
} | |||||
ge::OpDescPtr atomic_op_desc = atomic_clean_node->GetOpDesc(); | |||||
GE_CHECK_NOTNULL(atomic_op_desc); | |||||
TBEKernelPtr tbe_kernel = atomic_op_desc->TryGetExtAttr(ge::OP_EXTATTR_NAME_TBE_KERNEL, TBEKernelPtr()); | |||||
if (tbe_kernel == nullptr) { | |||||
std::string kernel_name; | |||||
GeAttrValue::BYTES kernel_buffer; | |||||
(void) AttrUtils::GetStr(atomic_op_desc, ATTR_NAME_TBE_KERNEL_NAME, kernel_name); | |||||
(void) AttrUtils::GetBytes(atomic_op_desc, ATTR_NAME_TBE_KERNEL_BUFFER, kernel_buffer); | |||||
if (!kernel_name.empty() && (kernel_buffer.GetSize() > 0)) { | |||||
GE_CHECK_NOTNULL(kernel_buffer.GetData()); | |||||
std::vector<char> data(kernel_buffer.GetData(), kernel_buffer.GetData() + kernel_buffer.GetSize()); | |||||
tbe_kernel = MakeShared<OpKernelBin>(kernel_name, std::move(data)); | |||||
GE_CHECK_NOTNULL(tbe_kernel); | |||||
} | |||||
} | |||||
if (tbe_kernel == nullptr) { | |||||
GELOGD("Atomic_clean_node doesn't have tbe_kernel."); | |||||
return SUCCESS; | |||||
} | |||||
tbe_kernel_store_.AddTBEKernel(tbe_kernel); | |||||
GELOGD("Atomic_clean_node tbe_kernel_name %s!", tbe_kernel->GetName().c_str()); | |||||
(void) AttrUtils::SetStr(op_desc, ATOMIC_ATTR_TBE_KERNEL_NAME, tbe_kernel->GetName()); | |||||
std::string kernel_name; | |||||
(void) AttrUtils::GetStr(atomic_op_desc, atomic_op_desc->GetName() + "_kernelname", kernel_name); | |||||
(void) AttrUtils::SetStr(op_desc, op_desc->GetName() + "_atomic_kernelname", kernel_name); | |||||
std::string meta_data; | |||||
(void) AttrUtils::GetStr(atomic_op_desc, TVM_ATTR_NAME_METADATA, meta_data); | |||||
(void) AttrUtils::SetStr(op_desc, ATOMIC_ATTR_TVM_METADATA, meta_data); | |||||
std::string json_string; | |||||
(void) AttrUtils::GetStr(atomic_op_desc, TVM_ATTR_NAME_MAGIC, json_string); | |||||
(void) AttrUtils::SetStr(op_desc, ATOMIC_ATTR_TVM_MAGIC, json_string); | |||||
return SUCCESS; | |||||
} | |||||
Status ModelBuilder::SaveDataToModel(ge::Model &model, ge::GeModel &ge_model) { | Status ModelBuilder::SaveDataToModel(ge::Model &model, ge::GeModel &ge_model) { | ||||
// Add weight | // Add weight | ||||
ge_model.SetWeight(weight_buffer_); | ge_model.SetWeight(weight_buffer_); | ||||
@@ -602,11 +699,15 @@ Status ModelBuilder::SaveDataToModel(ge::Model &model, ge::GeModel &ge_model) { | |||||
} | } | ||||
GE_IF_BOOL_EXEC(tbe_kernel == nullptr, continue); | GE_IF_BOOL_EXEC(tbe_kernel == nullptr, continue); | ||||
if (tbe_name_set.count(tbe_kernel->GetName()) > 0) { | if (tbe_name_set.count(tbe_kernel->GetName()) > 0) { | ||||
REPORT_INNER_ERROR("E19999", "tbe_kernel name %s can't be the same, judge for op:%s(%s),", | |||||
tbe_kernel->GetName().c_str(), n->GetName().c_str(), n->GetType().c_str()); | |||||
GELOGE(FAILED, "tbe_kernel name %s can't be the same", tbe_kernel->GetName().c_str()); | GELOGE(FAILED, "tbe_kernel name %s can't be the same", tbe_kernel->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
tbe_name_set.insert(tbe_kernel->GetName()); | tbe_name_set.insert(tbe_kernel->GetName()); | ||||
tbe_kernel_store_.AddTBEKernel(tbe_kernel); | tbe_kernel_store_.AddTBEKernel(tbe_kernel); | ||||
GE_CHK_STATUS_RET(SaveAtomicTBEKernel(node_op_desc), "[Save][TBEKernel] save atomic tbekernel failed!"); | |||||
} | } | ||||
SetModelCheckAicpuAttr(model, aicpu_op_types, aicpu_tf_op_types); | SetModelCheckAicpuAttr(model, aicpu_op_types, aicpu_tf_op_types); | ||||
@@ -618,6 +719,8 @@ Status ModelBuilder::SaveDataToModel(ge::Model &model, ge::GeModel &ge_model) { | |||||
node_op_desc->TryGetExtAttr(ge::OP_EXTATTR_CUSTAICPU_KERNEL, CustAICPUKernelPtr()); | node_op_desc->TryGetExtAttr(ge::OP_EXTATTR_CUSTAICPU_KERNEL, CustAICPUKernelPtr()); | ||||
GE_IF_BOOL_EXEC(cust_aicpu_kernel == nullptr, continue); | GE_IF_BOOL_EXEC(cust_aicpu_kernel == nullptr, continue); | ||||
if (aicpu_name_set.count(cust_aicpu_kernel->GetName()) > 0) { | if (aicpu_name_set.count(cust_aicpu_kernel->GetName()) > 0) { | ||||
REPORT_INNER_ERROR("E19999", "aicpu_kernel name %s can't be the same, judge for op:%s(%s),", | |||||
cust_aicpu_kernel->GetName().c_str(), n->GetName().c_str(), n->GetType().c_str()); | |||||
GELOGE(FAILED, "aicpu_kernel name %s can't be the same", cust_aicpu_kernel->GetName().c_str()); | GELOGE(FAILED, "aicpu_kernel name %s can't be the same", cust_aicpu_kernel->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -640,6 +743,7 @@ Status ModelBuilder::SaveDataToModel(ge::Model &model, ge::GeModel &ge_model) { | |||||
// Add task | // Add task | ||||
GeAttrValue::BYTES task_def_bytes; | GeAttrValue::BYTES task_def_bytes; | ||||
if (!AttrUtils::GetZeroCopyBytes(model, MODEL_ATTR_TASKS, task_def_bytes)) { | if (!AttrUtils::GetZeroCopyBytes(model, MODEL_ATTR_TASKS, task_def_bytes)) { | ||||
REPORT_CALL_ERROR("E19999", "Get attr:%s in model failed", MODEL_ATTR_TASKS.c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Get zero copy bytes fail."); | GELOGE(INTERNAL_ERROR, "Get zero copy bytes fail."); | ||||
return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
} | } | ||||
@@ -675,6 +779,7 @@ void ModelBuilder::SetModelVersion(ge::Model &model) { | |||||
Status ModelBuilder::PreBuildModel() { | Status ModelBuilder::PreBuildModel() { | ||||
if ((compute_graph_ == nullptr) || !(compute_graph_->IsValid())) { | if ((compute_graph_ == nullptr) || !(compute_graph_->IsValid())) { | ||||
REPORT_INNER_ERROR("E19999", "Check compute_graph no valid"); | |||||
GELOGE(FAILED, "Graph_ is not valid."); | GELOGE(FAILED, "Graph_ is not valid."); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -754,6 +859,7 @@ Status ModelBuilder::CompileSingleOp() { | |||||
// Create ge instance | // Create ge instance | ||||
std::shared_ptr<GELib> instance = ge::GELib::GetInstance(); | std::shared_ptr<GELib> instance = ge::GELib::GetInstance(); | ||||
if ((instance == nullptr) || !instance->InitFlag()) { | if ((instance == nullptr) || !instance->InitFlag()) { | ||||
REPORT_INNER_ERROR("E19999", "Check GELib instance not init before"); | |||||
GELOGE(ge::GE_CLI_GE_NOT_INITIALIZED, "CompileSingleOp failed."); | GELOGE(ge::GE_CLI_GE_NOT_INITIALIZED, "CompileSingleOp failed."); | ||||
return ge::GE_CLI_GE_NOT_INITIALIZED; | return ge::GE_CLI_GE_NOT_INITIALIZED; | ||||
} | } | ||||
@@ -775,6 +881,8 @@ Status ModelBuilder::CompileSingleOp() { | |||||
(void)instance->DNNEngineManagerObj().GetDNNEngineName(node); | (void)instance->DNNEngineManagerObj().GetDNNEngineName(node); | ||||
kernel_lib_name = op_desc->GetOpKernelLibName(); | kernel_lib_name = op_desc->GetOpKernelLibName(); | ||||
if (kernel_lib_name.empty()) { | if (kernel_lib_name.empty()) { | ||||
REPORT_INNER_ERROR("E19999", "Check kernel lib name empty of op:%s(%s)", | |||||
node->GetName().c_str(), node->GetType().c_str()); | |||||
GELOGE(ge::INTERNAL_ERROR, "Get node:%s(%s) kernel lib failed.", node->GetName().c_str(), | GELOGE(ge::INTERNAL_ERROR, "Get node:%s(%s) kernel lib failed.", node->GetName().c_str(), | ||||
node->GetType().c_str()); | node->GetType().c_str()); | ||||
return ge::INTERNAL_ERROR; | return ge::INTERNAL_ERROR; | ||||
@@ -785,6 +893,8 @@ Status ModelBuilder::CompileSingleOp() { | |||||
if (kernel_info != nullptr) { | if (kernel_info != nullptr) { | ||||
node_vector_map[kernel_lib_name].emplace_back(node); | node_vector_map[kernel_lib_name].emplace_back(node); | ||||
} else { | } else { | ||||
REPORT_INNER_ERROR("E19999", "Get ops kernel info store failed for op:%s(%s), op_kernel_name:%s,", | |||||
node->GetName().c_str(), node->GetType().c_str(), kernel_lib_name.c_str()); | |||||
GELOGE(ge::GE_GRAPH_PARAM_NULLPTR, "Get op %s ops kernel info store failed", node->GetName().c_str()); | GELOGE(ge::GE_GRAPH_PARAM_NULLPTR, "Get op %s ops kernel info store failed", node->GetName().c_str()); | ||||
return ge::GE_GRAPH_PARAM_NULLPTR; | return ge::GE_GRAPH_PARAM_NULLPTR; | ||||
} | } | ||||
@@ -800,6 +910,8 @@ Status ModelBuilder::CompileSingleOp() { | |||||
GELOGI("[GEPERFTRACE] The node size of compile op of %s is %zu", kernel_lib_name.c_str(), node_vector.size()); | GELOGI("[GEPERFTRACE] The node size of compile op of %s is %zu", kernel_lib_name.c_str(), node_vector.size()); | ||||
GE_TIMESTAMP_ADD(BatchCompileOp); | GE_TIMESTAMP_ADD(BatchCompileOp); | ||||
if (ret != ge::SUCCESS) { | if (ret != ge::SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Batch compile op failed, kernel lib name, node size:%zu,", | |||||
node_vector.size()); | |||||
GELOGE(ret, "Compile op failed, kernel lib name is %s", kernel_lib_name.c_str()); | GELOGE(ret, "Compile op failed, kernel lib name is %s", kernel_lib_name.c_str()); | ||||
return ret; | return ret; | ||||
} | } | ||||
@@ -89,6 +89,8 @@ class ModelBuilder { | |||||
void SetModelCheckAicpuAttr(ge::Model &model, std::set<std::string> &aicpu_op_types, | void SetModelCheckAicpuAttr(ge::Model &model, std::set<std::string> &aicpu_op_types, | ||||
std::set<std::string> &aicpu_tf_op_types); | std::set<std::string> &aicpu_tf_op_types); | ||||
Status SaveAtomicTBEKernel(const OpDescPtr &op_desc); | |||||
uint64_t session_id_; | uint64_t session_id_; | ||||
map<int64_t, size_t> mem_type_to_mem_offset_; | map<int64_t, size_t> mem_type_to_mem_offset_; | ||||
@@ -18,6 +18,7 @@ | |||||
#include "common/util.h" | #include "common/util.h" | ||||
#include "framework/common/debug/ge_log.h" | #include "framework/common/debug/ge_log.h" | ||||
#include "graph/debug/ge_attr_define.h" | #include "graph/debug/ge_attr_define.h" | ||||
#include "graph/common/omg_util.h" | |||||
namespace ge { | namespace ge { | ||||
RunContextUtil::~RunContextUtil() { DestroyRtModelResources(); } | RunContextUtil::~RunContextUtil() { DestroyRtModelResources(); } | ||||
@@ -27,15 +28,21 @@ Status RunContextUtil::InitMemInfo(uint8_t *data_mem_base, uint64_t data_mem_siz | |||||
std::map<int64_t, uint64_t> mem_type_to_data_mem_size, uint8_t *weight_mem_base, | std::map<int64_t, uint64_t> mem_type_to_data_mem_size, uint8_t *weight_mem_base, | ||||
uint64_t weight_mem_size) { | uint64_t weight_mem_size) { | ||||
if ((data_mem_size > 0) && (data_mem_base == nullptr)) { | if ((data_mem_size > 0) && (data_mem_base == nullptr)) { | ||||
REPORT_INNER_ERROR("E19999", "InitMemInfo param data_mem_base is null but data_mem_size = %lu", data_mem_size); | |||||
GELOGE(PARAM_INVALID, "InitMemInfo param data_mem_base is null but data_mem_size = %lu.", data_mem_size); | GELOGE(PARAM_INVALID, "InitMemInfo param data_mem_base is null but data_mem_size = %lu.", data_mem_size); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
} | } | ||||
if ((weight_mem_size > 0) && (weight_mem_base == nullptr)) { | if ((weight_mem_size > 0) && (weight_mem_base == nullptr)) { | ||||
REPORT_INNER_ERROR("E19999", "InitMemInfo param weight_mem_base is null but weight_mem_size = %lu", | |||||
weight_mem_size); | |||||
GELOGE(PARAM_INVALID, "InitMemInfo param weight_mem_base is null but weight_mem_size = %lu.", weight_mem_size); | GELOGE(PARAM_INVALID, "InitMemInfo param weight_mem_base is null but weight_mem_size = %lu.", weight_mem_size); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
} | } | ||||
if (mem_type_to_data_mem_base.empty() || mem_type_to_data_mem_size.empty() || | if (mem_type_to_data_mem_base.empty() || mem_type_to_data_mem_size.empty() || | ||||
mem_type_to_data_mem_base.size() != mem_type_to_data_mem_size.size()) { | mem_type_to_data_mem_base.size() != mem_type_to_data_mem_size.size()) { | ||||
REPORT_INNER_ERROR("E19999", "InitMemInfo param mem_type_to_data_mem_base size[%zu] " | |||||
"is not equal to the size of mem_type_to_data_mem_size[%zu].", | |||||
mem_type_to_data_mem_base.size(), mem_type_to_data_mem_size.size()); | |||||
GELOGE(PARAM_INVALID, | GELOGE(PARAM_INVALID, | ||||
"InitMemInfo param mem_type_to_data_mem_base size[%zu] is not equal to the size of " | "InitMemInfo param mem_type_to_data_mem_base size[%zu] is not equal to the size of " | ||||
"mem_type_to_data_mem_size[%zu].", | "mem_type_to_data_mem_size[%zu].", | ||||
@@ -55,6 +62,7 @@ Status RunContextUtil::CreateRtModelResources(uint32_t stream_num, uint32_t even | |||||
// Create rt model | // Create rt model | ||||
rtError_t rt_ret = rtModelCreate(&rt_model_, 0); | rtError_t rt_ret = rtModelCreate(&rt_model_, 0); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "call rtModelCreate failed, ret:%d,", static_cast<int>(rt_ret)); | |||||
GELOGE(RT_FAILED, "rtModelCreate failed. rt_ret = %d", static_cast<int>(rt_ret)); | GELOGE(RT_FAILED, "rtModelCreate failed. rt_ret = %d", static_cast<int>(rt_ret)); | ||||
return RT_FAILED; | return RT_FAILED; | ||||
} | } | ||||
@@ -64,6 +72,8 @@ Status RunContextUtil::CreateRtModelResources(uint32_t stream_num, uint32_t even | |||||
rtStream_t stream = nullptr; | rtStream_t stream = nullptr; | ||||
rt_ret = rtStreamCreate(&stream, 0); | rt_ret = rtStreamCreate(&stream, 0); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "call rtStreamCreate failed, ret:%d, index:%u,", | |||||
static_cast<int>(rt_ret), i); | |||||
GELOGE(RT_FAILED, "rtStreamCreate failed. rt_ret = %d, index = %u", static_cast<int>(rt_ret), i); | GELOGE(RT_FAILED, "rtStreamCreate failed. rt_ret = %d, index = %u", static_cast<int>(rt_ret), i); | ||||
return RT_FAILED; | return RT_FAILED; | ||||
} | } | ||||
@@ -71,16 +81,22 @@ Status RunContextUtil::CreateRtModelResources(uint32_t stream_num, uint32_t even | |||||
rt_ret = rtModelBindStream(rt_model_, stream, 0); | rt_ret = rtModelBindStream(rt_model_, stream, 0); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "call rtModelBindStream failed, ret:%d, index:%u,", | |||||
static_cast<int>(rt_ret), i); | |||||
GELOGE(RT_FAILED, "Bind stream and model failed. rt_ret = %d, index = %u", static_cast<int>(rt_ret), i); | GELOGE(RT_FAILED, "Bind stream and model failed. rt_ret = %d, index = %u", static_cast<int>(rt_ret), i); | ||||
return RT_FAILED; | return RT_FAILED; | ||||
} | } | ||||
} | } | ||||
// Create rt event | // Create rt event | ||||
uint32_t create_flag = static_cast<uint32_t>((event_num > kEventReuseThreshold) ? RT_EVENT_WITH_FLAG : | |||||
RT_EVENT_DEFAULT); | |||||
for (uint32_t i = 0; i < event_num; ++i) { | for (uint32_t i = 0; i < event_num; ++i) { | ||||
rtEvent_t event = nullptr; | rtEvent_t event = nullptr; | ||||
rt_ret = rtEventCreate(&event); | |||||
rt_ret = rtEventCreateWithFlag(&event, create_flag); | |||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "call rtEventCreate failed, ret:%d, index:%u,", | |||||
static_cast<int>(rt_ret), i); | |||||
GELOGE(RT_FAILED, "rtEventCreate failed. rt_ret = %d, index = %u", static_cast<int>(rt_ret), i); | GELOGE(RT_FAILED, "rtEventCreate failed. rt_ret = %d, index = %u", static_cast<int>(rt_ret), i); | ||||
return RT_FAILED; | return RT_FAILED; | ||||
} | } | ||||
@@ -92,6 +108,8 @@ Status RunContextUtil::CreateRtModelResources(uint32_t stream_num, uint32_t even | |||||
rtLabel_t label = nullptr; | rtLabel_t label = nullptr; | ||||
rt_ret = rtLabelCreateV2(&label, rt_model_); | rt_ret = rtLabelCreateV2(&label, rt_model_); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "call rtLabelCreateV2 failed, ret:%d, index:%u,", | |||||
static_cast<int>(rt_ret), i); | |||||
GELOGE(RT_FAILED, "rtLabelCreate failed. rt_ret = %d, index = %u", static_cast<int>(rt_ret), i); | GELOGE(RT_FAILED, "rtLabelCreate failed. rt_ret = %d, index = %u", static_cast<int>(rt_ret), i); | ||||
return RT_FAILED; | return RT_FAILED; | ||||
} | } | ||||
@@ -143,12 +161,15 @@ Status RunContextUtil::CreateRunContext(Model &model, const ComputeGraphPtr &gra | |||||
GELOGD("Begin to Create RunContext, session_id = %lu", session_id); | GELOGD("Begin to Create RunContext, session_id = %lu", session_id); | ||||
// check params | // check params | ||||
if (graph == nullptr) { | if (graph == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "Check param graph nullptr, session_id:%lu,", session_id); | |||||
GELOGE(PARAM_INVALID, "CreateRunContext param graph is null. session_id=%lu", session_id); | GELOGE(PARAM_INVALID, "CreateRunContext param graph is null. session_id=%lu", session_id); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
} | } | ||||
uint32_t stream_num = 0; | uint32_t stream_num = 0; | ||||
if (!AttrUtils::GetInt(&model, ATTR_MODEL_STREAM_NUM, stream_num)) { | if (!AttrUtils::GetInt(&model, ATTR_MODEL_STREAM_NUM, stream_num)) { | ||||
REPORT_INNER_ERROR("E19999", "Get Attr:%s failed for model, session_id:%lu,", | |||||
ATTR_MODEL_STREAM_NUM.c_str(), session_id); | |||||
GELOGE(INTERNAL_ERROR, "Get stream_num attr from model_def failed. session_id=%lu", session_id); | GELOGE(INTERNAL_ERROR, "Get stream_num attr from model_def failed. session_id=%lu", session_id); | ||||
return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
} | } | ||||
@@ -156,6 +177,8 @@ Status RunContextUtil::CreateRunContext(Model &model, const ComputeGraphPtr &gra | |||||
uint32_t event_num = 0; | uint32_t event_num = 0; | ||||
if (!AttrUtils::GetInt(&model, ATTR_MODEL_EVENT_NUM, event_num)) { | if (!AttrUtils::GetInt(&model, ATTR_MODEL_EVENT_NUM, event_num)) { | ||||
REPORT_INNER_ERROR("E19999", "Get Attr:%s failed for model, session_id:%lu,", | |||||
ATTR_MODEL_EVENT_NUM.c_str(), session_id); | |||||
GELOGE(INTERNAL_ERROR, "Get event_num attr from model failed. session_id=%lu", session_id); | GELOGE(INTERNAL_ERROR, "Get event_num attr from model failed. session_id=%lu", session_id); | ||||
return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
} | } | ||||
@@ -163,6 +186,8 @@ Status RunContextUtil::CreateRunContext(Model &model, const ComputeGraphPtr &gra | |||||
uint32_t label_num = 0; | uint32_t label_num = 0; | ||||
if (!AttrUtils::GetInt(&model, ATTR_MODEL_LABEL_NUM, label_num)) { | if (!AttrUtils::GetInt(&model, ATTR_MODEL_LABEL_NUM, label_num)) { | ||||
REPORT_INNER_ERROR("E19999", "Get Attr:%s failed for model, session_id:%lu,", | |||||
ATTR_MODEL_LABEL_NUM.c_str(), session_id); | |||||
GELOGE(INTERNAL_ERROR, "Get label_num attr from model failed. session_id=%lu", session_id); | GELOGE(INTERNAL_ERROR, "Get label_num attr from model failed. session_id=%lu", session_id); | ||||
return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
} | } | ||||
@@ -27,6 +27,8 @@ | |||||
#include "graph/ge_context.h" | #include "graph/ge_context.h" | ||||
#include "graph/utils/graph_utils.h" | #include "graph/utils/graph_utils.h" | ||||
#include "init/gelib.h" | #include "init/gelib.h" | ||||
#include "common/string_util.h" | |||||
#include "common/util/error_manager/error_manager.h" | |||||
using std::map; | using std::map; | ||||
using std::set; | using std::set; | ||||
@@ -38,6 +40,13 @@ const int64_t kTaskNumPerNormalNode = 3; | |||||
const int64_t kTaskNumPerHcclNode = 245; | const int64_t kTaskNumPerHcclNode = 245; | ||||
const char *const kTrueStr = "true"; | const char *const kTrueStr = "true"; | ||||
const char *const kFalseStr = "false"; | const char *const kFalseStr = "false"; | ||||
const size_t kEventMultiplexingItemCount = 3; | |||||
const size_t kKeyWordIndex = 0; | |||||
const size_t kNodeNameIndex = 1; | |||||
const size_t kEventIdIndex = 2; | |||||
const char *const kSend = "SendTo"; | |||||
const char *const kRecv = "RecvFrom"; | |||||
const char kDelim = ';'; | |||||
inline bool HasContinuousStreamLabel(const ge::OpDescPtr &op_desc, std::string &continuous_stream_label) { | inline bool HasContinuousStreamLabel(const ge::OpDescPtr &op_desc, std::string &continuous_stream_label) { | ||||
if (ge::AttrUtils::GetStr(op_desc, ge::ATTR_NAME_CONTINUOUS_STREAM_LABEL, continuous_stream_label)) { | if (ge::AttrUtils::GetStr(op_desc, ge::ATTR_NAME_CONTINUOUS_STREAM_LABEL, continuous_stream_label)) { | ||||
@@ -52,6 +61,97 @@ bool IsHcclOp(const string &op_type) { | |||||
ge::HCOMALLREDUCE, ge::HCOMREDUCESCATTER, ge::HCOMREDUCE}); | ge::HCOMALLREDUCE, ge::HCOMREDUCESCATTER, ge::HCOMREDUCE}); | ||||
return hccl_op_types.find(op_type) != hccl_op_types.end(); | return hccl_op_types.find(op_type) != hccl_op_types.end(); | ||||
} | } | ||||
ge::Status ParseNodeEventMultiplexing(const ge::NodePtr &node, | |||||
const std::vector<std::string> &raw_event_multiplexing, | |||||
std::unordered_map<ge::NodePtr, std::vector<std::pair<std::string, uint32_t>>> &node_to_send, | |||||
std::unordered_map<ge::NodePtr, std::vector<std::pair<std::string, uint32_t>>> &node_to_recv) { | |||||
GE_CHECK_NOTNULL(node); | |||||
for (const auto &str : raw_event_multiplexing) { | |||||
std::vector<std::string> ele = ge::StringUtils::Split(str, kDelim); | |||||
if (ele.size() != kEventMultiplexingItemCount) { | |||||
GELOGE(ge::PARAM_INVALID, "[Check][RawMultiplexing]Size error, node:%s, require size:%zu, actually:%zu.", | |||||
node->GetName().c_str(), kEventMultiplexingItemCount, ele.size()); | |||||
REPORT_INNER_ERROR("E19999", "Raw event multiplexing is invalid, node:%s, require size:%zu, actually:%zu.", | |||||
node->GetName().c_str(), kEventMultiplexingItemCount, ele.size()); | |||||
return ge::PARAM_INVALID; | |||||
} | |||||
int value; | |||||
try { | |||||
value = std::stoi(ele[kEventIdIndex]); | |||||
} catch (std::invalid_argument &) { | |||||
GELOGE(ge::PARAM_INVALID, "[Throw][Exception]Event id is invalid, node:%s, raw:%s.", | |||||
node->GetName().c_str(), ele[kEventIdIndex].c_str()); | |||||
REPORT_INNER_ERROR("E19999", "Event id is invalid, node:%s, raw:%s.", | |||||
node->GetName().c_str(), ele[kEventIdIndex].c_str()); | |||||
return ge::PARAM_INVALID; | |||||
} catch (std::out_of_range &) { | |||||
GELOGE(ge::PARAM_INVALID, "[Throw][Exception]Event id is out of range, node:%s, raw:%s.", | |||||
node->GetName().c_str(), ele[kEventIdIndex].c_str()); | |||||
REPORT_INNER_ERROR("E19999", "Event id is out of range, node:%s, raw:%s.", | |||||
node->GetName().c_str(), ele[kEventIdIndex].c_str()); | |||||
return ge::PARAM_INVALID; | |||||
} | |||||
if (value < 0) { | |||||
GELOGE(ge::PARAM_INVALID, "[Check][EventId]Event id is out of range, node:%s, raw:%s, value:%d.", | |||||
node->GetName().c_str(), ele[kEventIdIndex].c_str(), value); | |||||
REPORT_INNER_ERROR("E19999", "Event id is out of range, node:%s, raw:%s, value:%d.", | |||||
node->GetName().c_str(), ele[kEventIdIndex].c_str(), value); | |||||
return ge::PARAM_INVALID; | |||||
} | |||||
if (ele[kKeyWordIndex] == kSend) { | |||||
node_to_send[node].emplace_back(std::make_pair(ele[kNodeNameIndex], static_cast<uint32_t>(value))); | |||||
} else if (ele[kKeyWordIndex] == kRecv) { | |||||
node_to_recv[node].emplace_back(std::make_pair(ele[kNodeNameIndex], static_cast<uint32_t>(value))); | |||||
} else { | |||||
GELOGE(ge::PARAM_INVALID, "[Check][KeyWord]Key word is not supported, node:%s, key:%s.", | |||||
node->GetName().c_str(), ele[kEventIdIndex].c_str()); | |||||
REPORT_INNER_ERROR("E19999", "Key word is not supported, node:%s, key:%s.", | |||||
node->GetName().c_str(), ele[kEventIdIndex].c_str()); | |||||
return ge::PARAM_INVALID; | |||||
} | |||||
} | |||||
return ge::SUCCESS; | |||||
} | |||||
ge::Status ParseAllNodeEventMultiplexing(const ge::ComputeGraphPtr &graph, | |||||
std::unordered_map<std::string, ge::NodePtr> &name_to_node_map, | |||||
std::unordered_map<ge::NodePtr, std::vector<std::pair<std::string, uint32_t>>> &node_to_send, | |||||
std::unordered_map<ge::NodePtr, std::vector<std::pair<std::string, uint32_t>>> &node_to_recv) { | |||||
for (const auto &node : graph->GetNodes(graph->GetGraphUnknownFlag())) { | |||||
ge::OpDescPtr op_desc = node->GetOpDesc(); | |||||
GE_CHECK_NOTNULL(op_desc); | |||||
name_to_node_map.insert({node->GetName(), node}); | |||||
std::vector<std::string> raw_event_multiplexing; | |||||
if (!(op_desc->HasAttr(ge::ATTR_NAME_EVENT_MULTIPLEXING))) { | |||||
continue; | |||||
} | |||||
bool get_attr = ge::AttrUtils::GetListStr(op_desc, ge::ATTR_NAME_EVENT_MULTIPLEXING, raw_event_multiplexing); | |||||
if (!get_attr) { | |||||
GELOGE(ge::PARAM_INVALID, "[Get][Attr]Node:%s.", node->GetName().c_str()); | |||||
REPORT_INNER_ERROR("E19999", "Failed to get raw event multiplexing, node:%s.", node->GetName().c_str()); | |||||
return ge::PARAM_INVALID; | |||||
} | |||||
auto parse_ret = ParseNodeEventMultiplexing(node, raw_event_multiplexing, node_to_send, node_to_recv); | |||||
if (parse_ret != ge::SUCCESS) { | |||||
GELOGE(parse_ret, "[Parse][Eventmultiplexing]Node:%s.", node->GetName().c_str()); | |||||
REPORT_INNER_ERROR("E19999", "Failed to parse node event multiplexing, node:%s.", node->GetName().c_str()); | |||||
return parse_ret; | |||||
} | |||||
} | |||||
return ge::SUCCESS; | |||||
} | |||||
std::vector<uint32_t> GetIntersection(std::vector<uint32_t> &a, std::vector<uint32_t> &b) { | |||||
std::unordered_set<uint32_t> ele_of_a(a.begin(), a.end()); | |||||
std::vector<uint32_t> res; | |||||
for (auto &ele : b) { | |||||
if (ele_of_a.count(ele) > 0) { | |||||
res.emplace_back(ele); | |||||
} | |||||
} | |||||
return res; | |||||
} | |||||
} // namespace | } // namespace | ||||
namespace ge { | namespace ge { | ||||
@@ -76,6 +176,7 @@ Status StreamAllocator::AssignLogicalStreams(const std::map<std::string, int> &m | |||||
auto gelib = GELib::GetInstance(); | auto gelib = GELib::GetInstance(); | ||||
if (gelib == nullptr) { | if (gelib == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "Check GELib instance nullptr"); | |||||
GELOGE(FAILED, "Get GELib instance failed."); | GELOGE(FAILED, "Get GELib instance failed."); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -149,6 +250,12 @@ Status StreamAllocator::RefreshRealStream(int64_t &stream_num, int64_t &event_nu | |||||
return status; | return status; | ||||
} | } | ||||
status = RefreshEventsWithReuse(); | |||||
if (status != SUCCESS) { | |||||
GELOGE(status, "[Refresh][Events]RefreshEventsWithReuse failed!"); | |||||
return status; | |||||
} | |||||
status = InsertSyncEventNodes(); | status = InsertSyncEventNodes(); | ||||
if (status != SUCCESS) { | if (status != SUCCESS) { | ||||
GELOGE(status, "InsertSyncEventNode failed!"); | GELOGE(status, "InsertSyncEventNode failed!"); | ||||
@@ -184,6 +291,8 @@ Status StreamAllocator::AssignSingleStream() { | |||||
} | } | ||||
if (stream_num_ > 1) { | if (stream_num_ > 1) { | ||||
REPORT_INNER_ERROR("E19999", "The number of ts streams is %ld, only one is supported", | |||||
stream_num_); | |||||
GELOGE(FAILED, "The number of ts streams is %ld, only one is supported.", stream_num_); | GELOGE(FAILED, "The number of ts streams is %ld, only one is supported.", stream_num_); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -257,6 +366,9 @@ Status StreamAllocator::SetActiveStreamsByLabel() { | |||||
} | } | ||||
} | } | ||||
GE_CHK_BOOL_EXEC(AttrUtils::SetListInt(node->GetOpDesc(), ATTR_NAME_ACTIVE_STREAM_LIST, activated_stream_list), | GE_CHK_BOOL_EXEC(AttrUtils::SetListInt(node->GetOpDesc(), ATTR_NAME_ACTIVE_STREAM_LIST, activated_stream_list), | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s for op:%s(%s) failed", | |||||
ATTR_NAME_ACTIVE_STREAM_LIST.c_str(), | |||||
node->GetName().c_str(), node->GetType().c_str()); | |||||
GELOGE(FAILED, "SetListInt failed."); | GELOGE(FAILED, "SetListInt failed."); | ||||
return FAILED); | return FAILED); | ||||
} | } | ||||
@@ -307,6 +419,9 @@ Status StreamAllocator::SetActiveStreamsForSubgraphs() { | |||||
} | } | ||||
if (!AttrUtils::SetListInt(first_active_node->GetOpDesc(), ATTR_NAME_ACTIVE_STREAM_LIST, active_streams)) { | if (!AttrUtils::SetListInt(first_active_node->GetOpDesc(), ATTR_NAME_ACTIVE_STREAM_LIST, active_streams)) { | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s for op:%s(%s) failed", | |||||
ATTR_NAME_ACTIVE_STREAM_LIST.c_str(), | |||||
first_active_node->GetName().c_str(), first_active_node->GetType().c_str()); | |||||
GELOGE(FAILED, "Set active streams for node %s failed.", first_active_node->GetName().c_str()); | GELOGE(FAILED, "Set active streams for node %s failed.", first_active_node->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -376,6 +491,8 @@ Status StreamAllocator::InsertOneEventInTwoNodes(const NodePtr &cur_node, const | |||||
} | } | ||||
if (next_stream_id == kInvalidStream) { | if (next_stream_id == kInvalidStream) { | ||||
REPORT_INNER_ERROR("E19999", "Stream id of next_node %s(%s) should not be %ld", | |||||
next_node->GetName().c_str(), next_node->GetType().c_str(), kInvalidStream); | |||||
GELOGE(FAILED, "Stream id of next_node %s should not be %ld", next_node->GetName().c_str(), kInvalidStream); | GELOGE(FAILED, "Stream id of next_node %s should not be %ld", next_node->GetName().c_str(), kInvalidStream); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -589,8 +706,14 @@ Status StreamAllocator::OptimizeByStreamActivate() { | |||||
// -> stream(streamSwitch) -> stream(streamActivate) -> stream(stream true or false) | // -> stream(streamSwitch) -> stream(streamActivate) -> stream(stream true or false) | ||||
// No need to insert an event between node in stream(normal) and node in stream(stream true or false) | // No need to insert an event between node in stream(normal) and node in stream(stream true or false) | ||||
bool StreamAllocator::IsRecvNodeActivatedBySendNode(const NodePtr &send_node_ptr, const NodePtr &recv_node_ptr) const { | bool StreamAllocator::IsRecvNodeActivatedBySendNode(const NodePtr &send_node_ptr, const NodePtr &recv_node_ptr) const { | ||||
GE_CHECK_NOTNULL_EXEC(send_node_ptr->GetOpDesc(), GELOGE(FAILED, "op desc is nullptr"); return false); | |||||
GE_CHECK_NOTNULL_EXEC(recv_node_ptr->GetOpDesc(), GELOGE(FAILED, "op desc is nullptr"); return false); | |||||
GE_CHECK_NOTNULL_EXEC(send_node_ptr->GetOpDesc(), | |||||
REPORT_INNER_ERROR("E19999", "Check param send_node_ptr nullptr"); | |||||
GELOGE(FAILED, "op desc is nullptr"); | |||||
return false); | |||||
GE_CHECK_NOTNULL_EXEC(recv_node_ptr->GetOpDesc(), | |||||
REPORT_INNER_ERROR("E19999", "Check param recv_node_ptr nullptr"); | |||||
GELOGE(FAILED, "op desc is nullptr"); | |||||
return false); | |||||
auto cur_stream_id = send_node_ptr->GetOpDesc()->GetStreamId(); | auto cur_stream_id = send_node_ptr->GetOpDesc()->GetStreamId(); | ||||
if (AttrUtils::HasAttr(recv_node_ptr->GetOpDesc(), ATTR_NAME_STREAM_LABEL)) { | if (AttrUtils::HasAttr(recv_node_ptr->GetOpDesc(), ATTR_NAME_STREAM_LABEL)) { | ||||
// find streamActivate node | // find streamActivate node | ||||
@@ -714,6 +837,8 @@ Status StreamAllocator::SplitStreams(vector<set<int64_t>> &split_streams) { | |||||
continue; | continue; | ||||
} | } | ||||
if (stream_id > last_stream_id) { | if (stream_id > last_stream_id) { | ||||
REPORT_INNER_ERROR("E19999", "streamid(%ld) > last_stream_id(%ld), check invalid", | |||||
stream_id, last_stream_id); | |||||
GELOGE(FAILED, "SplitStreams:streamid(%ld) > last_stream_id(%ld)", stream_id, last_stream_id); | GELOGE(FAILED, "SplitStreams:streamid(%ld) > last_stream_id(%ld)", stream_id, last_stream_id); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -727,6 +852,8 @@ Status StreamAllocator::SplitStreams(vector<set<int64_t>> &split_streams) { | |||||
stream_continuous_2_node_num_map[continuous_stream_label]++; | stream_continuous_2_node_num_map[continuous_stream_label]++; | ||||
// return error | // return error | ||||
if (stream_continuous_2_node_num_map[continuous_stream_label] > max_node_num_one_stream) { | if (stream_continuous_2_node_num_map[continuous_stream_label] > max_node_num_one_stream) { | ||||
REPORT_INNER_ERROR("E19999", "Check node[%s] stream_id[%ld] continuous stream label[%s] unsatisfied", | |||||
op_desc->GetName().c_str(), stream_id, continuous_stream_label.c_str()); | |||||
GELOGE(FAILED, "SplitStreams:node[%s] stream_id[%ld] continuous stream label[%s] unsatisfied ", | GELOGE(FAILED, "SplitStreams:node[%s] stream_id[%ld] continuous stream label[%s] unsatisfied ", | ||||
op_desc->GetName().c_str(), stream_id, continuous_stream_label.c_str()); | op_desc->GetName().c_str(), stream_id, continuous_stream_label.c_str()); | ||||
return FAILED; | return FAILED; | ||||
@@ -881,6 +1008,8 @@ Status StreamAllocator::UpdateActiveStreamsForSwitchNode(NodePtr &switch_node) { | |||||
GE_CHECK_NOTNULL(op_desc); | GE_CHECK_NOTNULL(op_desc); | ||||
if (!AttrUtils::SetListInt(op_desc, ATTR_NAME_ACTIVE_STREAM_LIST, stream_ids)) { | if (!AttrUtils::SetListInt(op_desc, ATTR_NAME_ACTIVE_STREAM_LIST, stream_ids)) { | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", ATTR_NAME_ACTIVE_STREAM_LIST.c_str(), | |||||
op_desc->GetName().c_str(), op_desc->GetType().c_str()); | |||||
GELOGE(FAILED, "SetListInt failed."); | GELOGE(FAILED, "SetListInt failed."); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -895,6 +1024,8 @@ Status StreamAllocator::InsertActiveNodesAfterSwitch(NodePtr &switch_node, vecto | |||||
vector<string> ori_active_label_list; | vector<string> ori_active_label_list; | ||||
if (!AttrUtils::GetListStr(switch_desc, ATTR_NAME_ACTIVE_LABEL_LIST, ori_active_label_list) || | if (!AttrUtils::GetListStr(switch_desc, ATTR_NAME_ACTIVE_LABEL_LIST, ori_active_label_list) || | ||||
ori_active_label_list.empty()) { | ori_active_label_list.empty()) { | ||||
REPORT_INNER_ERROR("E19999", "Get Attr:%s fail for op:%s(%s)", ATTR_NAME_ACTIVE_LABEL_LIST.c_str(), | |||||
switch_node->GetName().c_str(), switch_node->GetType().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Get active label list of switch %s failed.", switch_node->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "Get active label list of switch %s failed.", switch_node->GetName().c_str()); | ||||
return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
} | } | ||||
@@ -918,6 +1049,8 @@ Status StreamAllocator::InsertActiveNodesAfterSwitch(NodePtr &switch_node, vecto | |||||
for (auto &active_node : added_active_nodes) { | for (auto &active_node : added_active_nodes) { | ||||
GE_CHECK_NOTNULL(switch_node->GetOutControlAnchor()); | GE_CHECK_NOTNULL(switch_node->GetOutControlAnchor()); | ||||
if (switch_node->GetOutControlAnchor()->LinkTo(active_node->GetInControlAnchor()) != GRAPH_SUCCESS) { | if (switch_node->GetOutControlAnchor()->LinkTo(active_node->GetInControlAnchor()) != GRAPH_SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Link from %s to %s failed", | |||||
switch_node->GetName().c_str(), active_node->GetName().c_str()); | |||||
GELOGE(FAILED, "Link %s to %s failed.", switch_node->GetName().c_str(), active_node->GetName().c_str()); | GELOGE(FAILED, "Link %s to %s failed.", switch_node->GetName().c_str(), active_node->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -933,6 +1066,8 @@ Status StreamAllocator::UpdateActiveStreamsForActiveNode(const vector<set<int64_ | |||||
vector<uint32_t> new_active_streams = active_streams; | vector<uint32_t> new_active_streams = active_streams; | ||||
for (uint32_t logical_stream : active_streams) { | for (uint32_t logical_stream : active_streams) { | ||||
if (static_cast<size_t>(logical_stream) >= split_streams.size()) { | if (static_cast<size_t>(logical_stream) >= split_streams.size()) { | ||||
REPORT_INNER_ERROR("E19999", "Check logical stream:%u is out of range:%zu", | |||||
logical_stream, split_streams.size()); | |||||
GELOGE(FAILED, "logical stream is out of range."); | GELOGE(FAILED, "logical stream is out of range."); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -951,6 +1086,8 @@ Status StreamAllocator::UpdateActiveStreamsForActiveNode(const vector<set<int64_ | |||||
} | } | ||||
} | } | ||||
if (!AttrUtils::SetListInt(node->GetOpDesc(), ATTR_NAME_ACTIVE_STREAM_LIST, new_active_streams)) { | if (!AttrUtils::SetListInt(node->GetOpDesc(), ATTR_NAME_ACTIVE_STREAM_LIST, new_active_streams)) { | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", ATTR_NAME_ACTIVE_STREAM_LIST.c_str(), | |||||
node->GetName().c_str(), node->GetType().c_str()); | |||||
GELOGE(FAILED, "Set active streams for node %s failed.", node->GetName().c_str()); | GELOGE(FAILED, "Set active streams for node %s failed.", node->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -991,6 +1128,8 @@ Status StreamAllocator::UpdateActiveStreamsForSubgraphs() const { | |||||
new_active_streams.emplace(static_cast<uint32_t>(new_split_stream)); | new_active_streams.emplace(static_cast<uint32_t>(new_split_stream)); | ||||
active_streams.assign(new_active_streams.begin(), new_active_streams.end()); | active_streams.assign(new_active_streams.begin(), new_active_streams.end()); | ||||
if (!AttrUtils::SetListInt(active_op, ATTR_NAME_ACTIVE_STREAM_LIST, active_streams)) { | if (!AttrUtils::SetListInt(active_op, ATTR_NAME_ACTIVE_STREAM_LIST, active_streams)) { | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", ATTR_NAME_ACTIVE_STREAM_LIST.c_str(), | |||||
active_op->GetName().c_str(), active_op->GetType().c_str()); | |||||
GELOGE(FAILED, "Set active streams for node %s failed.", active_node->GetName().c_str()); | GELOGE(FAILED, "Set active streams for node %s failed.", active_node->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -1059,6 +1198,8 @@ Status StreamAllocator::SetActiveStreamsForLoop() { | |||||
NodePtr pre_switch_node = FindSwitchNodeBeforeLoopActiveNode(node); | NodePtr pre_switch_node = FindSwitchNodeBeforeLoopActiveNode(node); | ||||
if (pre_switch_node == nullptr) { | if (pre_switch_node == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "Find switch node before loop active node %s fail", | |||||
node->GetName().c_str()); | |||||
GELOGE(FAILED, "find switch node before loop active node %s failed", node->GetName().c_str()); | GELOGE(FAILED, "find switch node before loop active node %s failed", node->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -1066,6 +1207,9 @@ Status StreamAllocator::SetActiveStreamsForLoop() { | |||||
if (!AttrUtils::GetListStr(node->GetOpDesc(), ATTR_NAME_ACTIVE_LABEL_LIST, activated_label_list) || | if (!AttrUtils::GetListStr(node->GetOpDesc(), ATTR_NAME_ACTIVE_LABEL_LIST, activated_label_list) || | ||||
activated_label_list.empty()) { | activated_label_list.empty()) { | ||||
GE_CHK_BOOL_EXEC(AttrUtils::SetListInt(node->GetOpDesc(), ATTR_NAME_ACTIVE_STREAM_LIST, loop_active_streams), | GE_CHK_BOOL_EXEC(AttrUtils::SetListInt(node->GetOpDesc(), ATTR_NAME_ACTIVE_STREAM_LIST, loop_active_streams), | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", | |||||
ATTR_NAME_ACTIVE_STREAM_LIST.c_str(), | |||||
node->GetName().c_str(), node->GetType().c_str()); | |||||
GELOGE(FAILED, "SetListInt failed."); | GELOGE(FAILED, "SetListInt failed."); | ||||
return FAILED); | return FAILED); | ||||
for (const auto &stream_id : loop_active_streams) { | for (const auto &stream_id : loop_active_streams) { | ||||
@@ -1112,6 +1256,8 @@ Status StreamAllocator::CheckStreamActived() const { | |||||
uint32_t stream_id = static_cast<uint32_t>(node->GetOpDesc()->GetStreamId()); | uint32_t stream_id = static_cast<uint32_t>(node->GetOpDesc()->GetStreamId()); | ||||
auto iter = find(active_streams.begin(), active_streams.end(), stream_id); | auto iter = find(active_streams.begin(), active_streams.end(), stream_id); | ||||
if (iter != active_streams.end()) { | if (iter != active_streams.end()) { | ||||
REPORT_INNER_ERROR("E19999", "Node:%s(%s) cannot active its own stream %u, check invalid ", | |||||
node->GetName().c_str(), node->GetType().c_str(), stream_id); | |||||
GELOGE(FAILED, "Node %s cannot active its own stream %u.", node->GetName().c_str(), stream_id); | GELOGE(FAILED, "Node %s cannot active its own stream %u.", node->GetName().c_str(), stream_id); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -1121,6 +1267,94 @@ Status StreamAllocator::CheckStreamActived() const { | |||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
Status StreamAllocator::ReuseEvent(bool send_to, | |||||
const std::unordered_map<std::string, ge::NodePtr> &name_to_node_map, | |||||
const std::unordered_map<ge::NodePtr, std::vector<std::pair<std::string, uint32_t>>> &node_to_event_id) { | |||||
for (const auto &node_event_id : node_to_event_id) { | |||||
ge::NodePtr curr_node = node_event_id.first; | |||||
NodePtr send_node = send_to ? curr_node : nullptr; | |||||
NodePtr recv_node = send_to ? nullptr : curr_node; | |||||
for (const auto &event_pair : node_event_id.second) { | |||||
auto peer_node_iter = name_to_node_map.find(event_pair.first); | |||||
if (peer_node_iter == name_to_node_map.end()) { | |||||
GELOGE(PARAM_INVALID, "[Get][Node]Name:%s.", event_pair.first.c_str()); | |||||
REPORT_INNER_ERROR("E19999", "Failed to find node, name:%s.", event_pair.first.c_str()); | |||||
return PARAM_INVALID; | |||||
} | |||||
recv_node = send_to ? peer_node_iter->second : recv_node; | |||||
send_node = send_to ? send_node : peer_node_iter->second; | |||||
GE_CHECK_NOTNULL(send_node); | |||||
GE_CHECK_NOTNULL(recv_node); | |||||
auto event_id = GetIntersection(node_to_send_events_[send_node], node_to_recv_events_[recv_node]); | |||||
uint32_t new_event = event_pair.second + event_num_; | |||||
if (event_id.empty()) { | |||||
GELOGI("[Check][Optimized]Send:%s, recv:%s.", send_node->GetName().c_str(), recv_node->GetName().c_str()); | |||||
continue; | |||||
} else if (event_id.size() != 1) { | |||||
GELOGW("[Check][Event]More than one event are found between %s and %s, event num:%zu.", | |||||
send_node->GetName().c_str(), recv_node->GetName().c_str(), event_id.size()); | |||||
} | |||||
uint32_t old_event = event_id[0]; | |||||
auto reuse_event_id = [] (vector<uint32_t> &event_list, uint32_t old_event, uint32_t new_event) -> void { | |||||
event_list.erase(std::remove(event_list.begin(), event_list.end(), old_event), event_list.end()); | |||||
event_list.push_back(new_event); | |||||
return; | |||||
}; | |||||
reuse_event_id(node_to_send_events_[send_node], old_event, new_event); | |||||
reuse_event_id(node_to_recv_events_[recv_node], old_event, new_event); | |||||
GELOGI("[Reuse][Event]Replace event successfully, send node:%s, recv node:%s, old id:%u, new id:%u.", | |||||
send_node->GetName().c_str(), recv_node->GetName().c_str(), old_event, new_event); | |||||
} | |||||
} | |||||
return ge::SUCCESS; | |||||
} | |||||
// Refresh events to reuse events | |||||
Status StreamAllocator::RefreshEventsWithReuse() { | |||||
GELOGI("[Refresh][Events]Refresh events with reuse, stream num:%ld, original event num:%u.", stream_num_, event_num_); | |||||
if (event_num_ <= kEventReuseThreshold) { | |||||
GELOGI("[Check][ReuseThreshold]Event used num is %u, less than %u, skip reuse.", | |||||
event_num_, kEventReuseThreshold); | |||||
return SUCCESS; | |||||
} | |||||
std::unordered_map<std::string, NodePtr> name_to_node_map; | |||||
std::unordered_map<NodePtr, std::vector<std::pair<std::string, uint32_t>>> node_to_send; | |||||
std::unordered_map<NodePtr, std::vector<std::pair<std::string, uint32_t>>> node_to_recv; | |||||
Status ret = ParseAllNodeEventMultiplexing(whole_graph_, name_to_node_map, node_to_send, node_to_recv); | |||||
if (ret != SUCCESS) { | |||||
GELOGE(ret, "[Parse][AllNodeEventMultiplexing]Graph:%s.", whole_graph_->GetName().c_str()); | |||||
REPORT_INNER_ERROR("E19999", "Failed to parse all node event multiplexing, graph:%s.", | |||||
whole_graph_->GetName().c_str()); | |||||
return ret; | |||||
} | |||||
if (node_to_send.empty() && node_to_recv.empty()) { | |||||
return SUCCESS; | |||||
} | |||||
ret = ReuseEvent(true, name_to_node_map, node_to_send); | |||||
if (ret != SUCCESS) { | |||||
GELOGE(ret, "[Reuse][Event]Phase:Send, graph:%s.", whole_graph_->GetName().c_str()); | |||||
REPORT_INNER_ERROR("E19999", "Failed to reuse event, phase:Send, graph:%s.", whole_graph_->GetName().c_str()); | |||||
return ret; | |||||
} | |||||
ret = ReuseEvent(false, name_to_node_map, node_to_recv); | |||||
if (ret != SUCCESS) { | |||||
GELOGE(ret, "[Reuse][Event]Phase:Recv, graph:%s.", whole_graph_->GetName().c_str()); | |||||
REPORT_INNER_ERROR("E19999", "Failed to reuse event, phase:Recv, graph:%s.", whole_graph_->GetName().c_str()); | |||||
return ret; | |||||
} | |||||
Status status = RefreshContinuousEvents(); | |||||
if (status != SUCCESS) { | |||||
GELOGE(status, "[Refresh][ContinuousEvents]Graph:%s.", whole_graph_->GetName().c_str()); | |||||
REPORT_INNER_ERROR("E19999", "Failed to refresh continuous events, graph:%s.", whole_graph_->GetName().c_str()); | |||||
return status; | |||||
} | |||||
GELOGI("[Refresh][Events]RefreshEventsWithReuse successfully, event num:%u.", event_num_); | |||||
return SUCCESS; | |||||
} | |||||
// Refresh events to continuous events | // Refresh events to continuous events | ||||
Status StreamAllocator::RefreshContinuousEvents() { | Status StreamAllocator::RefreshContinuousEvents() { | ||||
// Establish a mapping relationship from old to new event id | // Establish a mapping relationship from old to new event id | ||||
@@ -1128,8 +1362,10 @@ Status StreamAllocator::RefreshContinuousEvents() { | |||||
uint32_t new_event_id = 0; | uint32_t new_event_id = 0; | ||||
for (const auto &one_pair : node_to_send_events_) { | for (const auto &one_pair : node_to_send_events_) { | ||||
for (const auto &event_id : one_pair.second) { | for (const auto &event_id : one_pair.second) { | ||||
old_to_new_events[event_id] = new_event_id; | |||||
new_event_id++; | |||||
if (old_to_new_events.find(event_id) == old_to_new_events.end()) { | |||||
old_to_new_events[event_id] = new_event_id; | |||||
new_event_id++; | |||||
} | |||||
} | } | ||||
} | } | ||||
@@ -1139,6 +1375,7 @@ Status StreamAllocator::RefreshContinuousEvents() { | |||||
for (size_t i = 0; i < send_events.size(); i++) { | for (size_t i = 0; i < send_events.size(); i++) { | ||||
auto find_it = old_to_new_events.find(send_events[i]); | auto find_it = old_to_new_events.find(send_events[i]); | ||||
if (find_it == old_to_new_events.end()) { | if (find_it == old_to_new_events.end()) { | ||||
REPORT_INNER_ERROR("E19999", "Check invalid send event %u", send_events[i]); | |||||
GELOGE(FAILED, "RefreshContinuousEvents: invalid send event %u", send_events[i]); | GELOGE(FAILED, "RefreshContinuousEvents: invalid send event %u", send_events[i]); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -1152,6 +1389,7 @@ Status StreamAllocator::RefreshContinuousEvents() { | |||||
for (size_t i = 0; i < recv_events.size(); i++) { | for (size_t i = 0; i < recv_events.size(); i++) { | ||||
auto find_it = old_to_new_events.find(recv_events[i]); | auto find_it = old_to_new_events.find(recv_events[i]); | ||||
if (find_it == old_to_new_events.end()) { | if (find_it == old_to_new_events.end()) { | ||||
REPORT_INNER_ERROR("E19999", "Check invalid recv event %u", recv_events[i]); | |||||
GELOGE(FAILED, "RefreshContinuousEvents: invalid recv event %u", recv_events[i]); | GELOGE(FAILED, "RefreshContinuousEvents: invalid recv event %u", recv_events[i]); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -1166,6 +1404,7 @@ Status StreamAllocator::RefreshContinuousEvents() { | |||||
// Insert the real send/recv node in the graph | // Insert the real send/recv node in the graph | ||||
Status StreamAllocator::InsertSyncEventNodes() { | Status StreamAllocator::InsertSyncEventNodes() { | ||||
unordered_map<string, uint32_t> sync_event_name; | |||||
for (const auto &node : whole_graph_->GetNodes(whole_graph_->GetGraphUnknownFlag())) { | for (const auto &node : whole_graph_->GetNodes(whole_graph_->GetGraphUnknownFlag())) { | ||||
// Add the node corresponding to the recv event | // Add the node corresponding to the recv event | ||||
vector<uint32_t> recv_event_id_list; | vector<uint32_t> recv_event_id_list; | ||||
@@ -1175,12 +1414,23 @@ Status StreamAllocator::InsertSyncEventNodes() { | |||||
GE_CHECK_NOTNULL(node->GetOutControlAnchor()); | GE_CHECK_NOTNULL(node->GetOutControlAnchor()); | ||||
for (auto &event_id : recv_event_id_list) { | for (auto &event_id : recv_event_id_list) { | ||||
string recv_node_name = whole_graph_->GetName() + "_Recv_" + to_string(event_id); | string recv_node_name = whole_graph_->GetName() + "_Recv_" + to_string(event_id); | ||||
auto iter = sync_event_name.find(recv_node_name); | |||||
if (iter == sync_event_name.end()) { | |||||
sync_event_name[recv_node_name] = 1; | |||||
} else { | |||||
recv_node_name = recv_node_name + "_Reuse_" + to_string(iter->second); | |||||
++(iter->second); | |||||
} | |||||
OpDescPtr op_desc_ptr = MakeShared<OpDesc>(recv_node_name, RECV); | OpDescPtr op_desc_ptr = MakeShared<OpDesc>(recv_node_name, RECV); | ||||
GE_CHECK_NOTNULL(op_desc_ptr); | GE_CHECK_NOTNULL(op_desc_ptr); | ||||
int64_t temp_stream_id = node->GetOpDesc()->GetStreamId(); | int64_t temp_stream_id = node->GetOpDesc()->GetStreamId(); | ||||
op_desc_ptr->SetStreamId(temp_stream_id); | op_desc_ptr->SetStreamId(temp_stream_id); | ||||
GE_CHK_BOOL_EXEC(AttrUtils::SetInt(op_desc_ptr, RECV_ATTR_EVENT_ID, event_id), GELOGE(FAILED, "SetInt failed."); | |||||
GE_CHK_BOOL_EXEC(AttrUtils::SetInt(op_desc_ptr, RECV_ATTR_EVENT_ID, event_id), | |||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s for op:%s(%s) failed, event_id:%u,", | |||||
RECV_ATTR_EVENT_ID.c_str(), | |||||
node->GetName().c_str(), node->GetType().c_str(), event_id); | |||||
GELOGE(FAILED, "SetInt failed."); | |||||
return FAILED); | return FAILED); | ||||
(void)AttrUtils::SetListStr(op_desc_ptr, ATTR_NAME_DATA_DUMP_ORIGIN_OP_NAMES, | (void)AttrUtils::SetListStr(op_desc_ptr, ATTR_NAME_DATA_DUMP_ORIGIN_OP_NAMES, | ||||
std::move(std::vector<std::string>())); | std::move(std::vector<std::string>())); | ||||
@@ -1189,6 +1439,8 @@ Status StreamAllocator::InsertSyncEventNodes() { | |||||
GE_CHECK_NOTNULL(recv_node->GetOutControlAnchor()); | GE_CHECK_NOTNULL(recv_node->GetOutControlAnchor()); | ||||
Status status = GraphUtils::AddEdge(recv_node->GetOutControlAnchor(), node->GetInControlAnchor()); | Status status = GraphUtils::AddEdge(recv_node->GetOutControlAnchor(), node->GetInControlAnchor()); | ||||
if (status != SUCCESS) { | if (status != SUCCESS) { | ||||
REPORT_INNER_ERROR("E19999", "Add edge from node %s to node %s failed", | |||||
recv_node->GetName().c_str(), node->GetName().c_str()); | |||||
GELOGE(status, "Add edge for node %s and node %s failed.", recv_node->GetName().c_str(), | GELOGE(status, "Add edge for node %s and node %s failed.", recv_node->GetName().c_str(), | ||||
node->GetName().c_str()); | node->GetName().c_str()); | ||||
return status; | return status; | ||||
@@ -1203,6 +1455,13 @@ Status StreamAllocator::InsertSyncEventNodes() { | |||||
for (auto &event_id : send_event_id_list) { | for (auto &event_id : send_event_id_list) { | ||||
string send_node_name = whole_graph_->GetName() + "_Send_" + to_string(event_id); | string send_node_name = whole_graph_->GetName() + "_Send_" + to_string(event_id); | ||||
auto iter = sync_event_name.find(send_node_name); | |||||
if (iter == sync_event_name.end()) { | |||||
sync_event_name[send_node_name] = 1; | |||||
} else { | |||||
send_node_name = send_node_name + "_Reuse_" + to_string(iter->second); | |||||
++(iter->second); | |||||
} | |||||
OpDescPtr op_desc_ptr = MakeShared<OpDesc>(send_node_name, SEND); | OpDescPtr op_desc_ptr = MakeShared<OpDesc>(send_node_name, SEND); | ||||
GE_CHECK_NOTNULL(op_desc_ptr); | GE_CHECK_NOTNULL(op_desc_ptr); | ||||
@@ -1217,6 +1476,8 @@ Status StreamAllocator::InsertSyncEventNodes() { | |||||
GE_CHECK_NOTNULL(send_node->GetInControlAnchor()); | GE_CHECK_NOTNULL(send_node->GetInControlAnchor()); | ||||
Status status = GraphUtils::AddEdge(node->GetOutControlAnchor(), send_node->GetInControlAnchor()); | Status status = GraphUtils::AddEdge(node->GetOutControlAnchor(), send_node->GetInControlAnchor()); | ||||
if (status != SUCCESS) { | if (status != SUCCESS) { | ||||
REPORT_INNER_ERROR("E19999", "Add edge from node %s to node %s failed", | |||||
node->GetName().c_str(), send_node->GetName().c_str()); | |||||
GELOGE(status, "Add edge for node %s and node %s failed.", node->GetName().c_str(), | GELOGE(status, "Add edge for node %s and node %s failed.", node->GetName().c_str(), | ||||
send_node->GetName().c_str()); | send_node->GetName().c_str()); | ||||
return status; | return status; | ||||
@@ -1228,6 +1489,8 @@ Status StreamAllocator::InsertSyncEventNodes() { | |||||
Status status = whole_graph_->InsertGraphEvents(); | Status status = whole_graph_->InsertGraphEvents(); | ||||
if (status != SUCCESS) { | if (status != SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Insert Graph Events fail, graph:%s,", | |||||
whole_graph_->GetName().c_str()); | |||||
GELOGE(status, "Graph ReorderEventNodes failed"); | GELOGE(status, "Graph ReorderEventNodes failed"); | ||||
return status; | return status; | ||||
} | } | ||||
@@ -1248,12 +1511,16 @@ void StreamAllocator::DumpEvents() { | |||||
GELOGD("After RefreshRealStream: stream %ld.", stream_id); | GELOGD("After RefreshRealStream: stream %ld.", stream_id); | ||||
for (const auto &node : one_pair.second) { | for (const auto &node : one_pair.second) { | ||||
if (node == nullptr || node->GetOpDesc() == nullptr) { | |||||
continue; | |||||
} | |||||
string send_event_str; | string send_event_str; | ||||
for (const auto &send_event_id : node_to_send_events_[node]) { | for (const auto &send_event_id : node_to_send_events_[node]) { | ||||
send_event_str += " " + to_string(send_event_id); | send_event_str += " " + to_string(send_event_id); | ||||
} | } | ||||
if (!send_event_str.empty()) { | if (!send_event_str.empty()) { | ||||
GELOGI("node: %s, send events: %s", node->GetName().c_str(), send_event_str.c_str()); | |||||
GELOGI("node: %s, id: %ld, stream id :%ld, send events: %s.", node->GetName().c_str(), | |||||
node->GetOpDesc()->GetId(), node->GetOpDesc()->GetStreamId(), send_event_str.c_str()); | |||||
} | } | ||||
string recv_event_str; | string recv_event_str; | ||||
@@ -1261,7 +1528,8 @@ void StreamAllocator::DumpEvents() { | |||||
recv_event_str += " " + to_string(recv_event_id); | recv_event_str += " " + to_string(recv_event_id); | ||||
} | } | ||||
if (!recv_event_str.empty()) { | if (!recv_event_str.empty()) { | ||||
GELOGI("node: %s, recv events: %s", node->GetName().c_str(), recv_event_str.c_str()); | |||||
GELOGI("node: %s, id: %ld, stream id :%ld, recv events: %s.", node->GetName().c_str(), | |||||
node->GetOpDesc()->GetId(), node->GetOpDesc()->GetStreamId(), recv_event_str.c_str()); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -1274,6 +1542,8 @@ Status StreamAllocator::GetMaxStreamAndTask(bool huge_stream, uint32_t &max_stre | |||||
} | } | ||||
rtError_t ret = rtGetMaxStreamAndTask(stream_type, &max_stream_count, &max_task_count); | rtError_t ret = rtGetMaxStreamAndTask(stream_type, &max_stream_count, &max_task_count); | ||||
if (ret != RT_ERROR_NONE) { | if (ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "call rtGetMaxStreamAndTask fail, ret:%d, stream_type:%u,", | |||||
static_cast<int>(ret), stream_type); | |||||
GELOGE(FAILED, "Get max stream and task count by rts failed."); | GELOGE(FAILED, "Get max stream and task count by rts failed."); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -1416,6 +1686,7 @@ Status StreamAllocator::AddActiveNodes(NodePtr &switch_node, const vector<string | |||||
for (size_t i = 0; i < label_num; i++) { | for (size_t i = 0; i < label_num; i++) { | ||||
const string &active_label = ori_active_label_list[i]; | const string &active_label = ori_active_label_list[i]; | ||||
if (labeled_streams_.find(active_label) == labeled_streams_.end()) { | if (labeled_streams_.find(active_label) == labeled_streams_.end()) { | ||||
REPORT_INNER_ERROR("E19999", "can not find stream label:%s", active_label.c_str()); | |||||
GELOGE(FAILED, "can not find stream label %s", active_label.c_str()); | GELOGE(FAILED, "can not find stream label %s", active_label.c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -1442,11 +1713,15 @@ Status StreamAllocator::AddActiveNodes(NodePtr &switch_node, const vector<string | |||||
} | } | ||||
GE_CHECK_NOTNULL(switch_node->GetOutControlAnchor()); | GE_CHECK_NOTNULL(switch_node->GetOutControlAnchor()); | ||||
if (switch_node->GetOutControlAnchor()->Unlink(node->GetInControlAnchor()) != GRAPH_SUCCESS) { | if (switch_node->GetOutControlAnchor()->Unlink(node->GetInControlAnchor()) != GRAPH_SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Unlink %s to %s failed", | |||||
switch_node->GetName().c_str(), node->GetName().c_str()); | |||||
GELOGE(FAILED, "Unlink %s to %s failed.", switch_node->GetName().c_str(), node->GetName().c_str()); | GELOGE(FAILED, "Unlink %s to %s failed.", switch_node->GetName().c_str(), node->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
GE_CHECK_NOTNULL(active_node->GetOutControlAnchor()); | GE_CHECK_NOTNULL(active_node->GetOutControlAnchor()); | ||||
if (active_node->GetOutControlAnchor()->LinkTo(node->GetInControlAnchor()) != GRAPH_SUCCESS) { | if (active_node->GetOutControlAnchor()->LinkTo(node->GetInControlAnchor()) != GRAPH_SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Link %s to %s failed", | |||||
active_node->GetName().c_str(), node->GetName().c_str()); | |||||
GELOGE(FAILED, "Link %s to %s failed.", active_node->GetName().c_str(), node->GetName().c_str()); | GELOGE(FAILED, "Link %s to %s failed.", active_node->GetName().c_str(), node->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -1477,12 +1752,15 @@ Status StreamAllocator::AddActiveNodes(NodePtr &switch_node, const vector<string | |||||
Status StreamAllocator::SetActiveStreamList(NodePtr &active_node, const string &active_label) { | Status StreamAllocator::SetActiveStreamList(NodePtr &active_node, const string &active_label) { | ||||
if (labeled_streams_.find(active_label) == labeled_streams_.end()) { | if (labeled_streams_.find(active_label) == labeled_streams_.end()) { | ||||
REPORT_INNER_ERROR("E19999", "Can not find stream label:%s", active_label.c_str()); | |||||
GELOGE(FAILED, "Can not find stream label %s.", active_label.c_str()); | GELOGE(FAILED, "Can not find stream label %s.", active_label.c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
set<int64_t> &streams = labeled_streams_[active_label]; | set<int64_t> &streams = labeled_streams_[active_label]; | ||||
vector<int64_t> active_streams(streams.begin(), streams.end()); | vector<int64_t> active_streams(streams.begin(), streams.end()); | ||||
if (!AttrUtils::SetListInt(active_node->GetOpDesc(), ATTR_NAME_ACTIVE_STREAM_LIST, active_streams)) { | if (!AttrUtils::SetListInt(active_node->GetOpDesc(), ATTR_NAME_ACTIVE_STREAM_LIST, active_streams)) { | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", ATTR_NAME_ACTIVE_STREAM_LIST.c_str(), | |||||
active_node->GetName().c_str(), active_node->GetType().c_str()); | |||||
GELOGE(FAILED, "SetListInt of %s failed.", ATTR_NAME_ACTIVE_STREAM_LIST.c_str()); | GELOGE(FAILED, "SetListInt of %s failed.", ATTR_NAME_ACTIVE_STREAM_LIST.c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -71,6 +71,10 @@ class StreamAllocator { | |||||
Status SetActiveStreamsForLoop(); | Status SetActiveStreamsForLoop(); | ||||
Status CheckStreamActived() const; | Status CheckStreamActived() const; | ||||
Status ReuseEvent(bool send_to, | |||||
const std::unordered_map<std::string, ge::NodePtr> &name_to_node_map, | |||||
const std::unordered_map<ge::NodePtr, std::vector<std::pair<std::string, uint32_t>>> &node_to_event_id); | |||||
Status RefreshEventsWithReuse(); | |||||
Status RefreshContinuousEvents(); | Status RefreshContinuousEvents(); | ||||
Status InsertSyncEventNodes(); | Status InsertSyncEventNodes(); | ||||
@@ -14,6 +14,9 @@ | |||||
* limitations under the License. | * limitations under the License. | ||||
*/ | */ | ||||
#include "stream_graph_optimizer.h" | #include "stream_graph_optimizer.h" | ||||
#include <securec.h> | |||||
#include "common/util.h" | #include "common/util.h" | ||||
#include "framework/common/debug/ge_log.h" | #include "framework/common/debug/ge_log.h" | ||||
#include "graph/utils/node_utils.h" | #include "graph/utils/node_utils.h" | ||||
@@ -122,13 +125,16 @@ Status StreamGraphOptimizer::OptimizeStreamedSubGraph(const ComputeGraphPtr &com | |||||
GE_CHECK_NOTNULL(op_desc); | GE_CHECK_NOTNULL(op_desc); | ||||
int64_t stream_id = op_desc->GetStreamId(); | int64_t stream_id = op_desc->GetStreamId(); | ||||
if (static_cast<size_t>(stream_id) >= run_context.graphStreamList.size()) { | if (static_cast<size_t>(stream_id) >= run_context.graphStreamList.size()) { | ||||
REPORT_INNER_ERROR("E19999", "Check stream_id:%ld in op:%s(%s) is bigger than " | |||||
"run_context.graphStreamList.size():%zu", stream_id, op_desc->GetName().c_str(), | |||||
op_desc->GetType().c_str(), run_context.graphStreamList.size()); | |||||
GELOGE(FAILED, "stream_id %ld is bigger than run_context.graphStreamList.size() %zu", stream_id, | GELOGE(FAILED, "stream_id %ld is bigger than run_context.graphStreamList.size() %zu", stream_id, | ||||
run_context.graphStreamList.size()); | run_context.graphStreamList.size()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
run_context.stream = run_context.graphStreamList[stream_id]; | run_context.stream = run_context.graphStreamList[stream_id]; | ||||
std::string batch_label; | |||||
(void)AttrUtils::GetStr(subgraph, ATTR_NAME_BATCH_LABEL, batch_label); | |||||
std::string batch_label; | |||||
(void)AttrUtils::GetStr(subgraph, ATTR_NAME_BATCH_LABEL, batch_label); | |||||
GELOGD("Subgraph has same stream id, subgraph: %s, engine_name: %s, stream_id: %ld, rtstream: %lu, " | GELOGD("Subgraph has same stream id, subgraph: %s, engine_name: %s, stream_id: %ld, rtstream: %lu, " | ||||
"batch_label: %s", subgraph->GetName().c_str(), engine_name.c_str(), stream_id, | "batch_label: %s", subgraph->GetName().c_str(), engine_name.c_str(), stream_id, | ||||
static_cast<uint64_t>(reinterpret_cast<uintptr_t>(run_context.stream)), batch_label.c_str()); | static_cast<uint64_t>(reinterpret_cast<uintptr_t>(run_context.stream)), batch_label.c_str()); | ||||
@@ -136,6 +142,9 @@ Status StreamGraphOptimizer::OptimizeStreamedSubGraph(const ComputeGraphPtr &com | |||||
GE_CHECK_NOTNULL(*iter); | GE_CHECK_NOTNULL(*iter); | ||||
Status ret = (*iter)->OptimizeStreamGraph(*subgraph, run_context); | Status ret = (*iter)->OptimizeStreamGraph(*subgraph, run_context); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Call optimize streamed subgraph failed, subgraph: %s, engine_name: %s, graph " | |||||
"Optimizer num: %zu, ret: %u", subgraph->GetName().c_str(), engine_name.c_str(), | |||||
graph_optimizers.size(), ret); | |||||
GELOGE( | GELOGE( | ||||
ret, | ret, | ||||
"[optimizeStreamedSubGraph]: optimize streamed subgraph failed, subgraph: %s, engine_name: %s, graph " | "[optimizeStreamedSubGraph]: optimize streamed subgraph failed, subgraph: %s, engine_name: %s, graph " | ||||
@@ -49,6 +49,7 @@ const char *const kIsLastNode = "is_last_node"; | |||||
const char *const kIsInputVar = "INPUT_IS_VAR"; | const char *const kIsInputVar = "INPUT_IS_VAR"; | ||||
const char *const kIsOutputVar = "OUTPUT_IS_VAR"; | const char *const kIsOutputVar = "OUTPUT_IS_VAR"; | ||||
const char *const kProfilingMode = "PROFILING_MODE"; | const char *const kProfilingMode = "PROFILING_MODE"; | ||||
const char *const kIteratorV2 = "IteratorV2"; | |||||
const uint32_t kProfilingArStep = 2; | const uint32_t kProfilingArStep = 2; | ||||
const uint64_t kProfilingFpStartLogid = 1; | const uint64_t kProfilingFpStartLogid = 1; | ||||
const uint64_t kProfilingBpEndLogid = 2; | const uint64_t kProfilingBpEndLogid = 2; | ||||
@@ -57,6 +58,7 @@ const uint64_t kProfilingArEndLogid = 4; | |||||
const uint64_t kProfilingIterEndLogid = 65535; | const uint64_t kProfilingIterEndLogid = 65535; | ||||
const int64_t kHashFactor = 100000; | const int64_t kHashFactor = 100000; | ||||
const int64_t kInvalidGroupId = -1; | const int64_t kInvalidGroupId = -1; | ||||
const std::set<std::string> kFpNodeTypes = {ge::DATA, ge::GETNEXT, kIteratorV2}; | |||||
} // namespace | } // namespace | ||||
namespace ge { | namespace ge { | ||||
TaskGenerator::TaskGenerator(uint8_t *var_mem_base, uint64_t var_mem_size) { | TaskGenerator::TaskGenerator(uint8_t *var_mem_base, uint64_t var_mem_size) { | ||||
@@ -69,6 +71,7 @@ Status TaskGenerator::GetTaskInfo(Model &model, ComputeGraphPtr &graph, uint64_t | |||||
GELOGD("Begin to Get TaskInfo. session_id=%lu", session_id); | GELOGD("Begin to Get TaskInfo. session_id=%lu", session_id); | ||||
// Check params | // Check params | ||||
if (graph == nullptr) { | if (graph == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "Check param graph is null, session_id:%lu", session_id); | |||||
GELOGE(PARAM_INVALID, "GetTaskInfo param graph is null. session_id=%lu", session_id); | GELOGE(PARAM_INVALID, "GetTaskInfo param graph is null. session_id=%lu", session_id); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
} | } | ||||
@@ -93,6 +96,8 @@ Status TaskGenerator::GetTaskInfo(Model &model, ComputeGraphPtr &graph, uint64_t | |||||
op_name.push_back(iter.second); | op_name.push_back(iter.second); | ||||
} | } | ||||
GE_CHK_BOOL_EXEC(ge::AttrUtils::SetListStr(model, ATTR_MODEL_TASK_INDEX_OP_NAME, op_name), | GE_CHK_BOOL_EXEC(ge::AttrUtils::SetListStr(model, ATTR_MODEL_TASK_INDEX_OP_NAME, op_name), | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for model:%s", | |||||
ATTR_MODEL_TASK_INDEX_OP_NAME.c_str(), model.GetName().c_str()); | |||||
GELOGE(FAILED, "SetListStr failed."); | GELOGE(FAILED, "SetListStr failed."); | ||||
return FAILED); | return FAILED); | ||||
@@ -106,6 +111,8 @@ Status TaskGenerator::GetTaskInfo(Model &model, ComputeGraphPtr &graph, uint64_t | |||||
for (const TaskDef &task_def_temp : task_def_list) { | for (const TaskDef &task_def_temp : task_def_list) { | ||||
TaskDef *task_def = model_task_def.add_task(); | TaskDef *task_def = model_task_def.add_task(); | ||||
if (task_def == nullptr) { | if (task_def == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "Add task_def in ModelTaskDef fail, session_id:%lu, graph:%s, model:%s", | |||||
session_id, graph->GetName().c_str(), model.GetName().c_str()); | |||||
GELOGE(FAILED, "task_def is nullptr."); | GELOGE(FAILED, "task_def is nullptr."); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -126,30 +133,44 @@ Status TaskGenerator::AddModelTaskToModel(const ModelTaskDef &model_task_def, ui | |||||
RunContext &run_context) { | RunContext &run_context) { | ||||
GE_CHK_BOOL_EXEC( | GE_CHK_BOOL_EXEC( | ||||
AttrUtils::SetInt(model, MODEL_ATTR_TASK_GEN_BASE_ADDR, reinterpret_cast<uintptr_t>(run_context.dataMemBase)), | AttrUtils::SetInt(model, MODEL_ATTR_TASK_GEN_BASE_ADDR, reinterpret_cast<uintptr_t>(run_context.dataMemBase)), | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for model:%s", | |||||
MODEL_ATTR_TASK_GEN_BASE_ADDR.c_str(), model.GetName().c_str()); | |||||
GELOGE(FAILED, "SetInt MODEL_ATTR_TASK_GEN_BASE_ADDR failed."); | GELOGE(FAILED, "SetInt MODEL_ATTR_TASK_GEN_BASE_ADDR failed."); | ||||
return FAILED); | return FAILED); | ||||
GE_CHK_BOOL_EXEC( | GE_CHK_BOOL_EXEC( | ||||
AttrUtils::SetInt(model, MODEL_ATTR_TASK_GEN_WEIGHT_ADDR, reinterpret_cast<uintptr_t>(run_context.weightMemBase)), | AttrUtils::SetInt(model, MODEL_ATTR_TASK_GEN_WEIGHT_ADDR, reinterpret_cast<uintptr_t>(run_context.weightMemBase)), | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for model:%s", | |||||
MODEL_ATTR_TASK_GEN_WEIGHT_ADDR.c_str(), model.GetName().c_str()); | |||||
GELOGE(FAILED, "SetInt MODEL_ATTR_TASK_GEN_WEIGHT_ADDR failed."); | GELOGE(FAILED, "SetInt MODEL_ATTR_TASK_GEN_WEIGHT_ADDR failed."); | ||||
return FAILED); | return FAILED); | ||||
GE_CHK_BOOL_EXEC(AttrUtils::SetInt(model, ATTR_MODEL_TASK_GEN_VAR_ADDR, reinterpret_cast<uintptr_t>(var_mem_base_)), | GE_CHK_BOOL_EXEC(AttrUtils::SetInt(model, ATTR_MODEL_TASK_GEN_VAR_ADDR, reinterpret_cast<uintptr_t>(var_mem_base_)), | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for model:%s", | |||||
ATTR_MODEL_TASK_GEN_VAR_ADDR.c_str(), model.GetName().c_str()); | |||||
GELOGE(FAILED, "SetInt ATTR_MODEL_TASK_GEN_VAR_ADDR failed."); | GELOGE(FAILED, "SetInt ATTR_MODEL_TASK_GEN_VAR_ADDR failed."); | ||||
return FAILED); | return FAILED); | ||||
GE_CHK_BOOL_EXEC(AttrUtils::SetInt(model, ATTR_MODEL_VAR_SIZE, var_mem_size_), | GE_CHK_BOOL_EXEC(AttrUtils::SetInt(model, ATTR_MODEL_VAR_SIZE, var_mem_size_), | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for model:%s", | |||||
ATTR_MODEL_VAR_SIZE.c_str(), model.GetName().c_str()); | |||||
GELOGE(FAILED, "SetInt ATTR_MODEL_VAR_SIZE failed."); | GELOGE(FAILED, "SetInt ATTR_MODEL_VAR_SIZE failed."); | ||||
return FAILED); | return FAILED); | ||||
GE_CHK_BOOL_EXEC(AttrUtils::SetInt(model, MODEL_ATTR_SESSION_ID, session_id), | GE_CHK_BOOL_EXEC(AttrUtils::SetInt(model, MODEL_ATTR_SESSION_ID, session_id), | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for mode:%s", | |||||
MODEL_ATTR_SESSION_ID.c_str(), model.GetName().c_str()); | |||||
GELOGE(FAILED, "SetInt MODEL_ATTR_SESSION_ID failed."); | GELOGE(FAILED, "SetInt MODEL_ATTR_SESSION_ID failed."); | ||||
return FAILED); | return FAILED); | ||||
size_t task_size = model_task_def.ByteSizeLong(); | size_t task_size = model_task_def.ByteSizeLong(); | ||||
ge::Buffer serial_buff(task_size); | ge::Buffer serial_buff(task_size); | ||||
if (!model_task_def.SerializePartialToArray(serial_buff.GetData(), static_cast<int>(task_size))) { | if (!model_task_def.SerializePartialToArray(serial_buff.GetData(), static_cast<int>(task_size))) { | ||||
REPORT_INNER_ERROR("E19999", "model_task_def's serialize failed, model name = %s, task_size=%zu", | |||||
model.GetName().c_str(), task_size); | |||||
GELOGE(FAILED, "model_task_def's serialize failed, model name = %s, task_size=%zu.", model.GetName().c_str(), | GELOGE(FAILED, "model_task_def's serialize failed, model name = %s, task_size=%zu.", model.GetName().c_str(), | ||||
task_size); | task_size); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
if (!AttrUtils::SetZeroCopyBytes(model, MODEL_ATTR_TASKS, std::move(serial_buff))) { | if (!AttrUtils::SetZeroCopyBytes(model, MODEL_ATTR_TASKS, std::move(serial_buff))) { | ||||
REPORT_INNER_ERROR("E19999", "Set model task to model failed, model name = %s, task_size=%zu", | |||||
model.GetName().c_str(), task_size); | |||||
GELOGE(FAILED, "Set model task to model failed, model name = %s, task_size=%zu.", model.GetName().c_str(), | GELOGE(FAILED, "Set model task to model failed, model name = %s, task_size=%zu.", model.GetName().c_str(), | ||||
task_size); | task_size); | ||||
return FAILED; | return FAILED; | ||||
@@ -167,7 +188,10 @@ Status TaskGenerator::UpdateOpIsVarAttr(const OpDescPtr &op_desc, uint64_t sessi | |||||
for (int64_t input : input_offsets) { | for (int64_t input : input_offsets) { | ||||
input_var.push_back(VarManager::Instance(session_id)->IsVarAddr(input)); | input_var.push_back(VarManager::Instance(session_id)->IsVarAddr(input)); | ||||
} | } | ||||
GE_CHK_BOOL_EXEC(AttrUtils::SetListBool(op_desc, kIsInputVar, input_var), GELOGE(FAILED, "SetListBool failed."); | |||||
GE_CHK_BOOL_EXEC(AttrUtils::SetListBool(op_desc, kIsInputVar, input_var), | |||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", kIsInputVar, | |||||
op_desc->GetName().c_str(), op_desc->GetType().c_str()); | |||||
GELOGE(FAILED, "SetListBool failed."); | |||||
return FAILED); | return FAILED); | ||||
} | } | ||||
@@ -177,7 +201,10 @@ Status TaskGenerator::UpdateOpIsVarAttr(const OpDescPtr &op_desc, uint64_t sessi | |||||
for (int64_t output : output_offsets) { | for (int64_t output : output_offsets) { | ||||
output_var.push_back(VarManager::Instance(session_id)->IsVarAddr(output)); | output_var.push_back(VarManager::Instance(session_id)->IsVarAddr(output)); | ||||
} | } | ||||
GE_CHK_BOOL_EXEC(AttrUtils::SetListBool(op_desc, kIsOutputVar, output_var), GELOGE(FAILED, "SetListBool failed."); | |||||
GE_CHK_BOOL_EXEC(AttrUtils::SetListBool(op_desc, kIsOutputVar, output_var), | |||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", kIsOutputVar, | |||||
op_desc->GetName().c_str(), op_desc->GetType().c_str()); | |||||
GELOGE(FAILED, "SetListBool failed."); | |||||
return FAILED); | return FAILED); | ||||
} | } | ||||
return SUCCESS; | return SUCCESS; | ||||
@@ -252,6 +279,7 @@ Status TaskGenerator::GenerateTask(RunContext &run_context, ComputeGraphPtr &gra | |||||
GELOGD("Beign to generate task, graph name is %s.", graph->GetName().c_str()); | GELOGD("Beign to generate task, graph name is %s.", graph->GetName().c_str()); | ||||
std::shared_ptr<GELib> ge_lib = GELib::GetInstance(); | std::shared_ptr<GELib> ge_lib = GELib::GetInstance(); | ||||
if ((ge_lib == nullptr) || !ge_lib->InitFlag()) { | if ((ge_lib == nullptr) || !ge_lib->InitFlag()) { | ||||
REPORT_INNER_ERROR("E19999", "Check GELib instance not init before"); | |||||
GELOGE(GE_CLI_GE_NOT_INITIALIZED, "GenerateTask failed."); | GELOGE(GE_CLI_GE_NOT_INITIALIZED, "GenerateTask failed."); | ||||
return GE_CLI_GE_NOT_INITIALIZED; | return GE_CLI_GE_NOT_INITIALIZED; | ||||
} | } | ||||
@@ -319,6 +347,8 @@ Status TaskGenerator::GenerateTask(RunContext &run_context, ComputeGraphPtr &gra | |||||
} | } | ||||
auto kernel_info_store = ops_kernel_manager.GetOpsKernelInfoStore(op_kernel_lib_name); | auto kernel_info_store = ops_kernel_manager.GetOpsKernelInfoStore(op_kernel_lib_name); | ||||
if (kernel_info_store == nullptr) { | if (kernel_info_store == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "Get ops kernel info store failed for op:%s(%s), op_kernel_name:%s", | |||||
node->GetName().c_str(), node->GetType().c_str(), op_kernel_lib_name.c_str()); | |||||
GELOGE(INTERNAL_ERROR, | GELOGE(INTERNAL_ERROR, | ||||
"No ops kernel store or ops kernel builder found. node:%s(%s), op_kernel_lib_name=%s.", | "No ops kernel store or ops kernel builder found. node:%s(%s), op_kernel_lib_name=%s.", | ||||
name.c_str(), | name.c_str(), | ||||
@@ -344,6 +374,8 @@ Status TaskGenerator::GenerateTask(RunContext &run_context, ComputeGraphPtr &gra | |||||
auto ret = OpsKernelBuilderManager::Instance().GenerateTask(*node, run_context, task_def_list); | auto ret = OpsKernelBuilderManager::Instance().GenerateTask(*node, run_context, task_def_list); | ||||
GE_TIMESTAMP_ADD(GenerateTask); | GE_TIMESTAMP_ADD(GenerateTask); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Call OpsKernelBuilderManager GenerateTask fail for op:%s(%s)", | |||||
node->GetName().c_str(), node->GetType().c_str()); | |||||
GELOGE(ret, "Call %s to generate node[name:%s(%s), id:%ld, stream_id:%ld] task failed.", | GELOGE(ret, "Call %s to generate node[name:%s(%s), id:%ld, stream_id:%ld] task failed.", | ||||
op_kernel_lib_name.c_str(), name.c_str(), type.c_str(), op_id, stream_id); | op_kernel_lib_name.c_str(), name.c_str(), type.c_str(), op_id, stream_id); | ||||
return ret; | return ret; | ||||
@@ -353,6 +385,9 @@ Status TaskGenerator::GenerateTask(RunContext &run_context, ComputeGraphPtr &gra | |||||
size_t task_list_size_after = task_def_list.size(); | size_t task_list_size_after = task_def_list.size(); | ||||
// If tasks is reduced | // If tasks is reduced | ||||
if (task_list_size_after < task_list_size_before) { | if (task_list_size_after < task_list_size_before) { | ||||
REPORT_INNER_ERROR("E19999", "Call %s to generate node[name:%s(%s), id:%ld, stream_id:%ld] task " | |||||
"but task num from %zu to %zu, check invalid", op_kernel_lib_name.c_str(), name.c_str(), | |||||
type.c_str(), op_id, stream_id, task_list_size_before, task_list_size_after); | |||||
GELOGE(FAILED, "Call %s to generate node[name:%s(%s), id:%ld, stream_id:%ld] task. but task num from %zu to %zu.", | GELOGE(FAILED, "Call %s to generate node[name:%s(%s), id:%ld, stream_id:%ld] task. but task num from %zu to %zu.", | ||||
op_kernel_lib_name.c_str(), name.c_str(), type.c_str(), op_id, stream_id, task_list_size_before, | op_kernel_lib_name.c_str(), name.c_str(), type.c_str(), op_id, stream_id, task_list_size_before, | ||||
task_list_size_after); | task_list_size_after); | ||||
@@ -417,6 +452,9 @@ Status TaskGenerator::GenerateTaskForFusionNode(FusionTaskInfo &fusion_task_info | |||||
size_t task_list_size_before = task_def_list.size(); | size_t task_list_size_before = task_def_list.size(); | ||||
OpsKernelInfoStorePtr kernel_info_store = ops_kernel_manager.GetOpsKernelInfoStore(op_kernel_lib_name); | OpsKernelInfoStorePtr kernel_info_store = ops_kernel_manager.GetOpsKernelInfoStore(op_kernel_lib_name); | ||||
if (kernel_info_store == nullptr) { | if (kernel_info_store == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "Get ops kernel info store failed for op:%s(%s), op_kernel_name:%s", | |||||
op_desc->GetName().c_str(), op_desc->GetType().c_str(), | |||||
op_kernel_lib_name.c_str()); | |||||
GELOGE(INTERNAL_ERROR, | GELOGE(INTERNAL_ERROR, | ||||
"Fusion: No ops kernel store or ops kernel builder found. fusion_node:%s(%s), op_kernel_lib_name=%s.", | "Fusion: No ops kernel store or ops kernel builder found. fusion_node:%s(%s), op_kernel_lib_name=%s.", | ||||
fusion_node_name.c_str(), fusion_node_type.c_str(), op_kernel_lib_name.c_str()); | fusion_node_name.c_str(), fusion_node_type.c_str(), op_kernel_lib_name.c_str()); | ||||
@@ -433,6 +471,9 @@ Status TaskGenerator::GenerateTaskForFusionNode(FusionTaskInfo &fusion_task_info | |||||
int64_t op_id = op_desc->GetId(); | int64_t op_id = op_desc->GetId(); | ||||
int64_t stream_id = op_desc->GetStreamId(); | int64_t stream_id = op_desc->GetStreamId(); | ||||
if (stream_id < 0 || stream_id >= (int64_t)run_context.graphStreamList.size()) { | if (stream_id < 0 || stream_id >= (int64_t)run_context.graphStreamList.size()) { | ||||
REPORT_INNER_ERROR("E19999", "Fusion: fusion_node[name:%s(%s), id:%ld] stream id is invalid, " | |||||
"stream list size=%zu", fusion_node_name.c_str(), fusion_node_type.c_str(), | |||||
op_id, run_context.graphStreamList.size()); | |||||
GELOGE(INTERNAL_ERROR, "Fusion: fusion_node[name:%s(%s), id:%ld] stream id is invalid, stream list size=%zu", | GELOGE(INTERNAL_ERROR, "Fusion: fusion_node[name:%s(%s), id:%ld] stream id is invalid, stream list size=%zu", | ||||
fusion_node_name.c_str(), fusion_node_type.c_str(), op_id, run_context.graphStreamList.size()); | fusion_node_name.c_str(), fusion_node_type.c_str(), op_id, run_context.graphStreamList.size()); | ||||
return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
@@ -444,6 +485,9 @@ Status TaskGenerator::GenerateTaskForFusionNode(FusionTaskInfo &fusion_task_info | |||||
op_kernel_lib_name.c_str(), fusion_node_name.c_str(), fusion_node_type.c_str(), op_id, stream_id); | op_kernel_lib_name.c_str(), fusion_node_name.c_str(), fusion_node_type.c_str(), op_id, stream_id); | ||||
ret = OpsKernelBuilderManager::Instance().GenerateTask(*fusion_node, run_context, task_def_list); | ret = OpsKernelBuilderManager::Instance().GenerateTask(*fusion_node, run_context, task_def_list); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", " Call %s to generate fusion_node:[fusion_node_name:%s(%s), " | |||||
"id:%ld, stream_id:%ld] task failed", op_kernel_lib_name.c_str(), | |||||
fusion_node_name.c_str(), fusion_node_type.c_str(), op_id, stream_id); | |||||
GELOGE(ret, | GELOGE(ret, | ||||
"Fusion: Call %s to generate fusion_node:[fusion_node_name:%s(%s), " | "Fusion: Call %s to generate fusion_node:[fusion_node_name:%s(%s), " | ||||
"id:%ld, stream_id:%ld] task failed.", | "id:%ld, stream_id:%ld] task failed.", | ||||
@@ -455,6 +499,10 @@ Status TaskGenerator::GenerateTaskForFusionNode(FusionTaskInfo &fusion_task_info | |||||
size_t task_list_size_after = task_def_list.size(); | size_t task_list_size_after = task_def_list.size(); | ||||
// if tasks is reduced | // if tasks is reduced | ||||
if (task_list_size_after < task_list_size_before) { | if (task_list_size_after < task_list_size_before) { | ||||
REPORT_INNER_ERROR("E19999", "InsertProfilingTask for fusion_node:[fusion_node_name:%s(%s), kernel_name:%s" | |||||
"id:%ld, stream_id:%ld] task, but task num from %zu to %zu, check invalid", | |||||
fusion_node_name.c_str(), fusion_node_type.c_str(), op_kernel_lib_name.c_str(), | |||||
op_id, stream_id, task_list_size_before, task_list_size_after); | |||||
GELOGE(FAILED, | GELOGE(FAILED, | ||||
"Fusion: Call %s to generate fusion_node:[fusion_node_name:%s(%s), " | "Fusion: Call %s to generate fusion_node:[fusion_node_name:%s(%s), " | ||||
"id:%ld, stream_id:%ld] task. but task num from %zu to %zu.", | "id:%ld, stream_id:%ld] task. but task num from %zu to %zu.", | ||||
@@ -489,6 +537,8 @@ Status TaskGenerator::GenerateTaskForFusionNode(FusionTaskInfo &fusion_task_info | |||||
Status TaskGenerator::UpdateAnchorStatus(const NodePtr &node) { | Status TaskGenerator::UpdateAnchorStatus(const NodePtr &node) { | ||||
if (NodeUtils::SetAllAnchorStatus(node) != GRAPH_SUCCESS) { | if (NodeUtils::SetAllAnchorStatus(node) != GRAPH_SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "SetAllAnchorStatus fail for op:%s(%s)", | |||||
node->GetName().c_str(), node->GetType().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "NodeUtils::SetAllAnchorStatus failed."); | GELOGE(INTERNAL_ERROR, "NodeUtils::SetAllAnchorStatus failed."); | ||||
return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
} | } | ||||
@@ -496,6 +546,8 @@ Status TaskGenerator::UpdateAnchorStatus(const NodePtr &node) { | |||||
auto peer_anchor = anchor->GetPeerOutAnchor(); | auto peer_anchor = anchor->GetPeerOutAnchor(); | ||||
if (peer_anchor == nullptr) { | if (peer_anchor == nullptr) { | ||||
if (AnchorUtils::SetStatus(anchor, ANCHOR_SUSPEND) != GRAPH_SUCCESS) { | if (AnchorUtils::SetStatus(anchor, ANCHOR_SUSPEND) != GRAPH_SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Set in peer anchor status fail for op:%s(%s), anchor_index:%d,", | |||||
node->GetName().c_str(), node->GetType().c_str(), anchor->GetIdx()); | |||||
GELOGE(INTERNAL_ERROR, "AnchorUtils::SetStatus failed."); | GELOGE(INTERNAL_ERROR, "AnchorUtils::SetStatus failed."); | ||||
return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
} | } | ||||
@@ -506,11 +558,15 @@ Status TaskGenerator::UpdateAnchorStatus(const NodePtr &node) { | |||||
bool is_const = NodeUtils::GetConstOpType(peer_anchor->GetOwnerNode(), const_type); | bool is_const = NodeUtils::GetConstOpType(peer_anchor->GetOwnerNode(), const_type); | ||||
if (is_const && (const_type == CONSTANT)) { | if (is_const && (const_type == CONSTANT)) { | ||||
if (AnchorUtils::SetStatus(anchor, ANCHOR_CONST) != GRAPH_SUCCESS) { | if (AnchorUtils::SetStatus(anchor, ANCHOR_CONST) != GRAPH_SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Set in anchor CONST status fail for op:%s(%s), anchor_index:%d,", | |||||
node->GetName().c_str(), node->GetType().c_str(), anchor->GetIdx()); | |||||
GELOGE(INTERNAL_ERROR, "AnchorUtils::SetStatus failed."); | GELOGE(INTERNAL_ERROR, "AnchorUtils::SetStatus failed."); | ||||
return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
} | } | ||||
} else { | } else { | ||||
if (AnchorUtils::SetStatus(anchor, ANCHOR_DATA) != GRAPH_SUCCESS) { | if (AnchorUtils::SetStatus(anchor, ANCHOR_DATA) != GRAPH_SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Set in anchor DATA status fail for op:%s(%s), anchor_index:%d,", | |||||
node->GetName().c_str(), node->GetType().c_str(), anchor->GetIdx()); | |||||
GELOGE(INTERNAL_ERROR, "AnchorUtils::SetStatus failed."); | GELOGE(INTERNAL_ERROR, "AnchorUtils::SetStatus failed."); | ||||
return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
} | } | ||||
@@ -523,12 +579,15 @@ Status TaskGenerator::UpdateAnchorStatus(const NodePtr &node) { | |||||
Status TaskGenerator::MarkNodeAndSetIndex(ComputeGraphPtr &graph) { | Status TaskGenerator::MarkNodeAndSetIndex(ComputeGraphPtr &graph) { | ||||
auto ge_lib = GELib::GetInstance(); | auto ge_lib = GELib::GetInstance(); | ||||
if ((ge_lib == nullptr) || !ge_lib->InitFlag()) { | if ((ge_lib == nullptr) || !ge_lib->InitFlag()) { | ||||
REPORT_INNER_ERROR("E19999", "Check GELib instance not init before"); | |||||
GELOGE(GE_CLI_GE_NOT_INITIALIZED, "GE is not initialized or is finalized."); | GELOGE(GE_CLI_GE_NOT_INITIALIZED, "GE is not initialized or is finalized."); | ||||
return GE_CLI_GE_NOT_INITIALIZED; | return GE_CLI_GE_NOT_INITIALIZED; | ||||
} | } | ||||
const auto all_nodes = graph->GetNodes(graph->GetGraphUnknownFlag()); | const auto all_nodes = graph->GetNodes(graph->GetGraphUnknownFlag()); | ||||
if (all_nodes.empty()) { | if (all_nodes.empty()) { | ||||
REPORT_INNER_ERROR("E19999", "Check param all_nodes empty in graph:%s", | |||||
graph->GetName().c_str()); | |||||
GELOGE(GE_GRAPH_GRAPH_NODE_NULL, "Graph's node is empty"); | GELOGE(GE_GRAPH_GRAPH_NODE_NULL, "Graph's node is empty"); | ||||
return GE_GRAPH_GRAPH_NODE_NULL; | return GE_GRAPH_GRAPH_NODE_NULL; | ||||
} | } | ||||
@@ -584,6 +643,9 @@ Status TaskGenerator::MarkFirstAndLastOps(const vector<OpDescPtr> &ops, bool is_ | |||||
for (auto &op_desc : continuous_ops) { | for (auto &op_desc : continuous_ops) { | ||||
string op_kernel_lib_name = op_desc->GetOpKernelLibName(); | string op_kernel_lib_name = op_desc->GetOpKernelLibName(); | ||||
if (op_kernel_lib_name.empty()) { | if (op_kernel_lib_name.empty()) { | ||||
REPORT_INNER_ERROR("E19999", "Get ops kernel info store failed for op:%s(%s), op_kernel_name:%s", | |||||
op_desc->GetName().c_str(), op_desc->GetType().c_str(), | |||||
op_kernel_lib_name.c_str()); | |||||
GELOGE(INTERNAL_ERROR, "node:%s(%s) get op kernel lib failed.", op_desc->GetName().c_str(), | GELOGE(INTERNAL_ERROR, "node:%s(%s) get op kernel lib failed.", op_desc->GetName().c_str(), | ||||
op_desc->GetType().c_str()); | op_desc->GetType().c_str()); | ||||
return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
@@ -599,9 +661,15 @@ Status TaskGenerator::MarkFirstAndLastOps(const vector<OpDescPtr> &ops, bool is_ | |||||
for (auto &it : first_and_last_ops) { | for (auto &it : first_and_last_ops) { | ||||
auto &op_pair = it.second; | auto &op_pair = it.second; | ||||
GE_CHK_BOOL_EXEC(ge::AttrUtils::SetBool(op_pair.first, kIsFirstNode, true), GELOGE(FAILED, "SetBool failed."); | |||||
GE_CHK_BOOL_EXEC(ge::AttrUtils::SetBool(op_pair.first, kIsFirstNode, true), | |||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", kIsFirstNode, | |||||
op_pair.first->GetName().c_str(), op_pair.first->GetType().c_str()); | |||||
GELOGE(FAILED, "SetBool failed."); | |||||
return FAILED); | return FAILED); | ||||
GE_CHK_BOOL_EXEC(ge::AttrUtils::SetBool(op_pair.second, kIsLastNode, true), GELOGE(FAILED, "SetBool failed."); | |||||
GE_CHK_BOOL_EXEC(ge::AttrUtils::SetBool(op_pair.second, kIsLastNode, true), | |||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", kIsLastNode, | |||||
op_pair.second->GetName().c_str(), op_pair.second->GetType().c_str()); | |||||
GELOGE(FAILED, "SetBool failed."); | |||||
return FAILED); | return FAILED); | ||||
} | } | ||||
} | } | ||||
@@ -621,8 +689,10 @@ Status TaskGenerator::AutoFindFpOpIndex(const ComputeGraphPtr &graph, ProfilingP | |||||
if (op_kernel_lib_name.empty()) { | if (op_kernel_lib_name.empty()) { | ||||
continue; | continue; | ||||
} | } | ||||
if (op_desc->GetType() == GETNEXT || op_desc->GetType() == DATA) { | |||||
auto type = op_desc->GetType(); | |||||
std::string original_type; | |||||
(void)AttrUtils::GetStr(op_desc, ATTR_NAME_FRAMEWORK_ORIGINAL_TYPE, original_type); | |||||
if (kFpNodeTypes.find(type) != kFpNodeTypes.end() || kFpNodeTypes.find(original_type) != kFpNodeTypes.end()) { | |||||
auto out_anchor = node->GetOutDataAnchor(0); | auto out_anchor = node->GetOutDataAnchor(0); | ||||
for (auto &peer_in_anchor : out_anchor->GetPeerInDataAnchors()) { | for (auto &peer_in_anchor : out_anchor->GetPeerInDataAnchors()) { | ||||
GE_CHECK_NOTNULL(peer_in_anchor); | GE_CHECK_NOTNULL(peer_in_anchor); | ||||
@@ -723,7 +793,9 @@ uint32_t TaskGenerator::FindLastBpFromBpNode(const ComputeGraphPtr &graph, const | |||||
GELOGI("bp_op_desc is %s, id is %ld", bp_op_desc->GetName().c_str(), bp_op_desc->GetId()); | GELOGI("bp_op_desc is %s, id is %ld", bp_op_desc->GetName().c_str(), bp_op_desc->GetId()); | ||||
} | } | ||||
GE_CHECK_NOTNULL(bp_op_desc); | |||||
if (bp_op_desc == nullptr) { | |||||
return last_bp; | |||||
} | |||||
uint32_t current_idx = 0; | uint32_t current_idx = 0; | ||||
for (auto &node : graph->GetNodes(graph->GetGraphUnknownFlag())) { | for (auto &node : graph->GetNodes(graph->GetGraphUnknownFlag())) { | ||||
OpDescPtr op_desc = node->GetOpDesc(); | OpDescPtr op_desc = node->GetOpDesc(); | ||||
@@ -906,6 +978,8 @@ Status TaskGenerator::InsertProfilingArTaskBefore(const OpDescPtr &op_desc, std: | |||||
for (size_t i = 0; i < all_reduce_nodes.size(); i++) { | for (size_t i = 0; i < all_reduce_nodes.size(); i++) { | ||||
if (all_reduce_nodes[i] == node_index) { | if (all_reduce_nodes[i] == node_index) { | ||||
GE_IF_BOOL_EXEC(TypeUtils::CheckUint64MulOverflow(i, kProfilingArStep), | GE_IF_BOOL_EXEC(TypeUtils::CheckUint64MulOverflow(i, kProfilingArStep), | ||||
REPORT_INNER_ERROR("E19999", "Multiply result is out of range when calc profiling ar log id " | |||||
"for node:%s(%s)", op_desc->GetName().c_str(), op_desc->GetType().c_str()); | |||||
GELOGE(FAILED, "Multiply result is out of range."); | GELOGE(FAILED, "Multiply result is out of range."); | ||||
return FAILED); | return FAILED); | ||||
ar_log_id = i * kProfilingArStep + kProfilingArStartLogid; | ar_log_id = i * kProfilingArStep + kProfilingArStartLogid; | ||||
@@ -998,6 +1072,8 @@ Status TaskGenerator::InsertProfilingArTaskAfter(const OpDescPtr &op_desc, std:: | |||||
for (size_t i = 0; i < all_reduce_nodes.size(); i++) { | for (size_t i = 0; i < all_reduce_nodes.size(); i++) { | ||||
if (all_reduce_nodes[i] == node_index) { | if (all_reduce_nodes[i] == node_index) { | ||||
GE_IF_BOOL_EXEC(TypeUtils::CheckUint64MulOverflow(i, kProfilingArStep), | GE_IF_BOOL_EXEC(TypeUtils::CheckUint64MulOverflow(i, kProfilingArStep), | ||||
REPORT_INNER_ERROR("E19999", "Multiply result is out of range when calc profiling ar log id " | |||||
"for node:%s(%s)", op_desc->GetName().c_str(), op_desc->GetType().c_str()); | |||||
GELOGE(FAILED, "Multiply result is out of range."); | GELOGE(FAILED, "Multiply result is out of range."); | ||||
return FAILED); | return FAILED); | ||||
ar_log_id = i * kProfilingArStep + kProfilingArEndLogid; | ar_log_id = i * kProfilingArStep + kProfilingArEndLogid; | ||||
@@ -1107,6 +1183,7 @@ Status TaskGenerator::SetUnknownShapeStream(RunContext &run_context, rtStream_t | |||||
run_context.stream = stream; | run_context.stream = stream; | ||||
rtError_t rt_ret = rtModelBindStream(run_context.model, stream, 0); | rtError_t rt_ret = rtModelBindStream(run_context.model, stream, 0); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtModelBindStream failed, ret:0x%X", rt_ret); | |||||
GELOGE(FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | GELOGE(FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | ||||
GE_CHK_RT_RET(rtStreamDestroy(stream)); | GE_CHK_RT_RET(rtStreamDestroy(stream)); | ||||
return FAILED; | return FAILED; | ||||
@@ -73,6 +73,8 @@ Status BCast::SetShapeDifferentInfo(const kVecInt &x, const kVecInt &y) { | |||||
y_bcast_i = x_i; | y_bcast_i = x_i; | ||||
grad_y_reduce_idx_.push_back(n - 1 - i); | grad_y_reduce_idx_.push_back(n - 1 - i); | ||||
} else { | } else { | ||||
REPORT_INNER_ERROR("E19999", "SetShapeDifferentInfo failed. Two tensor shapes are not compatible " | |||||
"according to the broadcasting rule."); | |||||
GELOGE(domi::PARAM_INVALID, | GELOGE(domi::PARAM_INVALID, | ||||
"SetShapeDifferentInfo failed. Two tensor shapes are not compatible " | "SetShapeDifferentInfo failed. Two tensor shapes are not compatible " | ||||
"according to the broadcasting rule."); | "according to the broadcasting rule."); | ||||
@@ -111,11 +111,14 @@ class BCast { | |||||
const std::function<OutT(InT const &, InT const &)> &func) { | const std::function<OutT(InT const &, InT const &)> &func) { | ||||
Status ret; | Status ret; | ||||
if (func == nullptr) { | if (func == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "Check param func nullptr"); | |||||
GELOGE(domi::PARAM_INVALID, "Param func is null"); | GELOGE(domi::PARAM_INVALID, "Param func is null"); | ||||
return domi::PARAM_INVALID; | return domi::PARAM_INVALID; | ||||
} | } | ||||
// Min input num is 2 | // Min input num is 2 | ||||
if (input.size() < kMinDimNum) { | if (input.size() < kMinDimNum) { | ||||
REPORT_INNER_ERROR("E19999", "Param input.size():%zu < %zu, check invalid", | |||||
input.size(), kMinDimNum); | |||||
GELOGE(domi::PARAM_INVALID, "Input size is smaller than two."); | GELOGE(domi::PARAM_INVALID, "Input size is smaller than two."); | ||||
return domi::PARAM_INVALID; | return domi::PARAM_INVALID; | ||||
} | } | ||||
@@ -149,11 +152,14 @@ class BCast { | |||||
Status BCastComputeCheck(const std::vector<ConstGeTensorPtr> &input, std::vector<OutT> &v_output, | Status BCastComputeCheck(const std::vector<ConstGeTensorPtr> &input, std::vector<OutT> &v_output, | ||||
const std::function<OutT(InT const &, InT const &, DataType &type, Status &)> &func) { | const std::function<OutT(InT const &, InT const &, DataType &type, Status &)> &func) { | ||||
if (func == nullptr) { | if (func == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "Check param func nullptr"); | |||||
GELOGE(PARAM_INVALID, "Param func is null"); | GELOGE(PARAM_INVALID, "Param func is null"); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
} | } | ||||
// Min input num is 2 | // Min input num is 2 | ||||
if (input.size() < kMinDimNum) { | if (input.size() < kMinDimNum) { | ||||
REPORT_INNER_ERROR("E19999", "Param input.size():%zu < %zu, check invalid", | |||||
input.size(), kMinDimNum); | |||||
GELOGE(PARAM_INVALID, "Input size is smaller than two."); | GELOGE(PARAM_INVALID, "Input size is smaller than two."); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
} | } | ||||
@@ -179,6 +185,7 @@ class BCast { | |||||
auto value = func((*(reinterpret_cast<const InT *>(x1_data) + x_index)), | auto value = func((*(reinterpret_cast<const InT *>(x1_data) + x_index)), | ||||
(*(reinterpret_cast<const InT *>(x2_data) + y_index)), data_type, ret); | (*(reinterpret_cast<const InT *>(x2_data) + y_index)), data_type, ret); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
REPORT_INNER_ERROR("E19999", "BCastComputeCheck func execute failed, datatype is %d.", data_type); | |||||
GELOGE(ret, "BCastComputeCheck func execute failed, datatype is %d.", data_type); | GELOGE(ret, "BCastComputeCheck func execute failed, datatype is %d.", data_type); | ||||
return ret; | return ret; | ||||
} | } | ||||
@@ -21,6 +21,8 @@ | |||||
#include "framework/common/debug/ge_log.h" | #include "framework/common/debug/ge_log.h" | ||||
#include "graph/debug/ge_attr_define.h" | #include "graph/debug/ge_attr_define.h" | ||||
#include "graph/utils/graph_utils.h" | #include "graph/utils/graph_utils.h" | ||||
#include "graph/utils/tensor_utils.h" | |||||
#include "common/math/math_util.h" | |||||
namespace ge { | namespace ge { | ||||
/// | /// | ||||
@@ -36,6 +38,8 @@ Status GetOriginalType(const ge::NodePtr &node, string &type) { | |||||
GE_CHECK_NOTNULL(node->GetOpDesc()); | GE_CHECK_NOTNULL(node->GetOpDesc()); | ||||
bool ret = ge::AttrUtils::GetStr(node->GetOpDesc(), ATTR_NAME_FRAMEWORK_ORIGINAL_TYPE, type); | bool ret = ge::AttrUtils::GetStr(node->GetOpDesc(), ATTR_NAME_FRAMEWORK_ORIGINAL_TYPE, type); | ||||
if (!ret) { | if (!ret) { | ||||
REPORT_INNER_ERROR("E19999", "Get Attr:%s fail for op:%s(%s)", ATTR_NAME_FRAMEWORK_ORIGINAL_TYPE.c_str(), | |||||
node->GetName().c_str(), node->GetType().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Get FrameWorkOp original type [%s]", type.c_str()); | GELOGE(INTERNAL_ERROR, "Get FrameWorkOp original type [%s]", type.c_str()); | ||||
return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
} | } | ||||
@@ -55,6 +59,8 @@ Status SetStreamLabel(const ge::NodePtr &node, const std::string &label) { | |||||
GE_CHECK_NOTNULL(tmp_desc); | GE_CHECK_NOTNULL(tmp_desc); | ||||
if (!AttrUtils::SetStr(tmp_desc, ge::ATTR_NAME_STREAM_LABEL, label)) { | if (!AttrUtils::SetStr(tmp_desc, ge::ATTR_NAME_STREAM_LABEL, label)) { | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", ATTR_NAME_STREAM_LABEL.c_str(), | |||||
node->GetName().c_str(), node->GetType().c_str()); | |||||
GELOGE(FAILED, "Op: %s set ATTR_NAME_STREAM_LABEL failed", node->GetName().c_str()); | GELOGE(FAILED, "Op: %s set ATTR_NAME_STREAM_LABEL failed", node->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -72,6 +78,8 @@ Status SetCycleEvent(const ge::NodePtr &node) { | |||||
OpDescPtr tmp_desc = node->GetOpDesc(); | OpDescPtr tmp_desc = node->GetOpDesc(); | ||||
GE_CHECK_NOTNULL(tmp_desc); | GE_CHECK_NOTNULL(tmp_desc); | ||||
if (!AttrUtils::SetBool(tmp_desc, ge::ATTR_NAME_STREAM_CYCLE_EVENT_FLAG, true)) { | if (!AttrUtils::SetBool(tmp_desc, ge::ATTR_NAME_STREAM_CYCLE_EVENT_FLAG, true)) { | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", ATTR_NAME_STREAM_CYCLE_EVENT_FLAG.c_str(), | |||||
node->GetName().c_str(), node->GetType().c_str()); | |||||
GELOGE(FAILED, "Op: %s set ATTR_NAME_STREAM_CYCLE_EVENT_FLAG failed", node->GetName().c_str()); | GELOGE(FAILED, "Op: %s set ATTR_NAME_STREAM_CYCLE_EVENT_FLAG failed", node->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -90,6 +98,8 @@ Status SetActiveLabelList(const ge::NodePtr &node, const std::vector<std::string | |||||
OpDescPtr tmp_desc = node->GetOpDesc(); | OpDescPtr tmp_desc = node->GetOpDesc(); | ||||
GE_CHECK_NOTNULL(tmp_desc); | GE_CHECK_NOTNULL(tmp_desc); | ||||
if (!AttrUtils::SetListStr(tmp_desc, ge::ATTR_NAME_ACTIVE_LABEL_LIST, active_label_list)) { | if (!AttrUtils::SetListStr(tmp_desc, ge::ATTR_NAME_ACTIVE_LABEL_LIST, active_label_list)) { | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", ATTR_NAME_ACTIVE_LABEL_LIST.c_str(), | |||||
node->GetName().c_str(), node->GetType().c_str()); | |||||
GELOGE(FAILED, "Op: %s set ATTR_NAME_ACTIVE_LABEL_LIST failed", node->GetName().c_str()); | GELOGE(FAILED, "Op: %s set ATTR_NAME_ACTIVE_LABEL_LIST failed", node->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -108,6 +118,8 @@ Status SetSwitchBranchNodeLabel(const ge::NodePtr &node, const std::string &bran | |||||
OpDescPtr tmp_desc = node->GetOpDesc(); | OpDescPtr tmp_desc = node->GetOpDesc(); | ||||
GE_CHECK_NOTNULL(tmp_desc); | GE_CHECK_NOTNULL(tmp_desc); | ||||
if (!AttrUtils::SetStr(tmp_desc, ge::ATTR_NAME_SWITCH_BRANCH_NODE_LABEL, branch_label)) { | if (!AttrUtils::SetStr(tmp_desc, ge::ATTR_NAME_SWITCH_BRANCH_NODE_LABEL, branch_label)) { | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", ATTR_NAME_SWITCH_BRANCH_NODE_LABEL.c_str(), | |||||
node->GetName().c_str(), node->GetType().c_str()); | |||||
GELOGE(FAILED, "Op: %s set ATTR_NAME_SWITCH_BRANCH_NODE_LABEL failed", node->GetName().c_str()); | GELOGE(FAILED, "Op: %s set ATTR_NAME_SWITCH_BRANCH_NODE_LABEL failed", node->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -126,6 +138,8 @@ Status SetSwitchTrueBranchFlag(const ge::NodePtr &node, bool value) { | |||||
OpDescPtr tmp_desc = node->GetOpDesc(); | OpDescPtr tmp_desc = node->GetOpDesc(); | ||||
GE_CHECK_NOTNULL(tmp_desc); | GE_CHECK_NOTNULL(tmp_desc); | ||||
if (!AttrUtils::SetBool(tmp_desc, ge::ATTR_NAME_SWITCH_TRUE_BRANCH_FLAG, value)) { | if (!AttrUtils::SetBool(tmp_desc, ge::ATTR_NAME_SWITCH_TRUE_BRANCH_FLAG, value)) { | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", ATTR_NAME_SWITCH_TRUE_BRANCH_FLAG.c_str(), | |||||
node->GetName().c_str(), node->GetType().c_str()); | |||||
GELOGE(FAILED, "Op: %s set ATTR_NAME_SWITCH_TRUE_BRANCH_FLAG failed", node->GetName().c_str()); | GELOGE(FAILED, "Op: %s set ATTR_NAME_SWITCH_TRUE_BRANCH_FLAG failed", node->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -144,6 +158,8 @@ Status SetOriginalNodeName(const ge::NodePtr &node, const std::string &orig_name | |||||
OpDescPtr tmp_desc = node->GetOpDesc(); | OpDescPtr tmp_desc = node->GetOpDesc(); | ||||
GE_CHECK_NOTNULL(tmp_desc); | GE_CHECK_NOTNULL(tmp_desc); | ||||
if (!AttrUtils::SetStr(tmp_desc, ge::ATTR_NAME_ORIG_NODE_NAME, orig_name)) { | if (!AttrUtils::SetStr(tmp_desc, ge::ATTR_NAME_ORIG_NODE_NAME, orig_name)) { | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", ATTR_NAME_ORIG_NODE_NAME.c_str(), | |||||
node->GetName().c_str(), node->GetType().c_str()); | |||||
GELOGE(FAILED, "Op: %s set ATTR_NAME_ORIG_NODE_NAME failed", node->GetName().c_str()); | GELOGE(FAILED, "Op: %s set ATTR_NAME_ORIG_NODE_NAME failed", node->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -161,6 +177,8 @@ Status SetCyclicDependenceFlag(const ge::NodePtr &node) { | |||||
OpDescPtr tmp_desc = node->GetOpDesc(); | OpDescPtr tmp_desc = node->GetOpDesc(); | ||||
GE_CHECK_NOTNULL(tmp_desc); | GE_CHECK_NOTNULL(tmp_desc); | ||||
if (!AttrUtils::SetBool(tmp_desc, ge::ATTR_NAME_CYCLIC_DEPENDENCE_FLAG, true)) { | if (!AttrUtils::SetBool(tmp_desc, ge::ATTR_NAME_CYCLIC_DEPENDENCE_FLAG, true)) { | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", ATTR_NAME_CYCLIC_DEPENDENCE_FLAG.c_str(), | |||||
node->GetName().c_str(), node->GetType().c_str()); | |||||
GELOGE(FAILED, "Op: %s set ATTR_NAME_CYCLIC_DEPENDENCE_FLAG failed", node->GetName().c_str()); | GELOGE(FAILED, "Op: %s set ATTR_NAME_CYCLIC_DEPENDENCE_FLAG failed", node->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -180,10 +198,50 @@ Status SetNextIteration(const ge::NodePtr &node, const std::string &next) { | |||||
GE_CHECK_NOTNULL(tmp_desc); | GE_CHECK_NOTNULL(tmp_desc); | ||||
if (!AttrUtils::SetStr(tmp_desc, ge::ATTR_NAME_NEXT_ITERATION, next)) { | if (!AttrUtils::SetStr(tmp_desc, ge::ATTR_NAME_NEXT_ITERATION, next)) { | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", ATTR_NAME_NEXT_ITERATION.c_str(), | |||||
node->GetName().c_str(), node->GetType().c_str()); | |||||
GELOGE(FAILED, "Op: %s set ATTR_NAME_NEXT_ITERATION failed", node->GetName().c_str()); | GELOGE(FAILED, "Op: %s set ATTR_NAME_NEXT_ITERATION failed", node->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
/// | |||||
/// @brief Align the memory | |||||
/// @param [in/out] memory size | |||||
/// @param [in] alinment | |||||
/// @return void | |||||
/// | |||||
void AlignMemSize(int64_t &mem_size, int64_t align_size) { | |||||
if (mem_size <= 0) { | |||||
return; | |||||
} | |||||
mem_size = (mem_size + align_size - 1) / align_size * align_size; | |||||
} | |||||
/// | |||||
/// @brief Get memory size from tensor desc | |||||
/// @param [in] node | |||||
/// @param [out] memory size | |||||
/// @return Status | |||||
/// | |||||
Status GetMemorySize(const NodePtr &node, int64_t &output_size) { | |||||
GE_CHECK_NOTNULL(node->GetOpDesc()); | |||||
auto output_op_desc = node->GetOpDesc()->GetOutputDescPtr(kBufferPoolNodeOutIndex); | |||||
GE_CHECK_NOTNULL(output_op_desc); | |||||
int64_t size = 0; | |||||
auto ret = ge::TensorUtils::GetSize(*output_op_desc, size); | |||||
if (ret != ge::GRAPH_SUCCESS) { | |||||
GELOGE(INTERNAL_ERROR, "[Get][Size]Node:%s.", node->GetName().c_str()); | |||||
REPORT_INNER_ERROR("E19999", "Failed to get output size, node:%s.", node->GetName().c_str()); | |||||
return INTERNAL_ERROR; | |||||
} | |||||
FMK_INT64_ADDCHECK(size, kBufferPoolMemAlignSize); | |||||
AlignMemSize(size, kBufferPoolMemAlignSize); | |||||
// The HCOM operator requires an additional 512 bytes before and after | |||||
FMK_INT64_ADDCHECK(size, (kBufferPoolMemAlignSize + kBufferPoolMemAlignSize)); | |||||
output_size = kBufferPoolMemAlignSize + size + kBufferPoolMemAlignSize; | |||||
return SUCCESS; | |||||
} | |||||
} // namespace ge | } // namespace ge |
@@ -27,6 +27,11 @@ | |||||
#include "graph/node.h" | #include "graph/node.h" | ||||
namespace ge { | namespace ge { | ||||
namespace { | |||||
const int64_t kBufferPoolMemAlignSize = 512; | |||||
const uint32_t kBufferPoolNodeOutIndex = 0; | |||||
const uint32_t kEventReuseThreshold = 65500; | |||||
} // namespace | |||||
/// | /// | ||||
/// @brief get the Original Type of FrameworkOp | /// @brief get the Original Type of FrameworkOp | ||||
/// @param [in] node | /// @param [in] node | ||||
@@ -96,6 +101,22 @@ Status SetCyclicDependenceFlag(const ge::NodePtr &node); | |||||
/// @return Status | /// @return Status | ||||
/// | /// | ||||
Status SetNextIteration(const ge::NodePtr &node, const std::string &next); | Status SetNextIteration(const ge::NodePtr &node, const std::string &next); | ||||
/// | |||||
/// @brief Align the memory | |||||
/// @param [in/out] memory size | |||||
/// @param [in] alinment | |||||
/// @return void | |||||
/// | |||||
void AlignMemSize(int64_t &mem_size, int64_t align_size); | |||||
/// | |||||
/// @brief Get memory size from tensor desc | |||||
/// @param [in] node | |||||
/// @param [out] memory size | |||||
/// @return Status | |||||
/// | |||||
Status GetMemorySize(const NodePtr &node, int64_t &output_size); | |||||
} // namespace ge | } // namespace ge | ||||
#endif // GE_GRAPH_COMMON_OMG_UTIL_H_ | #endif // GE_GRAPH_COMMON_OMG_UTIL_H_ |
@@ -20,9 +20,12 @@ | |||||
#include <string> | #include <string> | ||||
#include "graph/load/model_manager/model_manager.h" | #include "graph/load/model_manager/model_manager.h" | ||||
#include "graph/load/model_manager/davinci_model.h" | |||||
#include "omm/csa_interact.h" | #include "omm/csa_interact.h" | ||||
namespace ge { | namespace ge { | ||||
using Uint32Pair = pair<uint32_t, uint32_t>; | |||||
const uint32_t kInvalidModelId = UINT32_MAX; | |||||
GraphExecutor::GraphExecutor() | GraphExecutor::GraphExecutor() | ||||
: init_flag_(false), | : init_flag_(false), | ||||
train_graph_flag_(false), | train_graph_flag_(false), | ||||
@@ -40,6 +43,7 @@ GraphExecutor::~GraphExecutor() { | |||||
rtError_t rt_ret; | rtError_t rt_ret; | ||||
rt_ret = rtFreeHost(buffer_addr); | rt_ret = rtFreeHost(buffer_addr); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtFreeHost failed, ret:0x%X", rt_ret); | |||||
GELOGE(RT_FAILED, "[GraphManager] subgraph free buffer failed, ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "[GraphManager] subgraph free buffer failed, ret: 0x%X", rt_ret); | ||||
} | } | ||||
} | } | ||||
@@ -51,14 +55,17 @@ GraphExecutor::~GraphExecutor() { | |||||
Status GraphExecutor::SetCondition(std::mutex *mutex, std::condition_variable *cond, | Status GraphExecutor::SetCondition(std::mutex *mutex, std::condition_variable *cond, | ||||
std::shared_ptr<GraphModelListener> listener) { | std::shared_ptr<GraphModelListener> listener) { | ||||
if (mutex == nullptr) { | if (mutex == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "Check param mutex nullptr"); | |||||
GELOGE(GE_GRAPH_PARAM_NULLPTR, "[SetCondition] input param mutex is nullptr."); | GELOGE(GE_GRAPH_PARAM_NULLPTR, "[SetCondition] input param mutex is nullptr."); | ||||
return GE_GRAPH_PARAM_NULLPTR; | return GE_GRAPH_PARAM_NULLPTR; | ||||
} | } | ||||
if (cond == nullptr) { | if (cond == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "Check param cond nullptr"); | |||||
GELOGE(GE_GRAPH_PARAM_NULLPTR, "[SetCondition] input param cond is nullptr."); | GELOGE(GE_GRAPH_PARAM_NULLPTR, "[SetCondition] input param cond is nullptr."); | ||||
return GE_GRAPH_PARAM_NULLPTR; | return GE_GRAPH_PARAM_NULLPTR; | ||||
} | } | ||||
if (listener == nullptr) { | if (listener == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "Check param listener nullptr"); | |||||
GELOGE(GE_GRAPH_PARAM_NULLPTR, "[SetCondition] input param listener is nullptr."); | GELOGE(GE_GRAPH_PARAM_NULLPTR, "[SetCondition] input param listener is nullptr."); | ||||
return GE_GRAPH_PARAM_NULLPTR; | return GE_GRAPH_PARAM_NULLPTR; | ||||
} | } | ||||
@@ -75,6 +82,7 @@ Status GraphExecutor::SetCondition(std::mutex *mutex, std::condition_variable *c | |||||
Status GraphExecutor::SetGraphContext(GraphContextPtr graph_context_ptr) { | Status GraphExecutor::SetGraphContext(GraphContextPtr graph_context_ptr) { | ||||
if (graph_context_ptr == nullptr) { | if (graph_context_ptr == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "Check param graph_context_ptr nullptr"); | |||||
GELOGE(GE_GRAPH_PARAM_NULLPTR, "[SetGraphContext] input param graph_context_ptr is nullptr"); | GELOGE(GE_GRAPH_PARAM_NULLPTR, "[SetGraphContext] input param graph_context_ptr is nullptr"); | ||||
return GE_GRAPH_PARAM_NULLPTR; | return GE_GRAPH_PARAM_NULLPTR; | ||||
} | } | ||||
@@ -101,6 +109,7 @@ Status GraphExecutor::FreeInOutBuffer() { | |||||
rtError_t rt_ret; | rtError_t rt_ret; | ||||
rt_ret = rtFreeHost(*iter); | rt_ret = rtFreeHost(*iter); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtFreeHost failed, ret:0x%X", rt_ret); | |||||
GELOGE(RT_FAILED, "[GraphManager] subgraph free buffer failed, ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "[GraphManager] subgraph free buffer failed, ret: 0x%X", rt_ret); | ||||
(void)buffer_addr_.erase(buffer_addr_.begin(), iter); | (void)buffer_addr_.erase(buffer_addr_.begin(), iter); | ||||
return GE_GRAPH_FREE_FAILED; | return GE_GRAPH_FREE_FAILED; | ||||
@@ -146,6 +155,8 @@ Status GraphExecutor::MallocInOutBuffer(const std::vector<uint64_t> &buffer_size | |||||
void *tmp_buf = nullptr; | void *tmp_buf = nullptr; | ||||
rt_ret = rtMallocHost(&tmp_buf, buffer_size[i]); | rt_ret = rtMallocHost(&tmp_buf, buffer_size[i]); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtMallocHost failed, size:%lu, ret:0x%X", | |||||
buffer_size[i], rt_ret); | |||||
GELOGE(RT_FAILED, "[GraphManager] subgraph malloc buffer failed, ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "[GraphManager] subgraph malloc buffer failed, ret: 0x%X", rt_ret); | ||||
return GE_GRAPH_MALLOC_FAILED; | return GE_GRAPH_MALLOC_FAILED; | ||||
} | } | ||||
@@ -191,6 +202,8 @@ Status GraphExecutor::PrepareInputData(const std::vector<GeTensor> &input_tensor | |||||
rtError_t rt_ret = rtMemcpy(addrVec[i], bufferSizeVec[i], in_tensor->GetData().data(), | rtError_t rt_ret = rtMemcpy(addrVec[i], bufferSizeVec[i], in_tensor->GetData().data(), | ||||
in_tensor->GetData().size(), RT_MEMCPY_HOST_TO_HOST); | in_tensor->GetData().size(), RT_MEMCPY_HOST_TO_HOST); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtMemcpy failed, dst_size:%lu, src_size:%zu, ret:0x%X", | |||||
bufferSizeVec[i], in_tensor->GetData().size(), rt_ret); | |||||
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | ||||
return RT_FAILED; | return RT_FAILED; | ||||
} | } | ||||
@@ -250,6 +263,8 @@ Status GraphExecutor::SyncExecuteModel(uint32_t model_id, const std::vector<GeTe | |||||
} | } | ||||
if (graph_run_listener_->ResetResult() != SUCCESS) { | if (graph_run_listener_->ResetResult() != SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Call graph_run_listener_.ResetResult fail, model_id:%u", | |||||
model_id); | |||||
GELOGE(GE_GRAPH_EXECUTE_FAILED, "Reset result failed"); | GELOGE(GE_GRAPH_EXECUTE_FAILED, "Reset result failed"); | ||||
return GE_GRAPH_EXECUTE_FAILED; | return GE_GRAPH_EXECUTE_FAILED; | ||||
} | } | ||||
@@ -273,6 +288,8 @@ Status GraphExecutor::SyncExecuteModel(uint32_t model_id, const std::vector<GeTe | |||||
// Run graph return | // Run graph return | ||||
uint32_t result_code = graph_run_listener_->GetResultCode(); | uint32_t result_code = graph_run_listener_->GetResultCode(); | ||||
if (result_code != SUCCESS && result_code != END_OF_SEQUENCE) { | if (result_code != SUCCESS && result_code != END_OF_SEQUENCE) { | ||||
REPORT_CALL_ERROR("E19999", "Graph_run_listener_ run fail, result:%u, model_id:%u", | |||||
result_code, model_id); | |||||
GELOGE(GE_GRAPH_EXECUTE_FAILED, "[GraphExecutor] execute model failed, ret=%u, modelId=%u.", result_code, | GELOGE(GE_GRAPH_EXECUTE_FAILED, "[GraphExecutor] execute model failed, ret=%u, modelId=%u.", result_code, | ||||
model_id); | model_id); | ||||
return GE_GRAPH_EXECUTE_FAILED; | return GE_GRAPH_EXECUTE_FAILED; | ||||
@@ -281,10 +298,14 @@ Status GraphExecutor::SyncExecuteModel(uint32_t model_id, const std::vector<GeTe | |||||
for (size_t i = 0; i < output_data.blobs.size(); ++i) { | for (size_t i = 0; i < output_data.blobs.size(); ++i) { | ||||
DataBuffer outputDataTmp = output_data.blobs[i]; | DataBuffer outputDataTmp = output_data.blobs[i]; | ||||
CHECK_FALSE_EXEC(outputDataTmp.length != 0, | CHECK_FALSE_EXEC(outputDataTmp.length != 0, | ||||
REPORT_INNER_ERROR("E19999", "Param output_data.length is 0 in model:%u, check invalid", | |||||
model_id); | |||||
GELOGE(GE_GRAPH_EXECUTE_FAILED, "Failed to allocate memory, length is 0."); | GELOGE(GE_GRAPH_EXECUTE_FAILED, "Failed to allocate memory, length is 0."); | ||||
return GE_GRAPH_EXECUTE_FAILED); | return GE_GRAPH_EXECUTE_FAILED); | ||||
std::unique_ptr<uint8_t> outBufTmp(new (std::nothrow) uint8_t[outputDataTmp.length]); | std::unique_ptr<uint8_t> outBufTmp(new (std::nothrow) uint8_t[outputDataTmp.length]); | ||||
if (outBufTmp == nullptr) { | if (outBufTmp == nullptr) { | ||||
REPORT_CALL_ERROR("E19999", "New output buffer fail, length:%lu, model:%u", | |||||
outputDataTmp.length, model_id); | |||||
GELOGE(FAILED, "Failed to allocate memory."); | GELOGE(FAILED, "Failed to allocate memory."); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -292,6 +313,8 @@ Status GraphExecutor::SyncExecuteModel(uint32_t model_id, const std::vector<GeTe | |||||
rtError_t ret_value = rtMemcpy(outBufTmp.get(), outputDataTmp.length, outputDataTmp.data, outputDataTmp.length, | rtError_t ret_value = rtMemcpy(outBufTmp.get(), outputDataTmp.length, outputDataTmp.data, outputDataTmp.length, | ||||
RT_MEMCPY_HOST_TO_HOST); | RT_MEMCPY_HOST_TO_HOST); | ||||
CHECK_FALSE_EXEC(ret_value == RT_ERROR_NONE, | CHECK_FALSE_EXEC(ret_value == RT_ERROR_NONE, | ||||
REPORT_CALL_ERROR("E19999", "Call rtMemcpy failed, dst_size:%lu, src_size:%zu, ret:0x%X", | |||||
outputDataTmp.length, outputDataTmp.length, ret_value); | |||||
GELOGE(GE_GRAPH_EXECUTE_FAILED, "Call rt api rtMemcpy failed, ret: 0x%X", ret); | GELOGE(GE_GRAPH_EXECUTE_FAILED, "Call rt api rtMemcpy failed, ret: 0x%X", ret); | ||||
return GE_GRAPH_EXECUTE_FAILED); | return GE_GRAPH_EXECUTE_FAILED); | ||||
GeTensor outTensor; | GeTensor outTensor; | ||||
@@ -344,6 +367,8 @@ Status GraphExecutor::ExecuteGraph(GraphId graph_id, const GeRootModelPtr &ge_ro | |||||
last_graph_id_ = graph_id; | last_graph_id_ = graph_id; | ||||
if (!init_flag_) { | if (!init_flag_) { | ||||
REPORT_INNER_ERROR("E19999", "No SetCondition called before, graph:%u, check invalid", | |||||
graph_id); | |||||
GELOGE(GE_GRAPH_EXECUTE_NOT_INIT, "[GraphExecutor] AI Core Engine without calling SetCondition!"); | GELOGE(GE_GRAPH_EXECUTE_NOT_INIT, "[GraphExecutor] AI Core Engine without calling SetCondition!"); | ||||
return GE_GRAPH_EXECUTE_NOT_INIT; | return GE_GRAPH_EXECUTE_NOT_INIT; | ||||
} | } | ||||
@@ -358,7 +383,8 @@ Status GraphExecutor::ExecuteGraph(GraphId graph_id, const GeRootModelPtr &ge_ro | |||||
} | } | ||||
Status GraphExecutor::ExecuteGraphAsync(GraphId graph_id, const GeRootModelPtr &ge_root_model, | Status GraphExecutor::ExecuteGraphAsync(GraphId graph_id, const GeRootModelPtr &ge_root_model, | ||||
const std::vector<InputTensorInfo> &input_tensor) { | |||||
const std::vector<InputTensorInfo> &input_tensor, | |||||
const RunAsyncCallback& callback) { | |||||
GELOGI("[GraphExecutor] Start to async execute graph, graph_id=%u", graph_id); | GELOGI("[GraphExecutor] Start to async execute graph, graph_id=%u", graph_id); | ||||
if (graph_id != last_graph_id_) { | if (graph_id != last_graph_id_) { | ||||
auto ret = FreeExecuteMemory(); | auto ret = FreeExecuteMemory(); | ||||
@@ -368,7 +394,7 @@ Status GraphExecutor::ExecuteGraphAsync(GraphId graph_id, const GeRootModelPtr & | |||||
} | } | ||||
last_graph_id_ = graph_id; | last_graph_id_ = graph_id; | ||||
GE_CHECK_NOTNULL_EXEC(ge_root_model, return FAILED); | GE_CHECK_NOTNULL_EXEC(ge_root_model, return FAILED); | ||||
Status ret = AsyncExecuteModel(ge_root_model->GetModelId(), input_tensor); | |||||
Status ret = AsyncExecuteModel(ge_root_model, input_tensor, callback); | |||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
GELOGE(GE_GRAPH_SYNC_MODEL_FAILED, "[GraphExecutor] AsyncExecuteModel Error!"); | GELOGE(GE_GRAPH_SYNC_MODEL_FAILED, "[GraphExecutor] AsyncExecuteModel Error!"); | ||||
return GE_GRAPH_SYNC_MODEL_FAILED; | return GE_GRAPH_SYNC_MODEL_FAILED; | ||||
@@ -378,11 +404,81 @@ Status GraphExecutor::ExecuteGraphAsync(GraphId graph_id, const GeRootModelPtr & | |||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
Status GraphExecutor::AsyncExecuteModel(uint32_t model_id, const std::vector<InputTensorInfo> &inputs) { | |||||
bool CompareByLoad(const Uint32Pair &lhs, const Uint32Pair &rhs) { | |||||
return lhs.second < rhs.second; | |||||
} | |||||
uint32_t GraphExecutor::GetExecuteModelId(const GeRootModelPtr &ge_root_model) { | |||||
std::vector<uint32_t> model_ids = ge_root_model->GetAllModelId(); | |||||
if (model_ids.empty()) { | |||||
return kInvalidModelId; | |||||
} | |||||
if (model_ids.size() == 1) { | |||||
return ge_root_model->GetModelId(); | |||||
} | |||||
std::vector<Uint32Pair> model_id_to_loads; | |||||
auto model_manager = ModelManager::GetInstance(); | |||||
GE_CHECK_NOTNULL(model_manager); | |||||
for (auto model_id : model_ids) { | |||||
auto davinci_model = model_manager->GetModel(model_id); | |||||
auto hybrid_model = model_manager->GetHybridModel(model_id); | |||||
if (hybrid_model == nullptr) { | |||||
GE_CHECK_NOTNULL(davinci_model); | |||||
} | |||||
uint32_t input_load = hybrid_model != nullptr ? hybrid_model->GetDataInputerSize() : | |||||
davinci_model->GetDataInputerSize(); | |||||
uint32_t running_load = hybrid_model != nullptr ? static_cast<uint32_t>(hybrid_model->GetRunningFlag()) : | |||||
static_cast<uint32_t>(davinci_model->GetRunningFlag()); | |||||
uint32_t load = input_load + running_load; | |||||
if (load == 0) { | |||||
return model_id; | |||||
} | |||||
model_id_to_loads.emplace_back(model_id, load); | |||||
} | |||||
sort(model_id_to_loads.begin(), model_id_to_loads.end(), CompareByLoad); | |||||
if (model_id_to_loads.empty()) { | |||||
return kInvalidModelId; | |||||
} | |||||
return model_id_to_loads.begin()->first; | |||||
} | |||||
Status GraphExecutor::SetCallback(uint32_t model_id, const GeRootModelPtr &ge_root_model, | |||||
const RunAsyncCallback &callback) { | |||||
auto model_manager = ge::ModelManager::GetInstance(); | |||||
GE_CHECK_NOTNULL(model_manager); | |||||
if (model_manager->IsNeedHybridLoad(*ge_root_model)) { | |||||
auto model = model_manager->GetHybridModel(model_id); | |||||
GE_CHECK_NOTNULL(model); | |||||
if (model->SetRunAsyncListenerCallback(callback) != SUCCESS) { | |||||
GELOGE(FAILED, "SetRunAsyncListenerCallback failed."); | |||||
return FAILED; | |||||
} | |||||
} else { | |||||
auto model = model_manager->GetModel(model_id); | |||||
GE_CHECK_NOTNULL(model); | |||||
if (model->SetRunAsyncListenerCallback(callback) != SUCCESS) { | |||||
GELOGE(FAILED, "SetRunAsyncListenerCallback failed."); | |||||
return FAILED; | |||||
} | |||||
} | |||||
return SUCCESS; | |||||
} | |||||
Status GraphExecutor::AsyncExecuteModel(const GeRootModelPtr &ge_root_model, const std::vector<InputTensorInfo> &inputs, | |||||
const RunAsyncCallback &callback) { | |||||
uint32_t model_id = GetExecuteModelId(ge_root_model); | |||||
if (model_id == kInvalidModelId) { | |||||
GELOGE(INTERNAL_ERROR, "No valid model id."); | |||||
return INTERNAL_ERROR; | |||||
} | |||||
try { | try { | ||||
auto model_manager = ge::ModelManager::GetInstance(); | auto model_manager = ge::ModelManager::GetInstance(); | ||||
GE_CHECK_NOTNULL(model_manager); | GE_CHECK_NOTNULL(model_manager); | ||||
GELOGI("RunAsync begin.model_id %u", model_id); | GELOGI("RunAsync begin.model_id %u", model_id); | ||||
if (SetCallback(model_id, ge_root_model, callback) != SUCCESS) { | |||||
GELOGE(FAILED, "RunAsync: SetCallBack for model fail"); | |||||
return FAILED; | |||||
} | |||||
Status ret = model_manager->DataInputTensor(model_id, inputs); | Status ret = model_manager->DataInputTensor(model_id, inputs); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
@@ -392,10 +488,12 @@ Status GraphExecutor::AsyncExecuteModel(uint32_t model_id, const std::vector<Inp | |||||
GELOGI("RunAsync success."); | GELOGI("RunAsync success."); | ||||
} catch (std::bad_alloc &) { | } catch (std::bad_alloc &) { | ||||
REPORT_INNER_ERROR("E19999", "Bad memory allocation exception occur failed"); | |||||
GELOGE(MEMALLOC_FAILED, "RunAsync failed, bad memory allocation occur !"); | GELOGE(MEMALLOC_FAILED, "RunAsync failed, bad memory allocation occur !"); | ||||
CsaInteract::GetInstance().WriteErrorCode(FAILED, ERROR_MODULE_FMK, JOBSUBSTATE_GRAPH_EXEC); | CsaInteract::GetInstance().WriteErrorCode(FAILED, ERROR_MODULE_FMK, JOBSUBSTATE_GRAPH_EXEC); | ||||
return MEMALLOC_FAILED; | return MEMALLOC_FAILED; | ||||
} catch (...) { | } catch (...) { | ||||
REPORT_INNER_ERROR("E19999", "Some exceptions occur failed"); | |||||
GELOGE(FAILED, "RunAsync failed, some exceptions occur !"); | GELOGE(FAILED, "RunAsync failed, some exceptions occur !"); | ||||
CsaInteract::GetInstance().WriteErrorCode(FAILED, ERROR_MODULE_FMK, JOBSUBSTATE_GRAPH_EXEC); | CsaInteract::GetInstance().WriteErrorCode(FAILED, ERROR_MODULE_FMK, JOBSUBSTATE_GRAPH_EXEC); | ||||
return FAILED; | return FAILED; | ||||
@@ -415,10 +513,12 @@ Status GraphExecutor::DataInput(const InputData &input_data, OutputData &output_ | |||||
return ret; | return ret; | ||||
} | } | ||||
} catch (std::bad_alloc &) { | } catch (std::bad_alloc &) { | ||||
REPORT_INNER_ERROR("E19999", "Bad memory allocation exception occur failed"); | |||||
GELOGE(MEMALLOC_FAILED, "DataInput failed, bad memory allocation occur !"); | GELOGE(MEMALLOC_FAILED, "DataInput failed, bad memory allocation occur !"); | ||||
CsaInteract::GetInstance().WriteErrorCode(FAILED, ERROR_MODULE_FMK, JOBSUBSTATE_GRAPH_EXEC); | CsaInteract::GetInstance().WriteErrorCode(FAILED, ERROR_MODULE_FMK, JOBSUBSTATE_GRAPH_EXEC); | ||||
return MEMALLOC_FAILED; | return MEMALLOC_FAILED; | ||||
} catch (...) { | } catch (...) { | ||||
REPORT_INNER_ERROR("E19999", "Some exceptions occur failed"); | |||||
GELOGE(FAILED, "DataInput failed, some exceptions occur !"); | GELOGE(FAILED, "DataInput failed, some exceptions occur !"); | ||||
CsaInteract::GetInstance().WriteErrorCode(FAILED, ERROR_MODULE_FMK, JOBSUBSTATE_GRAPH_EXEC); | CsaInteract::GetInstance().WriteErrorCode(FAILED, ERROR_MODULE_FMK, JOBSUBSTATE_GRAPH_EXEC); | ||||
return FAILED; | return FAILED; | ||||
@@ -439,10 +539,12 @@ Status GraphExecutor::GetInputOutputDescInfo(const uint32_t model_id, vector<Inp | |||||
return ret; | return ret; | ||||
} | } | ||||
} catch (std::bad_alloc &) { | } catch (std::bad_alloc &) { | ||||
REPORT_INNER_ERROR("E19999", "Bad memory allocation exception occur failed"); | |||||
GELOGE(MEMALLOC_FAILED, "GetInputOutputDescInfo failed, bad memory allocation occur !"); | GELOGE(MEMALLOC_FAILED, "GetInputOutputDescInfo failed, bad memory allocation occur !"); | ||||
CsaInteract::GetInstance().WriteErrorCode(FAILED, ERROR_MODULE_FMK, JOBSUBSTATE_GRAPH_EXEC); | CsaInteract::GetInstance().WriteErrorCode(FAILED, ERROR_MODULE_FMK, JOBSUBSTATE_GRAPH_EXEC); | ||||
return MEMALLOC_FAILED; | return MEMALLOC_FAILED; | ||||
} catch (...) { | } catch (...) { | ||||
REPORT_INNER_ERROR("E19999", "Some exceptions occur failed"); | |||||
GELOGE(FAILED, "GetInputOutputDescInfo failed, some exceptions occur !"); | GELOGE(FAILED, "GetInputOutputDescInfo failed, some exceptions occur !"); | ||||
CsaInteract::GetInstance().WriteErrorCode(FAILED, ERROR_MODULE_FMK, JOBSUBSTATE_GRAPH_EXEC); | CsaInteract::GetInstance().WriteErrorCode(FAILED, ERROR_MODULE_FMK, JOBSUBSTATE_GRAPH_EXEC); | ||||
return FAILED; | return FAILED; | ||||
@@ -466,10 +568,12 @@ Status GraphExecutor::GetInputOutputDescInfo(const uint32_t model_id, vector<Inp | |||||
return ret; | return ret; | ||||
} | } | ||||
} catch (std::bad_alloc &) { | } catch (std::bad_alloc &) { | ||||
REPORT_INNER_ERROR("E19999", "Bad memory allocation exception occur failed"); | |||||
GELOGE(MEMALLOC_FAILED, "GetInputOutputDescInfo failed, bad memory allocation occur !"); | GELOGE(MEMALLOC_FAILED, "GetInputOutputDescInfo failed, bad memory allocation occur !"); | ||||
CsaInteract::GetInstance().WriteErrorCode(FAILED, ERROR_MODULE_FMK, JOBSUBSTATE_GRAPH_EXEC); | CsaInteract::GetInstance().WriteErrorCode(FAILED, ERROR_MODULE_FMK, JOBSUBSTATE_GRAPH_EXEC); | ||||
return MEMALLOC_FAILED; | return MEMALLOC_FAILED; | ||||
} catch (...) { | } catch (...) { | ||||
REPORT_INNER_ERROR("E19999", "Some exceptions occur failed"); | |||||
GELOGE(FAILED, "GetInputOutputDescInfo failed, some exceptions occur !"); | GELOGE(FAILED, "GetInputOutputDescInfo failed, some exceptions occur !"); | ||||
CsaInteract::GetInstance().WriteErrorCode(FAILED, ERROR_MODULE_FMK, JOBSUBSTATE_GRAPH_EXEC); | CsaInteract::GetInstance().WriteErrorCode(FAILED, ERROR_MODULE_FMK, JOBSUBSTATE_GRAPH_EXEC); | ||||
return FAILED; | return FAILED; | ||||
@@ -50,7 +50,7 @@ class GraphExecutor { | |||||
std::vector<GeTensor> &output_tensor); | std::vector<GeTensor> &output_tensor); | ||||
ge::Status ExecuteGraphAsync(GraphId graph_id, const GeRootModelPtr &ge_root_model, | ge::Status ExecuteGraphAsync(GraphId graph_id, const GeRootModelPtr &ge_root_model, | ||||
const std::vector<InputTensorInfo> &input_tensor); | |||||
const std::vector<InputTensorInfo> &input_tensor, const RunAsyncCallback &callback); | |||||
Status SetCondition(std::mutex *mutex, std::condition_variable *cond, std::shared_ptr<GraphModelListener> listener); | Status SetCondition(std::mutex *mutex, std::condition_variable *cond, std::shared_ptr<GraphModelListener> listener); | ||||
@@ -116,6 +116,8 @@ class GraphExecutor { | |||||
static Status GetOpDescInfo(uint32_t device_id, uint32_t stream_id, uint32_t task_id, OpDescInfo &op_desc_info); | static Status GetOpDescInfo(uint32_t device_id, uint32_t stream_id, uint32_t task_id, OpDescInfo &op_desc_info); | ||||
uint32_t GetExecuteModelId(const GeRootModelPtr &ge_root_model); | |||||
private: | private: | ||||
Status PrepareInputData(const std::vector<GeTensor> &input_tensor, InputData &graph_input_data, | Status PrepareInputData(const std::vector<GeTensor> &input_tensor, InputData &graph_input_data, | ||||
OutputData &graph_output_data, std::vector<InputOutputDescInfo> &output_desc); | OutputData &graph_output_data, std::vector<InputOutputDescInfo> &output_desc); | ||||
@@ -123,7 +125,8 @@ class GraphExecutor { | |||||
Status SyncExecuteModel(uint32_t model_id, const std::vector<GeTensor> &input_tensor, | Status SyncExecuteModel(uint32_t model_id, const std::vector<GeTensor> &input_tensor, | ||||
std::vector<GeTensor> &output_tensor); | std::vector<GeTensor> &output_tensor); | ||||
Status AsyncExecuteModel(uint32_t model_id, const std::vector<InputTensorInfo> &input_tensor); | |||||
Status AsyncExecuteModel(const GeRootModelPtr &ge_root_model, const std::vector<InputTensorInfo> &input_tensor, | |||||
const RunAsyncCallback &callback); | |||||
void InitModelIdInfo(std::vector<uint32_t> &out_model_id_info, std::vector<SubGraphInfoPtr> &sub_graph_vec, | void InitModelIdInfo(std::vector<uint32_t> &out_model_id_info, std::vector<SubGraphInfoPtr> &sub_graph_vec, | ||||
uint32_t output_size); | uint32_t output_size); | ||||
@@ -132,6 +135,9 @@ class GraphExecutor { | |||||
Status MallocInOutBuffer(const std::vector<uint64_t> &buffer_size, std::vector<void *> &data_addr); | Status MallocInOutBuffer(const std::vector<uint64_t> &buffer_size, std::vector<void *> &data_addr); | ||||
static Status SetCallback(uint32_t model_id, const GeRootModelPtr &ge_root_model, | |||||
const RunAsyncCallback &callback); | |||||
bool init_flag_; | bool init_flag_; | ||||
bool train_graph_flag_; | bool train_graph_flag_; | ||||
@@ -42,6 +42,8 @@ Status CaseOpLabelMaker::Run(uint32_t &label_index) { | |||||
const auto graph_names = case_desc->GetSubgraphInstanceNames(); | const auto graph_names = case_desc->GetSubgraphInstanceNames(); | ||||
if (graph_names.empty() || graph_names.size() > kMaxCaseBranch) { | if (graph_names.empty() || graph_names.size() > kMaxCaseBranch) { | ||||
REPORT_INNER_ERROR("E19999", "Node:%s(%s) subgraph size: %zu, check invalid", case_desc->GetName().c_str(), | |||||
case_desc->GetType().c_str(), graph_names.size()); | |||||
GELOGE(INTERNAL_ERROR, "Node: %s has invalid subgraph, graph size: %zu.", case_desc->GetName().c_str(), | GELOGE(INTERNAL_ERROR, "Node: %s has invalid subgraph, graph size: %zu.", case_desc->GetName().c_str(), | ||||
graph_names.size()); | graph_names.size()); | ||||
return FAILED; | return FAILED; | ||||
@@ -67,6 +69,8 @@ Status CaseOpLabelMaker::Run(uint32_t &label_index) { | |||||
parent_node_->GetName() + "/StreamActive_" + std::to_string(index); // rtStreamActive | parent_node_->GetName() + "/StreamActive_" + std::to_string(index); // rtStreamActive | ||||
NodePtr stream_active = AddStreamActive(graph, stream_active_name); | NodePtr stream_active = AddStreamActive(graph, stream_active_name); | ||||
if (stream_active == nullptr) { | if (stream_active == nullptr) { | ||||
REPORT_CALL_ERROR("E19999", "Add StreamActive node in graph:%s fail", | |||||
graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Subgraph: %s add stream active failed.", graph->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "Subgraph: %s add stream active failed.", graph->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -75,6 +79,8 @@ Status CaseOpLabelMaker::Run(uint32_t &label_index) { | |||||
std::string label_set_name = parent_node_->GetName() + "/LabelSet_" + std::to_string(index); // rtLabelSet | std::string label_set_name = parent_node_->GetName() + "/LabelSet_" + std::to_string(index); // rtLabelSet | ||||
NodePtr label = AddLabelSetEnter(graph, label_set_name, curr_label_index, stream_active); | NodePtr label = AddLabelSetEnter(graph, label_set_name, curr_label_index, stream_active); | ||||
if (label == nullptr) { | if (label == nullptr) { | ||||
REPORT_CALL_ERROR("E19999", "Add LabelSetEnter node in graph:%s fail", | |||||
graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Subgraph: %s add label set failed.", graph->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "Subgraph: %s add label set failed.", graph->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -88,6 +94,8 @@ Status CaseOpLabelMaker::Run(uint32_t &label_index) { | |||||
// middle node, add goto node to tail. | // middle node, add goto node to tail. | ||||
std::string label_goto_name = parent_node_->GetName() + "/LabelGoto_" + std::to_string(index); // rtLabelGoto | std::string label_goto_name = parent_node_->GetName() + "/LabelGoto_" + std::to_string(index); // rtLabelGoto | ||||
if (AddLabelGotoLeave(graph, label_goto_name, last_label_index) == nullptr) { | if (AddLabelGotoLeave(graph, label_goto_name, last_label_index) == nullptr) { | ||||
REPORT_CALL_ERROR("E19999", "Add LabelGotoLeave node in graph:%s fail", | |||||
graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Subgraph: %s add label goto failed.", graph->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "Subgraph: %s add label goto failed.", graph->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -95,6 +103,8 @@ Status CaseOpLabelMaker::Run(uint32_t &label_index) { | |||||
// last node, add label node to tail. | // last node, add label node to tail. | ||||
std::string last_label_name = parent_node_->GetName() + "/LabelSet_Last"; // rtLabelSet | std::string last_label_name = parent_node_->GetName() + "/LabelSet_Last"; // rtLabelSet | ||||
if (AddLabelSetLeave(graph, last_label_name, last_label_index) == nullptr) { | if (AddLabelSetLeave(graph, last_label_name, last_label_index) == nullptr) { | ||||
REPORT_CALL_ERROR("E19999", "Add LabelSetLeave node in graph:%s fail", | |||||
graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Subgraph: %s add label set failed.", graph->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "Subgraph: %s add label set failed.", graph->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -110,12 +120,16 @@ Status CaseOpLabelMaker::Run(uint32_t &label_index) { | |||||
const GeTensorDesc &pred_desc = case_desc->GetInputDesc(kCasePredIndex); | const GeTensorDesc &pred_desc = case_desc->GetInputDesc(kCasePredIndex); | ||||
NodePtr switch_node = AddLabelSwitchEnter(first_graph, label_switch_name, pred_desc, switch_labels); | NodePtr switch_node = AddLabelSwitchEnter(first_graph, label_switch_name, pred_desc, switch_labels); | ||||
if (switch_node == nullptr) { | if (switch_node == nullptr) { | ||||
REPORT_CALL_ERROR("E19999", "Add LabelSwitchEnter node in graph:%s fail", | |||||
first_graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Subgraph: %s add label switch failed.", first_graph->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "Subgraph: %s add label switch failed.", first_graph->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
// Link control edge to then branch head. | // Link control edge to then branch head. | ||||
if (GraphUtils::AddEdge(switch_node->GetOutControlAnchor(), first_label->GetInControlAnchor()) != SUCCESS) { | if (GraphUtils::AddEdge(switch_node->GetOutControlAnchor(), first_label->GetInControlAnchor()) != SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Add ctrl edge from %s to %s in graph:%s fail", switch_node->GetName().c_str(), | |||||
first_label->GetName().c_str(), first_graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add ctrl edge to %s failed.", first_label->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add ctrl edge to %s failed.", first_label->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -123,6 +137,8 @@ Status CaseOpLabelMaker::Run(uint32_t &label_index) { | |||||
uint32_t parent_index = 0; // Case cond input is first. | uint32_t parent_index = 0; // Case cond input is first. | ||||
const std::string data_name = parent_node_->GetName() + "/SwitchIndexData"; | const std::string data_name = parent_node_->GetName() + "/SwitchIndexData"; | ||||
if (AddLabelSwitchIndex(first_graph, data_name, pred_desc, switch_node, parent_index) == nullptr) { | if (AddLabelSwitchIndex(first_graph, data_name, pred_desc, switch_node, parent_index) == nullptr) { | ||||
REPORT_CALL_ERROR("E19999", "Add LabelSwitchIndex node in graph:%s fail", | |||||
first_graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Subgraph: %s add switch input failed.", first_graph->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "Subgraph: %s add switch input failed.", first_graph->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -43,6 +43,10 @@ Status IfOpLabelMaker::Run(uint32_t &label_index) { | |||||
const std::string then_branch_name = if_desc->GetSubgraphInstanceName(kThenBranchIndex); | const std::string then_branch_name = if_desc->GetSubgraphInstanceName(kThenBranchIndex); | ||||
const std::string else_branch_name = if_desc->GetSubgraphInstanceName(kElseBranchIndex); | const std::string else_branch_name = if_desc->GetSubgraphInstanceName(kElseBranchIndex); | ||||
if (then_branch_name.empty() || else_branch_name.empty()) { | if (then_branch_name.empty() || else_branch_name.empty()) { | ||||
REPORT_INNER_ERROR("E19999", "Node:%s(%s), check subgraph invalid, " | |||||
"then branch graph: %s, else branch graph: %s", | |||||
if_desc->GetName().c_str(), if_desc->GetType().c_str(), | |||||
then_branch_name.c_str(), else_branch_name.c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Node: %s has invalid subgraph, then branch: %s, else branch: %s.", | GELOGE(INTERNAL_ERROR, "Node: %s has invalid subgraph, then branch: %s, else branch: %s.", | ||||
if_desc->GetName().c_str(), then_branch_name.c_str(), else_branch_name.c_str()); | if_desc->GetName().c_str(), then_branch_name.c_str(), else_branch_name.c_str()); | ||||
return FAILED; | return FAILED; | ||||
@@ -66,32 +70,44 @@ Status IfOpLabelMaker::Run(uint32_t &label_index) { | |||||
NodePtr then_stream_active = AddStreamActive(then_sub_graph, then_active_name); | NodePtr then_stream_active = AddStreamActive(then_sub_graph, then_active_name); | ||||
if (then_stream_active == nullptr) { | if (then_stream_active == nullptr) { | ||||
REPORT_CALL_ERROR("E19999", "Add StreamActive node in graph:%s fail", | |||||
then_sub_graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Subgraph: %s add stream active failed.", then_sub_graph->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "Subgraph: %s add stream active failed.", then_sub_graph->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
NodePtr then_enter_label = AddLabelSetEnter(then_sub_graph, then_label_name, then_enter_index, then_stream_active); | NodePtr then_enter_label = AddLabelSetEnter(then_sub_graph, then_label_name, then_enter_index, then_stream_active); | ||||
if (then_enter_label == nullptr) { | if (then_enter_label == nullptr) { | ||||
REPORT_CALL_ERROR("E19999", "Add LabelSetEnter node in graph:%s fail", | |||||
then_sub_graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Subgraph: %s add label set failed.", then_sub_graph->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "Subgraph: %s add label set failed.", then_sub_graph->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
if (AddLabelGotoLeave(then_sub_graph, then_leave_name, else_leave_index) == nullptr) { | if (AddLabelGotoLeave(then_sub_graph, then_leave_name, else_leave_index) == nullptr) { | ||||
REPORT_CALL_ERROR("E19999", "Add LabelGotoLeave node in graph:%s fail", | |||||
then_sub_graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Subgraph: %s add label goto failed.", then_sub_graph->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "Subgraph: %s add label goto failed.", then_sub_graph->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
NodePtr else_stream_active = AddStreamActive(else_sub_graph, else_active_name); | NodePtr else_stream_active = AddStreamActive(else_sub_graph, else_active_name); | ||||
if (else_stream_active == nullptr) { | if (else_stream_active == nullptr) { | ||||
REPORT_CALL_ERROR("E19999", "Add StreamActive node in graph:%s fail", | |||||
else_stream_active->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Subgraph: %s add stream active failed.", else_sub_graph->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "Subgraph: %s add stream active failed.", else_sub_graph->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
if (AddLabelSetEnter(else_sub_graph, else_enter_name, else_enter_index, else_stream_active) == nullptr) { | if (AddLabelSetEnter(else_sub_graph, else_enter_name, else_enter_index, else_stream_active) == nullptr) { | ||||
REPORT_CALL_ERROR("E19999", "Add LabelSetEnter node in graph:%s fail", | |||||
else_sub_graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Subgraph: %s add label set failed.", else_sub_graph->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "Subgraph: %s add label set failed.", else_sub_graph->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
if (AddLabelSetLeave(else_sub_graph, else_leave_name, else_leave_index) == nullptr) { | if (AddLabelSetLeave(else_sub_graph, else_leave_name, else_leave_index) == nullptr) { | ||||
REPORT_CALL_ERROR("E19999", "Add LabelSetLeave node in graph:%s fail", | |||||
else_sub_graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Subgraph: %s add label set failed.", else_sub_graph->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "Subgraph: %s add label set failed.", else_sub_graph->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -103,12 +119,16 @@ Status IfOpLabelMaker::Run(uint32_t &label_index) { | |||||
const GeTensorDesc &pred_desc = if_desc->GetInputDesc(kIfPredIndex); | const GeTensorDesc &pred_desc = if_desc->GetInputDesc(kIfPredIndex); | ||||
NodePtr switch_node = AddLabelSwitchEnter(then_sub_graph, then_enter_name, pred_desc, switch_labels); | NodePtr switch_node = AddLabelSwitchEnter(then_sub_graph, then_enter_name, pred_desc, switch_labels); | ||||
if (switch_node == nullptr) { | if (switch_node == nullptr) { | ||||
REPORT_CALL_ERROR("E19999", "Add LabelSwitchEnter node in graph:%s fail", | |||||
then_sub_graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Subgraph: %s add label switch failed.", then_sub_graph->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "Subgraph: %s add label switch failed.", then_sub_graph->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
// Link control edge to then branch head. | // Link control edge to then branch head. | ||||
if (GraphUtils::AddEdge(switch_node->GetOutControlAnchor(), then_enter_label->GetInControlAnchor()) != SUCCESS) { | if (GraphUtils::AddEdge(switch_node->GetOutControlAnchor(), then_enter_label->GetInControlAnchor()) != SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Add ctrl edge from %s to %s in graph:%s fail", switch_node->GetName().c_str(), | |||||
then_enter_label->GetName().c_str(), then_sub_graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add ctrl edge to %s failed.", then_enter_label->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add ctrl edge to %s failed.", then_enter_label->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -116,6 +136,8 @@ Status IfOpLabelMaker::Run(uint32_t &label_index) { | |||||
uint32_t parent_index = 0; // If cond input is first. | uint32_t parent_index = 0; // If cond input is first. | ||||
const std::string data_name = parent_node_->GetName() + "/SwitchIndexData"; | const std::string data_name = parent_node_->GetName() + "/SwitchIndexData"; | ||||
if (AddLabelSwitchIndex(then_sub_graph, data_name, pred_desc, switch_node, parent_index) == nullptr) { | if (AddLabelSwitchIndex(then_sub_graph, data_name, pred_desc, switch_node, parent_index) == nullptr) { | ||||
REPORT_CALL_ERROR("E19999", "Add LabelSwitchIndex node in graph:%s fail", | |||||
then_sub_graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Subgraph: %s add switch input failed.", then_sub_graph->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "Subgraph: %s add switch input failed.", then_sub_graph->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -56,6 +56,8 @@ void LabelMaker::LinkToGraphHead(const ComputeGraphPtr &graph, const NodePtr &no | |||||
} | } | ||||
if (GraphUtils::AddEdge(node->GetOutControlAnchor(), n->GetInControlAnchor()) != SUCCESS) { | if (GraphUtils::AddEdge(node->GetOutControlAnchor(), n->GetInControlAnchor()) != SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Add ctrl edge from %s to %s in graph:%s fail", node->GetName().c_str(), | |||||
n->GetName().c_str(), graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Add ctrl edge from %s to %s failed.", node->GetName().c_str(), n->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "Add ctrl edge from %s to %s failed.", node->GetName().c_str(), n->GetName().c_str()); | ||||
} | } | ||||
} | } | ||||
@@ -78,6 +80,8 @@ void LabelMaker::LinkToGraphTail(const ComputeGraphPtr &graph, const NodePtr &no | |||||
} | } | ||||
if (GraphUtils::AddEdge(tail->GetOutControlAnchor(), node->GetInControlAnchor()) != SUCCESS) { | if (GraphUtils::AddEdge(tail->GetOutControlAnchor(), node->GetInControlAnchor()) != SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Add ctrl edge from %s to %s in graph:%s fail", tail->GetName().c_str(), | |||||
node->GetName().c_str(), graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Add ctrl edge from %s to %s failed.", tail->GetName().c_str(), node->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "Add ctrl edge from %s to %s failed.", tail->GetName().c_str(), node->GetName().c_str()); | ||||
} | } | ||||
return; | return; | ||||
@@ -96,6 +100,7 @@ NodePtr LabelMaker::AddStreamActive(const ComputeGraphPtr &graph, const std::str | |||||
const auto &node_list = graph->GetDirectNode(); | const auto &node_list = graph->GetDirectNode(); | ||||
if (node_list.empty()) { | if (node_list.empty()) { | ||||
REPORT_INNER_ERROR("E19999", "Check param graph:%s has no node", graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "LabelSet: Graph %s node is empty.", graph->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "LabelSet: Graph %s node is empty.", graph->GetName().c_str()); | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||
@@ -131,6 +136,7 @@ NodePtr LabelMaker::AddLabelSetEnter(const ComputeGraphPtr &graph, const std::st | |||||
const auto &node_list = graph->GetDirectNode(); | const auto &node_list = graph->GetDirectNode(); | ||||
if (node_list.empty()) { | if (node_list.empty()) { | ||||
REPORT_INNER_ERROR("E19999", "Check param graph:%s has no node", graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "LabelSet: Graph %s node is empty.", graph->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "LabelSet: Graph %s node is empty.", graph->GetName().c_str()); | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||
@@ -145,6 +151,8 @@ NodePtr LabelMaker::AddLabelSetEnter(const ComputeGraphPtr &graph, const std::st | |||||
GE_CHECK_NOTNULL_EXEC(label_set, return nullptr); | GE_CHECK_NOTNULL_EXEC(label_set, return nullptr); | ||||
if (GraphUtils::AddEdge(label_set->GetOutControlAnchor(), stream_active->GetInControlAnchor()) != SUCCESS) { | if (GraphUtils::AddEdge(label_set->GetOutControlAnchor(), stream_active->GetInControlAnchor()) != SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Add ctrl edge from %s to %s in graph:%s fail", label_set->GetName().c_str(), | |||||
stream_active->GetName().c_str(), graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Add ctrl edge from %s to %s failed.", label_set->GetName().c_str(), | GELOGE(INTERNAL_ERROR, "Add ctrl edge from %s to %s failed.", label_set->GetName().c_str(), | ||||
stream_active->GetName().c_str()); | stream_active->GetName().c_str()); | ||||
return nullptr; | return nullptr; | ||||
@@ -193,6 +201,7 @@ NodePtr LabelMaker::AddLabelGotoEnter(const ComputeGraphPtr &graph, const std::s | |||||
const auto &node_list = graph->GetDirectNode(); | const auto &node_list = graph->GetDirectNode(); | ||||
auto it = node_list.begin(); | auto it = node_list.begin(); | ||||
if (it == node_list.end()) { | if (it == node_list.end()) { | ||||
REPORT_INNER_ERROR("E19999", "Check param graph:%s has no node", graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "LabelGoto: Graph %s node is empty.", graph->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "LabelGoto: Graph %s node is empty.", graph->GetName().c_str()); | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||
@@ -205,6 +214,8 @@ NodePtr LabelMaker::AddLabelGotoEnter(const ComputeGraphPtr &graph, const std::s | |||||
(void)AttrUtils::SetInt(op_desc, ATTR_NAME_LABEL_SWITCH_INDEX, index); | (void)AttrUtils::SetInt(op_desc, ATTR_NAME_LABEL_SWITCH_INDEX, index); | ||||
NodePtr label_goto = graph->AddNodeFront(op_desc); | NodePtr label_goto = graph->AddNodeFront(op_desc); | ||||
if (label_goto == nullptr) { | if (label_goto == nullptr) { | ||||
REPORT_CALL_ERROR("E19999", "Add node:%s(%s) to graph:%s fail", | |||||
op_desc->GetName().c_str(), op_desc->GetType().c_str(), graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "LabelGoto: Add to graph %s failed.", graph->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "LabelGoto: Add to graph %s failed.", graph->GetName().c_str()); | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||
@@ -253,6 +264,7 @@ NodePtr LabelMaker::AddLabelSwitchEnter(const ComputeGraphPtr &graph, const std: | |||||
const auto &node_list = graph->GetDirectNode(); | const auto &node_list = graph->GetDirectNode(); | ||||
auto it = node_list.begin(); | auto it = node_list.begin(); | ||||
if (it == node_list.end()) { | if (it == node_list.end()) { | ||||
REPORT_INNER_ERROR("E19999", "Check param graph:%s has no node", graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Graph %s node is empty.", graph->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Graph %s node is empty.", graph->GetName().c_str()); | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||
@@ -263,17 +275,23 @@ NodePtr LabelMaker::AddLabelSwitchEnter(const ComputeGraphPtr &graph, const std: | |||||
GELOGI("LabelSwitchByIndex: Create node %s.", op_desc->GetName().c_str()); | GELOGI("LabelSwitchByIndex: Create node %s.", op_desc->GetName().c_str()); | ||||
if (op_desc->AddInputDesc(desc) != GRAPH_SUCCESS) { | if (op_desc->AddInputDesc(desc) != GRAPH_SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Add input desc into node:%s(%s) in graph:%s fail", | |||||
op_desc->GetName().c_str(), op_desc->GetType().c_str(), graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add input desc failed."); | GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add input desc failed."); | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||
if (!AttrUtils::SetListInt(op_desc, ATTR_NAME_LABEL_SWITCH_LIST, labels)) { | if (!AttrUtils::SetListInt(op_desc, ATTR_NAME_LABEL_SWITCH_LIST, labels)) { | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", ATTR_NAME_LABEL_SWITCH_LIST.c_str(), | |||||
op_desc->GetName().c_str(), op_desc->GetType().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add %s failed.", ATTR_NAME_LABEL_SWITCH_INDEX.c_str()); | GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add %s failed.", ATTR_NAME_LABEL_SWITCH_INDEX.c_str()); | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||
NodePtr label_switch = graph->AddNodeFront(op_desc); | NodePtr label_switch = graph->AddNodeFront(op_desc); | ||||
if (label_switch == nullptr) { | if (label_switch == nullptr) { | ||||
REPORT_CALL_ERROR("E19999", "Add node:%s(%s) to graph:%s ahead fail", | |||||
op_desc->GetName().c_str(), op_desc->GetType().c_str(), graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add to graph %s failed.", graph->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add to graph %s failed.", graph->GetName().c_str()); | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||
@@ -300,11 +318,15 @@ NodePtr LabelMaker::AddLabelSwitchLeave(const ComputeGraphPtr &graph, const std: | |||||
GELOGI("LabelSwitchByIndex: Create node %s.", op_desc->GetName().c_str()); | GELOGI("LabelSwitchByIndex: Create node %s.", op_desc->GetName().c_str()); | ||||
if (op_desc->AddInputDesc(desc) != GRAPH_SUCCESS) { | if (op_desc->AddInputDesc(desc) != GRAPH_SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Add input desc into node:%s(%s) in graph:%s fail", | |||||
op_desc->GetName().c_str(), op_desc->GetType().c_str(), graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add input desc failed."); | GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add input desc failed."); | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||
if (!AttrUtils::SetListInt(op_desc, ATTR_NAME_LABEL_SWITCH_LIST, labels)) { | if (!AttrUtils::SetListInt(op_desc, ATTR_NAME_LABEL_SWITCH_LIST, labels)) { | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", ATTR_NAME_LABEL_SWITCH_LIST.c_str(), | |||||
op_desc->GetName().c_str(), op_desc->GetType().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add %s failed.", ATTR_NAME_LABEL_SWITCH_INDEX.c_str()); | GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add %s failed.", ATTR_NAME_LABEL_SWITCH_INDEX.c_str()); | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||
@@ -336,15 +358,21 @@ NodePtr LabelMaker::AddLabelSwitchIndex(const ComputeGraphPtr &graph, const std: | |||||
GELOGI("Data: Create node %s.", op_desc->GetName().c_str()); | GELOGI("Data: Create node %s.", op_desc->GetName().c_str()); | ||||
if (op_desc->AddInputDesc(desc) != GRAPH_SUCCESS) { | if (op_desc->AddInputDesc(desc) != GRAPH_SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Add input desc into node:%s(%s) in graph:%s fail", | |||||
op_desc->GetName().c_str(), op_desc->GetType().c_str(), graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add data input desc failed."); | GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add data input desc failed."); | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||
if (op_desc->AddOutputDesc(desc) != GRAPH_SUCCESS) { | if (op_desc->AddOutputDesc(desc) != GRAPH_SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Add output desc into node:%s(%s) in graph:%s fail", | |||||
op_desc->GetName().c_str(), op_desc->GetType().c_str(), graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add data output desc failed."); | GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add data output desc failed."); | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||
if (!AttrUtils::SetInt(op_desc, ATTR_NAME_PARENT_NODE_INDEX, parent_index)) { | if (!AttrUtils::SetInt(op_desc, ATTR_NAME_PARENT_NODE_INDEX, parent_index)) { | ||||
REPORT_INNER_ERROR("E19999", "Set Attr:%s fail for op:%s(%s)", ATTR_NAME_PARENT_NODE_INDEX.c_str(), | |||||
op_desc->GetName().c_str(), op_desc->GetType().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add %s failed.", ATTR_NAME_PARENT_NODE_INDEX.c_str()); | GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add %s failed.", ATTR_NAME_PARENT_NODE_INDEX.c_str()); | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||
@@ -354,6 +382,8 @@ NodePtr LabelMaker::AddLabelSwitchIndex(const ComputeGraphPtr &graph, const std: | |||||
// Link control edge to graph head. | // Link control edge to graph head. | ||||
if (GraphUtils::AddEdge(op_data->GetOutDataAnchor(0), sw_node->GetInDataAnchor(0)) != SUCCESS) { | if (GraphUtils::AddEdge(op_data->GetOutDataAnchor(0), sw_node->GetInDataAnchor(0)) != SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Add ctrl edge from %s to %s in graph:%s fail", op_data->GetName().c_str(), | |||||
sw_node->GetName().c_str(), graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add input edge to %s failed.", op_data->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "LabelSwitchByIndex: Add input edge to %s failed.", op_data->GetName().c_str()); | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||
@@ -39,12 +39,17 @@ Status PartitionedCallLabelMaker::Run(uint32_t &label_index) { | |||||
std::string sub_graph_name = call_desc->GetSubgraphInstanceName(kSubGraphIndex); | std::string sub_graph_name = call_desc->GetSubgraphInstanceName(kSubGraphIndex); | ||||
if (sub_graph_name.empty()) { | if (sub_graph_name.empty()) { | ||||
REPORT_INNER_ERROR("E19999", "Node:%s(%s) subgraph_index:%d name is empty, check invalid", | |||||
call_desc->GetName().c_str(), call_desc->GetType().c_str(), kSubGraphIndex); | |||||
GELOGE(INTERNAL_ERROR, "Node: %s has no subgraph name.", sub_graph_name.c_str()); | GELOGE(INTERNAL_ERROR, "Node: %s has no subgraph name.", sub_graph_name.c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
ComputeGraphPtr sub_graph = parent_graph_->GetSubgraph(sub_graph_name); | ComputeGraphPtr sub_graph = parent_graph_->GetSubgraph(sub_graph_name); | ||||
if (sub_graph == nullptr) { | if (sub_graph == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "Node:%s(%s) subgraph_name:%s is not exist in parent_graph, check invalid", | |||||
call_desc->GetName().c_str(), call_desc->GetType().c_str(), | |||||
sub_graph_name.c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Node: %s has no subgraph.", sub_graph_name.c_str()); | GELOGE(INTERNAL_ERROR, "Node: %s has no subgraph.", sub_graph_name.c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -52,6 +57,8 @@ Status PartitionedCallLabelMaker::Run(uint32_t &label_index) { | |||||
const std::string stream_active_name = parent_node_->GetName() + "/StreamActive"; // rtStreamActive | const std::string stream_active_name = parent_node_->GetName() + "/StreamActive"; // rtStreamActive | ||||
NodePtr stream_active = AddStreamActive(sub_graph, stream_active_name); | NodePtr stream_active = AddStreamActive(sub_graph, stream_active_name); | ||||
if (stream_active == nullptr) { | if (stream_active == nullptr) { | ||||
REPORT_CALL_ERROR("E19999", "Add StreamActive node in graph:%s fail", | |||||
sub_graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Subgraph: %s add stream active node failed.", sub_graph->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "Subgraph: %s add stream active node failed.", sub_graph->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -44,6 +44,9 @@ Status WhileOpLabelMaker::Run(uint32_t &label_index) { | |||||
std::string cond_name = while_desc->GetSubgraphInstanceName(kCondBranchIndex); | std::string cond_name = while_desc->GetSubgraphInstanceName(kCondBranchIndex); | ||||
std::string body_name = while_desc->GetSubgraphInstanceName(kBodyBranchIndex); | std::string body_name = while_desc->GetSubgraphInstanceName(kBodyBranchIndex); | ||||
if (cond_name.empty() || body_name.empty()) { | if (cond_name.empty() || body_name.empty()) { | ||||
REPORT_INNER_ERROR("E19999", "Node:%s(%s) cond subgraph index:%d or body subgraph index:%d name is empty, " | |||||
"check invalid", while_desc->GetName().c_str(), while_desc->GetType().c_str(), | |||||
kCondBranchIndex, kBodyBranchIndex); | |||||
GELOGE(INTERNAL_ERROR, "Node: %s has invalid subgraph, cond branch: %s, body branch: %s.", | GELOGE(INTERNAL_ERROR, "Node: %s has invalid subgraph, cond branch: %s, body branch: %s.", | ||||
while_desc->GetName().c_str(), cond_name.c_str(), body_name.c_str()); | while_desc->GetName().c_str(), cond_name.c_str(), body_name.c_str()); | ||||
return FAILED; | return FAILED; | ||||
@@ -67,32 +70,44 @@ Status WhileOpLabelMaker::Run(uint32_t &label_index) { | |||||
NodePtr cond_stream_active = AddStreamActive(cond_graph, cond_active_name); | NodePtr cond_stream_active = AddStreamActive(cond_graph, cond_active_name); | ||||
if (cond_stream_active == nullptr) { | if (cond_stream_active == nullptr) { | ||||
REPORT_CALL_ERROR("E19999", "Add StreamActive node in graph:%s fail", | |||||
cond_graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Subgraph: %s add stream active failed.", cond_graph->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "Subgraph: %s add stream active failed.", cond_graph->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
if (AddLabelSetEnter(cond_graph, cond_enter_name, cond_enter_index, cond_stream_active) == nullptr) { | if (AddLabelSetEnter(cond_graph, cond_enter_name, cond_enter_index, cond_stream_active) == nullptr) { | ||||
REPORT_CALL_ERROR("E19999", "Add LabelSetEnter node in graph:%s fail", | |||||
cond_graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Subgraph: %s add label set failed.", cond_graph->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "Subgraph: %s add label set failed.", cond_graph->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
NodePtr body_stream_active = AddStreamActive(body_graph, body_active_name); | NodePtr body_stream_active = AddStreamActive(body_graph, body_active_name); | ||||
if (body_stream_active == nullptr) { | if (body_stream_active == nullptr) { | ||||
REPORT_CALL_ERROR("E19999", "Add StreamActive node in graph:%s fail", | |||||
body_graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Subgraph: %s add stream active failed.", body_graph->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "Subgraph: %s add stream active failed.", body_graph->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
if (AddLabelSetEnter(body_graph, body_enter_name, body_enter_index, body_stream_active) == nullptr) { | if (AddLabelSetEnter(body_graph, body_enter_name, body_enter_index, body_stream_active) == nullptr) { | ||||
REPORT_CALL_ERROR("E19999", "Add LabelSetEnter node in graph:%s fail", | |||||
body_graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Subgraph: %s add label set failed.", body_graph->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "Subgraph: %s add label set failed.", body_graph->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
if (AddLabelGotoLeave(body_graph, goto_leave_name, cond_enter_index) == nullptr) { | if (AddLabelGotoLeave(body_graph, goto_leave_name, cond_enter_index) == nullptr) { | ||||
REPORT_CALL_ERROR("E19999", "Add LabelGotoLeave node in graph:%s fail", | |||||
body_graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Subgraph: %s add label goto failed.", body_graph->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "Subgraph: %s add label goto failed.", body_graph->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
if (AddLabelSetLeave(body_graph, body_leave_name, body_leave_index) == nullptr) { | if (AddLabelSetLeave(body_graph, body_leave_name, body_leave_index) == nullptr) { | ||||
REPORT_CALL_ERROR("E19999", "Add LabelSetLeave node in graph:%s fail", | |||||
body_graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Subgraph: %s add label set failed.", body_graph->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "Subgraph: %s add label set failed.", body_graph->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -109,6 +124,8 @@ Status WhileOpLabelMaker::Run(uint32_t &label_index) { | |||||
const std::vector<uint32_t> switch_labels = {body_leave_index, body_enter_index}; | const std::vector<uint32_t> switch_labels = {body_leave_index, body_enter_index}; | ||||
NodePtr switch_node = AddLabelSwitchLeave(cond_graph, cond_leave_name, pred_desc, switch_labels); | NodePtr switch_node = AddLabelSwitchLeave(cond_graph, cond_leave_name, pred_desc, switch_labels); | ||||
if (switch_node == nullptr) { | if (switch_node == nullptr) { | ||||
REPORT_CALL_ERROR("E19999", "Add LabelSwitchLeave node in graph:%s fail", | |||||
cond_graph->GetName().c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Subgraph: %s add label switch failed.", cond_graph->GetName().c_str()); | GELOGE(INTERNAL_ERROR, "Subgraph: %s add label switch failed.", cond_graph->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -124,6 +141,9 @@ Status WhileOpLabelMaker::Run(uint32_t &label_index) { | |||||
InDataAnchorPtr in_anchor = all_in_data.at(kCondOutputIndex); | InDataAnchorPtr in_anchor = all_in_data.at(kCondOutputIndex); | ||||
GE_CHECK_NOTNULL(in_anchor); | GE_CHECK_NOTNULL(in_anchor); | ||||
if (GraphUtils::AddEdge(in_anchor->GetPeerOutAnchor(), switch_node->GetInDataAnchor(kCondOutputIndex)) != SUCCESS) { | if (GraphUtils::AddEdge(in_anchor->GetPeerOutAnchor(), switch_node->GetInDataAnchor(kCondOutputIndex)) != SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Add ctrl edge from %s to %s in graph:%s fail", | |||||
in_anchor->GetPeerOutAnchor()->GetOwnerNode()->GetName().c_str(), | |||||
switch_node->GetName().c_str(), cond_graph->GetName().c_str()); | |||||
GELOGE(FAILED, "Node: %s Add pred data input failed.", switch_node->GetName().c_str()); | GELOGE(FAILED, "Node: %s Add pred data input failed.", switch_node->GetName().c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -52,15 +52,17 @@ Status GraphLoader::LoadModelOnline(uint32_t &model_id, const std::shared_ptr<ge | |||||
GELOGI("Load model online begin."); | GELOGI("Load model online begin."); | ||||
rtError_t rt_ret = rtSetDevice(GetContext().DeviceId()); | rtError_t rt_ret = rtSetDevice(GetContext().DeviceId()); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtSetDevice failed, device_id:%u, ret:0x%X", | |||||
GetContext().DeviceId(), rt_ret); | |||||
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | ||||
CsaInteract::GetInstance().WriteErrorCode(rt_ret, ERROR_MODULE_RUNTIME, JOBSUBSTATE_GRAPH_LOAD); | CsaInteract::GetInstance().WriteErrorCode(rt_ret, ERROR_MODULE_RUNTIME, JOBSUBSTATE_GRAPH_LOAD); | ||||
return RT_FAILED; | return RT_FAILED; | ||||
} | } | ||||
if (ge_root_model_ptr == nullptr) { | if (ge_root_model_ptr == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "Check param ge_root_model_ptr nullptr, check invalid"); | |||||
GELOGE(GE_GRAPH_PARAM_NULLPTR, "[LoadGraph] GE load graph model_ptr is nullptr."); | GELOGE(GE_GRAPH_PARAM_NULLPTR, "[LoadGraph] GE load graph model_ptr is nullptr."); | ||||
return GE_GRAPH_PARAM_NULLPTR; | return GE_GRAPH_PARAM_NULLPTR; | ||||
} | } | ||||
model_id = ge_root_model_ptr->GetModelId(); | |||||
auto model_manager = ModelManager::GetInstance(); | auto model_manager = ModelManager::GetInstance(); | ||||
GE_CHECK_NOTNULL(model_manager); | GE_CHECK_NOTNULL(model_manager); | ||||
@@ -71,6 +73,8 @@ Status GraphLoader::LoadModelOnline(uint32_t &model_id, const std::shared_ptr<ge | |||||
rt_ret = rtDeviceReset(GetContext().DeviceId()); | rt_ret = rtDeviceReset(GetContext().DeviceId()); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtDeviceReset failed, device_id:%u, ret:0x%X", | |||||
GetContext().DeviceId(), rt_ret); | |||||
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | ||||
} | } | ||||
return ret; | return ret; | ||||
@@ -84,6 +88,8 @@ Status GraphLoader::LoadModelOnline(uint32_t &model_id, const std::shared_ptr<ge | |||||
rt_ret = rtDeviceReset(GetContext().DeviceId()); | rt_ret = rtDeviceReset(GetContext().DeviceId()); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtDeviceReset failed, device_id:%u, ret:0x%X", | |||||
GetContext().DeviceId(), rt_ret); | |||||
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | ||||
} | } | ||||
@@ -93,6 +99,8 @@ Status GraphLoader::LoadModelOnline(uint32_t &model_id, const std::shared_ptr<ge | |||||
} | } | ||||
rt_ret = rtDeviceReset(GetContext().DeviceId()); | rt_ret = rtDeviceReset(GetContext().DeviceId()); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtDeviceReset failed, device_id:%u, ret:0x%X", | |||||
GetContext().DeviceId(), rt_ret); | |||||
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | ||||
return RT_FAILED; | return RT_FAILED; | ||||
} | } | ||||
@@ -121,6 +129,8 @@ Status GraphLoader::LoadDataFromFile(const std::string &path, const std::string | |||||
GELOGI("Load model begin, model path is: %s", path.c_str()); | GELOGI("Load model begin, model path is: %s", path.c_str()); | ||||
if (!key_path.empty() && !CheckInputPathValid(key_path)) { | if (!key_path.empty() && !CheckInputPathValid(key_path)) { | ||||
REPORT_INNER_ERROR("E19999", "Param key_path:%s empty or invalid", | |||||
key_path.c_str()); | |||||
GELOGE(ACL_ERROR_GE_PARAM_INVALID, "decrypt_key path is invalid: %s", key_path.c_str()); | GELOGE(ACL_ERROR_GE_PARAM_INVALID, "decrypt_key path is invalid: %s", key_path.c_str()); | ||||
return ACL_ERROR_GE_PARAM_INVALID; | return ACL_ERROR_GE_PARAM_INVALID; | ||||
} | } | ||||
@@ -147,10 +157,12 @@ Status GraphLoader::CommandHandle(const Command &command) { | |||||
return ret; | return ret; | ||||
} | } | ||||
} catch (std::bad_alloc &) { | } catch (std::bad_alloc &) { | ||||
REPORT_INNER_ERROR("E19999", "Bad memory allocation occur"); | |||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Command handle failed, bad memory allocation occur !"); | GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Command handle failed, bad memory allocation occur !"); | ||||
return ACL_ERROR_GE_MEMORY_ALLOCATION; | return ACL_ERROR_GE_MEMORY_ALLOCATION; | ||||
} catch (...) { | } catch (...) { | ||||
REPORT_INNER_ERROR("E19999", "Some exceptions occur"); | |||||
GELOGE(FAILED, "Command handle failed, some exceptions occur !"); | GELOGE(FAILED, "Command handle failed, some exceptions occur !"); | ||||
return FAILED; | return FAILED; | ||||
@@ -232,6 +244,8 @@ Status GraphLoader::ExecuteModel(uint32_t model_id, rtStream_t stream, bool asyn | |||||
Status GraphLoader::GetMemoryInfo(int64_t &free) { | Status GraphLoader::GetMemoryInfo(int64_t &free) { | ||||
rtError_t rt_ret = rtSetDevice(GetContext().DeviceId()); | rtError_t rt_ret = rtSetDevice(GetContext().DeviceId()); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtSetDevice failed, device_id:%u, ret:0x%X", | |||||
GetContext().DeviceId(), rt_ret); | |||||
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | ||||
CsaInteract::GetInstance().WriteErrorCode(rt_ret, ERROR_MODULE_RUNTIME, JOBSUBSTATE_GRAPH_LOAD); | CsaInteract::GetInstance().WriteErrorCode(rt_ret, ERROR_MODULE_RUNTIME, JOBSUBSTATE_GRAPH_LOAD); | ||||
return RT_FAILED; | return RT_FAILED; | ||||
@@ -240,11 +254,14 @@ Status GraphLoader::GetMemoryInfo(int64_t &free) { | |||||
size_t free_mem = 0; | size_t free_mem = 0; | ||||
rt_ret = rtMemGetInfo(&free_mem, &total_mem); | rt_ret = rtMemGetInfo(&free_mem, &total_mem); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtMemGetInfo failed, ret:0x%X", rt_ret); | |||||
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | ||||
return RT_FAILED; | return RT_FAILED; | ||||
} | } | ||||
rt_ret = rtDeviceReset(GetContext().DeviceId()); | rt_ret = rtDeviceReset(GetContext().DeviceId()); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtDeviceReset failed, device_id:%u, ret:0x%X", | |||||
GetContext().DeviceId(), rt_ret); | |||||
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | ||||
return RT_FAILED; | return RT_FAILED; | ||||
} | } | ||||
@@ -51,6 +51,8 @@ CpuTaskInfo::~CpuTaskInfo() { | |||||
/// | /// | ||||
Status CpuTaskModelDequeue::Init(uint32_t queue_id, uintptr_t &in_mbuf) { | Status CpuTaskModelDequeue::Init(uint32_t queue_id, uintptr_t &in_mbuf) { | ||||
if ((args_ != nullptr) || (args_size_ > 0)) { | if ((args_ != nullptr) || (args_size_ > 0)) { | ||||
REPORT_INNER_ERROR("E19999", "Param args_ is not nullptr or args_size_:%u > 0," | |||||
"check invalid", args_size_); | |||||
GELOGE(FAILED, "Task already initialized, size: %u", args_size_); | GELOGE(FAILED, "Task already initialized, size: %u", args_size_); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -58,6 +60,8 @@ Status CpuTaskModelDequeue::Init(uint32_t queue_id, uintptr_t &in_mbuf) { | |||||
args_size_ = sizeof(MbufQueueInfo) + sizeof(uintptr_t); // sizeof(uintptr_t) for save in_mbuf. | args_size_ = sizeof(MbufQueueInfo) + sizeof(uintptr_t); // sizeof(uintptr_t) for save in_mbuf. | ||||
rtError_t status = rtMalloc(&args_, args_size_, RT_MEMORY_HBM); | rtError_t status = rtMalloc(&args_, args_size_, RT_MEMORY_HBM); | ||||
if (status != RT_ERROR_NONE) { | if (status != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtMalloc failed, size:%u, ret:0x%X", | |||||
args_size_, status); | |||||
GELOGE(RT_FAILED, "Call rt malloc failed, status: 0x%x", status); | GELOGE(RT_FAILED, "Call rt malloc failed, status: 0x%x", status); | ||||
return RT_ERROR_TO_GE_STATUS(status); | return RT_ERROR_TO_GE_STATUS(status); | ||||
} | } | ||||
@@ -69,6 +73,8 @@ Status CpuTaskModelDequeue::Init(uint32_t queue_id, uintptr_t &in_mbuf) { | |||||
queue_info.in_mbuf = in_mbuf; // Placeholder, input mbuf addr will save to this place. | queue_info.in_mbuf = in_mbuf; // Placeholder, input mbuf addr will save to this place. | ||||
status = rtMemcpy(args_, args_size_, &queue_info, sizeof(MbufQueueInfo), RT_MEMCPY_HOST_TO_DEVICE); | status = rtMemcpy(args_, args_size_, &queue_info, sizeof(MbufQueueInfo), RT_MEMCPY_HOST_TO_DEVICE); | ||||
if (status != RT_ERROR_NONE) { | if (status != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtMemcpy failed, size:%u, ret:0x%X", | |||||
args_size_, status); | |||||
GELOGE(RT_FAILED, "Call rt memcpy failed, status: 0x%x", status); | GELOGE(RT_FAILED, "Call rt memcpy failed, status: 0x%x", status); | ||||
return RT_ERROR_TO_GE_STATUS(status); | return RT_ERROR_TO_GE_STATUS(status); | ||||
} | } | ||||
@@ -78,12 +84,16 @@ Status CpuTaskModelDequeue::Init(uint32_t queue_id, uintptr_t &in_mbuf) { | |||||
Status CpuTaskModelDequeue::Distribute() { | Status CpuTaskModelDequeue::Distribute() { | ||||
if ((args_ == nullptr) || (args_size_ == 0) || (stream_ == nullptr)) { | if ((args_ == nullptr) || (args_size_ == 0) || (stream_ == nullptr)) { | ||||
REPORT_INNER_ERROR("E19999", "Param args_ is nullptr or args_size_:%u is 0 or stream_ is nullptr," | |||||
"check invalid", args_size_); | |||||
GELOGE(FAILED, "Task not initialized, distribute failed, size: %u", args_size_); | GELOGE(FAILED, "Task not initialized, distribute failed, size: %u", args_size_); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
rtError_t status = rtCpuKernelLaunch(nullptr, kCpuTaskModelDequeue, kCoreDim, args_, args_size_, nullptr, stream_); | rtError_t status = rtCpuKernelLaunch(nullptr, kCpuTaskModelDequeue, kCoreDim, args_, args_size_, nullptr, stream_); | ||||
if (status != RT_ERROR_NONE) { | if (status != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtCpuKernelLaunch failed, ret:0x%X", | |||||
status); | |||||
GELOGE(RT_FAILED, "Call rt CpuKernelLaunch ModelDequeue failed, status: 0x%X", status); | GELOGE(RT_FAILED, "Call rt CpuKernelLaunch ModelDequeue failed, status: 0x%X", status); | ||||
return RT_ERROR_TO_GE_STATUS(status); | return RT_ERROR_TO_GE_STATUS(status); | ||||
} | } | ||||
@@ -101,6 +111,8 @@ Status CpuTaskModelDequeue::Distribute() { | |||||
/// | /// | ||||
Status CpuTaskZeroCopy::Init(std::vector<uintptr_t> &mbuf_list, const map<uint32_t, ZeroCopyOffset> &outside_addrs) { | Status CpuTaskZeroCopy::Init(std::vector<uintptr_t> &mbuf_list, const map<uint32_t, ZeroCopyOffset> &outside_addrs) { | ||||
if ((args_ != nullptr) || (args_size_ > 0)) { | if ((args_ != nullptr) || (args_size_ > 0)) { | ||||
REPORT_INNER_ERROR("E19999", "Param args_ is not nullptr or args_size_:%u > 0," | |||||
"check invalid", args_size_); | |||||
GELOGE(FAILED, "Task already initialized, size: %u", args_size_); | GELOGE(FAILED, "Task already initialized, size: %u", args_size_); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -155,12 +167,16 @@ Status CpuTaskZeroCopy::Init(std::vector<uintptr_t> &mbuf_list, const map<uint32 | |||||
Status CpuTaskZeroCopy::Distribute() { | Status CpuTaskZeroCopy::Distribute() { | ||||
if ((args_ == nullptr) || (args_size_ == 0) || (stream_ == nullptr)) { | if ((args_ == nullptr) || (args_size_ == 0) || (stream_ == nullptr)) { | ||||
REPORT_INNER_ERROR("E19999", "Param args_ is nullptr or args_size_:%u is 0 or stream_ is nullptr," | |||||
"check invalid", args_size_); | |||||
GELOGE(FAILED, "Task not initialized, distribute failed, size: %u", args_size_); | GELOGE(FAILED, "Task not initialized, distribute failed, size: %u", args_size_); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
rtError_t status = rtCpuKernelLaunch(nullptr, kCpuTaskZeroCopy, kCoreDim, args_, args_size_, nullptr, stream_); | rtError_t status = rtCpuKernelLaunch(nullptr, kCpuTaskZeroCopy, kCoreDim, args_, args_size_, nullptr, stream_); | ||||
if (status != RT_ERROR_NONE) { | if (status != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtCpuKernelLaunch failed, ret:0x%X", | |||||
status); | |||||
GELOGE(RT_FAILED, "Call rt CpuKernelLaunch ZeroCopy failed, status: 0x%X", status); | GELOGE(RT_FAILED, "Call rt CpuKernelLaunch ZeroCopy failed, status: 0x%X", status); | ||||
return RT_ERROR_TO_GE_STATUS(status); | return RT_ERROR_TO_GE_STATUS(status); | ||||
} | } | ||||
@@ -199,6 +215,8 @@ CpuTaskZeroCopy::~CpuTaskZeroCopy() { | |||||
/// | /// | ||||
Status CpuTaskPrepareOutput::Init(uintptr_t addr, uint32_t size, uintptr_t in_mbuf, uintptr_t &out_mbuf) { | Status CpuTaskPrepareOutput::Init(uintptr_t addr, uint32_t size, uintptr_t in_mbuf, uintptr_t &out_mbuf) { | ||||
if ((args_ != nullptr) || (args_size_ > 0)) { | if ((args_ != nullptr) || (args_size_ > 0)) { | ||||
REPORT_INNER_ERROR("E19999", "Param args_ is not nullptr or args_size_:%u > 0," | |||||
"check invalid", args_size_); | |||||
GELOGE(FAILED, "Task already initialized, size: %u", args_size_); | GELOGE(FAILED, "Task already initialized, size: %u", args_size_); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -206,6 +224,8 @@ Status CpuTaskPrepareOutput::Init(uintptr_t addr, uint32_t size, uintptr_t in_mb | |||||
args_size_ = sizeof(PrepareOutputInfo) + sizeof(uintptr_t); // sizeof(uintptr_t) for save out_mbuf. | args_size_ = sizeof(PrepareOutputInfo) + sizeof(uintptr_t); // sizeof(uintptr_t) for save out_mbuf. | ||||
rtError_t status = rtMalloc(&args_, args_size_, RT_MEMORY_HBM); | rtError_t status = rtMalloc(&args_, args_size_, RT_MEMORY_HBM); | ||||
if (status != RT_ERROR_NONE) { | if (status != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtMalloc failed, size:%u, ret:0x%X", | |||||
args_size_, status); | |||||
GELOGE(RT_FAILED, "Call rt malloc failed, status: 0x%x", status); | GELOGE(RT_FAILED, "Call rt malloc failed, status: 0x%x", status); | ||||
return RT_ERROR_TO_GE_STATUS(status); | return RT_ERROR_TO_GE_STATUS(status); | ||||
} | } | ||||
@@ -220,6 +240,8 @@ Status CpuTaskPrepareOutput::Init(uintptr_t addr, uint32_t size, uintptr_t in_mb | |||||
prepare.out_mbuf = out_mbuf; // Placeholder, output mbuf addr will save to this place. | prepare.out_mbuf = out_mbuf; // Placeholder, output mbuf addr will save to this place. | ||||
status = rtMemcpy(args_, args_size_, &prepare, sizeof(PrepareOutputInfo), RT_MEMCPY_HOST_TO_DEVICE); | status = rtMemcpy(args_, args_size_, &prepare, sizeof(PrepareOutputInfo), RT_MEMCPY_HOST_TO_DEVICE); | ||||
if (status != RT_ERROR_NONE) { | if (status != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtMemcpy failed, size:%u, ret:0x%X", | |||||
args_size_, status); | |||||
GELOGE(RT_FAILED, "Call rt memcpy failed, status: 0x%x", status); | GELOGE(RT_FAILED, "Call rt memcpy failed, status: 0x%x", status); | ||||
return RT_ERROR_TO_GE_STATUS(status); | return RT_ERROR_TO_GE_STATUS(status); | ||||
} | } | ||||
@@ -229,12 +251,16 @@ Status CpuTaskPrepareOutput::Init(uintptr_t addr, uint32_t size, uintptr_t in_mb | |||||
Status CpuTaskPrepareOutput::Distribute() { | Status CpuTaskPrepareOutput::Distribute() { | ||||
if ((args_ == nullptr) || (args_size_ == 0) || (stream_ == nullptr)) { | if ((args_ == nullptr) || (args_size_ == 0) || (stream_ == nullptr)) { | ||||
REPORT_INNER_ERROR("E19999", "Param args_ is nullptr or args_size_:%u is 0 or stream_ is nullptr," | |||||
"check invalid", args_size_); | |||||
GELOGE(FAILED, "Task not initialized, distribute failed, size: %u", args_size_); | GELOGE(FAILED, "Task not initialized, distribute failed, size: %u", args_size_); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
rtError_t status = rtCpuKernelLaunch(nullptr, kCpuTaskPrepareOutput, kCoreDim, args_, args_size_, nullptr, stream_); | rtError_t status = rtCpuKernelLaunch(nullptr, kCpuTaskPrepareOutput, kCoreDim, args_, args_size_, nullptr, stream_); | ||||
if (status != RT_ERROR_NONE) { | if (status != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtCpuKernelLaunch failed, ret:0x%X", | |||||
status); | |||||
GELOGE(RT_FAILED, "Call rt CpuKernelLaunch PrepareOutput failed, status: 0x%X", status); | GELOGE(RT_FAILED, "Call rt CpuKernelLaunch PrepareOutput failed, status: 0x%X", status); | ||||
return RT_ERROR_TO_GE_STATUS(status); | return RT_ERROR_TO_GE_STATUS(status); | ||||
} | } | ||||
@@ -252,6 +278,8 @@ Status CpuTaskPrepareOutput::Distribute() { | |||||
/// | /// | ||||
Status CpuTaskModelEnqueue::Init(uint32_t queue_id, uintptr_t out_mbuf) { | Status CpuTaskModelEnqueue::Init(uint32_t queue_id, uintptr_t out_mbuf) { | ||||
if ((args_ != nullptr) || (args_size_ > 0)) { | if ((args_ != nullptr) || (args_size_ > 0)) { | ||||
REPORT_INNER_ERROR("E19999", "Param args_ is not nullptr or args_size_:%u > 0," | |||||
"check invalid", args_size_); | |||||
GELOGE(FAILED, "Task already initialized, size: %u", args_size_); | GELOGE(FAILED, "Task already initialized, size: %u", args_size_); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -260,6 +288,8 @@ Status CpuTaskModelEnqueue::Init(uint32_t queue_id, uintptr_t out_mbuf) { | |||||
args_size_ = sizeof(MbufQueueInfo); | args_size_ = sizeof(MbufQueueInfo); | ||||
rtError_t status = rtMalloc(&args_, args_size_, RT_MEMORY_HBM); | rtError_t status = rtMalloc(&args_, args_size_, RT_MEMORY_HBM); | ||||
if (status != RT_ERROR_NONE) { | if (status != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtMalloc failed, size:%u, ret:0x%X", | |||||
args_size_, status); | |||||
GELOGE(RT_FAILED, "Call rt malloc failed, status: 0x%x", status); | GELOGE(RT_FAILED, "Call rt malloc failed, status: 0x%x", status); | ||||
return RT_ERROR_TO_GE_STATUS(status); | return RT_ERROR_TO_GE_STATUS(status); | ||||
} | } | ||||
@@ -270,6 +300,8 @@ Status CpuTaskModelEnqueue::Init(uint32_t queue_id, uintptr_t out_mbuf) { | |||||
queue_info.in_mbuf = out_mbuf; | queue_info.in_mbuf = out_mbuf; | ||||
status = rtMemcpy(args_, args_size_, &queue_info, args_size_, RT_MEMCPY_HOST_TO_DEVICE); | status = rtMemcpy(args_, args_size_, &queue_info, args_size_, RT_MEMCPY_HOST_TO_DEVICE); | ||||
if (status != RT_ERROR_NONE) { | if (status != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtMemcpy failed, size:%u, ret:0x%X", | |||||
args_size_, status); | |||||
GELOGE(RT_FAILED, "Call rt memcpy failed, status: 0x%x", status); | GELOGE(RT_FAILED, "Call rt memcpy failed, status: 0x%x", status); | ||||
return RT_ERROR_TO_GE_STATUS(status); | return RT_ERROR_TO_GE_STATUS(status); | ||||
} | } | ||||
@@ -279,12 +311,16 @@ Status CpuTaskModelEnqueue::Init(uint32_t queue_id, uintptr_t out_mbuf) { | |||||
Status CpuTaskModelEnqueue::Distribute() { | Status CpuTaskModelEnqueue::Distribute() { | ||||
if ((args_ == nullptr) || (args_size_ == 0) || (stream_ == nullptr)) { | if ((args_ == nullptr) || (args_size_ == 0) || (stream_ == nullptr)) { | ||||
REPORT_INNER_ERROR("E19999", "Param args_ is nullptr or args_size_ is 0 or stream_ is nullptr, arg_size:%u," | |||||
"check invalid", args_size_); | |||||
GELOGE(FAILED, "Task not initialized, distribute failed, size: %u", args_size_); | GELOGE(FAILED, "Task not initialized, distribute failed, size: %u", args_size_); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
rtError_t status = rtCpuKernelLaunch(nullptr, kCpuTaskModelEnqueue, kCoreDim, args_, args_size_, nullptr, stream_); | rtError_t status = rtCpuKernelLaunch(nullptr, kCpuTaskModelEnqueue, kCoreDim, args_, args_size_, nullptr, stream_); | ||||
if (status != RT_ERROR_NONE) { | if (status != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtCpuKernelLaunch failed, ret:0x%X", | |||||
status); | |||||
GELOGE(RT_FAILED, "Call rt CpuKernelLaunch ModelEnqueue failed, status: 0x%X", status); | GELOGE(RT_FAILED, "Call rt CpuKernelLaunch ModelEnqueue failed, status: 0x%X", status); | ||||
return RT_ERROR_TO_GE_STATUS(status); | return RT_ERROR_TO_GE_STATUS(status); | ||||
} | } | ||||
@@ -301,6 +337,7 @@ Status CpuTaskModelEnqueue::Distribute() { | |||||
/// | /// | ||||
Status CpuTaskActiveEntry::Init(rtStream_t stream) { | Status CpuTaskActiveEntry::Init(rtStream_t stream) { | ||||
if (stream == nullptr) { | if (stream == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "Param stream is nullptr, check invalid"); | |||||
GELOGE(FAILED, "Task active stream not valid"); | GELOGE(FAILED, "Task active stream not valid"); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -311,12 +348,16 @@ Status CpuTaskActiveEntry::Init(rtStream_t stream) { | |||||
Status CpuTaskActiveEntry::Distribute() { | Status CpuTaskActiveEntry::Distribute() { | ||||
if ((active_stream_ == nullptr) || (stream_ == nullptr)) { | if ((active_stream_ == nullptr) || (stream_ == nullptr)) { | ||||
REPORT_INNER_ERROR("E19999", "Param stream is nullptr or active_stream_ is nullptr, " | |||||
"check invalid"); | |||||
GELOGE(FAILED, "Task not initialized, distribute failed, size: %u", args_size_); | GELOGE(FAILED, "Task not initialized, distribute failed, size: %u", args_size_); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
rtError_t ret = rtStreamActive(active_stream_, stream_); | rtError_t ret = rtStreamActive(active_stream_, stream_); | ||||
if (ret != RT_ERROR_NONE) { | if (ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtStreamActive failed, ret:0x%X", | |||||
ret); | |||||
GELOGE(RT_FAILED, "Call rt StreamActive failed, ret: 0x%X", ret); | GELOGE(RT_FAILED, "Call rt StreamActive failed, ret: 0x%X", ret); | ||||
return RT_ERROR_TO_GE_STATUS(ret); | return RT_ERROR_TO_GE_STATUS(ret); | ||||
} | } | ||||
@@ -333,6 +374,8 @@ Status CpuTaskActiveEntry::Distribute() { | |||||
/// | /// | ||||
Status CpuTaskWaitEndGraph::Init(uint32_t model_id) { | Status CpuTaskWaitEndGraph::Init(uint32_t model_id) { | ||||
if ((args_ != nullptr) || (args_size_ > 0)) { | if ((args_ != nullptr) || (args_size_ > 0)) { | ||||
REPORT_INNER_ERROR("E19999", "Param args_ is not nullptr or args_size_:%u > 0," | |||||
"check invalid", args_size_); | |||||
GELOGE(FAILED, "Task already initialized, size: %u", args_size_); | GELOGE(FAILED, "Task already initialized, size: %u", args_size_); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -340,6 +383,8 @@ Status CpuTaskWaitEndGraph::Init(uint32_t model_id) { | |||||
args_size_ = sizeof(model_id); | args_size_ = sizeof(model_id); | ||||
rtError_t status = rtMalloc(&args_, args_size_, RT_MEMORY_HBM); | rtError_t status = rtMalloc(&args_, args_size_, RT_MEMORY_HBM); | ||||
if (status != RT_ERROR_NONE) { | if (status != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtMalloc failed, size:%u, ret:0x%X", | |||||
args_size_, status); | |||||
GELOGE(RT_FAILED, "Call rt malloc failed, status: 0x%x", status); | GELOGE(RT_FAILED, "Call rt malloc failed, status: 0x%x", status); | ||||
return RT_ERROR_TO_GE_STATUS(status); | return RT_ERROR_TO_GE_STATUS(status); | ||||
} | } | ||||
@@ -347,6 +392,8 @@ Status CpuTaskWaitEndGraph::Init(uint32_t model_id) { | |||||
status = rtMemcpy(args_, args_size_, &model_id, args_size_, RT_MEMCPY_HOST_TO_DEVICE); | status = rtMemcpy(args_, args_size_, &model_id, args_size_, RT_MEMCPY_HOST_TO_DEVICE); | ||||
if (status != RT_ERROR_NONE) { | if (status != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtMemcpy failed, size:%u, ret:0x%X", | |||||
args_size_, status); | |||||
GELOGE(RT_FAILED, "Call rt memcpy failed, status: 0x%x", status); | GELOGE(RT_FAILED, "Call rt memcpy failed, status: 0x%x", status); | ||||
return RT_ERROR_TO_GE_STATUS(status); | return RT_ERROR_TO_GE_STATUS(status); | ||||
} | } | ||||
@@ -356,12 +403,16 @@ Status CpuTaskWaitEndGraph::Init(uint32_t model_id) { | |||||
Status CpuTaskWaitEndGraph::Distribute() { | Status CpuTaskWaitEndGraph::Distribute() { | ||||
if ((args_ == nullptr) || (args_size_ == 0) || (stream_ == nullptr)) { | if ((args_ == nullptr) || (args_size_ == 0) || (stream_ == nullptr)) { | ||||
REPORT_INNER_ERROR("E19999", "Param args_ is nullptr or args_size_:%u is 0 or stream_ is nullptr," | |||||
"check invalid", args_size_); | |||||
GELOGE(FAILED, "Task not initialized, distribute failed, size: %u", args_size_); | GELOGE(FAILED, "Task not initialized, distribute failed, size: %u", args_size_); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
rtError_t status = rtCpuKernelLaunch(nullptr, kCpuTaskWaitEndGraph, kCoreDim, args_, args_size_, nullptr, stream_); | rtError_t status = rtCpuKernelLaunch(nullptr, kCpuTaskWaitEndGraph, kCoreDim, args_, args_size_, nullptr, stream_); | ||||
if (status != RT_ERROR_NONE) { | if (status != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtCpuKernelLaunch failed, ret:0x%X", | |||||
status); | |||||
GELOGE(RT_FAILED, "Call rt CpuKernelLaunch WaitEndGraph failed, status: 0x%X", status); | GELOGE(RT_FAILED, "Call rt CpuKernelLaunch WaitEndGraph failed, status: 0x%X", status); | ||||
return RT_ERROR_TO_GE_STATUS(status); | return RT_ERROR_TO_GE_STATUS(status); | ||||
} | } | ||||
@@ -378,6 +429,8 @@ Status CpuTaskWaitEndGraph::Distribute() { | |||||
/// | /// | ||||
Status CpuTaskModelRepeat::Init(uint32_t model_id) { | Status CpuTaskModelRepeat::Init(uint32_t model_id) { | ||||
if ((args_ != nullptr) || (args_size_ > 0)) { | if ((args_ != nullptr) || (args_size_ > 0)) { | ||||
REPORT_INNER_ERROR("E19999", "Param args_ is not nullptr or args_size_:%u > 0," | |||||
"check invalid", args_size_); | |||||
GELOGE(FAILED, "Task already initialized, size: %u", args_size_); | GELOGE(FAILED, "Task already initialized, size: %u", args_size_); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -385,6 +438,8 @@ Status CpuTaskModelRepeat::Init(uint32_t model_id) { | |||||
args_size_ = sizeof(model_id); | args_size_ = sizeof(model_id); | ||||
rtError_t status = rtMalloc(&args_, args_size_, RT_MEMORY_HBM); | rtError_t status = rtMalloc(&args_, args_size_, RT_MEMORY_HBM); | ||||
if (status != RT_ERROR_NONE) { | if (status != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtMalloc failed, size:%u, ret:0x%X", | |||||
args_size_, status); | |||||
GELOGE(RT_FAILED, "Call rt malloc failed, status: 0x%x", status); | GELOGE(RT_FAILED, "Call rt malloc failed, status: 0x%x", status); | ||||
return RT_ERROR_TO_GE_STATUS(status); | return RT_ERROR_TO_GE_STATUS(status); | ||||
} | } | ||||
@@ -392,6 +447,8 @@ Status CpuTaskModelRepeat::Init(uint32_t model_id) { | |||||
status = rtMemcpy(args_, args_size_, &model_id, args_size_, RT_MEMCPY_HOST_TO_DEVICE); | status = rtMemcpy(args_, args_size_, &model_id, args_size_, RT_MEMCPY_HOST_TO_DEVICE); | ||||
if (status != RT_ERROR_NONE) { | if (status != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtMemcpy failed, size:%u, ret:0x%X", | |||||
args_size_, status); | |||||
GELOGE(RT_FAILED, "Call rt memcpy failed, status: 0x%x", status); | GELOGE(RT_FAILED, "Call rt memcpy failed, status: 0x%x", status); | ||||
return RT_ERROR_TO_GE_STATUS(status); | return RT_ERROR_TO_GE_STATUS(status); | ||||
} | } | ||||
@@ -401,12 +458,16 @@ Status CpuTaskModelRepeat::Init(uint32_t model_id) { | |||||
Status CpuTaskModelRepeat::Distribute() { | Status CpuTaskModelRepeat::Distribute() { | ||||
if ((args_ == nullptr) || (args_size_ == 0) || (stream_ == nullptr)) { | if ((args_ == nullptr) || (args_size_ == 0) || (stream_ == nullptr)) { | ||||
REPORT_INNER_ERROR("E19999", "Param args_ is nullptr or args_size_:%u is 0 or stream_ is nullptr," | |||||
"check invalid", args_size_); | |||||
GELOGE(FAILED, "Task not initialized, distribute failed, size: %u", args_size_); | GELOGE(FAILED, "Task not initialized, distribute failed, size: %u", args_size_); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
rtError_t status = rtCpuKernelLaunch(nullptr, kCpuTaskModelRepeat, kCoreDim, args_, args_size_, nullptr, stream_); | rtError_t status = rtCpuKernelLaunch(nullptr, kCpuTaskModelRepeat, kCoreDim, args_, args_size_, nullptr, stream_); | ||||
if (status != RT_ERROR_NONE) { | if (status != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtCpuKernelLaunch failed, ret:0x%X", | |||||
status); | |||||
GELOGE(RT_FAILED, "Call rt CpuKernelLaunch ModelRepeat failed, status: 0x%x", status); | GELOGE(RT_FAILED, "Call rt CpuKernelLaunch ModelRepeat failed, status: 0x%x", status); | ||||
return RT_ERROR_TO_GE_STATUS(status); | return RT_ERROR_TO_GE_STATUS(status); | ||||
} | } | ||||
@@ -72,24 +72,6 @@ static bool ParseNameIndex(const std::string &node_name_index, std::string &node | |||||
static bool IsTensorDescWithSkipDumpAddrType(bool has_mem_type_attr, vector<int64_t> v_memory_type, size_t i) { | static bool IsTensorDescWithSkipDumpAddrType(bool has_mem_type_attr, vector<int64_t> v_memory_type, size_t i) { | ||||
return has_mem_type_attr && (v_memory_type[i] == RT_MEMORY_L1); | return has_mem_type_attr && (v_memory_type[i] == RT_MEMORY_L1); | ||||
} | } | ||||
static uint64_t GetNowTime() { | |||||
uint64_t ret = 0; | |||||
mmTimeval tv; | |||||
if (mmGetTimeOfDay(&tv, nullptr) == 0) { | |||||
ret = tv.tv_sec * 1000000ULL + tv.tv_usec; | |||||
} | |||||
return ret; | |||||
} | |||||
static void ReplaceStringElem(std::string &str) { | |||||
for_each(str.begin(), str.end(), [](char &ch) { | |||||
if ((ch == ' ') || (ch == '.') || (ch == '/') || (ch == '\\')) { | |||||
ch = '_'; | |||||
} | |||||
}); | |||||
} | |||||
} // namespace | } // namespace | ||||
static int32_t GetIrDataType(ge::DataType data_type) { | static int32_t GetIrDataType(ge::DataType data_type) { | ||||
@@ -194,66 +176,6 @@ void DataDumper::SaveOpDebugId(uint32_t task_id, uint32_t stream_id, void *op_de | |||||
is_op_debug_ = is_op_debug; | is_op_debug_ = is_op_debug; | ||||
} | } | ||||
void DataDumper::SaveDumpOpInfo(const RuntimeParam &model_param, const OpDescPtr &op, uint32_t task_id, | |||||
uint32_t stream_id) { | |||||
GELOGD("Start SaveDumpOpInfo of task_id: %u, stream_id: %u", task_id, stream_id); | |||||
OpDescInfo op_desc_info; | |||||
op_desc_info.op_name = op->GetName(); | |||||
op_desc_info.op_type = op->GetType(); | |||||
op_desc_info.task_id = task_id; | |||||
op_desc_info.stream_id = stream_id; | |||||
for (size_t i = 0; i < op->GetAllInputsSize(); ++i) { | |||||
GeTensorDescPtr input_tensor_desc = op->MutableInputDesc(i); | |||||
if (input_tensor_desc == nullptr) { | |||||
continue; | |||||
} | |||||
op_desc_info.input_format.emplace_back(input_tensor_desc->GetFormat()); | |||||
op_desc_info.input_shape.emplace_back(input_tensor_desc->GetShape().GetDims()); | |||||
op_desc_info.input_data_type.emplace_back(input_tensor_desc->GetDataType()); | |||||
int64_t input_size = 0; | |||||
if (TensorUtils::GetTensorSizeInBytes(*input_tensor_desc, input_size) != SUCCESS) { | |||||
GELOGW("Get input size failed"); | |||||
return; | |||||
} | |||||
GELOGD("Save dump op info, the input size is %ld", input_size); | |||||
op_desc_info.input_size.emplace_back(input_size); | |||||
} | |||||
for (size_t j = 0; j < op->GetOutputsSize(); ++j) { | |||||
GeTensorDescPtr output_tensor_desc = op->MutableOutputDesc(j); | |||||
if (output_tensor_desc == nullptr) { | |||||
continue; | |||||
} | |||||
op_desc_info.output_format.emplace_back(output_tensor_desc->GetFormat()); | |||||
op_desc_info.output_shape.emplace_back(output_tensor_desc->GetShape().GetDims()); | |||||
op_desc_info.output_data_type.emplace_back(output_tensor_desc->GetDataType()); | |||||
int64_t output_size = 0; | |||||
if (TensorUtils::GetTensorSizeInBytes(*output_tensor_desc, output_size) != SUCCESS) { | |||||
GELOGW("Get input size failed"); | |||||
return; | |||||
} | |||||
GELOGD("Save dump op info, the output size is %ld", output_size); | |||||
op_desc_info.output_size.emplace_back(output_size); | |||||
} | |||||
op_desc_info.input_addrs = ModelUtils::GetInputDataAddrs(model_param, op); | |||||
op_desc_info.output_addrs = ModelUtils::GetOutputDataAddrs(model_param, op); | |||||
op_desc_info_.emplace_back(op_desc_info); | |||||
} | |||||
bool DataDumper::GetOpDescInfo(uint32_t stream_id, uint32_t task_id, OpDescInfo &op_desc_info) const { | |||||
GELOGI("There are %zu op need to dump.", op_desc_info_.size()); | |||||
for (size_t index = 0; index < op_desc_info_.size(); ++index) { | |||||
OpDescInfo dump_op_info = op_desc_info_.at(index); | |||||
if (dump_op_info.task_id == task_id && dump_op_info.stream_id == stream_id) { | |||||
GELOGI("find exception op of task_id: %u, stream_id: %u.", task_id, stream_id); | |||||
op_desc_info = dump_op_info; | |||||
return true; | |||||
} | |||||
} | |||||
return false; | |||||
} | |||||
void DataDumper::SaveDumpTask(uint32_t task_id, uint32_t stream_id, const std::shared_ptr<OpDesc> &op_desc, | void DataDumper::SaveDumpTask(uint32_t task_id, uint32_t stream_id, const std::shared_ptr<OpDesc> &op_desc, | ||||
uintptr_t args) { | uintptr_t args) { | ||||
if (op_desc == nullptr) { | if (op_desc == nullptr) { | ||||
@@ -325,6 +247,7 @@ Status DataDumper::GenerateOutput(aicpu::dump::Output &output, const OpDesc::Vis | |||||
} | } | ||||
int64_t output_size = 0; | int64_t output_size = 0; | ||||
if (TensorUtils::GetTensorSizeInBytes(tensor_descs.at(index), output_size) != SUCCESS) { | if (TensorUtils::GetTensorSizeInBytes(tensor_descs.at(index), output_size) != SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Get tensor size fail"); | |||||
GELOGE(PARAM_INVALID, "Get output size filed"); | GELOGE(PARAM_INVALID, "Get output size filed"); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
} | } | ||||
@@ -385,8 +308,11 @@ Status DataDumper::DumpRefOutput(const DataDumper::InnerDumpInfo &inner_dump_inf | |||||
Status DataDumper::DumpOutputWithTask(const InnerDumpInfo &inner_dump_info, aicpu::dump::Task &task) { | Status DataDumper::DumpOutputWithTask(const InnerDumpInfo &inner_dump_info, aicpu::dump::Task &task) { | ||||
const auto &output_descs = inner_dump_info.op->GetAllOutputsDesc(); | const auto &output_descs = inner_dump_info.op->GetAllOutputsDesc(); | ||||
const std::vector<void *> output_addrs = ModelUtils::GetOutputDataAddrs(runtime_param_, inner_dump_info.op); | |||||
const std::vector<void *> output_addrs = ModelUtils::GetOutputDataAddrs(*runtime_param_, inner_dump_info.op); | |||||
if (output_descs.size() != output_addrs.size()) { | if (output_descs.size() != output_addrs.size()) { | ||||
REPORT_INNER_ERROR("E19999", "output_desc size:%zu != output addr size:%zu in op:%s(%s)", | |||||
output_descs.size(), output_addrs.size(), | |||||
inner_dump_info.op->GetName().c_str(), inner_dump_info.op->GetType().c_str()); | |||||
GELOGE(PARAM_INVALID, "Invalid output desc addrs size %zu, op %s has %zu output desc.", output_addrs.size(), | GELOGE(PARAM_INVALID, "Invalid output desc addrs size %zu, op %s has %zu output desc.", output_addrs.size(), | ||||
inner_dump_info.op->GetName().c_str(), output_descs.size()); | inner_dump_info.op->GetName().c_str(), output_descs.size()); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
@@ -411,6 +337,8 @@ Status DataDumper::DumpOutputWithTask(const InnerDumpInfo &inner_dump_info, aicp | |||||
GELOGI("[L1Fusion] DumpOutputWithTask[%s] output[%zu] is l1 addr.", inner_dump_info.op->GetName().c_str(), i); | GELOGI("[L1Fusion] DumpOutputWithTask[%s] output[%zu] is l1 addr.", inner_dump_info.op->GetName().c_str(), i); | ||||
int64_t output_size = 0; | int64_t output_size = 0; | ||||
if (TensorUtils::GetTensorSizeInBytes(output_descs.at(i), output_size) != SUCCESS) { | if (TensorUtils::GetTensorSizeInBytes(output_descs.at(i), output_size) != SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Get output tensor size fail in op:%s(%s), index:%zu", | |||||
inner_dump_info.op->GetName().c_str(), inner_dump_info.op->GetType().c_str(), i); | |||||
GELOGE(PARAM_INVALID, "Get output size failed."); | GELOGE(PARAM_INVALID, "Get output size failed."); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
} | } | ||||
@@ -436,8 +364,12 @@ Status DataDumper::DumpOutput(const InnerDumpInfo &inner_dump_info, aicpu::dump: | |||||
// else data, const or variable op | // else data, const or variable op | ||||
aicpu::dump::Output output; | aicpu::dump::Output output; | ||||
auto output_tensor = inner_dump_info.op->GetOutputDescPtr(inner_dump_info.output_anchor_index); | auto output_tensor = inner_dump_info.op->GetOutputDescPtr(inner_dump_info.output_anchor_index); | ||||
const std::vector<void *> output_addrs = ModelUtils::GetOutputDataAddrs(runtime_param_, inner_dump_info.op); | |||||
const std::vector<void *> output_addrs = ModelUtils::GetOutputDataAddrs(*runtime_param_, inner_dump_info.op); | |||||
if (output_tensor == nullptr) { | if (output_tensor == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "output_desc tensor is nullptr in op:%s(%s), index:%u, " | |||||
"check invalid", | |||||
inner_dump_info.op->GetName().c_str(), inner_dump_info.op->GetType().c_str(), | |||||
inner_dump_info.output_anchor_index); | |||||
GELOGE(PARAM_INVALID, "output_tensor is null, index: %d, size: %zu.", inner_dump_info.output_anchor_index, | GELOGE(PARAM_INVALID, "output_tensor is null, index: %d, size: %zu.", inner_dump_info.output_anchor_index, | ||||
inner_dump_info.op->GetOutputsSize()); | inner_dump_info.op->GetOutputsSize()); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
@@ -461,6 +393,9 @@ Status DataDumper::DumpOutput(const InnerDumpInfo &inner_dump_info, aicpu::dump: | |||||
output.set_original_output_data_type(static_cast<int32_t>(output_tensor->GetOriginDataType())); | output.set_original_output_data_type(static_cast<int32_t>(output_tensor->GetOriginDataType())); | ||||
// due to lhisi virtual addr bug, cannot use args now | // due to lhisi virtual addr bug, cannot use args now | ||||
if (inner_dump_info.output_anchor_index >= static_cast<int>(output_addrs.size())) { | if (inner_dump_info.output_anchor_index >= static_cast<int>(output_addrs.size())) { | ||||
REPORT_INNER_ERROR("E19999", "output_anchor_index:%u >= output addr size:%zu in op:%s(%s), " | |||||
"check invalid", inner_dump_info.output_anchor_index, output_addrs.size(), | |||||
inner_dump_info.op->GetName().c_str(), inner_dump_info.op->GetType().c_str()); | |||||
GELOGE(FAILED, "Index is out of range."); | GELOGE(FAILED, "Index is out of range."); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -487,6 +422,7 @@ Status DataDumper::GenerateInput(aicpu::dump::Input &input, const OpDesc::Vistor | |||||
if (AttrUtils::GetInt(tensor_descs.at(index), ATTR_NAME_INPUT_ORIGIN_SIZE, input_size)) { | if (AttrUtils::GetInt(tensor_descs.at(index), ATTR_NAME_INPUT_ORIGIN_SIZE, input_size)) { | ||||
GELOGI("Get aipp input size according to attr is %ld", input_size); | GELOGI("Get aipp input size according to attr is %ld", input_size); | ||||
} else if (TensorUtils::GetTensorSizeInBytes(tensor_descs.at(index), input_size) != SUCCESS) { | } else if (TensorUtils::GetTensorSizeInBytes(tensor_descs.at(index), input_size) != SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Get tensor size fail"); | |||||
GELOGE(PARAM_INVALID, "Get input size filed"); | GELOGE(PARAM_INVALID, "Get input size filed"); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
} | } | ||||
@@ -540,8 +476,11 @@ Status DataDumper::DumpRefInput(const DataDumper::InnerDumpInfo &inner_dump_info | |||||
Status DataDumper::DumpInput(const InnerDumpInfo &inner_dump_info, aicpu::dump::Task &task) { | Status DataDumper::DumpInput(const InnerDumpInfo &inner_dump_info, aicpu::dump::Task &task) { | ||||
GELOGI("Start dump input"); | GELOGI("Start dump input"); | ||||
const auto &input_descs = inner_dump_info.op->GetAllInputsDesc(); | const auto &input_descs = inner_dump_info.op->GetAllInputsDesc(); | ||||
const std::vector<void *> input_addrs = ModelUtils::GetInputDataAddrs(runtime_param_, inner_dump_info.op); | |||||
const std::vector<void *> input_addrs = ModelUtils::GetInputDataAddrs(*runtime_param_, inner_dump_info.op); | |||||
if (input_descs.size() != input_addrs.size()) { | if (input_descs.size() != input_addrs.size()) { | ||||
REPORT_INNER_ERROR("E19999", "input_desc size:%zu != input addr size:%zu in op:%s(%s)", | |||||
input_descs.size(), input_addrs.size(), | |||||
inner_dump_info.op->GetName().c_str(), inner_dump_info.op->GetType().c_str()); | |||||
GELOGE(PARAM_INVALID, "Invalid input desc addrs size %zu, op %s has %zu input desc.", input_addrs.size(), | GELOGE(PARAM_INVALID, "Invalid input desc addrs size %zu, op %s has %zu input desc.", input_addrs.size(), | ||||
inner_dump_info.op->GetName().c_str(), input_descs.size()); | inner_dump_info.op->GetName().c_str(), input_descs.size()); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
@@ -567,6 +506,8 @@ Status DataDumper::DumpInput(const InnerDumpInfo &inner_dump_info, aicpu::dump:: | |||||
if (AttrUtils::GetInt(input_descs.at(i), ATTR_NAME_INPUT_ORIGIN_SIZE, input_size)) { | if (AttrUtils::GetInt(input_descs.at(i), ATTR_NAME_INPUT_ORIGIN_SIZE, input_size)) { | ||||
GELOGI("Get aipp input size according to attr is %ld", input_size); | GELOGI("Get aipp input size according to attr is %ld", input_size); | ||||
} else if (TensorUtils::GetTensorSizeInBytes(input_descs.at(i), input_size) != SUCCESS) { | } else if (TensorUtils::GetTensorSizeInBytes(input_descs.at(i), input_size) != SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Get input tensor size fail in op:%s(%s), index:%zu", | |||||
inner_dump_info.op->GetName().c_str(), inner_dump_info.op->GetType().c_str(), i); | |||||
GELOGE(PARAM_INVALID, "Get input size failed."); | GELOGE(PARAM_INVALID, "Get input size failed."); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
} | } | ||||
@@ -595,6 +536,7 @@ Status DataDumper::ExecuteLoadDumpInfo(aicpu::dump::OpMappingInfo &op_mapping_in | |||||
size_t proto_size = op_mapping_info.ByteSizeLong(); | size_t proto_size = op_mapping_info.ByteSizeLong(); | ||||
bool ret = op_mapping_info.SerializeToString(&proto_str); | bool ret = op_mapping_info.SerializeToString(&proto_str); | ||||
if (!ret || proto_size == 0) { | if (!ret || proto_size == 0) { | ||||
REPORT_INNER_ERROR("E19999", "Serialize proto to string fail"); | |||||
GELOGE(PARAM_INVALID, "Protobuf SerializeToString failed, proto size %zu.", proto_size); | GELOGE(PARAM_INVALID, "Protobuf SerializeToString failed, proto size %zu.", proto_size); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
} | } | ||||
@@ -606,6 +548,8 @@ Status DataDumper::ExecuteLoadDumpInfo(aicpu::dump::OpMappingInfo &op_mapping_in | |||||
rtError_t rt_ret = rtMalloc(&dev_mem_load_, proto_size, RT_MEMORY_HBM); | rtError_t rt_ret = rtMalloc(&dev_mem_load_, proto_size, RT_MEMORY_HBM); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtMalloc failed, size:%zu, ret:0x%X", | |||||
proto_size, rt_ret); | |||||
GELOGE(RT_FAILED, "Call rtMalloc failed, ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "Call rtMalloc failed, ret: 0x%X", rt_ret); | ||||
return RT_ERROR_TO_GE_STATUS(rt_ret); | return RT_ERROR_TO_GE_STATUS(rt_ret); | ||||
} | } | ||||
@@ -613,12 +557,15 @@ Status DataDumper::ExecuteLoadDumpInfo(aicpu::dump::OpMappingInfo &op_mapping_in | |||||
rt_ret = rtMemcpy(dev_mem_load_, proto_size, proto_str.c_str(), proto_size, RT_MEMCPY_HOST_TO_DEVICE); | rt_ret = rtMemcpy(dev_mem_load_, proto_size, proto_str.c_str(), proto_size, RT_MEMCPY_HOST_TO_DEVICE); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtMemcpy failed, size:%zu, ret:0x%X", | |||||
proto_size, rt_ret); | |||||
GELOGE(RT_FAILED, "Call rtMemcpy failed, ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "Call rtMemcpy failed, ret: 0x%X", rt_ret); | ||||
return RT_ERROR_TO_GE_STATUS(rt_ret); | return RT_ERROR_TO_GE_STATUS(rt_ret); | ||||
} | } | ||||
rt_ret = rtDatadumpInfoLoad(dev_mem_load_, proto_size); | rt_ret = rtDatadumpInfoLoad(dev_mem_load_, proto_size); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtDatadumpInfoLoad failed, ret:0x%X", rt_ret); | |||||
GELOGE(RT_FAILED, "Call rtDatadumpInfoLoad failed, ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "Call rtDatadumpInfoLoad failed, ret: 0x%X", rt_ret); | ||||
return RT_ERROR_TO_GE_STATUS(rt_ret); | return RT_ERROR_TO_GE_STATUS(rt_ret); | ||||
} | } | ||||
@@ -633,6 +580,7 @@ Status DataDumper::ExecuteUnLoadDumpInfo(aicpu::dump::OpMappingInfo &op_mapping_ | |||||
size_t proto_size = op_mapping_info.ByteSizeLong(); | size_t proto_size = op_mapping_info.ByteSizeLong(); | ||||
bool ret = op_mapping_info.SerializeToString(&proto_str); | bool ret = op_mapping_info.SerializeToString(&proto_str); | ||||
if (!ret || proto_size == 0) { | if (!ret || proto_size == 0) { | ||||
REPORT_INNER_ERROR("E19999", "Serialize proto to string fail"); | |||||
GELOGE(PARAM_INVALID, "Protobuf SerializeToString failed, proto size %zu.", proto_size); | GELOGE(PARAM_INVALID, "Protobuf SerializeToString failed, proto size %zu.", proto_size); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
} | } | ||||
@@ -644,6 +592,8 @@ Status DataDumper::ExecuteUnLoadDumpInfo(aicpu::dump::OpMappingInfo &op_mapping_ | |||||
rtError_t rt_ret = rtMalloc(&dev_mem_unload_, proto_size, RT_MEMORY_HBM); | rtError_t rt_ret = rtMalloc(&dev_mem_unload_, proto_size, RT_MEMORY_HBM); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtMalloc failed, size:%zu, ret:0x%X", | |||||
proto_size, rt_ret); | |||||
GELOGE(RT_FAILED, "Call rtMalloc failed, ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "Call rtMalloc failed, ret: 0x%X", rt_ret); | ||||
return RT_ERROR_TO_GE_STATUS(rt_ret); | return RT_ERROR_TO_GE_STATUS(rt_ret); | ||||
} | } | ||||
@@ -651,12 +601,15 @@ Status DataDumper::ExecuteUnLoadDumpInfo(aicpu::dump::OpMappingInfo &op_mapping_ | |||||
rt_ret = rtMemcpy(dev_mem_unload_, proto_size, proto_str.c_str(), proto_size, RT_MEMCPY_HOST_TO_DEVICE); | rt_ret = rtMemcpy(dev_mem_unload_, proto_size, proto_str.c_str(), proto_size, RT_MEMCPY_HOST_TO_DEVICE); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtMemcpy failed, size:%zu, ret:0x%X", | |||||
proto_size, rt_ret); | |||||
GELOGE(RT_FAILED, "Call rtMemcpy failed, ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "Call rtMemcpy failed, ret: 0x%X", rt_ret); | ||||
return RT_ERROR_TO_GE_STATUS(rt_ret); | return RT_ERROR_TO_GE_STATUS(rt_ret); | ||||
} | } | ||||
rt_ret = rtDatadumpInfoLoad(dev_mem_unload_, proto_size); | rt_ret = rtDatadumpInfoLoad(dev_mem_unload_, proto_size); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtDatadumpInfoLoad failed, ret:0x%X", rt_ret); | |||||
GELOGE(RT_FAILED, "Call rtDatadumpInfoLoad failed, ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "Call rtDatadumpInfoLoad failed, ret: 0x%X", rt_ret); | ||||
return RT_ERROR_TO_GE_STATUS(rt_ret); | return RT_ERROR_TO_GE_STATUS(rt_ret); | ||||
} | } | ||||
@@ -873,97 +826,4 @@ void DataDumper::PrintCheckLog(string &dump_list_key) { | |||||
} | } | ||||
} | } | ||||
} | } | ||||
Status DataDumper::DumpExceptionInput(const OpDescInfo &op_desc_info, const string &dump_file) { | |||||
GELOGI("Start to dump exception input"); | |||||
for (size_t i = 0; i < op_desc_info.input_addrs.size(); i++) { | |||||
if (Debug::DumpDevMem(dump_file.data(), op_desc_info.input_addrs.at(i), op_desc_info.input_size.at(i)) != SUCCESS) { | |||||
GELOGE(PARAM_INVALID, "Dump the %zu input data failed", i); | |||||
return PARAM_INVALID; | |||||
} | |||||
} | |||||
return SUCCESS; | |||||
} | |||||
Status DataDumper::DumpExceptionOutput(const OpDescInfo &op_desc_info, const string &dump_file) { | |||||
GELOGI("Start to dump exception output"); | |||||
for (size_t i = 0; i < op_desc_info.output_addrs.size(); i++) { | |||||
if (Debug::DumpDevMem(dump_file.data(), op_desc_info.output_addrs.at(i), op_desc_info.output_size.at(i)) != | |||||
SUCCESS) { | |||||
GELOGE(PARAM_INVALID, "Dump the %zu input data failed", i); | |||||
return PARAM_INVALID; | |||||
} | |||||
} | |||||
return SUCCESS; | |||||
} | |||||
Status DataDumper::DumpExceptionInfo(const std::vector<rtExceptionInfo> exception_infos) { | |||||
GELOGI("Start to dump exception info"); | |||||
for (const rtExceptionInfo &iter : exception_infos) { | |||||
OpDescInfo op_desc_info; | |||||
if (GetOpDescInfo(iter.streamid, iter.taskid, op_desc_info)) { | |||||
toolkit::dumpdata::DumpData dump_data; | |||||
dump_data.set_version("2.0"); | |||||
dump_data.set_dump_time(GetNowTime()); | |||||
dump_data.set_op_name(op_desc_info.op_name); | |||||
for (size_t i = 0; i < op_desc_info.input_format.size(); ++i) { | |||||
toolkit::dumpdata::OpInput input; | |||||
input.set_data_type(toolkit::dumpdata::OutputDataType(GetIrDataType(op_desc_info.input_data_type[i]))); | |||||
input.set_format(toolkit::dumpdata::OutputFormat(op_desc_info.input_format[i])); | |||||
for (auto dim : op_desc_info.input_shape[i]) { | |||||
input.mutable_shape()->add_dim(dim); | |||||
} | |||||
input.set_size(op_desc_info.input_size[i]); | |||||
GELOGI("The input size int exception is %ld", op_desc_info.input_size[i]); | |||||
dump_data.mutable_input()->Add(std::move(input)); | |||||
} | |||||
for (size_t j = 0; j < op_desc_info.output_format.size(); ++j) { | |||||
toolkit::dumpdata::OpOutput output; | |||||
output.set_data_type(toolkit::dumpdata::OutputDataType(GetIrDataType(op_desc_info.output_data_type[j]))); | |||||
output.set_format(toolkit::dumpdata::OutputFormat(op_desc_info.output_format[j])); | |||||
for (auto dim : op_desc_info.output_shape[j]) { | |||||
output.mutable_shape()->add_dim(dim); | |||||
} | |||||
output.set_size(op_desc_info.output_size[j]); | |||||
GELOGI("The output size int exception is %ld", op_desc_info.output_size[j]); | |||||
dump_data.mutable_output()->Add(std::move(output)); | |||||
} | |||||
uint64_t now_time = GetNowTime(); | |||||
std::string op_name = op_desc_info.op_name; | |||||
std::string op_type = op_desc_info.op_type; | |||||
ReplaceStringElem(op_name); | |||||
ReplaceStringElem(op_type); | |||||
string dump_file_path = | |||||
"./" + op_type + "." + op_name + "." + std::to_string(op_desc_info.task_id) + "." + std::to_string(now_time); | |||||
GELOGI("The exception dump file path is %s", dump_file_path.c_str()); | |||||
uint64_t proto_size = dump_data.ByteSizeLong(); | |||||
std::unique_ptr<char[]> proto_msg(new (std::nothrow) char[proto_size]); | |||||
bool ret = dump_data.SerializeToArray(proto_msg.get(), proto_size); | |||||
if (!ret || proto_size == 0) { | |||||
GELOGE(PARAM_INVALID, "Dump data proto serialize failed"); | |||||
return PARAM_INVALID; | |||||
} | |||||
GE_CHK_STATUS_RET(MemoryDumper::DumpToFile(dump_file_path.c_str(), &proto_size, sizeof(uint64_t)), | |||||
"Failed to dump proto size"); | |||||
GE_CHK_STATUS_RET(MemoryDumper::DumpToFile(dump_file_path.c_str(), proto_msg.get(), proto_size), | |||||
"Failed to dump proto msg"); | |||||
if (DumpExceptionInput(op_desc_info, dump_file_path) != SUCCESS) { | |||||
GELOGE(PARAM_INVALID, "Dump exception input failed"); | |||||
return PARAM_INVALID; | |||||
} | |||||
if (DumpExceptionOutput(op_desc_info, dump_file_path) != SUCCESS) { | |||||
GELOGE(PARAM_INVALID, "Dump exception output failed"); | |||||
return PARAM_INVALID; | |||||
} | |||||
GELOGI("Dump exception info SUCCESS"); | |||||
} else { | |||||
GELOGE(PARAM_INVALID, "Get op desc info failed,task id:%u,stream id:%u", iter.taskid, iter.streamid); | |||||
return PARAM_INVALID; | |||||
} | |||||
} | |||||
return SUCCESS; | |||||
} | |||||
} // namespace ge | } // namespace ge |
@@ -36,9 +36,21 @@ | |||||
namespace ge { | namespace ge { | ||||
class DataDumper { | class DataDumper { | ||||
public: | public: | ||||
DataDumper() : runtime_param_{} {} | |||||
explicit DataDumper(const RuntimeParam &rsh) : runtime_param_(rsh) {} | |||||
explicit DataDumper(RuntimeParam *rsh) | |||||
: model_name_(), | |||||
model_id_(0), | |||||
runtime_param_(rsh), | |||||
dev_mem_load_(nullptr), | |||||
dev_mem_unload_(nullptr), | |||||
op_list_(), | |||||
input_map_(), | |||||
load_flag_(false), | |||||
device_id_(0), | |||||
global_step_(0), | |||||
loop_per_iter_(0), | |||||
loop_cond_(0), | |||||
compute_graph_(nullptr), | |||||
ref_info_() {} | |||||
~DataDumper(); | ~DataDumper(); | ||||
@@ -58,8 +70,6 @@ class DataDumper { | |||||
void SaveDumpInput(const std::shared_ptr<Node> &node); | void SaveDumpInput(const std::shared_ptr<Node> &node); | ||||
void SaveDumpOpInfo(const RuntimeParam &model_param, const OpDescPtr &op, uint32_t task_id, uint32_t stream_id); | |||||
// args is device memory stored first output addr | // args is device memory stored first output addr | ||||
void SaveDumpTask(uint32_t task_id, uint32_t stream_id, const std::shared_ptr<OpDesc> &op_desc, uintptr_t args); | void SaveDumpTask(uint32_t task_id, uint32_t stream_id, const std::shared_ptr<OpDesc> &op_desc, uintptr_t args); | ||||
void SaveEndGraphId(uint32_t task_id, uint32_t stream_id); | void SaveEndGraphId(uint32_t task_id, uint32_t stream_id); | ||||
@@ -75,14 +85,8 @@ class DataDumper { | |||||
void SetDumpProperties(const DumpProperties &dump_properties) { dump_properties_ = dump_properties; } | void SetDumpProperties(const DumpProperties &dump_properties) { dump_properties_ = dump_properties; } | ||||
const DumpProperties &GetDumpProperties() const { return dump_properties_; } | const DumpProperties &GetDumpProperties() const { return dump_properties_; } | ||||
bool GetOpDescInfo(uint32_t stream_id, uint32_t task_id, OpDescInfo &op_desc_info) const; | |||||
const std::vector<OpDescInfo> &GetAllOpDescInfo() const { return op_desc_info_; } | const std::vector<OpDescInfo> &GetAllOpDescInfo() const { return op_desc_info_; } | ||||
// Dump exception info | |||||
Status DumpExceptionInput(const OpDescInfo &op_desc_info, const string &dump_file); | |||||
Status DumpExceptionOutput(const OpDescInfo &op_desc_info, const string &dump_file); | |||||
Status DumpExceptionInfo(const std::vector<rtExceptionInfo> exception_infos); | |||||
private: | private: | ||||
void ReleaseDevMem(void **ptr) noexcept; | void ReleaseDevMem(void **ptr) noexcept; | ||||
@@ -93,10 +97,10 @@ class DataDumper { | |||||
// for inference data dump | // for inference data dump | ||||
std::string om_name_; | std::string om_name_; | ||||
uint32_t model_id_ = 0; | |||||
const RuntimeParam &runtime_param_; | |||||
void *dev_mem_load_ = nullptr; | |||||
void *dev_mem_unload_ = nullptr; | |||||
uint32_t model_id_; | |||||
RuntimeParam *runtime_param_; | |||||
void *dev_mem_load_; | |||||
void *dev_mem_unload_; | |||||
struct InnerDumpInfo; | struct InnerDumpInfo; | ||||
struct InnerInputMapping; | struct InnerInputMapping; | ||||
@@ -107,12 +111,12 @@ class DataDumper { | |||||
uint32_t end_graph_stream_id_ = 0; | uint32_t end_graph_stream_id_ = 0; | ||||
bool is_end_graph_ = false; | bool is_end_graph_ = false; | ||||
std::multimap<std::string, InnerInputMapping> input_map_; // release after DavinciModel::Init | std::multimap<std::string, InnerInputMapping> input_map_; // release after DavinciModel::Init | ||||
bool load_flag_ = false; | |||||
uint32_t device_id_ = 0; | |||||
uintptr_t global_step_ = 0; | |||||
uintptr_t loop_per_iter_ = 0; | |||||
uintptr_t loop_cond_ = 0; | |||||
ComputeGraphPtr compute_graph_ = nullptr; // release after DavinciModel::Init | |||||
bool load_flag_; | |||||
uint32_t device_id_; | |||||
uintptr_t global_step_; | |||||
uintptr_t loop_per_iter_; | |||||
uintptr_t loop_cond_; | |||||
ComputeGraphPtr compute_graph_; // release after DavinciModel::Init | |||||
std::map<OpDescPtr, void *> ref_info_; // release after DavinciModel::Init | std::map<OpDescPtr, void *> ref_info_; // release after DavinciModel::Init | ||||
void *l1_fusion_addr_ = nullptr; | void *l1_fusion_addr_ = nullptr; | ||||
@@ -134,6 +134,8 @@ class DataInputer { | |||||
/// | /// | ||||
void Stop() { queue_.Stop(); } | void Stop() { queue_.Stop(); } | ||||
uint32_t Size() { return queue_.Size(); } | |||||
private: | private: | ||||
/// | /// | ||||
/// @ingroup domi_ome | /// @ingroup domi_ome | ||||
@@ -29,6 +29,7 @@ | |||||
#include "common/helper/om_file_helper.h" | #include "common/helper/om_file_helper.h" | ||||
#include "common/opskernel/ge_task_info.h" | #include "common/opskernel/ge_task_info.h" | ||||
#include "common/properties_manager.h" | #include "common/properties_manager.h" | ||||
#include "common/dump/exception_dumper.h" | |||||
#include "common/dump/opdebug_register.h" | #include "common/dump/opdebug_register.h" | ||||
#include "common/types.h" | #include "common/types.h" | ||||
#include "framework/common/util.h" | #include "framework/common/util.h" | ||||
@@ -221,6 +222,11 @@ class DavinciModel { | |||||
/// | /// | ||||
DataInputer *const GetDataInputer() const { return data_inputer_; } | DataInputer *const GetDataInputer() const { return data_inputer_; } | ||||
uint32_t GetDataInputerSize() { | |||||
GE_CHECK_NOTNULL(data_inputer_); | |||||
return data_inputer_->Size(); | |||||
} | |||||
// get Stream number | // get Stream number | ||||
uint32_t StreamNum() const { return runtime_param_.stream_num; } | uint32_t StreamNum() const { return runtime_param_.stream_num; } | ||||
@@ -248,7 +254,10 @@ class DavinciModel { | |||||
string Name() const { return name_; } | string Name() const { return name_; } | ||||
// om_name | // om_name | ||||
string OmName() const { return om_name_; } | |||||
const string &OmName() const { return om_name_; } | |||||
// dump_model_name | |||||
const string &DumpModelName() const { return dump_model_name_; } | |||||
// version | // version | ||||
uint32_t Version() const { return version_; } | uint32_t Version() const { return version_; } | ||||
@@ -273,6 +282,8 @@ class DavinciModel { | |||||
const vector<rtLabel_t> &GetLabelList() const { return label_list_; } | const vector<rtLabel_t> &GetLabelList() const { return label_list_; } | ||||
Status GetLabelGotoAddr(uint32_t label_index, rtMemType_t memory_type, void *&addr, uint32_t &size); | |||||
Status DestroyThread(); | Status DestroyThread(); | ||||
// get Op | // get Op | ||||
@@ -466,13 +477,17 @@ class DavinciModel { | |||||
Status ReportProfilingData(); | Status ReportProfilingData(); | ||||
void SaveDumpOpInfo(const RuntimeParam &model_param, const OpDescPtr &op, uint32_t task_id, uint32_t stream_id) { | void SaveDumpOpInfo(const RuntimeParam &model_param, const OpDescPtr &op, uint32_t task_id, uint32_t stream_id) { | ||||
data_dumper_.SaveDumpOpInfo(model_param, op, task_id, stream_id); | |||||
exception_dumper_.SaveDumpOpInfo(model_param, op, task_id, stream_id); | |||||
} | } | ||||
void SaveDumpTask(uint32_t task_id, uint32_t stream_id, const shared_ptr<OpDesc> &op_desc, uintptr_t args) { | void SaveDumpTask(uint32_t task_id, uint32_t stream_id, const shared_ptr<OpDesc> &op_desc, uintptr_t args) { | ||||
data_dumper_.SaveDumpTask(task_id, stream_id, op_desc, args); | data_dumper_.SaveDumpTask(task_id, stream_id, op_desc, args); | ||||
} | } | ||||
Status DumpExceptionInfo(const std::vector<rtExceptionInfo> &exception_infos) const { | |||||
return exception_dumper_.DumpExceptionInfo(exception_infos); | |||||
} | |||||
void SetKnownShapeGlobalStep(void *global_step) { | void SetKnownShapeGlobalStep(void *global_step) { | ||||
known_shape_global_step_ = global_step; | known_shape_global_step_ = global_step; | ||||
} | } | ||||
@@ -481,6 +496,12 @@ class DavinciModel { | |||||
data_dumper_.DumpShrink(); | data_dumper_.DumpShrink(); | ||||
} | } | ||||
bool OpNeedDump(const string &op_name) { | |||||
return GetDumpProperties().IsLayerNeedDump(dump_model_name_, om_name_, op_name); | |||||
} | |||||
bool ModelNeedDump(); | |||||
void SetEndGraphId(uint32_t task_id, uint32_t stream_id); | void SetEndGraphId(uint32_t task_id, uint32_t stream_id); | ||||
DavinciModel &operator=(const DavinciModel &model) = delete; | DavinciModel &operator=(const DavinciModel &model) = delete; | ||||
@@ -529,10 +550,10 @@ class DavinciModel { | |||||
void SetKnownNode(bool known_node) { known_node_ = known_node; } | void SetKnownNode(bool known_node) { known_node_ = known_node; } | ||||
bool IsKnownNode() { return known_node_; } | bool IsKnownNode() { return known_node_; } | ||||
Status MallocKnownArgs(); | Status MallocKnownArgs(); | ||||
Status CheckCapability(rtFeatureType_t featureType, int32_t featureInfo, bool &is_support) const; | |||||
Status UpdateKnownNodeArgs(const vector<void *> &inputs, const vector<void *> &outputs); | Status UpdateKnownNodeArgs(const vector<void *> &inputs, const vector<void *> &outputs); | ||||
Status CreateKnownZeroCopyMap(const vector<void *> &inputs, const vector<void *> &outputs); | Status CreateKnownZeroCopyMap(const vector<void *> &inputs, const vector<void *> &outputs); | ||||
Status UpdateKnownZeroCopyAddr(vector<void *> &total_io_addrs, bool update_args = true); | Status UpdateKnownZeroCopyAddr(vector<void *> &total_io_addrs, bool update_args = true); | ||||
void SetKnownNodeAddrNotChanged(bool base_addr_not_changed) { base_addr_not_changed_ = base_addr_not_changed; } | |||||
Status GetOrigInputInfo(uint32_t index, OriginInputInfo &orig_input_info) const; | Status GetOrigInputInfo(uint32_t index, OriginInputInfo &orig_input_info) const; | ||||
Status GetAllAippInputOutputDims(uint32_t index, vector<InputOutputDims> &input_dims, | Status GetAllAippInputOutputDims(uint32_t index, vector<InputOutputDims> &input_dims, | ||||
@@ -540,13 +561,19 @@ class DavinciModel { | |||||
// om file name | // om file name | ||||
void SetOmName(const string &om_name) { om_name_ = om_name; } | void SetOmName(const string &om_name) { om_name_ = om_name; } | ||||
void SetDumpModelName(const string &dump_model_name) { dump_model_name_ = dump_model_name; } | |||||
void SetDumpProperties(const DumpProperties &dump_properties) { data_dumper_.SetDumpProperties(dump_properties); } | void SetDumpProperties(const DumpProperties &dump_properties) { data_dumper_.SetDumpProperties(dump_properties); } | ||||
const DumpProperties &GetDumpProperties() const { return data_dumper_.GetDumpProperties(); } | const DumpProperties &GetDumpProperties() const { return data_dumper_.GetDumpProperties(); } | ||||
bool GetOpDescInfo(uint32_t stream_id, uint32_t task_id, OpDescInfo &op_desc_info) const { | bool GetOpDescInfo(uint32_t stream_id, uint32_t task_id, OpDescInfo &op_desc_info) const { | ||||
return data_dumper_.GetOpDescInfo(stream_id, task_id, op_desc_info); | |||||
return exception_dumper_.GetOpDescInfo(stream_id, task_id, op_desc_info); | |||||
} | } | ||||
void UpdateOpIOAddrs(uint32_t task_id, uint32_t stream_id, const std::vector<void *> &io_addrs); | |||||
bool GetRunningFlag() const { return running_flg_; } | |||||
void SetRunningFlag(bool flag) { running_flg_ = flag; } | |||||
Status SetRunAsyncListenerCallback(const RunAsyncCallback &callback); | |||||
private: | private: | ||||
// memory address of weights | // memory address of weights | ||||
@@ -886,6 +913,7 @@ class DavinciModel { | |||||
// used for inference data dump | // used for inference data dump | ||||
string om_name_; | string om_name_; | ||||
string dump_model_name_; | |||||
uint32_t version_; | uint32_t version_; | ||||
GeModelPtr ge_model_; // release after DavinciModel::Init | GeModelPtr ge_model_; // release after DavinciModel::Init | ||||
@@ -911,6 +939,8 @@ class DavinciModel { | |||||
shared_ptr<ModelListener> listener_; | shared_ptr<ModelListener> listener_; | ||||
bool run_flg_; | bool run_flg_; | ||||
// check whether model is running with data | |||||
bool running_flg_ = false; | |||||
mutex mux_run_flg_; | mutex mux_run_flg_; | ||||
@@ -930,6 +960,9 @@ class DavinciModel { | |||||
vector<rtLabel_t> label_list_; | vector<rtLabel_t> label_list_; | ||||
set<uint32_t> label_id_indication_; | set<uint32_t> label_id_indication_; | ||||
mutex label_args_mutex_; | |||||
map<uint32_t, pair<void *, uint32_t>> label_goto_args_; | |||||
mutex outside_addrs_mutex_; | mutex outside_addrs_mutex_; | ||||
vector<ZeroCopyTask> zero_copy_tasks_; // Task used Data or NetOutput addr. | vector<ZeroCopyTask> zero_copy_tasks_; // Task used Data or NetOutput addr. | ||||
set<const void *> copy_only_addrs_; // Address need copy to original place. | set<const void *> copy_only_addrs_; // Address need copy to original place. | ||||
@@ -985,6 +1018,7 @@ class DavinciModel { | |||||
int64_t maxDumpOpNum_; | int64_t maxDumpOpNum_; | ||||
// for data dump | // for data dump | ||||
DataDumper data_dumper_; | DataDumper data_dumper_; | ||||
ExceptionDumper exception_dumper_; | |||||
OpdebugRegister opdebug_register_; | OpdebugRegister opdebug_register_; | ||||
uint64_t iterator_count_; | uint64_t iterator_count_; | ||||
bool is_l1_fusion_enable_; | bool is_l1_fusion_enable_; | ||||
@@ -1002,8 +1036,6 @@ class DavinciModel { | |||||
map<const void *, void *> known_input_data_info_; | map<const void *, void *> known_input_data_info_; | ||||
map<const void *, void *> known_output_data_info_; | map<const void *, void *> known_output_data_info_; | ||||
vector<void *> total_io_addrs_; | vector<void *> total_io_addrs_; | ||||
vector<void *> orig_total_io_addrs_; | |||||
bool base_addr_not_changed_ = false; | |||||
vector<vector<int64_t>> batch_info_; | vector<vector<int64_t>> batch_info_; | ||||
vector<vector<int64_t>> combined_batch_info_; | vector<vector<int64_t>> combined_batch_info_; | ||||
@@ -99,11 +99,17 @@ Status ModelManager::KernelLaunchEx(aicpu::FWKAdapter::FWKOperateType op_type, u | |||||
auto kernel_size = sizeof(uint64_t) * (v_aicpu_kernel.size()); | auto kernel_size = sizeof(uint64_t) * (v_aicpu_kernel.size()); | ||||
rtError_t rt_ret = rtMalloc(&aicpu_kernel_addr, kernel_size, RT_MEMORY_HBM); | rtError_t rt_ret = rtMalloc(&aicpu_kernel_addr, kernel_size, RT_MEMORY_HBM); | ||||
GE_IF_BOOL_EXEC(rt_ret != RT_ERROR_NONE, GELOGE(RT_FAILED, "rtMalloc error, ret: 0x%X", rt_ret); | |||||
GE_IF_BOOL_EXEC(rt_ret != RT_ERROR_NONE, | |||||
REPORT_CALL_ERROR("E19999", "Call rtMalloc failed, size:%zu, ret: 0x%X", | |||||
kernel_size, rt_ret); | |||||
GELOGE(RT_FAILED, "rtMalloc error, ret: 0x%X", rt_ret); | |||||
return RT_ERROR_TO_GE_STATUS(rt_ret);) | return RT_ERROR_TO_GE_STATUS(rt_ret);) | ||||
rt_ret = rtMemcpy(aicpu_kernel_addr, kernel_size, v_aicpu_kernel.data(), kernel_size, RT_MEMCPY_HOST_TO_DEVICE); | rt_ret = rtMemcpy(aicpu_kernel_addr, kernel_size, v_aicpu_kernel.data(), kernel_size, RT_MEMCPY_HOST_TO_DEVICE); | ||||
GE_IF_BOOL_EXEC(rt_ret != RT_ERROR_NONE, GELOGE(RT_FAILED, "rtMemcpy to input_output_addr_ error: 0x%X", rt_ret); | |||||
GE_IF_BOOL_EXEC(rt_ret != RT_ERROR_NONE, | |||||
REPORT_CALL_ERROR("E19999", "Call rtMemcpy failed, size:%zu, ret: 0x%X", | |||||
kernel_size, rt_ret); | |||||
GELOGE(RT_FAILED, "rtMemcpy to input_output_addr_ error: 0x%X", rt_ret); | |||||
GE_CHK_RT(rtFree(aicpu_kernel_addr)); return RT_ERROR_TO_GE_STATUS(rt_ret);) | GE_CHK_RT(rtFree(aicpu_kernel_addr)); return RT_ERROR_TO_GE_STATUS(rt_ret);) | ||||
uint64_t kernel_id_addr = static_cast<uint64_t>(reinterpret_cast<uintptr_t>(aicpu_kernel_addr)); | uint64_t kernel_id_addr = static_cast<uint64_t>(reinterpret_cast<uintptr_t>(aicpu_kernel_addr)); | ||||
param_base.fwkKernelBase.fwk_kernel.kernelID = kernel_id_addr; | param_base.fwkKernelBase.fwk_kernel.kernelID = kernel_id_addr; | ||||
@@ -114,6 +120,8 @@ Status ModelManager::KernelLaunchEx(aicpu::FWKAdapter::FWKOperateType op_type, u | |||||
rtError_t rt_ret = rtMalloc(&(devicebase), sizeof(STR_FWK_OP_KERNEL), RT_MEMORY_HBM); | rtError_t rt_ret = rtMalloc(&(devicebase), sizeof(STR_FWK_OP_KERNEL), RT_MEMORY_HBM); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtMalloc failed, size:%zu, ret: 0x%X", | |||||
sizeof(STR_FWK_OP_KERNEL), rt_ret); | |||||
GELOGE(RT_FAILED, "malloc device memory failed. ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "malloc device memory failed. ret: 0x%X", rt_ret); | ||||
GE_IF_BOOL_EXEC(aicpu_kernel_addr != nullptr, GE_CHK_RT(rtFree(aicpu_kernel_addr))); | GE_IF_BOOL_EXEC(aicpu_kernel_addr != nullptr, GE_CHK_RT(rtFree(aicpu_kernel_addr))); | ||||
return RT_ERROR_TO_GE_STATUS(rt_ret); | return RT_ERROR_TO_GE_STATUS(rt_ret); | ||||
@@ -122,6 +130,8 @@ Status ModelManager::KernelLaunchEx(aicpu::FWKAdapter::FWKOperateType op_type, u | |||||
rt_ret = | rt_ret = | ||||
rtMemcpy(devicebase, sizeof(STR_FWK_OP_KERNEL), ¶m_base, sizeof(STR_FWK_OP_KERNEL), RT_MEMCPY_HOST_TO_DEVICE); | rtMemcpy(devicebase, sizeof(STR_FWK_OP_KERNEL), ¶m_base, sizeof(STR_FWK_OP_KERNEL), RT_MEMCPY_HOST_TO_DEVICE); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtMemcpy failed, size:%zu, ret: 0x%X", | |||||
sizeof(STR_FWK_OP_KERNEL), rt_ret); | |||||
GELOGE(RT_FAILED, "memory copy to device failed. ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "memory copy to device failed. ret: 0x%X", rt_ret); | ||||
GE_IF_BOOL_EXEC(aicpu_kernel_addr != nullptr, GE_CHK_RT(rtFree(aicpu_kernel_addr))); | GE_IF_BOOL_EXEC(aicpu_kernel_addr != nullptr, GE_CHK_RT(rtFree(aicpu_kernel_addr))); | ||||
GE_CHK_RT(rtFree(devicebase)); | GE_CHK_RT(rtFree(devicebase)); | ||||
@@ -131,6 +141,7 @@ Status ModelManager::KernelLaunchEx(aicpu::FWKAdapter::FWKOperateType op_type, u | |||||
rtStream_t stream = nullptr; | rtStream_t stream = nullptr; | ||||
rt_ret = rtStreamCreate(&stream, 0); | rt_ret = rtStreamCreate(&stream, 0); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtStreamCreate failed, ret: 0x%X", rt_ret); | |||||
GELOGE(RT_FAILED, "create stream failed. ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "create stream failed. ret: 0x%X", rt_ret); | ||||
GE_IF_BOOL_EXEC(aicpu_kernel_addr != nullptr, GE_CHK_RT(rtFree(aicpu_kernel_addr))); | GE_IF_BOOL_EXEC(aicpu_kernel_addr != nullptr, GE_CHK_RT(rtFree(aicpu_kernel_addr))); | ||||
GE_CHK_RT(rtFree(devicebase)); | GE_CHK_RT(rtFree(devicebase)); | ||||
@@ -139,6 +150,7 @@ Status ModelManager::KernelLaunchEx(aicpu::FWKAdapter::FWKOperateType op_type, u | |||||
rt_ret = rtKernelLaunchEx(devicebase, sizeof(STR_FWK_OP_KERNEL), 0, stream); | rt_ret = rtKernelLaunchEx(devicebase, sizeof(STR_FWK_OP_KERNEL), 0, stream); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtKernelLaunchEx failed, ret: 0x%X", rt_ret); | |||||
GELOGE(RT_FAILED, "rtKernelLaunchEx failed. ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "rtKernelLaunchEx failed. ret: 0x%X", rt_ret); | ||||
GE_IF_BOOL_EXEC(aicpu_kernel_addr != nullptr, GE_CHK_RT(rtFree(aicpu_kernel_addr))); | GE_IF_BOOL_EXEC(aicpu_kernel_addr != nullptr, GE_CHK_RT(rtFree(aicpu_kernel_addr))); | ||||
GE_CHK_RT(rtFree(devicebase)); | GE_CHK_RT(rtFree(devicebase)); | ||||
@@ -147,6 +159,8 @@ Status ModelManager::KernelLaunchEx(aicpu::FWKAdapter::FWKOperateType op_type, u | |||||
} | } | ||||
rt_ret = rtStreamSynchronize(stream); | rt_ret = rtStreamSynchronize(stream); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtStreamSynchronize failed, ret: 0x%X", | |||||
rt_ret); | |||||
GELOGE(RT_FAILED, "rtStreamSynchronize failed. ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "rtStreamSynchronize failed. ret: 0x%X", rt_ret); | ||||
GE_IF_BOOL_EXEC(aicpu_kernel_addr != nullptr, GE_CHK_RT(rtFree(aicpu_kernel_addr))); | GE_IF_BOOL_EXEC(aicpu_kernel_addr != nullptr, GE_CHK_RT(rtFree(aicpu_kernel_addr))); | ||||
GE_CHK_RT(rtFree(devicebase)); | GE_CHK_RT(rtFree(devicebase)); | ||||
@@ -156,6 +170,7 @@ Status ModelManager::KernelLaunchEx(aicpu::FWKAdapter::FWKOperateType op_type, u | |||||
if (aicpu_kernel_addr != nullptr) { | if (aicpu_kernel_addr != nullptr) { | ||||
rt_ret = rtFree(aicpu_kernel_addr); | rt_ret = rtFree(aicpu_kernel_addr); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtFree failed, ret: 0x%X", rt_ret); | |||||
GELOGE(RT_FAILED, "free memory failed. ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "free memory failed. ret: 0x%X", rt_ret); | ||||
GE_CHK_RT(rtFree(devicebase)); | GE_CHK_RT(rtFree(devicebase)); | ||||
GE_CHK_RT(rtStreamDestroy(stream)); | GE_CHK_RT(rtStreamDestroy(stream)); | ||||
@@ -164,12 +179,14 @@ Status ModelManager::KernelLaunchEx(aicpu::FWKAdapter::FWKOperateType op_type, u | |||||
} | } | ||||
rt_ret = rtFree(devicebase); | rt_ret = rtFree(devicebase); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtFree failed, ret: 0x%X", rt_ret); | |||||
GELOGE(RT_FAILED, "free memory failed. ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "free memory failed. ret: 0x%X", rt_ret); | ||||
GE_CHK_RT(rtStreamDestroy(stream)); | GE_CHK_RT(rtStreamDestroy(stream)); | ||||
return RT_ERROR_TO_GE_STATUS(rt_ret); | return RT_ERROR_TO_GE_STATUS(rt_ret); | ||||
} | } | ||||
rt_ret = rtStreamDestroy(stream); | rt_ret = rtStreamDestroy(stream); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtStreamDestroy failed, ret: 0x%X", rt_ret); | |||||
GELOGE(RT_FAILED, "rtStreamDestroy failed. ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "rtStreamDestroy failed. ret: 0x%X", rt_ret); | ||||
return RT_ERROR_TO_GE_STATUS(rt_ret); | return RT_ERROR_TO_GE_STATUS(rt_ret); | ||||
} | } | ||||
@@ -216,6 +233,8 @@ ge::Status ModelManager::DestroyAicpuSessionForInfer(uint32_t model_id) { | |||||
auto it = model_map_.find(model_id); | auto it = model_map_.find(model_id); | ||||
if (it == model_map_.end()) { | if (it == model_map_.end()) { | ||||
REPORT_INNER_ERROR("E19999", "Param model_id:%u can't find in model_map, check invalid", | |||||
model_id); | |||||
GELOGE(ACL_ERROR_GE_EXEC_MODEL_ID_INVALID, "model id %u does not exists.", model_id); | GELOGE(ACL_ERROR_GE_EXEC_MODEL_ID_INVALID, "model id %u does not exists.", model_id); | ||||
return ACL_ERROR_GE_EXEC_MODEL_ID_INVALID; | return ACL_ERROR_GE_EXEC_MODEL_ID_INVALID; | ||||
} | } | ||||
@@ -233,6 +252,8 @@ ge::Status ModelManager::DestroyAicpuKernel(uint64_t session_id, uint32_t model_ | |||||
Status ret = KernelLaunchEx(aicpu::FWKAdapter::FWKOperateType::FWK_ADPT_KERNEL_DESTROY, session_id, model_id, | Status ret = KernelLaunchEx(aicpu::FWKAdapter::FWKOperateType::FWK_ADPT_KERNEL_DESTROY, session_id, model_id, | ||||
sub_model_id); | sub_model_id); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Call KernelLaunchEx fail, model_id:%u, sub_model_id:%u, session_id:%lu", | |||||
model_id, sub_model_id, session_id); | |||||
GELOGE(FAILED, "Destroy aicpu kernel failed."); | GELOGE(FAILED, "Destroy aicpu kernel failed."); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -259,6 +280,7 @@ ModelManager::~ModelManager() { | |||||
model_map_.clear(); | model_map_.clear(); | ||||
model_aicpu_kernel_.clear(); | model_aicpu_kernel_.clear(); | ||||
cust_aicpu_so_.clear(); | cust_aicpu_so_.clear(); | ||||
dump_exception_flag_ = false; | |||||
GE_IF_BOOL_EXEC(device_count > 0, GE_CHK_RT(rtDeviceReset(0))); | GE_IF_BOOL_EXEC(device_count > 0, GE_CHK_RT(rtDeviceReset(0))); | ||||
} | } | ||||
@@ -271,7 +293,7 @@ ge::Status ModelManager::SetDynamicSize(uint32_t model_id, const std::vector<uin | |||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
ge::Status ModelManager::DoLoadHybridModelOnline(uint32_t model_id, const string &model_name, | |||||
ge::Status ModelManager::DoLoadHybridModelOnline(uint32_t model_id, const string &om_name, | |||||
const shared_ptr<ge::GeRootModel> &ge_root_model, | const shared_ptr<ge::GeRootModel> &ge_root_model, | ||||
const shared_ptr<ModelListener> &listener) { | const shared_ptr<ModelListener> &listener) { | ||||
auto hybrid_model = hybrid::HybridDavinciModel::Create(ge_root_model); | auto hybrid_model = hybrid::HybridDavinciModel::Create(ge_root_model); | ||||
@@ -279,13 +301,26 @@ ge::Status ModelManager::DoLoadHybridModelOnline(uint32_t model_id, const string | |||||
hybrid_model->SetListener(listener); | hybrid_model->SetListener(listener); | ||||
hybrid_model->SetModelId(model_id); | hybrid_model->SetModelId(model_id); | ||||
hybrid_model->SetDeviceId(GetContext().DeviceId()); | hybrid_model->SetDeviceId(GetContext().DeviceId()); | ||||
hybrid_model->SetModelName(model_name); | |||||
hybrid_model->SetOmName(om_name); | |||||
GE_CHK_STATUS_RET(hybrid_model->Init(), "Failed to init hybrid model. model_id = %u", model_id); | GE_CHK_STATUS_RET(hybrid_model->Init(), "Failed to init hybrid model. model_id = %u", model_id); | ||||
auto shared_model = std::shared_ptr<hybrid::HybridDavinciModel>(hybrid_model.release()); | auto shared_model = std::shared_ptr<hybrid::HybridDavinciModel>(hybrid_model.release()); | ||||
InsertModel(model_id, shared_model); | InsertModel(model_id, shared_model); | ||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
bool ModelManager::IsNeedHybridLoad(ge::GeRootModel &ge_root_model) { | |||||
auto root_graph = ge_root_model.GetRootGraph(); | |||||
if (root_graph == nullptr) { | |||||
REPORT_INNER_ERROR("E19999", "root graph in param ge_root_model is nullptr, model_id:%u, " | |||||
"check invalid", ge_root_model.GetModelId()); | |||||
GELOGE(FAILED, "no model on root model"); | |||||
return false; | |||||
} | |||||
bool is_shape_unknown = root_graph->GetGraphUnknownFlag(); | |||||
bool is_dsp_partitioned_graph = false; | |||||
(void)AttrUtils::GetBool(root_graph, ATTR_NAME_DYNAMIC_SHAPE_PARTITIONED, is_dsp_partitioned_graph); | |||||
return is_shape_unknown || is_dsp_partitioned_graph || GetContext().GetHostExecFlag(); | |||||
} | |||||
/// | /// | ||||
/// @ingroup domi_ome | /// @ingroup domi_ome | ||||
/// @brief load model online | /// @brief load model online | ||||
@@ -296,19 +331,18 @@ Status ModelManager::LoadModelOnline(uint32_t &model_id, const shared_ptr<ge::Ge | |||||
GE_CHK_BOOL_RET_STATUS(listener.get() != nullptr, PARAM_INVALID, "Param incorrect, listener is null"); | GE_CHK_BOOL_RET_STATUS(listener.get() != nullptr, PARAM_INVALID, "Param incorrect, listener is null"); | ||||
if (model_id == INVALID_MODEL_ID) { | if (model_id == INVALID_MODEL_ID) { | ||||
GenModelId(&model_id); | GenModelId(&model_id); | ||||
GELOGD("Generate new model_id:%u", model_id); | |||||
} | } | ||||
bool is_shape_unknown = false; | |||||
string model_name = ""; | |||||
GE_CHK_STATUS_RET(ge_root_model->CheckIsUnknownShape(is_shape_unknown), "CheckIsUnknownShape failed, model id:%u", | |||||
model_id); | |||||
if (is_shape_unknown || GetContext().GetHostExecFlag()) { | |||||
return DoLoadHybridModelOnline(model_id, model_name, ge_root_model, listener); | |||||
auto name_to_model = ge_root_model->GetSubgraphInstanceNameToModel(); | |||||
string om_name; | |||||
if (IsNeedHybridLoad(*ge_root_model)) { | |||||
return DoLoadHybridModelOnline(model_id, om_name, ge_root_model, listener); | |||||
} | } | ||||
mmTimespec timespec = mmGetTickCount(); | mmTimespec timespec = mmGetTickCount(); | ||||
std::shared_ptr<DavinciModel> davinci_model = MakeShared<DavinciModel>(0, listener); | std::shared_ptr<DavinciModel> davinci_model = MakeShared<DavinciModel>(0, listener); | ||||
if (davinci_model == nullptr) { | if (davinci_model == nullptr) { | ||||
REPORT_CALL_ERROR("E19999", "New DavinciModel fail, model_id:%u", model_id); | |||||
GELOGE(FAILED, "davinci_model is nullptr"); | GELOGE(FAILED, "davinci_model is nullptr"); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -324,7 +358,6 @@ Status ModelManager::LoadModelOnline(uint32_t &model_id, const shared_ptr<ge::Ge | |||||
auto root_graph = ge_root_model->GetRootGraph(); | auto root_graph = ge_root_model->GetRootGraph(); | ||||
GE_CHECK_NOTNULL(root_graph); | GE_CHECK_NOTNULL(root_graph); | ||||
string root_model_name = root_graph->GetName(); | string root_model_name = root_graph->GetName(); | ||||
auto name_to_model = ge_root_model->GetSubgraphInstanceNameToModel(); | |||||
GeModelPtr ge_model = name_to_model[root_model_name]; | GeModelPtr ge_model = name_to_model[root_model_name]; | ||||
Status ret = SUCCESS; | Status ret = SUCCESS; | ||||
do { | do { | ||||
@@ -332,7 +365,18 @@ Status ModelManager::LoadModelOnline(uint32_t &model_id, const shared_ptr<ge::Ge | |||||
GE_IF_BOOL_EXEC(SUCCESS != (ret = davinci_model->Assign(ge_model)), GELOGW("assign model to modeldef failed."); | GE_IF_BOOL_EXEC(SUCCESS != (ret = davinci_model->Assign(ge_model)), GELOGW("assign model to modeldef failed."); | ||||
break;); | break;); | ||||
GE_TIMESTAMP_END(Assign, "GraphLoader::ModelAssign"); | GE_TIMESTAMP_END(Assign, "GraphLoader::ModelAssign"); | ||||
/// In multi-threaded inference, using the same session_id among multiple threads may cause some threads to fail. | |||||
/// These session_ids come from the same model, so the values of session_id are the same. | |||||
/// Update session_id for infer in load model to avoid the same session_id. | |||||
if (!ge_root_model->GetTrainFlag()) { | |||||
uint64_t new_session_id; | |||||
ret = GenSessionId(new_session_id); | |||||
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(ret != SUCCESS, return ret, "Generate session_id for infer failed."); | |||||
ret = davinci_model->UpdateSessionId(new_session_id); | |||||
GE_CHK_BOOL_TRUE_EXEC_WITH_LOG(ret != SUCCESS, return ret, "Update session_id for infer failed."); | |||||
ge_model->InsertSessionMap(model_id, new_session_id); | |||||
GELOGD("Update new session id: %lu.", new_session_id); | |||||
} | |||||
GE_TIMESTAMP_START(Init); | GE_TIMESTAMP_START(Init); | ||||
GE_IF_BOOL_EXEC(SUCCESS != (ret = davinci_model->Init()), GELOGW("DavinciInit failed."); break;); | GE_IF_BOOL_EXEC(SUCCESS != (ret = davinci_model->Init()), GELOGW("DavinciInit failed."); break;); | ||||
GE_TIMESTAMP_END(Init, "GraphLoader::ModelInit"); | GE_TIMESTAMP_END(Init, "GraphLoader::ModelInit"); | ||||
@@ -345,16 +389,16 @@ Status ModelManager::LoadModelOnline(uint32_t &model_id, const shared_ptr<ge::Ge | |||||
return ret; | return ret; | ||||
} | } | ||||
void ModelManager::InsertModel(uint32_t id, std::shared_ptr<DavinciModel> &davinci_model) { | |||||
GE_CHK_BOOL_EXEC(davinci_model != nullptr, return, "davinci_model ptr is null, id: %u", id); | |||||
void ModelManager::InsertModel(uint32_t model_id, std::shared_ptr<DavinciModel> &davinci_model) { | |||||
GE_CHK_BOOL_EXEC(davinci_model != nullptr, return, "davinci_model ptr is null, id: %u", model_id); | |||||
std::lock_guard<std::recursive_mutex> lock(map_mutex_); | std::lock_guard<std::recursive_mutex> lock(map_mutex_); | ||||
model_map_[id] = davinci_model; | |||||
model_map_[model_id] = davinci_model; | |||||
} | } | ||||
void ModelManager::InsertModel(uint32_t id, shared_ptr<hybrid::HybridDavinciModel> &hybrid_model) { | |||||
GE_CHK_BOOL_EXEC(hybrid_model != nullptr, return, "hybrid_model ptr is null, id: %u", id); | |||||
void ModelManager::InsertModel(uint32_t model_id, shared_ptr<hybrid::HybridDavinciModel> &hybrid_model) { | |||||
GE_CHK_BOOL_EXEC(hybrid_model != nullptr, return, "hybrid_model ptr is null, id: %u", model_id); | |||||
std::lock_guard<std::recursive_mutex> lock(map_mutex_); | std::lock_guard<std::recursive_mutex> lock(map_mutex_); | ||||
hybrid_model_map_[id] = hybrid_model; | |||||
hybrid_model_map_[model_id] = hybrid_model; | |||||
} | } | ||||
Status ModelManager::DeleteModel(uint32_t id) { | Status ModelManager::DeleteModel(uint32_t id) { | ||||
@@ -374,6 +418,8 @@ Status ModelManager::DeleteModel(uint32_t id) { | |||||
} else if (hybrid_model_it != hybrid_model_map_.end()) { | } else if (hybrid_model_it != hybrid_model_map_.end()) { | ||||
(void)hybrid_model_map_.erase(hybrid_model_it); | (void)hybrid_model_map_.erase(hybrid_model_it); | ||||
} else { | } else { | ||||
REPORT_INNER_ERROR("E19999", "model_id:%u not exist in model_map, check invalid", | |||||
id); | |||||
GELOGE(ACL_ERROR_GE_EXEC_MODEL_ID_INVALID, "model id %u does not exists.", id); | GELOGE(ACL_ERROR_GE_EXEC_MODEL_ID_INVALID, "model id %u does not exists.", id); | ||||
return ACL_ERROR_GE_EXEC_MODEL_ID_INVALID; | return ACL_ERROR_GE_EXEC_MODEL_ID_INVALID; | ||||
} | } | ||||
@@ -420,6 +466,7 @@ Status ModelManager::DataInput(const InputData &input_data, OutputData &output_d | |||||
Status status = data_wrap->Init(input_data, output_data); | Status status = data_wrap->Init(input_data, output_data); | ||||
if (status != SUCCESS) { | if (status != SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Init InputDataWrapper failed, input data index: %u", input_data.index); | |||||
GELOGE(domi::PUSH_DATA_FAILED, "Init InputDataWrapper failed, input data index: %u.", input_data.index); | GELOGE(domi::PUSH_DATA_FAILED, "Init InputDataWrapper failed, input data index: %u.", input_data.index); | ||||
return domi::PUSH_DATA_FAILED; | return domi::PUSH_DATA_FAILED; | ||||
} | } | ||||
@@ -436,6 +483,7 @@ Status ModelManager::DataInput(const InputData &input_data, OutputData &output_d | |||||
DataInputer *inputer = model->GetDataInputer(); | DataInputer *inputer = model->GetDataInputer(); | ||||
GE_CHECK_NOTNULL(inputer); | GE_CHECK_NOTNULL(inputer); | ||||
if (inputer->Push(data_wrap) != SUCCESS) { | if (inputer->Push(data_wrap) != SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "DataInputer queue is full, please call again later, model_id %u", model_id); | |||||
GELOGE(domi::DATA_QUEUE_ISFULL, "Data queue is full, please call again later, model_id %u ", model_id); | GELOGE(domi::DATA_QUEUE_ISFULL, "Data queue is full, please call again later, model_id %u ", model_id); | ||||
return domi::DATA_QUEUE_ISFULL; | return domi::DATA_QUEUE_ISFULL; | ||||
} | } | ||||
@@ -449,6 +497,9 @@ Status ModelManager::GetCurDynamicDims(const vector<vector<int64_t>> &user_real_ | |||||
vector<int32_t> &cur_dynamic_dims) { | vector<int32_t> &cur_dynamic_dims) { | ||||
GELOGD("Start get cur dynamic dims."); | GELOGD("Start get cur dynamic dims."); | ||||
if (user_real_input_dims.size() != user_input_dims.size()) { | if (user_real_input_dims.size() != user_input_dims.size()) { | ||||
REPORT_INNER_ERROR("E19999", "Param user_real_input_dims.size:%zu != user_input_dims.size:%zu, " | |||||
"check invalid", | |||||
user_real_input_dims.size(), user_input_dims.size()); | |||||
GELOGE(INTERNAL_ERROR, | GELOGE(INTERNAL_ERROR, | ||||
"The input count of user: %zu should be equal to the data count of graph: %zu", | "The input count of user: %zu should be equal to the data count of graph: %zu", | ||||
user_real_input_dims.size(), user_input_dims.size()); | user_real_input_dims.size(), user_input_dims.size()); | ||||
@@ -457,6 +508,9 @@ Status ModelManager::GetCurDynamicDims(const vector<vector<int64_t>> &user_real_ | |||||
for (size_t i = 0; i < user_input_dims.size(); ++i) { | for (size_t i = 0; i < user_input_dims.size(); ++i) { | ||||
if (user_real_input_dims[i].size() != user_input_dims[i].second.size()) { | if (user_real_input_dims[i].size() != user_input_dims[i].second.size()) { | ||||
REPORT_INNER_ERROR("E19999", "Param user_real_input_dims[%zu].size:%zu != user_input_dims[%zu].size:%zu, " | |||||
"check invalid", i, user_real_input_dims[i].size(), | |||||
i, user_input_dims[i].second.size()); | |||||
GELOGE(INTERNAL_ERROR, | GELOGE(INTERNAL_ERROR, | ||||
"The shape size: %zu of dynamic input: %s should be equal to the shape size of input shape: %zu.", | "The shape size: %zu of dynamic input: %s should be equal to the shape size of input shape: %zu.", | ||||
user_real_input_dims[i].size(), user_input_dims[i].first.c_str(), user_input_dims[i].second.size()); | user_real_input_dims[i].size(), user_input_dims[i].first.c_str(), user_input_dims[i].second.size()); | ||||
@@ -478,6 +532,8 @@ Status ModelManager::GetCurDynamicDims(const vector<vector<int64_t>> &user_real_ | |||||
} | } | ||||
} | } | ||||
if (!cur_dynamic_dims_valid) { | if (!cur_dynamic_dims_valid) { | ||||
REPORT_INNER_ERROR("E19999", "cur dynamic dims is %s, not exist in options, check invalid", | |||||
formats::JoinToString(cur_dynamic_dims).c_str()); | |||||
GELOGE(INTERNAL_ERROR, "Cur dynamic dims is %s, not exist in options.", | GELOGE(INTERNAL_ERROR, "Cur dynamic dims is %s, not exist in options.", | ||||
formats::JoinToString(cur_dynamic_dims).c_str()); | formats::JoinToString(cur_dynamic_dims).c_str()); | ||||
return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
@@ -629,6 +685,8 @@ Status ModelManager::HandleCommand(const Command &command) { | |||||
auto iter = cmds.find(command.cmd_type); | auto iter = cmds.find(command.cmd_type); | ||||
if (iter == cmds.end()) { | if (iter == cmds.end()) { | ||||
REPORT_INNER_ERROR("E19999", "Unsupported command:%s check", | |||||
command.cmd_type.c_str()); | |||||
GELOGE(PARAM_INVALID, "Unsupported command: %s", command.cmd_type.c_str()); | GELOGE(PARAM_INVALID, "Unsupported command: %s", command.cmd_type.c_str()); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
} else { | } else { | ||||
@@ -639,6 +697,9 @@ Status ModelManager::HandleCommand(const Command &command) { | |||||
Status ModelManager::GetModelByCmd(const Command &command, | Status ModelManager::GetModelByCmd(const Command &command, | ||||
std::shared_ptr<DavinciModel> &davinci_model) { | std::shared_ptr<DavinciModel> &davinci_model) { | ||||
if (command.cmd_params.size() < kCmdParSize) { | if (command.cmd_params.size() < kCmdParSize) { | ||||
REPORT_INNER_ERROR("E19999", "command.cmd_params.size:%zu < kCmdParSize:%u, command_type:%s, " | |||||
"check invalid", command.cmd_params.size(), kCmdParSize, | |||||
command.cmd_type.c_str()); | |||||
GELOGE(PARAM_INVALID, "When the cmd_type is '%s', the size of cmd_params must larger than 2.", | GELOGE(PARAM_INVALID, "When the cmd_type is '%s', the size of cmd_params must larger than 2.", | ||||
command.cmd_type.c_str()); | command.cmd_type.c_str()); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
@@ -651,12 +712,18 @@ Status ModelManager::GetModelByCmd(const Command &command, | |||||
try { | try { | ||||
model_id = std::stoi(value); | model_id = std::stoi(value); | ||||
} catch (std::invalid_argument &) { | } catch (std::invalid_argument &) { | ||||
REPORT_INNER_ERROR("E19999", "%s param:%s, check invalid", PROFILE_MODEL_ID.c_str(), | |||||
value.c_str()); | |||||
GELOGE(PARAM_INVALID, "Model id: %s is invalid.", value.c_str()); | GELOGE(PARAM_INVALID, "Model id: %s is invalid.", value.c_str()); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
} catch (std::out_of_range &) { | } catch (std::out_of_range &) { | ||||
REPORT_INNER_ERROR("E19999", "%s param:%s, check out of range", PROFILE_MODEL_ID.c_str(), | |||||
value.c_str()); | |||||
GELOGE(PARAM_INVALID, "Model id: %s is out of range.", value.c_str()); | GELOGE(PARAM_INVALID, "Model id: %s is out of range.", value.c_str()); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
} catch (...) { | } catch (...) { | ||||
REPORT_INNER_ERROR("E19999", "%s param:%s, check cannot change to int", | |||||
PROFILE_MODEL_ID.c_str(), value.c_str()); | |||||
GELOGE(FAILED, "Model id: %s cannot change to int.", value.c_str()); | GELOGE(FAILED, "Model id: %s cannot change to int.", value.c_str()); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -665,10 +732,14 @@ Status ModelManager::GetModelByCmd(const Command &command, | |||||
GE_CHECK_NOTNULL(model_manager); | GE_CHECK_NOTNULL(model_manager); | ||||
davinci_model = model_manager->GetModel(static_cast<uint32_t>(model_id)); | davinci_model = model_manager->GetModel(static_cast<uint32_t>(model_id)); | ||||
if (davinci_model == nullptr) { | if (davinci_model == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "GetModel from model_manager fail, model_id:%u", | |||||
model_id); | |||||
GELOGE(FAILED, "Model id: %d is invaild or model is not loaded.", model_id); | GELOGE(FAILED, "Model id: %d is invaild or model is not loaded.", model_id); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
} else { | } else { | ||||
REPORT_INNER_ERROR("E19999", "Fisrt cmd_param not %s, check invalid", | |||||
PROFILE_MODEL_ID.c_str()); | |||||
GELOGE(FAILED, "The model_id parameter is not found in the command."); | GELOGE(FAILED, "The model_id parameter is not found in the command."); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -732,10 +803,14 @@ Status ModelManager::HandleProfFinalizeCommand(const Command &command) { | |||||
*/ | */ | ||||
Status ModelManager::HandleProfStartCommand(const Command &command) { | Status ModelManager::HandleProfStartCommand(const Command &command) { | ||||
if (command.cmd_params.size() < kProfStartCmdParaSize) { | if (command.cmd_params.size() < kProfStartCmdParaSize) { | ||||
REPORT_INNER_ERROR("E19999", "command.cmd_params.size:%zu < %zu, check invalid", | |||||
command.cmd_params.size(), kProfStartCmdParaSize); | |||||
GELOGE(PARAM_INVALID, "When the cmd_type is 'profile start', the size of cmd_params must larger than 2."); | GELOGE(PARAM_INVALID, "When the cmd_type is 'profile start', the size of cmd_params must larger than 2."); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
} | } | ||||
if (command.cmd_params.size() > kProfCmdParaMaxSize) { | if (command.cmd_params.size() > kProfCmdParaMaxSize) { | ||||
REPORT_INNER_ERROR("E19999", "command.cmd_params.size:%zu > %zu, check invalid", | |||||
command.cmd_params.size(), kProfCmdParaMaxSize); | |||||
GELOGE(PARAM_INVALID, "Command para size[%zu] larger than max[1000].", command.cmd_params.size()); | GELOGE(PARAM_INVALID, "Command para size[%zu] larger than max[1000].", command.cmd_params.size()); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
} | } | ||||
@@ -758,10 +833,14 @@ Status ModelManager::HandleProfStartCommand(const Command &command) { | |||||
Status ModelManager::HandleProfStopCommand(const Command &command) { | Status ModelManager::HandleProfStopCommand(const Command &command) { | ||||
if (command.cmd_params.size() < kProfStartCmdParaSize) { | if (command.cmd_params.size() < kProfStartCmdParaSize) { | ||||
REPORT_INNER_ERROR("E19999", "command.cmd_params.size:%zu < %zu, check invalid", | |||||
command.cmd_params.size(), kProfStartCmdParaSize); | |||||
GELOGE(PARAM_INVALID, "When the cmd_type is 'profile stop', the size of cmd_params must larger than 2."); | GELOGE(PARAM_INVALID, "When the cmd_type is 'profile stop', the size of cmd_params must larger than 2."); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
} | } | ||||
if (command.cmd_params.size() > kProfCmdParaMaxSize) { | if (command.cmd_params.size() > kProfCmdParaMaxSize) { | ||||
REPORT_INNER_ERROR("E19999", "command.cmd_params.size:%zu > %zu, check invalid", | |||||
command.cmd_params.size(), kProfCmdParaMaxSize); | |||||
GELOGE(PARAM_INVALID, "Command para size[%zu] larger than max[1000].", command.cmd_params.size()); | GELOGE(PARAM_INVALID, "Command para size[%zu] larger than max[1000].", command.cmd_params.size()); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
} | } | ||||
@@ -787,6 +866,8 @@ static Status ParserPara(const Command &command, const string &dump_key, string | |||||
if (iter != command.cmd_params.end()) { | if (iter != command.cmd_params.end()) { | ||||
++iter; | ++iter; | ||||
if (iter == command.cmd_params.end()) { | if (iter == command.cmd_params.end()) { | ||||
REPORT_INNER_ERROR("E19999", "dump_key:%s can't find in command.param, check invalid", | |||||
dump_key.c_str()); | |||||
GELOGE(PARAM_INVALID, "Invalid access."); | GELOGE(PARAM_INVALID, "Invalid access."); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
} | } | ||||
@@ -797,6 +878,8 @@ static Status ParserPara(const Command &command, const string &dump_key, string | |||||
Status ModelManager::HandleDumpCommand(const Command &command) { | Status ModelManager::HandleDumpCommand(const Command &command) { | ||||
if (command.cmd_params.size() % kDumpCmdPairSize != 0) { | if (command.cmd_params.size() % kDumpCmdPairSize != 0) { | ||||
REPORT_INNER_ERROR("E19999", "command.cmd_params.size:%zu MOD 2 != 0, check invalid", | |||||
command.cmd_params.size()); | |||||
GELOGE(PARAM_INVALID, "When the cmd_type is 'dump', the size of cmd_params must be a even number."); | GELOGE(PARAM_INVALID, "When the cmd_type is 'dump', the size of cmd_params must be a even number."); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
} | } | ||||
@@ -1013,6 +1096,7 @@ Status ModelManager::GenSessionId(uint64_t &session_id) { | |||||
mmTimeval tv; | mmTimeval tv; | ||||
if (mmGetTimeOfDay(&tv, nullptr) != 0) { | if (mmGetTimeOfDay(&tv, nullptr) != 0) { | ||||
REPORT_CALL_ERROR("E19999", "Call mmGetTimeOfDay fail"); | |||||
GELOGE(INTERNAL_ERROR, "Failed to get current time."); | GELOGE(INTERNAL_ERROR, "Failed to get current time."); | ||||
return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
} | } | ||||
@@ -1057,6 +1141,7 @@ Status ModelManager::LoadModelOffline(uint32_t &model_id, const ModelData &model | |||||
GeModelPtr ge_model = model_helper.GetGeModel(); | GeModelPtr ge_model = model_helper.GetGeModel(); | ||||
shared_ptr<DavinciModel> davinci_model = MakeShared<DavinciModel>(model.priority, listener); | shared_ptr<DavinciModel> davinci_model = MakeShared<DavinciModel>(model.priority, listener); | ||||
if (davinci_model == nullptr) { | if (davinci_model == nullptr) { | ||||
REPORT_CALL_ERROR("E19999", "New DavinciModel fail"); | |||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Make shared failed"); | GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "Make shared failed"); | ||||
return ACL_ERROR_GE_MEMORY_ALLOCATION; | return ACL_ERROR_GE_MEMORY_ALLOCATION; | ||||
} | } | ||||
@@ -1072,6 +1157,7 @@ Status ModelManager::LoadModelOffline(uint32_t &model_id, const ModelData &model | |||||
int32_t device_id = 0; | int32_t device_id = 0; | ||||
rtError_t rt_ret = rtGetDevice(&device_id); | rtError_t rt_ret = rtGetDevice(&device_id); | ||||
if (rt_ret != RT_ERROR_NONE || device_id < 0) { | if (rt_ret != RT_ERROR_NONE || device_id < 0) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtGetDevice failed, ret = 0x%X", rt_ret); | |||||
GELOGE(rt_ret, "Call rtGetDevice failed, ret = 0x%X, device_id = %d.", rt_ret, device_id); | GELOGE(rt_ret, "Call rtGetDevice failed, ret = 0x%X, device_id = %d.", rt_ret, device_id); | ||||
return RT_ERROR_TO_GE_STATUS(rt_ret); | return RT_ERROR_TO_GE_STATUS(rt_ret); | ||||
} | } | ||||
@@ -1130,6 +1216,7 @@ Status ModelManager::LoadModelWithQ(uint32_t &model_id, const ModelData &model_d | |||||
shared_ptr<DavinciModel> davinci_model = MakeShared<DavinciModel>(model_data.priority, nullptr); | shared_ptr<DavinciModel> davinci_model = MakeShared<DavinciModel>(model_data.priority, nullptr); | ||||
if (davinci_model == nullptr) { | if (davinci_model == nullptr) { | ||||
REPORT_CALL_ERROR("E19999", "New DavinciModel fail"); | |||||
GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "create model failed."); | GELOGE(ACL_ERROR_GE_MEMORY_ALLOCATION, "create model failed."); | ||||
return ACL_ERROR_GE_MEMORY_ALLOCATION; | return ACL_ERROR_GE_MEMORY_ALLOCATION; | ||||
} | } | ||||
@@ -1250,6 +1337,8 @@ Status ModelManager::LoadCustAicpuSo(const OpDescPtr &op_desc, const string &so_ | |||||
rtContext_t rt_cur_ctx = nullptr; | rtContext_t rt_cur_ctx = nullptr; | ||||
auto rt_error = rtCtxGetCurrent(&rt_cur_ctx); | auto rt_error = rtCtxGetCurrent(&rt_cur_ctx); | ||||
if (rt_error != RT_ERROR_NONE) { | if (rt_error != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtCtxGetCurrent failed, ret = 0x%X", | |||||
rt_error); | |||||
GELOGE(RT_FAILED, "get current context failed, runtime result is %d", static_cast<int>(rt_error)); | GELOGE(RT_FAILED, "get current context failed, runtime result is %d", static_cast<int>(rt_error)); | ||||
return RT_FAILED; | return RT_FAILED; | ||||
} | } | ||||
@@ -1285,6 +1374,8 @@ Status ModelManager::LaunchKernelCustAicpuSo(const string &kernel_name) { | |||||
rtContext_t rt_cur_ctx = nullptr; | rtContext_t rt_cur_ctx = nullptr; | ||||
auto rt_error = rtCtxGetCurrent(&rt_cur_ctx); | auto rt_error = rtCtxGetCurrent(&rt_cur_ctx); | ||||
if (rt_error != RT_ERROR_NONE) { | if (rt_error != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtCtxGetCurrent failed, ret = 0x%X", | |||||
rt_error); | |||||
GELOGE(RT_FAILED, "get current context failed, runtime result is %d", static_cast<int>(rt_error)); | GELOGE(RT_FAILED, "get current context failed, runtime result is %d", static_cast<int>(rt_error)); | ||||
return RT_FAILED; | return RT_FAILED; | ||||
} | } | ||||
@@ -1310,12 +1401,16 @@ Status ModelManager::LaunchKernelCustAicpuSo(const string &kernel_name) { | |||||
status = rtMalloc(&d_aicpu_data, aicpu_data_length, RT_MEMORY_HBM); | status = rtMalloc(&d_aicpu_data, aicpu_data_length, RT_MEMORY_HBM); | ||||
if (status != RT_ERROR_NONE) { | if (status != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtMalloc failed, size:%u, ret = 0x%X", | |||||
aicpu_data_length, status); | |||||
GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); | GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); | ||||
return RT_ERROR_TO_GE_STATUS(status); | return RT_ERROR_TO_GE_STATUS(status); | ||||
} | } | ||||
allocated_mem.push_back(d_aicpu_data); | allocated_mem.push_back(d_aicpu_data); | ||||
status = rtMalloc(&d_so_name, so_name.size(), RT_MEMORY_HBM); | status = rtMalloc(&d_so_name, so_name.size(), RT_MEMORY_HBM); | ||||
if (status != RT_ERROR_NONE) { | if (status != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtMalloc fail, size:%zu, ret = 0x%X", | |||||
so_name.size(), status); | |||||
GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); | GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); | ||||
return RT_ERROR_TO_GE_STATUS(status); | return RT_ERROR_TO_GE_STATUS(status); | ||||
} | } | ||||
@@ -1338,6 +1433,8 @@ Status ModelManager::LaunchKernelCustAicpuSo(const string &kernel_name) { | |||||
uint32_t args_size = sizeof(CustAicpuSoBuf) * v_cust_so.size(); | uint32_t args_size = sizeof(CustAicpuSoBuf) * v_cust_so.size(); | ||||
status = rtMalloc(&args, args_size, RT_MEMORY_HBM); | status = rtMalloc(&args, args_size, RT_MEMORY_HBM); | ||||
if (status != RT_ERROR_NONE) { | if (status != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtMalloc fail, size:%u, ret = 0x%X", | |||||
args_size, status); | |||||
GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); | GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); | ||||
return RT_ERROR_TO_GE_STATUS(status); | return RT_ERROR_TO_GE_STATUS(status); | ||||
} | } | ||||
@@ -1352,6 +1449,8 @@ Status ModelManager::LaunchKernelCustAicpuSo(const string &kernel_name) { | |||||
uint32_t batch_args_size = sizeof(BatchLoadOpFromBufArgs); | uint32_t batch_args_size = sizeof(BatchLoadOpFromBufArgs); | ||||
status = rtMalloc(&batch_args, batch_args_size, RT_MEMORY_HBM); | status = rtMalloc(&batch_args, batch_args_size, RT_MEMORY_HBM); | ||||
if (status != RT_ERROR_NONE) { | if (status != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtMalloc fail, size:%u, ret = 0x%X", | |||||
batch_args_size, status); | |||||
GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); | GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); | ||||
return RT_ERROR_TO_GE_STATUS(status); | return RT_ERROR_TO_GE_STATUS(status); | ||||
} | } | ||||
@@ -1364,6 +1463,8 @@ Status ModelManager::LaunchKernelCustAicpuSo(const string &kernel_name) { | |||||
status = rtStreamSynchronize(stream); | status = rtStreamSynchronize(stream); | ||||
if (status != RT_ERROR_NONE) { | if (status != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtStreamSynchronize fail, ret = 0x%X", | |||||
status); | |||||
GELOGE(RT_FAILED, "Call rt stream sync failed, status: 0x%x", status); | GELOGE(RT_FAILED, "Call rt stream sync failed, status: 0x%x", status); | ||||
return RT_ERROR_TO_GE_STATUS(status); | return RT_ERROR_TO_GE_STATUS(status); | ||||
} | } | ||||
@@ -1408,6 +1509,7 @@ Status ModelManager::GetModelMemAndWeightSize(const ModelData &model, size_t &me | |||||
auto partition_table = reinterpret_cast<ModelPartitionTable *>(model_data); | auto partition_table = reinterpret_cast<ModelPartitionTable *>(model_data); | ||||
if (partition_table->num == 1) { | if (partition_table->num == 1) { | ||||
REPORT_INNER_ERROR("E19999", "partition_table num in model_data is 1, check invalid"); | |||||
GELOGE(ACL_ERROR_GE_PARAM_INVALID, "om model is error,please use executable om model"); | GELOGE(ACL_ERROR_GE_PARAM_INVALID, "om model is error,please use executable om model"); | ||||
return ACL_ERROR_GE_PARAM_INVALID; | return ACL_ERROR_GE_PARAM_INVALID; | ||||
} | } | ||||
@@ -1474,6 +1576,7 @@ ge::Status ModelManager::SyncExecuteModel(uint32_t model_id, const vector<GeTens | |||||
vector<GeTensor> &outputs) { | vector<GeTensor> &outputs) { | ||||
auto model = GetHybridModel(model_id); | auto model = GetHybridModel(model_id); | ||||
if (model == nullptr) { | if (model == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "partition_table num in model_data is 1, check invalid"); | |||||
GELOGE(FAILED, "Hybrid model not found. model id = %u.", model_id); | GELOGE(FAILED, "Hybrid model not found. model id = %u.", model_id); | ||||
return FAILED; | return FAILED; | ||||
} | } | ||||
@@ -1485,9 +1588,21 @@ Status ModelManager::GetOpDescInfo(uint32_t device_id, uint32_t stream_id, uint3 | |||||
for (const auto &model : model_map_) { | for (const auto &model : model_map_) { | ||||
auto davinci_model = model.second; | auto davinci_model = model.second; | ||||
if (davinci_model->GetDeviceId() == device_id) { | if (davinci_model->GetDeviceId() == device_id) { | ||||
GELOGI("Start to GetOpDescInfo of device_id: %u.", device_id); | |||||
GELOGI("[Get][OpDescInfo] Start to GetOpDescInfo of device_id: %u in davinci model.", device_id); | |||||
if (davinci_model->GetOpDescInfo(stream_id, task_id, op_desc_info)) { | if (davinci_model->GetOpDescInfo(stream_id, task_id, op_desc_info)) { | ||||
GELOGI("Find specific node of stream_id: %u, task_id: %u.", stream_id, task_id); | |||||
GELOGI("[Get][OpDescInfo] Find specific node of stream_id: %u, task_id: %u in davinci model.", | |||||
stream_id, task_id); | |||||
return SUCCESS; | |||||
} | |||||
} | |||||
} | |||||
for (const auto &model : hybrid_model_map_) { | |||||
auto hybrid_model = model.second; | |||||
if (hybrid_model->GetDeviceId() == device_id) { | |||||
GELOGI("[Get][OpDescInfo] Start to GetOpDescInfo of device_id: %u in hybrid model.", device_id); | |||||
if (hybrid_model->GetOpDescInfo(stream_id, task_id, op_desc_info)) { | |||||
GELOGI("[Get][OpDescInfo] Find specific node of stream_id: %u, task_id: %u in hybrid model.", | |||||
stream_id, task_id); | |||||
return SUCCESS; | return SUCCESS; | ||||
} | } | ||||
} | } | ||||
@@ -1500,8 +1615,11 @@ Status ModelManager::EnableExceptionDump(const std::map<string, string> &options | |||||
if (iter != options.end()) { | if (iter != options.end()) { | ||||
GELOGI("Find option enable_exeception_dump is %s", iter->second.c_str()); | GELOGI("Find option enable_exeception_dump is %s", iter->second.c_str()); | ||||
if (iter->second == "1") { | if (iter->second == "1") { | ||||
dump_exception_flag_ = true; | |||||
rtError_t rt_ret = rtSetTaskFailCallback(reinterpret_cast<rtTaskFailCallback>(ExceptionCallback)); | rtError_t rt_ret = rtSetTaskFailCallback(reinterpret_cast<rtTaskFailCallback>(ExceptionCallback)); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtSetTaskFailCallback fail, ret = 0x%X", | |||||
rt_ret); | |||||
GELOGE(RT_FAILED, "rtSetTaskFailCallback failed"); | GELOGE(RT_FAILED, "rtSetTaskFailCallback failed"); | ||||
return RT_ERROR_TO_GE_STATUS(rt_ret); | return RT_ERROR_TO_GE_STATUS(rt_ret); | ||||
} | } | ||||
@@ -1549,6 +1667,8 @@ Status ModelManager::LaunchKernelCheckAicpuOp(std::vector<std::string> &aicpu_op | |||||
// malloc sysOpInfoList in SysOpCheckInfo | // malloc sysOpInfoList in SysOpCheckInfo | ||||
status = rtMalloc(&d_req_op_list, op_nums * sizeof(SysOpInfo), RT_MEMORY_HBM); | status = rtMalloc(&d_req_op_list, op_nums * sizeof(SysOpInfo), RT_MEMORY_HBM); | ||||
if (status != RT_ERROR_NONE) { | if (status != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtMalloc fail, size:%zu, ret = 0x%X", | |||||
op_nums * sizeof(SysOpInfo), status); | |||||
GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); | GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); | ||||
return RT_ERROR_TO_GE_STATUS(status); | return RT_ERROR_TO_GE_STATUS(status); | ||||
} | } | ||||
@@ -1557,6 +1677,8 @@ Status ModelManager::LaunchKernelCheckAicpuOp(std::vector<std::string> &aicpu_op | |||||
// malloc sysOpInfoList in SysOpCheckResp | // malloc sysOpInfoList in SysOpCheckResp | ||||
status = rtMalloc(&d_res_op_list, op_nums * sizeof(SysOpInfo), RT_MEMORY_HBM); | status = rtMalloc(&d_res_op_list, op_nums * sizeof(SysOpInfo), RT_MEMORY_HBM); | ||||
if (status != RT_ERROR_NONE) { | if (status != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtMalloc fail, size:%zu, ret = 0x%X", | |||||
op_nums * sizeof(SysOpInfo), status); | |||||
GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); | GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); | ||||
return RT_ERROR_TO_GE_STATUS(status); | return RT_ERROR_TO_GE_STATUS(status); | ||||
} | } | ||||
@@ -1565,6 +1687,8 @@ Status ModelManager::LaunchKernelCheckAicpuOp(std::vector<std::string> &aicpu_op | |||||
// malloc returnCodeList in SysOpCheckResp | // malloc returnCodeList in SysOpCheckResp | ||||
status = rtMalloc(&d_ret_code_list, op_nums * sizeof(ReturnCode), RT_MEMORY_HBM); | status = rtMalloc(&d_ret_code_list, op_nums * sizeof(ReturnCode), RT_MEMORY_HBM); | ||||
if (status != RT_ERROR_NONE) { | if (status != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtMalloc fail, size:%zu, ret = 0x%X", | |||||
op_nums * sizeof(ReturnCode), status); | |||||
GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); | GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); | ||||
return RT_ERROR_TO_GE_STATUS(status); | return RT_ERROR_TO_GE_STATUS(status); | ||||
} | } | ||||
@@ -1576,6 +1700,8 @@ Status ModelManager::LaunchKernelCheckAicpuOp(std::vector<std::string> &aicpu_op | |||||
void *d_op_type_name = nullptr; | void *d_op_type_name = nullptr; | ||||
status = rtMalloc(&d_op_type_name, op_type.length(), RT_MEMORY_HBM); | status = rtMalloc(&d_op_type_name, op_type.length(), RT_MEMORY_HBM); | ||||
if (status != RT_ERROR_NONE) { | if (status != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtMalloc fail, size:%lu, ret = 0x%X", | |||||
op_type.length(), status); | |||||
GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); | GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); | ||||
return RT_ERROR_TO_GE_STATUS(status); | return RT_ERROR_TO_GE_STATUS(status); | ||||
} | } | ||||
@@ -1593,6 +1719,8 @@ Status ModelManager::LaunchKernelCheckAicpuOp(std::vector<std::string> &aicpu_op | |||||
void *d_op_type_name = nullptr; | void *d_op_type_name = nullptr; | ||||
status = rtMalloc(&d_op_type_name, op_type.size(), RT_MEMORY_HBM); | status = rtMalloc(&d_op_type_name, op_type.size(), RT_MEMORY_HBM); | ||||
if (status != RT_ERROR_NONE) { | if (status != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtMalloc fail, size:%lu, ret = 0x%X", | |||||
op_type.length(), status); | |||||
GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); | GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); | ||||
return RT_ERROR_TO_GE_STATUS(status); | return RT_ERROR_TO_GE_STATUS(status); | ||||
} | } | ||||
@@ -1621,6 +1749,8 @@ Status ModelManager::LaunchKernelCheckAicpuOp(std::vector<std::string> &aicpu_op | |||||
uint32_t args_size = sizeof(SysOpCheckInfo) + sizeof(SysOpCheckResp); | uint32_t args_size = sizeof(SysOpCheckInfo) + sizeof(SysOpCheckResp); | ||||
status = rtMalloc(&args, args_size, RT_MEMORY_HBM); | status = rtMalloc(&args, args_size, RT_MEMORY_HBM); | ||||
if (status != RT_ERROR_NONE) { | if (status != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtMalloc fail, size:%u, ret = 0x%X", | |||||
args_size, status); | |||||
GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); | GELOGE(RT_FAILED, "Call rt failed, status: 0x%x", status); | ||||
return RT_ERROR_TO_GE_STATUS(status); | return RT_ERROR_TO_GE_STATUS(status); | ||||
} | } | ||||
@@ -1636,6 +1766,8 @@ Status ModelManager::LaunchKernelCheckAicpuOp(std::vector<std::string> &aicpu_op | |||||
status = rtStreamSynchronize(stream); | status = rtStreamSynchronize(stream); | ||||
if (status != RT_ERROR_NONE) { | if (status != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtStreamSynchronize fail, ret = 0x%X", | |||||
status); | |||||
GELOGE(RT_FAILED, "Call rt stream sync failed, status: 0x%x", status); | GELOGE(RT_FAILED, "Call rt stream sync failed, status: 0x%x", status); | ||||
GE_CHK_RT(rtStreamDestroy(stream)); | GE_CHK_RT(rtStreamDestroy(stream)); | ||||
return RT_ERROR_TO_GE_STATUS(status); | return RT_ERROR_TO_GE_STATUS(status); | ||||
@@ -1668,6 +1800,9 @@ Status ModelManager::LaunchKernelCheckAicpuOp(std::vector<std::string> &aicpu_op | |||||
reinterpret_cast<void *>(static_cast<uintptr_t>(op_check_info_res.sysOpInfoList)), | reinterpret_cast<void *>(static_cast<uintptr_t>(op_check_info_res.sysOpInfoList)), | ||||
sizeof(SysOpInfo) * res_op_nums, RT_MEMCPY_DEVICE_TO_HOST)); | sizeof(SysOpInfo) * res_op_nums, RT_MEMCPY_DEVICE_TO_HOST)); | ||||
if (res_ret_code_list.size() != res_aicpu_op_info_list.size() || res_ret_code_list.size() != res_op_nums) { | if (res_ret_code_list.size() != res_aicpu_op_info_list.size() || res_ret_code_list.size() != res_op_nums) { | ||||
REPORT_INNER_ERROR("E19999", "res_ret_code_list.size:%zu res_aicpu_op_info_list.size:%zu res_op_nums:%lu " | |||||
"not equal, check invalid", | |||||
res_ret_code_list.size(), res_aicpu_op_info_list.size(), res_op_nums); | |||||
GELOGE(FAILED, "Number of retcode is not equal to number of op type."); | GELOGE(FAILED, "Number of retcode is not equal to number of op type."); | ||||
GE_CHK_RT(rtStreamDestroy(stream)); | GE_CHK_RT(rtStreamDestroy(stream)); | ||||
return FAILED; | return FAILED; | ||||
@@ -1691,6 +1826,8 @@ Status ModelManager::LaunchKernelCheckAicpuOp(std::vector<std::string> &aicpu_op | |||||
"<0: op_type, 1: format, 2: datatype> \n"; | "<0: op_type, 1: format, 2: datatype> \n"; | ||||
} | } | ||||
fail_reason += "not support."; | fail_reason += "not support."; | ||||
REPORT_INNER_ERROR("E19999", "Check aicpu op_type failed, details:%s", | |||||
fail_reason.c_str()); | |||||
GELOGE(FAILED, "Check aicpu op_type failed. details: %s", fail_reason.c_str()); | GELOGE(FAILED, "Check aicpu op_type failed. details: %s", fail_reason.c_str()); | ||||
GE_CHK_RT(rtStreamDestroy(stream)); | GE_CHK_RT(rtStreamDestroy(stream)); | ||||
return FAILED; | return FAILED; | ||||
@@ -294,6 +294,7 @@ class FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY ModelManager { | |||||
std::vector<InputOutputDims> &output_dims); | std::vector<InputOutputDims> &output_dims); | ||||
bool IsDynamicShape(uint32_t model_id); | bool IsDynamicShape(uint32_t model_id); | ||||
bool IsNeedHybridLoad(ge::GeRootModel &ge_root_model); | |||||
ge::Status GetOpDescInfo(uint32_t device_id, uint32_t stream_id, uint32_t task_id, OpDescInfo &op_desc_info); | ge::Status GetOpDescInfo(uint32_t device_id, uint32_t stream_id, uint32_t task_id, OpDescInfo &op_desc_info); | ||||
ge::Status EnableExceptionDump(const std::map<string, string> &options); | ge::Status EnableExceptionDump(const std::map<string, string> &options); | ||||
@@ -312,6 +313,7 @@ class FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY ModelManager { | |||||
instance->AddExceptionInfo(*rt_exception_info); | instance->AddExceptionInfo(*rt_exception_info); | ||||
} | } | ||||
bool IsDumpExceptionOpen() { return dump_exception_flag_; } | |||||
private: | private: | ||||
/// | /// | ||||
/// @ingroup domi_ome | /// @ingroup domi_ome | ||||
@@ -329,8 +331,8 @@ class FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY ModelManager { | |||||
/// @ingroup domi_ome | /// @ingroup domi_ome | ||||
/// @brief insert new model into model manager set | /// @brief insert new model into model manager set | ||||
/// | /// | ||||
void InsertModel(uint32_t id, std::shared_ptr<DavinciModel> &davinci_model); | |||||
void InsertModel(uint32_t id, std::shared_ptr<hybrid::HybridDavinciModel> &hybrid_model); | |||||
void InsertModel(uint32_t model_id, std::shared_ptr<DavinciModel> &davinci_model); | |||||
void InsertModel(uint32_t model_id, std::shared_ptr<hybrid::HybridDavinciModel> &hybrid_model); | |||||
/// | /// | ||||
/// @ingroup domi_ome | /// @ingroup domi_ome | ||||
@@ -340,6 +342,7 @@ class FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY ModelManager { | |||||
void GenModelId(uint32_t *id); | void GenModelId(uint32_t *id); | ||||
std::map<uint32_t, std::shared_ptr<DavinciModel>> model_map_; | std::map<uint32_t, std::shared_ptr<DavinciModel>> model_map_; | ||||
std::map<uint32_t, std::shared_ptr<hybrid::HybridDavinciModel>> hybrid_model_map_; | std::map<uint32_t, std::shared_ptr<hybrid::HybridDavinciModel>> hybrid_model_map_; | ||||
std::map<std::string, std::vector<uint64_t>> model_aicpu_kernel_; | std::map<std::string, std::vector<uint64_t>> model_aicpu_kernel_; | ||||
@@ -354,6 +357,7 @@ class FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY ModelManager { | |||||
std::map<uintptr_t, std::map<std::string, CustAICPUKernelPtr>> cust_aicpu_so_; | std::map<uintptr_t, std::map<std::string, CustAICPUKernelPtr>> cust_aicpu_so_; | ||||
static DumpProperties dump_properties_; | static DumpProperties dump_properties_; | ||||
bool dump_exception_flag_ = false; | |||||
}; | }; | ||||
} // namespace ge | } // namespace ge | ||||
@@ -25,6 +25,9 @@ | |||||
#define VALIDATE_MEM_RANGE(OP, SIZE, OFFSET) \ | #define VALIDATE_MEM_RANGE(OP, SIZE, OFFSET) \ | ||||
do { \ | do { \ | ||||
if (SIZE <= static_cast<uint64_t>(OFFSET)) { \ | if (SIZE <= static_cast<uint64_t>(OFFSET)) { \ | ||||
REPORT_INNER_ERROR("E19999", \ | |||||
"Node:%s(%s) offset:%ld out of range size:%lu, check invalid", \ | |||||
OP->GetName().c_str(), OP->GetType().c_str(), OFFSET, SIZE); \ | |||||
GELOGE(OUT_OF_MEMORY, "Node: %s, memory out of range[%lu: %ld]", OP->GetName().c_str(), SIZE, OFFSET); \ | GELOGE(OUT_OF_MEMORY, "Node: %s, memory out of range[%lu: %ld]", OP->GetName().c_str(), SIZE, OFFSET); \ | ||||
return {}; \ | return {}; \ | ||||
} \ | } \ | ||||
@@ -305,6 +308,9 @@ vector<void *> ModelUtils::GetInputDataAddrs(const RuntimeParam &model_param, Co | |||||
vector<int64_t> v_memory_type; | vector<int64_t> v_memory_type; | ||||
bool has_mem_type_attr = ge::AttrUtils::GetListInt(op_desc, ATTR_NAME_INPUT_MEM_TYPE_LIST, v_memory_type); | bool has_mem_type_attr = ge::AttrUtils::GetListInt(op_desc, ATTR_NAME_INPUT_MEM_TYPE_LIST, v_memory_type); | ||||
if (has_mem_type_attr && (v_memory_type.size() != inputs_size)) { | if (has_mem_type_attr && (v_memory_type.size() != inputs_size)) { | ||||
REPORT_INNER_ERROR("E19999", "Attr:%s, memory_type.size:%zu != input_desc.size:%zu, op:%s(%s), check invalid", | |||||
ATTR_NAME_INPUT_MEM_TYPE_LIST.c_str(), v_memory_type.size(), inputs_size, | |||||
op_desc->GetName().c_str(), op_desc->GetType().c_str()); | |||||
GELOGE(PARAM_INVALID, "Fusion: check input size failed, op: %s, input v_memory_type size: %zu input numbers: %zu", | GELOGE(PARAM_INVALID, "Fusion: check input size failed, op: %s, input v_memory_type size: %zu input numbers: %zu", | ||||
op_desc->GetName().c_str(), v_memory_type.size(), inputs_size); | op_desc->GetName().c_str(), v_memory_type.size(), inputs_size); | ||||
return v_input_data_addr; | return v_input_data_addr; | ||||
@@ -384,7 +390,9 @@ Status ModelUtils::GetVarAddr(const RuntimeParam &model_param, const ConstOpDesc | |||||
switch (mem_type) { | switch (mem_type) { | ||||
case RT_MEMORY_RDMA_HBM: | case RT_MEMORY_RDMA_HBM: | ||||
if (offset < 0) { | if (offset < 0) { | ||||
GELOGE(PARAM_INVALID, "rdma var addr is invalid, addr=%p", reinterpret_cast<uint8_t *>(offset)); | |||||
REPORT_INNER_ERROR("E19999", "Param offset:%ld < 0, check invalid", offset); | |||||
GELOGE(PARAM_INVALID, "rdma var addr is invalid, addr=%p", | |||||
reinterpret_cast<uint8_t *>(static_cast<uintptr_t>(offset))); | |||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
} | } | ||||
var_addr = reinterpret_cast<uint8_t *>(static_cast<uintptr_t>(offset)); | var_addr = reinterpret_cast<uint8_t *>(static_cast<uintptr_t>(offset)); | ||||
@@ -394,6 +402,8 @@ Status ModelUtils::GetVarAddr(const RuntimeParam &model_param, const ConstOpDesc | |||||
var_addr = model_param.var_base + offset - model_param.logic_var_base; | var_addr = model_param.var_base + offset - model_param.logic_var_base; | ||||
break; | break; | ||||
default: | default: | ||||
REPORT_INNER_ERROR("E19999", "Get mem_type:%d for offset:%ld is unsupported, check invalid", | |||||
mem_type, offset); | |||||
GELOGE(PARAM_INVALID, "unsupported memory type %u", mem_type); | GELOGE(PARAM_INVALID, "unsupported memory type %u", mem_type); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
} | } | ||||
@@ -419,6 +429,9 @@ vector<void *> ModelUtils::GetOutputDataAddrs(const RuntimeParam &model_param, C | |||||
vector<int64_t> v_memory_type; | vector<int64_t> v_memory_type; | ||||
bool has_mem_type_attr = ge::AttrUtils::GetListInt(op_desc, ATTR_NAME_OUTPUT_MEM_TYPE_LIST, v_memory_type); | bool has_mem_type_attr = ge::AttrUtils::GetListInt(op_desc, ATTR_NAME_OUTPUT_MEM_TYPE_LIST, v_memory_type); | ||||
if (has_mem_type_attr && (v_memory_type.size() != outputs_size)) { | if (has_mem_type_attr && (v_memory_type.size() != outputs_size)) { | ||||
REPORT_INNER_ERROR("E19999", "Attr:%s, memory_type.size:%zu != output_desc.size:%zu, op:%s(%s), check invalid", | |||||
ATTR_NAME_OUTPUT_MEM_TYPE_LIST.c_str(), v_memory_type.size(), outputs_size, | |||||
op_desc->GetName().c_str(), op_desc->GetType().c_str()); | |||||
GELOGE(PARAM_INVALID, | GELOGE(PARAM_INVALID, | ||||
"Fusion: check output size failed, op: %s, output v_memory_type size: %lu output numbers: %zu", | "Fusion: check output size failed, op: %s, output v_memory_type size: %lu output numbers: %zu", | ||||
op_desc->GetName().c_str(), v_memory_type.size(), outputs_size); | op_desc->GetName().c_str(), v_memory_type.size(), outputs_size); | ||||
@@ -567,6 +580,7 @@ Status ModelUtils::GetRtAddress(const RuntimeParam ¶m, uintptr_t logic_addr, | |||||
param.var_size); | param.var_size); | ||||
} else if (logic_addr != 0) { | } else if (logic_addr != 0) { | ||||
mem_addr = nullptr; | mem_addr = nullptr; | ||||
REPORT_INNER_ERROR("E19999", "Check param logic addr:0x%lx abnormal", logic_addr); | |||||
GELOGE(PARAM_INVALID, "The logic addr:0x%lx is abnormal", logic_addr); | GELOGE(PARAM_INVALID, "The logic addr:0x%lx is abnormal", logic_addr); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
} | } | ||||
@@ -27,6 +27,7 @@ namespace ge { | |||||
Status EndGraphTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_model) { | Status EndGraphTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_model) { | ||||
GELOGI("InitEndGraphTaskInfo Init Start."); | GELOGI("InitEndGraphTaskInfo Init Start."); | ||||
if (davinci_model == nullptr) { | if (davinci_model == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "Check param davinci_model nullptr"); | |||||
GELOGE(PARAM_INVALID, "davinci_model is null!"); | GELOGE(PARAM_INVALID, "davinci_model is null!"); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
} | } | ||||
@@ -45,13 +46,11 @@ Status EndGraphTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davin | |||||
Status EndGraphTaskInfo::Distribute() { | Status EndGraphTaskInfo::Distribute() { | ||||
GELOGI("EndGraphTaskInfo Distribute Start."); | GELOGI("EndGraphTaskInfo Distribute Start."); | ||||
GE_CHECK_NOTNULL(davinci_model_); | GE_CHECK_NOTNULL(davinci_model_); | ||||
auto all_dump_model = davinci_model_->GetDumpProperties().GetAllDumpModel(); | |||||
if (all_dump_model.find(ge::DUMP_ALL_MODEL) != all_dump_model.end() || | |||||
all_dump_model.find(davinci_model_->Name()) != all_dump_model.end() || | |||||
all_dump_model.find(davinci_model_->OmName()) != all_dump_model.end()) { | |||||
if (davinci_model_->ModelNeedDump()) { | |||||
GELOGI("Start to call rtEndGraphEx"); | GELOGI("Start to call rtEndGraphEx"); | ||||
rtError_t rt_ret = rtEndGraphEx(model_, stream_, kDumpFlag); | rtError_t rt_ret = rtEndGraphEx(model_, stream_, kDumpFlag); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtEndGraphEx failed, ret:0x%X", rt_ret); | |||||
GELOGE(RT_FAILED, "Call rtEndGraphEx failed, ret: 0x%x", rt_ret); | GELOGE(RT_FAILED, "Call rtEndGraphEx failed, ret: 0x%x", rt_ret); | ||||
return RT_ERROR_TO_GE_STATUS(rt_ret); | return RT_ERROR_TO_GE_STATUS(rt_ret); | ||||
} | } | ||||
@@ -59,6 +58,7 @@ Status EndGraphTaskInfo::Distribute() { | |||||
GELOGI("Start to call rtEndGraph"); | GELOGI("Start to call rtEndGraph"); | ||||
rtError_t rt_ret = rtEndGraph(model_, stream_); | rtError_t rt_ret = rtEndGraph(model_, stream_); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtEndGraph failed, ret:0x%X", rt_ret); | |||||
GELOGE(RT_FAILED, "Call rtEndGraph failed, ret: 0x%x", rt_ret); | GELOGE(RT_FAILED, "Call rtEndGraph failed, ret: 0x%x", rt_ret); | ||||
return RT_ERROR_TO_GE_STATUS(rt_ret); | return RT_ERROR_TO_GE_STATUS(rt_ret); | ||||
} | } | ||||
@@ -68,6 +68,8 @@ Status EndGraphTaskInfo::Distribute() { | |||||
uint32_t stream_id = 0; | uint32_t stream_id = 0; | ||||
rtError_t rt_ret = rtModelGetTaskId(davinci_model_->GetRtModelHandle(), &task_id, &stream_id); | rtError_t rt_ret = rtModelGetTaskId(davinci_model_->GetRtModelHandle(), &task_id, &stream_id); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtModelGetTaskId failed, ret:0x%X", | |||||
rt_ret); | |||||
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | ||||
return RT_ERROR_TO_GE_STATUS(rt_ret); | return RT_ERROR_TO_GE_STATUS(rt_ret); | ||||
} | } | ||||
@@ -23,6 +23,7 @@ namespace ge { | |||||
Status EventRecordTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_model) { | Status EventRecordTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_model) { | ||||
GELOGI("EventRecordTaskInfo Init Start."); | GELOGI("EventRecordTaskInfo Init Start."); | ||||
if (davinci_model == nullptr) { | if (davinci_model == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "Check param davinci_model nullptr"); | |||||
GELOGE(PARAM_INVALID, "davinci_model is null!"); | GELOGE(PARAM_INVALID, "davinci_model is null!"); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
} | } | ||||
@@ -34,6 +35,8 @@ Status EventRecordTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *da | |||||
const auto &eventList = davinci_model->GetEventList(); | const auto &eventList = davinci_model->GetEventList(); | ||||
if (task_def.event_id() >= eventList.size()) { | if (task_def.event_id() >= eventList.size()) { | ||||
REPORT_INNER_ERROR("E19999", "Task event_id:%u > model event size:%zu, check invalid", | |||||
task_def.event_id(), eventList.size()); | |||||
GELOGE(INTERNAL_ERROR, "event list size:%zu, cur:%u!", eventList.size(), task_def.event_id()); | GELOGE(INTERNAL_ERROR, "event list size:%zu, cur:%u!", eventList.size(), task_def.event_id()); | ||||
return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
} | } | ||||
@@ -47,6 +50,8 @@ Status EventRecordTaskInfo::Distribute() { | |||||
GELOGI("EventRecordTaskInfo Distribute Start."); | GELOGI("EventRecordTaskInfo Distribute Start."); | ||||
rtError_t rt_ret = rtEventRecord(event_, stream_); | rtError_t rt_ret = rtEventRecord(event_, stream_); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtEventRecord failed, ret:0x%X", | |||||
rt_ret); | |||||
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | ||||
return RT_ERROR_TO_GE_STATUS(rt_ret); | return RT_ERROR_TO_GE_STATUS(rt_ret); | ||||
} | } | ||||
@@ -23,6 +23,7 @@ namespace ge { | |||||
Status EventWaitTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_model) { | Status EventWaitTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_model) { | ||||
GELOGI("EventWaitTaskInfo Init Start."); | GELOGI("EventWaitTaskInfo Init Start."); | ||||
if (davinci_model == nullptr) { | if (davinci_model == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "Check param davinci_model nullptr"); | |||||
GELOGE(PARAM_INVALID, "davinci_model is null!"); | GELOGE(PARAM_INVALID, "davinci_model is null!"); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
} | } | ||||
@@ -34,6 +35,8 @@ Status EventWaitTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davi | |||||
const auto &eventList = davinci_model->GetEventList(); | const auto &eventList = davinci_model->GetEventList(); | ||||
if (task_def.event_id() >= eventList.size()) { | if (task_def.event_id() >= eventList.size()) { | ||||
REPORT_INNER_ERROR("E19999", "Task event_id:%u > model event size:%zu, check invalid", | |||||
task_def.event_id(), eventList.size()); | |||||
GELOGE(INTERNAL_ERROR, "event list size:%zu, cur:%u!", eventList.size(), task_def.event_id()); | GELOGE(INTERNAL_ERROR, "event list size:%zu, cur:%u!", eventList.size(), task_def.event_id()); | ||||
return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
} | } | ||||
@@ -48,12 +51,16 @@ Status EventWaitTaskInfo::Distribute() { | |||||
GELOGI("EventWaitTaskInfo Distribute Start."); | GELOGI("EventWaitTaskInfo Distribute Start."); | ||||
rtError_t rt_ret = rtStreamWaitEvent(stream_, event_); | rtError_t rt_ret = rtStreamWaitEvent(stream_, event_); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtStreamWaitEvent failed, ret:0x%X", | |||||
rt_ret); | |||||
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | ||||
return RT_ERROR_TO_GE_STATUS(rt_ret); | return RT_ERROR_TO_GE_STATUS(rt_ret); | ||||
} | } | ||||
rt_ret = rtEventReset(event_, stream_); | rt_ret = rtEventReset(event_, stream_); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtEventReset failed, ret:0x%X", | |||||
rt_ret); | |||||
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | ||||
return RT_ERROR_TO_GE_STATUS(rt_ret); | return RT_ERROR_TO_GE_STATUS(rt_ret); | ||||
} | } | ||||
@@ -23,6 +23,7 @@ namespace ge { | |||||
Status FusionStartTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_model) { | Status FusionStartTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_model) { | ||||
GELOGI("FusionStartTaskInfo Init Start."); | GELOGI("FusionStartTaskInfo Init Start."); | ||||
if (davinci_model == nullptr) { | if (davinci_model == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "Check param davinci_model nullptr"); | |||||
GELOGE(PARAM_INVALID, "davinci_model is null!"); | GELOGE(PARAM_INVALID, "davinci_model is null!"); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
} | } | ||||
@@ -39,6 +40,8 @@ Status FusionStartTaskInfo::Distribute() { | |||||
GELOGI("FusionStartTaskInfo Distribute Start."); | GELOGI("FusionStartTaskInfo Distribute Start."); | ||||
rtError_t rt_ret = rtKernelFusionStart(stream_); | rtError_t rt_ret = rtKernelFusionStart(stream_); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtKernelFusionStart failed, ret:0x%X", | |||||
rt_ret); | |||||
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | ||||
return RT_ERROR_TO_GE_STATUS(rt_ret); | return RT_ERROR_TO_GE_STATUS(rt_ret); | ||||
} | } | ||||
@@ -23,6 +23,7 @@ namespace ge { | |||||
Status FusionStopTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_model) { | Status FusionStopTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_model) { | ||||
GELOGI("FusionStopTaskInfo Init Start."); | GELOGI("FusionStopTaskInfo Init Start."); | ||||
if (davinci_model == nullptr) { | if (davinci_model == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "Check param davinci_model nullptr"); | |||||
GELOGE(PARAM_INVALID, "davinci_model is null!"); | GELOGE(PARAM_INVALID, "davinci_model is null!"); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
} | } | ||||
@@ -39,6 +40,7 @@ Status FusionStopTaskInfo::Distribute() { | |||||
GELOGI("FusionStopTaskInfo Distribute Start."); | GELOGI("FusionStopTaskInfo Distribute Start."); | ||||
rtError_t rt_ret = rtKernelFusionEnd(stream_); | rtError_t rt_ret = rtKernelFusionEnd(stream_); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtKernelFusionEnd failed, ret:0x%X", rt_ret); | |||||
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | ||||
return RT_ERROR_TO_GE_STATUS(rt_ret); | return RT_ERROR_TO_GE_STATUS(rt_ret); | ||||
} | } | ||||
@@ -30,6 +30,7 @@ HcclTaskInfo::~HcclTaskInfo() { | |||||
if (private_def_ != nullptr) { | if (private_def_ != nullptr) { | ||||
rtError_t ret = rtFreeHost(private_def_); | rtError_t ret = rtFreeHost(private_def_); | ||||
if (ret != RT_ERROR_NONE) { | if (ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtFreeHost failed, ret:0x%X", ret); | |||||
GELOGE(RT_FAILED, "Call rtFree Fail, ret = 0x%X.", ret); | GELOGE(RT_FAILED, "Call rtFree Fail, ret = 0x%X.", ret); | ||||
} | } | ||||
private_def_ = nullptr; | private_def_ = nullptr; | ||||
@@ -41,6 +42,7 @@ HcclTaskInfo::~HcclTaskInfo() { | |||||
Status HcclTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_model) { | Status HcclTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_model) { | ||||
GELOGI("HcclTaskInfo Init Start."); | GELOGI("HcclTaskInfo Init Start."); | ||||
if (davinci_model == nullptr) { | if (davinci_model == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "Check param davinci_model nullptr"); | |||||
GELOGE(PARAM_INVALID, "davinci_model is null!"); | GELOGE(PARAM_INVALID, "davinci_model is null!"); | ||||
return PARAM_INVALID; | return PARAM_INVALID; | ||||
} | } | ||||
@@ -67,22 +69,30 @@ Status HcclTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_m | |||||
// Only in Horovod scenario should get the inputName and GeShape | // Only in Horovod scenario should get the inputName and GeShape | ||||
ret = HcomOmeUtil::GetHorovodInputs(op_desc, kernel_hccl_infos_); | ret = HcomOmeUtil::GetHorovodInputs(op_desc, kernel_hccl_infos_); | ||||
if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Call GetHorovodInputs fail for op:%s(%s)", | |||||
op_desc->GetName().c_str(), op_desc->GetType().c_str()); | |||||
GELOGE(ret, "davinci_model: GetHorovodInputs fail! domi error: %u", ret); | GELOGE(ret, "davinci_model: GetHorovodInputs fail! domi error: %u", ret); | ||||
return ret; | return ret; | ||||
} | } | ||||
Status dmrt = HcomOmeUtil::GetHcclDataType(op_desc, kernel_hccl_infos_); | Status dmrt = HcomOmeUtil::GetHcclDataType(op_desc, kernel_hccl_infos_); | ||||
if (dmrt != SUCCESS) { | if (dmrt != SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Call GetHcclDataType fail for op:%s(%s)", | |||||
op_desc->GetName().c_str(), op_desc->GetType().c_str()); | |||||
GELOGE(dmrt, "davinci_model: GetHcomDataType fail! domi error: %u", dmrt); | GELOGE(dmrt, "davinci_model: GetHcomDataType fail! domi error: %u", dmrt); | ||||
return dmrt; | return dmrt; | ||||
} | } | ||||
dmrt = HcomOmeUtil::GetHcclCount(op_desc, kernel_hccl_infos_); | dmrt = HcomOmeUtil::GetHcclCount(op_desc, kernel_hccl_infos_); | ||||
if (dmrt != SUCCESS) { | if (dmrt != SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Call GetHcclCount fail for op:%s(%s)", | |||||
op_desc->GetName().c_str(), op_desc->GetType().c_str()); | |||||
GELOGE(dmrt, "davinci_model: GetHcomCount fail! domi error: %u", dmrt); | GELOGE(dmrt, "davinci_model: GetHcomCount fail! domi error: %u", dmrt); | ||||
return dmrt; | return dmrt; | ||||
} | } | ||||
// Only HCOMBROADCAST and HVDCALLBACKBROADCAST need to get the rootId | // Only HCOMBROADCAST and HVDCALLBACKBROADCAST need to get the rootId | ||||
dmrt = HcomOmeUtil::GetAllRootId(op_desc, kernel_hccl_infos_); | dmrt = HcomOmeUtil::GetAllRootId(op_desc, kernel_hccl_infos_); | ||||
if (dmrt != SUCCESS) { | if (dmrt != SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Call GetAllRootId fail for op:%s(%s)", | |||||
op_desc->GetName().c_str(), op_desc->GetType().c_str()); | |||||
GELOGE(dmrt, "davinci_model: Get rootId fail! domi error: %u", dmrt); | GELOGE(dmrt, "davinci_model: Get rootId fail! domi error: %u", dmrt); | ||||
return dmrt; | return dmrt; | ||||
} | } | ||||
@@ -169,12 +179,16 @@ Status HcclTaskInfo::CreateStream(int64_t stream_num, DavinciModel *davinci_mode | |||||
rtError_t rt_ret = | rtError_t rt_ret = | ||||
rtStreamCreateWithFlags(&stream, davinci_model->Priority(), RT_STREAM_PERSISTENT | RT_STREAM_FORCE_COPY); | rtStreamCreateWithFlags(&stream, davinci_model->Priority(), RT_STREAM_PERSISTENT | RT_STREAM_FORCE_COPY); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtStreamCreateWithFlags failed, ret:0x%X, stream_idx:%ld, stream_num:%ld", | |||||
rt_ret, i, stream_num); | |||||
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | ||||
return RT_ERROR_TO_GE_STATUS(rt_ret); | return RT_ERROR_TO_GE_STATUS(rt_ret); | ||||
} | } | ||||
// Create slave stream, inactive by default, activated by hccl | // Create slave stream, inactive by default, activated by hccl | ||||
rt_ret = rtModelBindStream(davinci_model->GetRtModelHandle(), stream, RT_MODEL_WAIT_ACTIVE_STREAM); | rt_ret = rtModelBindStream(davinci_model->GetRtModelHandle(), stream, RT_MODEL_WAIT_ACTIVE_STREAM); | ||||
if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtModelBindStream failed, ret:0x%X, stream_idx:%ld, stream_num:%ld", | |||||
rt_ret, i, stream_num); | |||||
GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | ||||
(void)rtStreamDestroy(stream); | (void)rtStreamDestroy(stream); | ||||
return RT_ERROR_TO_GE_STATUS(rt_ret); | return RT_ERROR_TO_GE_STATUS(rt_ret); | ||||
@@ -192,6 +206,7 @@ Status HcclTaskInfo::CreateStream(int64_t stream_num, DavinciModel *davinci_mode | |||||
Status HcclTaskInfo::Distribute() { | Status HcclTaskInfo::Distribute() { | ||||
GELOGI("HcclTaskInfo Distribute Start. begin to call function LoadTask in hccl."); | GELOGI("HcclTaskInfo Distribute Start. begin to call function LoadTask in hccl."); | ||||
if (ops_kernel_store_ == nullptr) { | if (ops_kernel_store_ == nullptr) { | ||||
REPORT_INNER_ERROR("E19999", "Check param ops_kernel_store_ nullptr"); | |||||
GELOGE(INTERNAL_ERROR, "ops kernel store is null."); | GELOGE(INTERNAL_ERROR, "ops kernel store is null."); | ||||
return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
} | } | ||||
@@ -201,6 +216,7 @@ Status HcclTaskInfo::Distribute() { | |||||
TransToGETaskInfo(ge_task); | TransToGETaskInfo(ge_task); | ||||
auto result = ops_kernel_info_store->LoadTask(ge_task); | auto result = ops_kernel_info_store->LoadTask(ge_task); | ||||
if (result != HCCL_SUCCESS) { | if (result != HCCL_SUCCESS) { | ||||
REPORT_CALL_ERROR("E19999", "Call ops_kernel_info_store LoadTask fail"); | |||||
GELOGE(INTERNAL_ERROR, "davinci_model : load task fail, return ret: %u", result); | GELOGE(INTERNAL_ERROR, "davinci_model : load task fail, return ret: %u", result); | ||||
return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
} | } | ||||
@@ -316,6 +332,8 @@ void HcclTaskInfo::GetPrivateDefByTaskDef(const domi::TaskDef &task) { | |||||
private_def_len_ = private_def_temp.size(); | private_def_len_ = private_def_temp.size(); | ||||
rtError_t ret = rtMallocHost(&private_def_, private_def_len_); | rtError_t ret = rtMallocHost(&private_def_, private_def_len_); | ||||
if (ret != RT_ERROR_NONE) { | if (ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtMallocHost failed, ret:0x%X, size:%u", | |||||
ret, private_def_len_); | |||||
GELOGE(RT_FAILED, "Call rtMallocHost Fail, ret = 0x%X.", ret); | GELOGE(RT_FAILED, "Call rtMallocHost Fail, ret = 0x%X.", ret); | ||||
return; | return; | ||||
} | } | ||||
@@ -323,6 +341,8 @@ void HcclTaskInfo::GetPrivateDefByTaskDef(const domi::TaskDef &task) { | |||||
ret = rtMemcpy(private_def_, private_def_len_, task.private_def().c_str(), private_def_len_, | ret = rtMemcpy(private_def_, private_def_len_, task.private_def().c_str(), private_def_len_, | ||||
RT_MEMCPY_HOST_TO_HOST); | RT_MEMCPY_HOST_TO_HOST); | ||||
if (ret != RT_ERROR_NONE) { | if (ret != RT_ERROR_NONE) { | ||||
REPORT_CALL_ERROR("E19999", "Call rtMemcpy failed, ret:0x%X, size:%u", | |||||
ret, private_def_len_); | |||||
GELOGE(RT_FAILED, "Call rtMemcpy Fail, ret = 0x%X.", ret); | GELOGE(RT_FAILED, "Call rtMemcpy Fail, ret = 0x%X.", ret); | ||||
return; | return; | ||||
} | } | ||||