The usage of parent scope in the scope design.
Created by: qingqing01
The scope has a parent scope with shared_ptr
type and has a constructor for it:
explicit Scope(const std::shared_ptr<Scope>& parent) : parent_(parent) {}
But the scope pointer is used in the operator as follows:
class OpContext {
public:
Scope* scope;
DeviceContext* device_context;
};
In the recurrent operator, we want to create a new local scope with a global parent scope. The global parent scope is passed by the network. There is a potential danger. If the local scope is released, reference count of parent scope will be decrease to zero, then the parent scope, namely global scope, will be released too. We can simply test this case in the scope_test.cc
as follows. There will be an error.
TEST(Scope, Parent) {
using paddle::framework::Scope;
using paddle::framework::Variable;
// auto parent_scope = std::make_shared<Scope>();
Scope* parent_scope = new Scope();
Variable* var0 = parent_scope->CreateVariable("a");
EXPECT_NE(var0, nullptr);
{
auto scope = std::make_shared<Scope>(std::shared_ptr<Scope>(parent_scope));
/// GetVariable will get Variable from parent scope if exist.
Variable* var1 = scope->GetVariable("a");
EXPECT_EQ(var0, var1);
} // the scope will be released
Variable* var2 = parent_scope->GetVariable("a");
EXPECT_EQ(var0, var2);
}