From 5310701eabf45a0839d76aaaf13457c060cda417 Mon Sep 17 00:00:00 2001 From: Yoshiki Kanemoto Date: Wed, 10 Jan 2024 14:46:22 +0900 Subject: [PATCH 1/5] release GIL before potentially heavy computations --- python/bindings/openravepy_int.cpp | 15 +++++++++-- python/bindings/openravepy_kinbody.cpp | 35 +++++++++++++++++++++++--- 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/python/bindings/openravepy_int.cpp b/python/bindings/openravepy_int.cpp index 69e0e47e14..c0e863cc0c 100644 --- a/python/bindings/openravepy_int.cpp +++ b/python/bindings/openravepy_int.cpp @@ -2001,6 +2001,7 @@ void PyEnvironmentBase::Add(PyInterfaceBasePtr pinterface, py::object oAddMode, addMode = py::extract(oAddMode); } } + PythonThreadSaver threadsaver; _penv->Add(pinterface->GetInterfaceBase(), addMode, cmdargs); } @@ -2463,14 +2464,24 @@ object PyEnvironmentBase::plot3(object opoints,float pointsize,object ocolors, i pair sizes = _getGraphPointsColors(opoints,ocolors,vpoints,vcolors); bool bhasalpha = vcolors.size() == 4*sizes.second; if( sizes.first == sizes.second ) { - return toPyGraphHandle(_penv->plot3(vpoints.data(),sizes.first,sizeof(float)*3,pointsize,vcolors.data(),drawstyle,bhasalpha)); + GraphHandlePtr phandle; + { + PythonThreadSaver saver; + phandle = _penv->plot3(vpoints.data(),sizes.first,sizeof(float)*3,pointsize,vcolors.data(),drawstyle,bhasalpha); + } + return toPyGraphHandle(phandle); } BOOST_ASSERT(vcolors.size()<=4); RaveVector vcolor; for(int i = 0; i < (int)vcolors.size(); ++i) { vcolor[i] = vcolors[i]; } - return toPyGraphHandle(_penv->plot3(vpoints.data(),sizes.first,sizeof(float)*3,pointsize,vcolor,drawstyle)); + GraphHandlePtr phandle; + { + PythonThreadSaver saver; + phandle = _penv->plot3(vpoints.data(),sizes.first,sizeof(float)*3,pointsize,vcolor,drawstyle); + } + return toPyGraphHandle(phandle); } object PyEnvironmentBase::drawlinestrip(object opoints,float linewidth,object ocolors, int drawstyle) diff --git a/python/bindings/openravepy_kinbody.cpp b/python/bindings/openravepy_kinbody.cpp index e67d18963c..8aed456c6f 100644 --- a/python/bindings/openravepy_kinbody.cpp +++ b/python/bindings/openravepy_kinbody.cpp @@ -366,7 +366,11 @@ object PyGeometryInfo::SerializeJSON(dReal fUnitScale, object options) { rapidjson::Document doc; KinBody::GeometryInfoPtr pgeominfo = GetGeometryInfo(); - pgeominfo->SerializeJSON(doc, doc.GetAllocator(), fUnitScale, pyGetIntFromPy(options, 0)); + const int intOption = pyGetIntFromPy(options, 0); + { + openravepy::PythonThreadSaver threadsaver; + pgeominfo->SerializeJSON(doc, doc.GetAllocator(), fUnitScale, intOption); + } return toPyObject(doc); } @@ -375,7 +379,11 @@ void PyGeometryInfo::DeserializeJSON(object obj, dReal fUnitScale, object option rapidjson::Document doc; toRapidJSONValue(obj, doc, doc.GetAllocator()); KinBody::GeometryInfoPtr pgeominfo = GetGeometryInfo(); - pgeominfo->DeserializeJSON(doc, fUnitScale, pyGetIntFromPy(options, 0)); + const int intOption = pyGetIntFromPy(options, 0); + { + openravepy::PythonThreadSaver threadsaver; + pgeominfo->DeserializeJSON(doc, fUnitScale, intOption); + } Init(*pgeominfo); } @@ -608,7 +616,11 @@ py::object PyLinkInfo::SerializeJSON(dReal fUnitScale, object options) { rapidjson::Document doc; KinBody::LinkInfoPtr pInfo = GetLinkInfo(); - pInfo->SerializeJSON(doc, doc.GetAllocator(), fUnitScale, pyGetIntFromPy(options, 0)); + const int intOption = pyGetIntFromPy(options, 0); + { + openravepy::PythonThreadSaver threadsaver; + pInfo->SerializeJSON(doc, doc.GetAllocator(), fUnitScale, intOption); + } return toPyObject(doc); } @@ -617,7 +629,11 @@ void PyLinkInfo::DeserializeJSON(object obj, dReal fUnitScale, py::object option rapidjson::Document doc; toRapidJSONValue(obj, doc, doc.GetAllocator()); KinBody::LinkInfoPtr pInfo = GetLinkInfo(); - pInfo->DeserializeJSON(doc, fUnitScale, pyGetIntFromPy(options, 0)); + const int intOption = pyGetIntFromPy(options, 0); + { + openravepy::PythonThreadSaver threadsaver; + pInfo->DeserializeJSON(doc, fUnitScale, intOption); + } _Update(*pInfo); } @@ -1769,6 +1785,7 @@ void PyLink::InitGeometries(object ogeometryinfos) } geometries[i] = pygeom->GetGeometryInfo(); } + openravepy::PythonThreadSaver threadsaver; return _plink->InitGeometries(geometries); } @@ -1819,6 +1836,7 @@ void PyLink::SetGroupGeometries(const std::string& name, object ogeometryinfos) } geometries[i] = pygeom->GetGeometryInfo(); } + openravepy::PythonThreadSaver threadsaver; _plink->SetGroupGeometries(name, geometries); } @@ -2686,6 +2704,7 @@ bool PyKinBody::InitFromKinBodyInfo(const object pyKinBodyInfo) KinBody::KinBodyInfoPtr pKinBodyInfo; pKinBodyInfo = ExtractKinBodyInfo(pyKinBodyInfo); if(!!pKinBodyInfo) { + openravepy::PythonThreadSaver threadsaver; return _pbody->InitFromKinBodyInfo(*pKinBodyInfo); } return false; @@ -2714,6 +2733,7 @@ bool PyKinBody::InitFromBoxes(const boost::multi_array& vboxes, bool bD vaabbs[i].pos = Vector(vboxes[i][0],vboxes[i][1],vboxes[i][2]); vaabbs[i].extents = Vector(vboxes[i][3],vboxes[i][4],vboxes[i][5]); } + openravepy::PythonThreadSaver threadsaver; return _pbody->InitFromBoxes(vaabbs,bDraw,uri); } @@ -2739,6 +2759,7 @@ bool PyKinBody::InitFromSpheres(const boost::multi_array& vspheres, boo for(size_t i = 0; i < vvspheres.size(); ++i) { vvspheres[i] = Vector(vspheres[i][0],vspheres[i][1],vspheres[i][2],vspheres[i][3]); } + openravepy::PythonThreadSaver threadsaver; return _pbody->InitFromSpheres(vvspheres,bDraw,uri); } @@ -2746,6 +2767,7 @@ bool PyKinBody::InitFromTrimesh(object pytrimesh, bool bDraw, const std::string& { TriMesh mesh; if( ExtractTriMesh(pytrimesh,mesh) ) { + openravepy::PythonThreadSaver threadsaver; return _pbody->InitFromTrimesh(mesh,bDraw,uri); } else { @@ -2763,6 +2785,7 @@ bool PyKinBody::InitFromGeometries(object ogeometries, const std::string& uri) } geometries[i] = pygeom->GetGeometryInfo(); } + openravepy::PythonThreadSaver threadsaver; return _pbody->InitFromGeometries(geometries, uri); } @@ -2776,6 +2799,7 @@ void PyKinBody::InitFromLinkInfos(py::object olinkinfos, const std::string& uri) } linkInfos[i] = *pylinkinfo->GetLinkInfo(); } + openravepy::PythonThreadSaver threadsaver; return _pbody->InitFromLinkInfos(linkInfos, uri); } @@ -2785,11 +2809,13 @@ bool PyKinBody::Init(object olinkinfos, object ojointinfos, const std::string& u _ParseLinkInfos(olinkinfos, vlinkinfos); std::vector vjointinfos; _ParseJointInfos(ojointinfos, vjointinfos); + openravepy::PythonThreadSaver threadsaver; return _pbody->Init(vlinkinfos, vjointinfos, uri); } void PyKinBody::SetLinkGeometriesFromGroup(const std::string& geomname, const bool propagateGroupNameToSelfCollisionChecker) { + openravepy::PythonThreadSaver threadsaver; _pbody->SetLinkGeometriesFromGroup(geomname, propagateGroupNameToSelfCollisionChecker); } @@ -2808,6 +2834,7 @@ void PyKinBody::SetLinkGroupGeometries(const std::string& geomname, object olink geometries[j] = pygeom->GetGeometryInfo(); } } + openravepy::PythonThreadSaver threadsaver; _pbody->SetLinkGroupGeometries(geomname, linkgeometries); } From bbdc1b834223209ad5689f56947a7c649bf6601f Mon Sep 17 00:00:00 2001 From: YoshitoMori <87542096+y423610m@users.noreply.github.com> Date: Fri, 12 Jan 2024 09:27:32 +0900 Subject: [PATCH 2/5] fix log message in plugins/configurationcache/configurationjitterer.cpp --- plugins/configurationcache/configurationjitterer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/configurationcache/configurationjitterer.cpp b/plugins/configurationcache/configurationjitterer.cpp index ade223b741..6be7f9e8b2 100644 --- a/plugins/configurationcache/configurationjitterer.cpp +++ b/plugins/configurationcache/configurationjitterer.cpp @@ -729,7 +729,7 @@ By default will sample the robot's active DOFs. Parameters part of the interface } } ss << "]"; - RAVELOG_VERBOSE_FORMAT("env=%s, link '%s' exceeded linkdisthresh=%e. ellipdist[%e] > rhs[%e], %s", GetEnv()->GetNameId()%_linkdistthresh%_vLinks[ilink]->GetName()%ellipdist%rhs%ss.str()); + RAVELOG_VERBOSE_FORMAT("env=%s, link '%s' exceeded linkdisthresh=%e. ellipdist[%e] > rhs[%e], %s", GetEnv()->GetNameId()%_vLinks[ilink]->GetName()%_linkdistthresh%ellipdist%rhs%ss.str()); } break; } From 78ceece6a016da1c7bb045e74c0999b9363b27b9 Mon Sep 17 00:00:00 2001 From: Yoshiki Kanemoto Date: Fri, 12 Jan 2024 10:46:19 +0900 Subject: [PATCH 3/5] cosme, include a little more c++ computation into GIL unlock scope --- python/bindings/openravepy_int.cpp | 8 ++++---- python/bindings/openravepy_kinbody.cpp | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/python/bindings/openravepy_int.cpp b/python/bindings/openravepy_int.cpp index c0e863cc0c..3be7f8b9c5 100644 --- a/python/bindings/openravepy_int.cpp +++ b/python/bindings/openravepy_int.cpp @@ -2472,13 +2472,13 @@ object PyEnvironmentBase::plot3(object opoints,float pointsize,object ocolors, i return toPyGraphHandle(phandle); } BOOST_ASSERT(vcolors.size()<=4); - RaveVector vcolor; - for(int i = 0; i < (int)vcolors.size(); ++i) { - vcolor[i] = vcolors[i]; - } GraphHandlePtr phandle; { PythonThreadSaver saver; + RaveVector vcolor; + for(int i = 0; i < (int)vcolors.size(); ++i) { + vcolor[i] = vcolors[i]; + } phandle = _penv->plot3(vpoints.data(),sizes.first,sizeof(float)*3,pointsize,vcolor,drawstyle); } return toPyGraphHandle(phandle); diff --git a/python/bindings/openravepy_kinbody.cpp b/python/bindings/openravepy_kinbody.cpp index 8aed456c6f..2ee8ac1f58 100644 --- a/python/bindings/openravepy_kinbody.cpp +++ b/python/bindings/openravepy_kinbody.cpp @@ -366,10 +366,10 @@ object PyGeometryInfo::SerializeJSON(dReal fUnitScale, object options) { rapidjson::Document doc; KinBody::GeometryInfoPtr pgeominfo = GetGeometryInfo(); - const int intOption = pyGetIntFromPy(options, 0); + const int intOptions = pyGetIntFromPy(options, 0); { openravepy::PythonThreadSaver threadsaver; - pgeominfo->SerializeJSON(doc, doc.GetAllocator(), fUnitScale, intOption); + pgeominfo->SerializeJSON(doc, doc.GetAllocator(), fUnitScale, intOptions); } return toPyObject(doc); } @@ -379,10 +379,10 @@ void PyGeometryInfo::DeserializeJSON(object obj, dReal fUnitScale, object option rapidjson::Document doc; toRapidJSONValue(obj, doc, doc.GetAllocator()); KinBody::GeometryInfoPtr pgeominfo = GetGeometryInfo(); - const int intOption = pyGetIntFromPy(options, 0); + const int intOptions = pyGetIntFromPy(options, 0); { openravepy::PythonThreadSaver threadsaver; - pgeominfo->DeserializeJSON(doc, fUnitScale, intOption); + pgeominfo->DeserializeJSON(doc, fUnitScale, intOptions); } Init(*pgeominfo); } @@ -616,10 +616,10 @@ py::object PyLinkInfo::SerializeJSON(dReal fUnitScale, object options) { rapidjson::Document doc; KinBody::LinkInfoPtr pInfo = GetLinkInfo(); - const int intOption = pyGetIntFromPy(options, 0); + const int intOptions = pyGetIntFromPy(options, 0); { openravepy::PythonThreadSaver threadsaver; - pInfo->SerializeJSON(doc, doc.GetAllocator(), fUnitScale, intOption); + pInfo->SerializeJSON(doc, doc.GetAllocator(), fUnitScale, intOptions); } return toPyObject(doc); } @@ -629,10 +629,10 @@ void PyLinkInfo::DeserializeJSON(object obj, dReal fUnitScale, py::object option rapidjson::Document doc; toRapidJSONValue(obj, doc, doc.GetAllocator()); KinBody::LinkInfoPtr pInfo = GetLinkInfo(); - const int intOption = pyGetIntFromPy(options, 0); + const int intOptions = pyGetIntFromPy(options, 0); { openravepy::PythonThreadSaver threadsaver; - pInfo->DeserializeJSON(doc, fUnitScale, intOption); + pInfo->DeserializeJSON(doc, fUnitScale, intOptions); } _Update(*pInfo); } From ed2a2821aee82374785c53d032e728907fff7b98 Mon Sep 17 00:00:00 2001 From: Yoshiki Kanemoto Date: Fri, 12 Jan 2024 15:38:47 +0900 Subject: [PATCH 4/5] do not release GIL on box and sphere kinbody init. add GIL release on ExtractInfo --- python/bindings/openravepy_kinbody.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/python/bindings/openravepy_kinbody.cpp b/python/bindings/openravepy_kinbody.cpp index 2ee8ac1f58..eb238ecf5c 100644 --- a/python/bindings/openravepy_kinbody.cpp +++ b/python/bindings/openravepy_kinbody.cpp @@ -2733,7 +2733,6 @@ bool PyKinBody::InitFromBoxes(const boost::multi_array& vboxes, bool bD vaabbs[i].pos = Vector(vboxes[i][0],vboxes[i][1],vboxes[i][2]); vaabbs[i].extents = Vector(vboxes[i][3],vboxes[i][4],vboxes[i][5]); } - openravepy::PythonThreadSaver threadsaver; return _pbody->InitFromBoxes(vaabbs,bDraw,uri); } @@ -2759,7 +2758,6 @@ bool PyKinBody::InitFromSpheres(const boost::multi_array& vspheres, boo for(size_t i = 0; i < vvspheres.size(); ++i) { vvspheres[i] = Vector(vspheres[i][0],vspheres[i][1],vspheres[i][2],vspheres[i][3]); } - openravepy::PythonThreadSaver threadsaver; return _pbody->InitFromSpheres(vvspheres,bDraw,uri); } @@ -4288,7 +4286,10 @@ PyStateRestoreContextBase* PyKinBody::CreateKinBodyStateSaver(object options) object PyKinBody::ExtractInfo(ExtractInfoOptions options) const { KinBody::KinBodyInfo info; - _pbody->ExtractInfo(info, options); + { + openravepy::PythonThreadSaver threadsaver; + _pbody->ExtractInfo(info, options); + } return py::to_object(boost::shared_ptr(new PyKinBody::PyKinBodyInfo(info))); } From e756cbc20ae58efd184e18ba53cc14a5d097e380 Mon Sep 17 00:00:00 2001 From: Yoshiki Kanemoto Date: Fri, 12 Jan 2024 15:53:00 +0900 Subject: [PATCH 5/5] do not release GIL on kinbody/geom init since they are not obvious on profiler --- python/bindings/openravepy_kinbody.cpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/python/bindings/openravepy_kinbody.cpp b/python/bindings/openravepy_kinbody.cpp index eb238ecf5c..369925ab5a 100644 --- a/python/bindings/openravepy_kinbody.cpp +++ b/python/bindings/openravepy_kinbody.cpp @@ -1785,7 +1785,6 @@ void PyLink::InitGeometries(object ogeometryinfos) } geometries[i] = pygeom->GetGeometryInfo(); } - openravepy::PythonThreadSaver threadsaver; return _plink->InitGeometries(geometries); } @@ -1836,7 +1835,6 @@ void PyLink::SetGroupGeometries(const std::string& name, object ogeometryinfos) } geometries[i] = pygeom->GetGeometryInfo(); } - openravepy::PythonThreadSaver threadsaver; _plink->SetGroupGeometries(name, geometries); } @@ -2704,7 +2702,6 @@ bool PyKinBody::InitFromKinBodyInfo(const object pyKinBodyInfo) KinBody::KinBodyInfoPtr pKinBodyInfo; pKinBodyInfo = ExtractKinBodyInfo(pyKinBodyInfo); if(!!pKinBodyInfo) { - openravepy::PythonThreadSaver threadsaver; return _pbody->InitFromKinBodyInfo(*pKinBodyInfo); } return false; @@ -2765,7 +2762,6 @@ bool PyKinBody::InitFromTrimesh(object pytrimesh, bool bDraw, const std::string& { TriMesh mesh; if( ExtractTriMesh(pytrimesh,mesh) ) { - openravepy::PythonThreadSaver threadsaver; return _pbody->InitFromTrimesh(mesh,bDraw,uri); } else { @@ -2783,7 +2779,6 @@ bool PyKinBody::InitFromGeometries(object ogeometries, const std::string& uri) } geometries[i] = pygeom->GetGeometryInfo(); } - openravepy::PythonThreadSaver threadsaver; return _pbody->InitFromGeometries(geometries, uri); } @@ -2797,7 +2792,6 @@ void PyKinBody::InitFromLinkInfos(py::object olinkinfos, const std::string& uri) } linkInfos[i] = *pylinkinfo->GetLinkInfo(); } - openravepy::PythonThreadSaver threadsaver; return _pbody->InitFromLinkInfos(linkInfos, uri); } @@ -2807,13 +2801,11 @@ bool PyKinBody::Init(object olinkinfos, object ojointinfos, const std::string& u _ParseLinkInfos(olinkinfos, vlinkinfos); std::vector vjointinfos; _ParseJointInfos(ojointinfos, vjointinfos); - openravepy::PythonThreadSaver threadsaver; return _pbody->Init(vlinkinfos, vjointinfos, uri); } void PyKinBody::SetLinkGeometriesFromGroup(const std::string& geomname, const bool propagateGroupNameToSelfCollisionChecker) { - openravepy::PythonThreadSaver threadsaver; _pbody->SetLinkGeometriesFromGroup(geomname, propagateGroupNameToSelfCollisionChecker); } @@ -2832,7 +2824,6 @@ void PyKinBody::SetLinkGroupGeometries(const std::string& geomname, object olink geometries[j] = pygeom->GetGeometryInfo(); } } - openravepy::PythonThreadSaver threadsaver; _pbody->SetLinkGroupGeometries(geomname, linkgeometries); }