From 65eb48fd48f7abd549e50e70e4c4ee1fef73d9d0 Mon Sep 17 00:00:00 2001 From: Valery Chernov Date: Tue, 18 Jan 2022 20:30:54 +0300 Subject: [PATCH 1/3] use ObjectPtr instead of Executable* to solid saving of Executable object for correct work of VirtualMachine on c++ side --- include/tvm/runtime/object.h | 7 +++++++ include/tvm/runtime/vm/vm.h | 4 ++-- src/runtime/vm/executable.cc | 3 ++- src/runtime/vm/profiler/vm.cc | 7 ++----- src/runtime/vm/profiler/vm.h | 2 +- src/runtime/vm/vm.cc | 7 +++---- 6 files changed, 17 insertions(+), 13 deletions(-) diff --git a/include/tvm/runtime/object.h b/include/tvm/runtime/object.h index 0ed61177e65a..09076d573352 100644 --- a/include/tvm/runtime/object.h +++ b/include/tvm/runtime/object.h @@ -438,6 +438,13 @@ class ObjectPtr { ObjectPtr(std::move(other)).swap(*this); // NOLINT(*) return *this; } + /*! + * \brief nullptr check + * \return result of comparison of internal pointer with nullptr. + */ + explicit operator bool() { + return get() != nullptr; + } /*! \brief reset the content of ptr to be nullptr */ void reset() { if (data_ != nullptr) { diff --git a/include/tvm/runtime/vm/vm.h b/include/tvm/runtime/vm/vm.h index 67c21a1b479f..d7311951b702 100644 --- a/include/tvm/runtime/vm/vm.h +++ b/include/tvm/runtime/vm/vm.h @@ -174,7 +174,7 @@ class VirtualMachine : public runtime::ModuleNode { * \brief load the executable for the virtual machine. * \param exec The executable. */ - virtual void LoadExecutable(Executable* exec); + virtual void LoadExecutable(const ObjectPtr& exec); protected: /*! \brief Push a call frame on to the call stack. */ @@ -300,7 +300,7 @@ class VirtualMachine : public runtime::ModuleNode { /*! \brief The special return register. */ ObjectRef return_register_; /*! \brief The executable the VM will operate on. */ - Executable* exec_; + ObjectPtr exec_; /*! \brief The function name to inputs mapping. */ std::unordered_map> inputs_; /*! diff --git a/src/runtime/vm/executable.cc b/src/runtime/vm/executable.cc index e2fe867630b0..0e2246835995 100644 --- a/src/runtime/vm/executable.cc +++ b/src/runtime/vm/executable.cc @@ -86,7 +86,8 @@ PackedFunc Executable::GetFunction(const std::string& name, const ObjectPtr(); - vm->LoadExecutable(this); + ICHECK(sptr_to_self.get() == this); + vm->LoadExecutable(GetObjectPtr(this)); *rv = Module(vm); }); } else if (name == "move_late_bound_consts") { diff --git a/src/runtime/vm/profiler/vm.cc b/src/runtime/vm/profiler/vm.cc index 67344df7dbe6..bcbd9011a1df 100644 --- a/src/runtime/vm/profiler/vm.cc +++ b/src/runtime/vm/profiler/vm.cc @@ -90,9 +90,8 @@ PackedFunc VirtualMachineDebug::GetFunction(const std::string& name, } } -void VirtualMachineDebug::LoadExecutable(Executable* exec) { +void VirtualMachineDebug::LoadExecutable(const ObjectPtr& exec) { VirtualMachine::LoadExecutable(exec); - ICHECK(exec_); for (auto kv : exec_->primitive_map) { packed_index_map_[kv.second] = kv.first; } @@ -204,15 +203,13 @@ void VirtualMachineDebug::InvokePacked(Index packed_index, const PackedFunc& fun runtime::Module CreateVirtualMachineDebug(Executable* exec) { auto vm = make_object(); - vm->LoadExecutable(exec); + vm->LoadExecutable(GetObjectPtr(exec)); return runtime::Module(vm); } TVM_REGISTER_GLOBAL("runtime._VirtualMachineDebug").set_body([](TVMArgs args, TVMRetValue* rv) { runtime::Module mod = args[0]; auto* exec = dynamic_cast(mod.operator->()); - ICHECK(exec) << "Virtual machine has not been defined yet." - << "\n"; *rv = CreateVirtualMachineDebug(exec); }); diff --git a/src/runtime/vm/profiler/vm.h b/src/runtime/vm/profiler/vm.h index 4a09b51fb86e..0c9e94c0ddd6 100644 --- a/src/runtime/vm/profiler/vm.h +++ b/src/runtime/vm/profiler/vm.h @@ -44,7 +44,7 @@ class VirtualMachineDebug : public VirtualMachine { PackedFunc GetFunction(const std::string& name, const ObjectPtr& sptr_to_self) final; - void LoadExecutable(Executable* exec) final; + void LoadExecutable(const ObjectPtr& exec) final; ~VirtualMachineDebug() {} diff --git a/src/runtime/vm/vm.cc b/src/runtime/vm/vm.cc index 7a83c9acb906..b1b5068ee19e 100644 --- a/src/runtime/vm/vm.cc +++ b/src/runtime/vm/vm.cc @@ -374,7 +374,7 @@ void VirtualMachine::InvokePacked(Index packed_index, const PackedFunc& func, In } } -void VirtualMachine::LoadExecutable(Executable* exec) { +void VirtualMachine::LoadExecutable(const ObjectPtr& exec) { ICHECK(exec) << "The executable is not created yet."; ICHECK(exec->late_bound_constant_names.empty()) << "Need to load late-bound-constants before creating VM"; @@ -382,7 +382,7 @@ void VirtualMachine::LoadExecutable(Executable* exec) { runtime::Module lib = exec_->GetLib(); - ICHECK(exec->primitive_map.empty() || lib.operator->()) + ICHECK(exec_->primitive_map.empty() || lib.operator->()) << "If the executable has declared primitive functions, the " << "generated kernel library must non-be null."; @@ -769,14 +769,13 @@ void VirtualMachine::RunLoop() { runtime::Module CreateVirtualMachine(Executable* exec) { auto vm = make_object(); - vm->LoadExecutable(exec); + vm->LoadExecutable(GetObjectPtr(exec)); return runtime::Module(vm); } TVM_REGISTER_GLOBAL("runtime._VirtualMachine").set_body([](TVMArgs args, TVMRetValue* rv) { runtime::Module mod = args[0]; auto* exec = dynamic_cast(mod.operator->()); - ICHECK(exec) << "The virtual machine executable has not been defined yet."; *rv = CreateVirtualMachine(exec); }); From b0919312e76aea7e2fd850806acaf44b35c97ca8 Mon Sep 17 00:00:00 2001 From: Valery Chernov Date: Mon, 31 Jan 2022 13:28:03 +0300 Subject: [PATCH 2/3] fix clang-format lint --- include/tvm/runtime/object.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/include/tvm/runtime/object.h b/include/tvm/runtime/object.h index 09076d573352..ff056de275e1 100644 --- a/include/tvm/runtime/object.h +++ b/include/tvm/runtime/object.h @@ -442,9 +442,7 @@ class ObjectPtr { * \brief nullptr check * \return result of comparison of internal pointer with nullptr. */ - explicit operator bool() { - return get() != nullptr; - } + explicit operator bool() { return get() != nullptr; } /*! \brief reset the content of ptr to be nullptr */ void reset() { if (data_ != nullptr) { From 517f24d80c8119377d510f3ccf308a141ae96a81 Mon Sep 17 00:00:00 2001 From: Valery Chernov Date: Mon, 31 Jan 2022 14:47:32 +0300 Subject: [PATCH 3/3] fix operator bool() --- include/tvm/runtime/object.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/tvm/runtime/object.h b/include/tvm/runtime/object.h index ff056de275e1..7046afcaf482 100644 --- a/include/tvm/runtime/object.h +++ b/include/tvm/runtime/object.h @@ -442,7 +442,7 @@ class ObjectPtr { * \brief nullptr check * \return result of comparison of internal pointer with nullptr. */ - explicit operator bool() { return get() != nullptr; } + explicit operator bool() const { return get() != nullptr; } /*! \brief reset the content of ptr to be nullptr */ void reset() { if (data_ != nullptr) {