You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

misc.cpp 2.6 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #include "../dnn_op_helper.h"
  2. #include "../op_trait.h"
  3. #include "megbrain/imperative/ops/autogen.h"
  4. #include "megbrain/opr/misc.h"
  5. namespace mgb {
  6. namespace imperative {
  7. namespace check_non_finite {
  8. SymbolVarArray apply_on_var_node(const OpDef& def, const VarNodeArray& inputs) {
  9. auto&& op = def.cast_final_safe<CheckNonFinite>();
  10. OperatorNodeConfig config{op.make_name()};
  11. return opr::CheckNonFinite::make(inputs, op.param(), config);
  12. }
  13. SmallVector<TensorPtr> apply_on_physical_tensor(
  14. const OpDef& def, const SmallVector<TensorPtr>& inputs,
  15. SmallVector<LogicalTensorDesc>& output_descs, const bool& validated) {
  16. size_t size = inputs.size();
  17. auto&& op = def.cast_final_safe<CheckNonFinite>();
  18. SmallVector<TensorPtr> outputs(size + 1);
  19. outputs[size] = Tensor::make(
  20. TensorLayout(TensorShape({1}), dtype::Int32()), inputs[0]->comp_node());
  21. auto dest = outputs[size];
  22. auto cn = dest->comp_node();
  23. DnnOprCaller<megdnn::CheckNonFinite> dnn_opr(cn);
  24. SmallVector<megdnn::TensorND> srcs(size);
  25. // copy an outputs to the dnn for inplace
  26. for (size_t i = 0; i < size; ++i) {
  27. outputs[i] = Tensor::make(inputs[i]->layout(), inputs[0]->comp_node());
  28. outputs[i]->dev_tensor().copy_from_fixlayout(inputs[i]->dev_tensor());
  29. srcs[i] = outputs[i]->dev_tensor().as_megdnn();
  30. }
  31. megdnn::CheckNonFinite::Param param({op.scale});
  32. dnn_opr.op->param() = param;
  33. size_t sz = dnn_opr.op->get_workspace_in_bytes(srcs, dest->layout());
  34. auto dnn_wk = dnn_opr.create_workspace(sz);
  35. dnn_opr.op->exec(srcs, dest->dnn_tensor(), dnn_wk);
  36. return outputs;
  37. }
  38. std::tuple<SmallVector<LogicalTensorDesc>, bool> infer_output_attrs_fallible(
  39. const OpDef& def, const SmallVector<LogicalTensorDesc>& inputs) {
  40. size_t size = inputs.size();
  41. SmallVector<LogicalTensorDesc> dests(size + 1);
  42. for (size_t i = 0; i < size; ++i) {
  43. dests[i].comp_node = inputs[i].comp_node;
  44. dests[i].layout = inputs[i].layout;
  45. }
  46. dests[size].comp_node = inputs[0].comp_node;
  47. dests[size].layout = TensorLayout(TensorShape({1}), dtype::Int32());
  48. return {dests, true};
  49. }
  50. OP_TRAIT_REG(CheckNonFinite, CheckNonFinite)
  51. .apply_on_var_node(apply_on_var_node)
  52. .apply_on_physical_tensor(apply_on_physical_tensor)
  53. .infer_output_attrs_fallible(infer_output_attrs_fallible)
  54. .fallback();
  55. } // namespace check_non_finite
  56. } // namespace imperative
  57. } // namespace mgb
  58. // vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}}