动态图pynative_execute的个人理解

在这里插入图片描述

using mindspore::tensor::TensorPy;
const size_t PTR_LEN = 15; 
// 原语无法推断 PyNative 模式下恒定输入的值
static const std::set<std::string> vm_operators = {"make_ref", "HookBackward", "InsertGradientOf", "stop_gradient",
                                                   "mixed_precision_cast"};
static const char kOpsFunctionModelName[] = "mindspore.ops.functional";
static const char kMSDtypeModelName[] = "mindspore.common.dtype";
// mindspore命名空间
namespace mindspore::pynative {
// 设置一些值为nullptr
static std::shared_ptr<session::SessionBasic> session = nullptr;
PynativeExecutorPtr PynativeExecutor::executor_ = nullptr;
ForwardExecutorPtr PynativeExecutor::forward_executor_ = nullptr;
GradExecutorPtr PynativeExecutor::grad_executor_ = nullptr;
std::mutex PynativeExecutor::instance_lock_;
/* 声明为constexpr函数的意义是:
如果其参数均为合适的编译期常量,则对这个constexpr函数的调用就可用于期望常量表达式的场合
(如模板的非类型参数,或枚举(enum)常量的值)
如果参数的值在运行期才能确定,或者虽然参数的值是编译期常量,
但不匹配这个函数的要求,则对这个函数调用的求值只能在运行期进行 */
constexpr auto implcast = "implcast";

template <typename T, typename... Args>
// 泛化
void PynativeExecutorTry(std::function<void(T *ret, const Args &...)> method, T *ret, const Args &... args) {
/* auto是一个C/C++语言存储类型,仅在语句块内部使用
  初始化可为任何表达式,其特点是当执行流程进入该语句块的时候初始化可为任何表达式 */
  const auto inst = PynativeExecutor::GetInstance();
  MS_EXCEPTION_IF_NULL(inst);
  MS_EXCEPTION_IF_NULL(method);
  // 异常处理
  try {
    method(ret, args...);
  } catch (const py::error_already_set &ex) {
    // 发布前打印函数调用堆栈信息
    std::ostringstream oss;
    trace::TraceGraphEval();
    trace::GetEvalStackInfo(oss);
    // py::print 将函数调用栈输出到STDOUT,如果输出到文件,用户可以看到
    // 这些信息来自屏幕,无需打开日志文件即可找到这些信息
    py::print(oss.str());
    MS_LOG(ERROR) << oss.str();
    inst->ClearRes();
    // 将此异常重新抛出给 Python 解释器来处理它
    throw(py::error_already_set(ex));
  } catch (const py::type_error &ex) {
    inst->ClearRes();
    throw py::type_error(ex);
  } catch (const py::value_error &ex) {
    inst->ClearRes();
    throw py::value_error(ex);
  } catch (const py::index_error &ex) {
    inst->ClearRes();
    throw py::index_error(ex);
  } catch (const py::name_error &ex) {
    inst->ClearRes();
    throw py::name_error(ex);
  } catch (const std::exception &ex) {
    inst->ClearRes();
    // 将此异常重新抛出给 Python 解释器来处理它
    throw(std::runtime_error(ex.what()));
  } catch (...) {
    inst->ClearRes();
    std::string exName(abi::__cxa_current_exception_type()->name());
    // 输出:“编译图时出错。异常名称:”
    MS_LOG(EXCEPTION) << "Error occurred when compile graph. Exception name: " << exName;
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bessie_Lee_gogogo

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值