@@ -152,19 +152,28 @@ TEST_F(UtestAicpuNodeExecutor, aicpu_tf_node_task) { | |||
domi::TaskDef task_def2; | |||
task_def2.set_type(RT_MODEL_TASK_ALL_KERNEL); | |||
task_def2.mutable_kernel()->set_args(reinterpret_cast<const char *>(&args), args.head.length); | |||
task_def2.mutable_kernel()->set_args_size(args.head.length); | |||
hybrid_model.task_defs_[node] = std::vector<domi::TaskDef>({task_def2}); | |||
AicpuNodeTask aicpu_node_task(node_item, task_def); | |||
ASSERT_EQ(aicpu_node_task.Init(hybrid_model), FAILED); | |||
domi::KernelDef *kernel_def = task_def2.mutable_kernel(); | |||
kernel_def->set_args(reinterpret_cast<const char *>(&args), args.head.length); | |||
kernel_def->set_args_size(args.head.length); | |||
AicpuExtInfo aicpu_ext_info2; | |||
aicpu_ext_info2.infoType = aicpu::FWKAdapter::FWK_ADPT_EXT_SHAPE_TYPE; | |||
aicpu_ext_info2.infoLen = sizeof(int32_t); | |||
memcpy_s(aicpu_ext_info2.infoMsg, sizeof(int32_t), &type, sizeof(int32_t)); | |||
char *ext_mem2 = (char*)malloc(sizeof(AicpuExtInfo) + sizeof(int32_t)); | |||
memcpy_s(ext_mem2, sizeof(AicpuExtInfo) + sizeof(int32_t), &aicpu_ext_info2, sizeof(AicpuExtInfo) + sizeof(int32_t)); | |||
kernel_def->set_kernel_ext_info(ext_mem2, sizeof(AicpuExtInfo) + sizeof(int32_t)); | |||
kernel_def->set_kernel_ext_info_size(sizeof(AicpuExtInfo) + sizeof(int32_t)); | |||
hybrid_model.task_defs_[node] = std::vector<domi::TaskDef>({task_def2, task_def2}); | |||
AicpuNodeTask aicpu_node_task(node_item, task_def2); | |||
ASSERT_EQ(aicpu_node_task.Init(hybrid_model), SUCCESS); | |||
ASSERT_EQ(aicpu_node_task.UpdateIoAddr(*node_state->GetTaskContext()), SUCCESS); | |||
ASSERT_EQ(aicpu_node_task.LaunchTask(*node_state->GetTaskContext()), SUCCESS); | |||
node_item->is_dynamic = false; | |||
ASSERT_EQ(aicpu_node_task.UpdateIoAddr(*node_state->GetTaskContext()), SUCCESS); | |||
//kernel_ex_def->set_allocated_kernel_ext_info(nullptr); | |||
free(ext_mem); | |||
free(ext_mem2); | |||
} | |||
@@ -23,6 +23,7 @@ | |||
#include "graph/utils/graph_utils.h" | |||
#include "runtime/rt.h" | |||
#include "single_op/single_op_model.h" | |||
#include "aicpu/common/aicpu_task_struct.h" | |||
#include "single_op/task/tbe_task_builder.h" | |||
#include "single_op/task/rts_kernel_task_builder.h" | |||
#include "single_op/task/op_task.h" | |||
@@ -43,6 +44,10 @@ constexpr char const *kAttrSupportDynamicShape = "support_dynamicshape"; | |||
const char *const kEngineNameAiCore = "AIcoreEngine"; | |||
const char *const kEngineNameAiCpu = "aicpu_ascend_kernel"; | |||
const char *const kEngineNameAiCpuTf = "aicpu_tf_kernel"; | |||
struct AicpuTaskStruct { | |||
aicpu::AicpuParamHead head; | |||
uint64_t io_addrp[6]; | |||
}__attribute__((packed)); | |||
} // namespace | |||
class UtestSingleOpModel : public testing::Test { | |||
@@ -315,7 +320,7 @@ TEST_F(UtestSingleOpModel, BuildTaskList) { | |||
ASSERT_EQ(mem_task.LaunchKernel(0), SUCCESS); | |||
} | |||
TEST_F(UtestSingleOpModel, build_dynamic_task) { | |||
TEST_F(UtestSingleOpModel, build_dynamic_task01) { | |||
ComputeGraphPtr graph = make_shared<ComputeGraph>("single_op"); | |||
GeModelPtr ge_model = make_shared<GeModel>(); | |||
ge_model->SetGraph(GraphUtils::CreateGraphFromComputeGraph(graph)); | |||
@@ -366,3 +371,49 @@ TEST_F(UtestSingleOpModel, build_dynamic_task) { | |||
op_desc->SetOpKernelLibName(kEngineNameAiCpu); | |||
model.BuildTaskListForDynamicOp(res, single_op); | |||
} | |||
TEST_F(UtestSingleOpModel, build_dynamic_task02) { | |||
ComputeGraphPtr graph = make_shared<ComputeGraph>("single_op"); | |||
GeModelPtr ge_model = make_shared<GeModel>(); | |||
ge_model->SetGraph(GraphUtils::CreateGraphFromComputeGraph(graph)); | |||
shared_ptr<domi::ModelTaskDef> model_task_def = make_shared<domi::ModelTaskDef>(); | |||
ge_model->SetModelTaskDef(model_task_def); | |||
AicpuTaskStruct args; | |||
args.head.length = sizeof(args); | |||
args.head.ioAddrNum = 6; | |||
domi::TaskDef *task_def = model_task_def->add_task(); | |||
task_def->set_type(RT_MODEL_TASK_KERNEL); | |||
domi::KernelDef *kernel_def = task_def->mutable_kernel(); | |||
kernel_def->set_args(reinterpret_cast<const char *>(&args), args.head.length); | |||
kernel_def->set_args_size(args.head.length); | |||
ge::hybrid::AicpuExtInfo aicpu_ext_info; | |||
aicpu_ext_info.infoType = aicpu::FWKAdapter::FWK_ADPT_EXT_SHAPE_TYPE; | |||
aicpu_ext_info.infoLen = sizeof(int32_t); | |||
int32_t type = ge::DEPEND_COMPUTE; | |||
memcpy_s(aicpu_ext_info.infoMsg, sizeof(int32_t), &type, sizeof(int32_t)); | |||
char *ext_mem = (char*)malloc(sizeof(ge::hybrid::AicpuExtInfo) + sizeof(int32_t)); | |||
memcpy_s(ext_mem, sizeof(ge::hybrid::AicpuExtInfo) + sizeof(int32_t), &aicpu_ext_info, | |||
sizeof(ge::hybrid::AicpuExtInfo) + sizeof(int32_t)); | |||
kernel_def->set_kernel_ext_info(ext_mem, sizeof(ge::hybrid::AicpuExtInfo) + sizeof(int32_t)); | |||
kernel_def->set_kernel_ext_info_size(sizeof(ge::hybrid::AicpuExtInfo) + sizeof(int32_t)); | |||
domi::KernelContext *context = kernel_def->mutable_context(); | |||
context->set_kernel_type(6); // ccKernelType::AI_CPU | |||
string model_data_str = "dynamic_model"; | |||
SingleOpModel model("model", model_data_str.c_str(), model_data_str.size()); | |||
std::mutex stream_mu; | |||
rtStream_t stream = nullptr; | |||
rtStreamCreate(&stream, 0); | |||
DynamicSingleOp single_op(0, &stream_mu, stream); | |||
model.model_helper_.model_ = ge_model; | |||
auto op_desc = std::make_shared<ge::OpDesc>("add", "Add"); | |||
AttrUtils::SetInt(op_desc, ::ge::ATTR_NAME_UNKNOWN_SHAPE_TYPE, ge::DEPEND_COMPUTE); | |||
NodePtr node = graph->AddNode(op_desc); | |||
model.op_list_[0] = node; | |||
StreamResource *res = new (std::nothrow) StreamResource(1); | |||
ASSERT_EQ(model.ParseTasks(), SUCCESS); | |||
model.node_tasks_[node] = { *task_def, *task_def }; | |||
op_desc->SetOpKernelLibName(kEngineNameAiCpu); | |||
model.BuildTaskListForDynamicOp(res, single_op); | |||
} |
@@ -195,7 +195,35 @@ TEST_F(UtestSingleOpTask, test_atomic_exec) { | |||
optiling::utils::OpRunInfo run_info(0, true, 0); | |||
task.CalcTilingInfo(run_info); | |||
} | |||
TEST_F(UtestSingleOpTask, test_aicpu_task_launch_kernel) { | |||
AiCpuCCTask task; | |||
rtStream_t stream = nullptr; | |||
task.num_inputs_ = 2; | |||
task.num_outputs_ = 1; | |||
task.input_is_const_ = {true, false}; | |||
int total_addr = 3; | |||
uint32_t* addrs[total_addr] = {nullptr, nullptr, nullptr}; | |||
task.io_addr_ = reinterpret_cast<uintptr_t*>(addrs); | |||
task.io_addr_num_ = total_addr; | |||
ge::hybrid::AicpuExtInfo aicpu_ext_info; | |||
aicpu_ext_info.infoType = aicpu::FWKAdapter::FWK_ADPT_EXT_SHAPE_TYPE; | |||
aicpu_ext_info.infoLen = sizeof(int32_t); | |||
int32_t type = ge::DEPEND_COMPUTE; | |||
memcpy_s(aicpu_ext_info.infoMsg, sizeof(int32_t), &type, sizeof(int32_t)); | |||
char *ext_mem = (char*)malloc(sizeof(ge::hybrid::AicpuExtInfo) + sizeof(int32_t)); | |||
memcpy_s(ext_mem, sizeof(ge::hybrid::AicpuExtInfo) + sizeof(int32_t), &aicpu_ext_info, | |||
sizeof(ge::hybrid::AicpuExtInfo) + sizeof(int32_t)); | |||
std::string ext_info_str(ext_mem, sizeof(ge::hybrid::AicpuExtInfo) + sizeof(int32_t)); | |||
vector<DataBuffer> inputs(2, DataBuffer()); | |||
vector<DataBuffer> outputs(1, DataBuffer()); | |||
vector<GeTensorDesc> inputs_desc(2, GeTensorDesc(GeShape(), FORMAT_NCHW, DT_FLOAT)); | |||
vector<GeTensorDesc> outputs_desc(1, GeTensorDesc(GeShape(), FORMAT_NCHW, DT_FLOAT)); | |||
ASSERT_EQ(task.SetExtInfoAndType(ext_info_str, 0), SUCCESS); | |||
task.unknown_type_ = ge::DEPEND_COMPUTE; | |||
task.num_outputs_ = 1; | |||
ASSERT_EQ(task.InitForSummaryAndCopy(), SUCCESS); | |||
ASSERT_EQ(task.LaunchKernel(inputs_desc, inputs, outputs_desc, outputs, stream), SUCCESS); | |||
} | |||
TEST_F(UtestSingleOpTask, test_aicpu_task_update_io_addr) { | |||
AiCpuCCTask task; | |||
task.num_inputs_ = 2; | |||