| 381 | } |
| 382 | |
| 383 | void ExternCOprRunner::scn_do_execute() { |
| 384 | SmallVector<MGBTensor> c_inp(input().size()), c_out(output().size()); |
| 385 | SmallVector<HostTensorND> cpu_inp, cpu_out; |
| 386 | check_param(); |
| 387 | |
| 388 | bool need_copy = false; |
| 389 | if (comp_node().device_type() == CompNode::DeviceType::CPU) { |
| 390 | for (size_t i = 0; i < input().size(); ++i) { |
| 391 | c_inp[i] = tensor_to_c(input(i)->dev_tensor()); |
| 392 | } |
| 393 | for (size_t i = 0; i < output().size(); ++i) { |
| 394 | c_out[i] = tensor_to_c(output(i)->dev_tensor()); |
| 395 | } |
| 396 | } else { |
| 397 | need_copy = true; |
| 398 | mgb_log_debug( |
| 399 | "copy is needed to execute extern C " |
| 400 | "opr `%s' on comp node `%s'", |
| 401 | cname(), comp_node().to_string().c_str()); |
| 402 | cpu_inp.resize(input().size()); |
| 403 | cpu_out.resize(output().size()); |
| 404 | for (size_t i = 0; i < input().size(); ++i) { |
| 405 | cpu_inp[i].copy_from(input(i)->dev_tensor()); |
| 406 | c_inp[i] = tensor_to_c(cpu_inp[i]); |
| 407 | } |
| 408 | for (size_t i = 0; i < output().size(); ++i) { |
| 409 | cpu_out[i] |
| 410 | .comp_node(comp_node()) |
| 411 | .dtype(output(i)->dtype()) |
| 412 | .resize(output(i)->shape()); |
| 413 | c_out[i] = tensor_to_c(cpu_out[i]); |
| 414 | } |
| 415 | } |
| 416 | |
| 417 | if (need_copy) { |
| 418 | comp_node().sync(); |
| 419 | m_desc->execute(m_desc.get(), c_inp.data(), c_out.data()); |
| 420 | |
| 421 | for (size_t i = 0; i < output().size(); ++i) |
| 422 | output(i)->dev_tensor().copy_from_fixlayout(cpu_out[i]).sync(); |
| 423 | } else { |
| 424 | CompNodeEnv::from_comp_node(comp_node()) |
| 425 | .cpu_env() |
| 426 | .dispatch([this, c_inp, c_out]() mutable { |
| 427 | m_desc->execute(m_desc.get(), c_inp.data(), c_out.data()); |
| 428 | }); |
| 429 | } |
| 430 | } |
| 431 | |
| 432 | void ExternCOprRunner::add_input_layout_constraint() { |
| 433 | for (auto i : input()) |
nothing calls this directly
no test coverage detected