diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aad3747 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.hg diff --git a/Gazebo_exercise/gazebo7_7.14.0_exercise/CMakeLists.txt b/Gazebo_exercise/gazebo7_7.14.0_exercise/CMakeLists.txt index d1ca00c..079dc15 100644 --- a/Gazebo_exercise/gazebo7_7.14.0_exercise/CMakeLists.txt +++ b/Gazebo_exercise/gazebo7_7.14.0_exercise/CMakeLists.txt @@ -17,7 +17,7 @@ set (GAZEBO_MINOR_VERSION 14) set (GAZEBO_PATCH_VERSION 0) set (GAZEBO_VERSION ${GAZEBO_MAJOR_VERSION}.${GAZEBO_MINOR_VERSION}) -set (GAZEBO_VERSION_FULL ${GAZEBO_MAJOR_VERSION}.${GAZEBO_MINOR_VERSION}.${GAZEBO_PATCH_VERSION}) +set (GAZEBO_VERSION_FULL ${GAZEBO_MAJOR_VERSION}.${GAZEBO_MINOR_VERSION}.${GAZEBO_PATCH_VERSION}-exercise) message (STATUS "${PROJECT_NAME} version ${GAZEBO_VERSION_FULL}") diff --git a/Gazebo_exercise/gazebo7_7.14.0_exercise/Exercise_Changelog.md b/Gazebo_exercise/gazebo7_7.14.0_exercise/Exercise_Changelog.md new file mode 100644 index 0000000..426e2de --- /dev/null +++ b/Gazebo_exercise/gazebo7_7.14.0_exercise/Exercise_Changelog.md @@ -0,0 +1,25 @@ +## Gazebo 7.14.0 + +## Gazebo-exercise-0.2 (2019-05-23) + +1. 添加优化统一SDF标签exercise-opt,原标签parallel失效 + +1. 添加dxProcessIslands模块OpenMP并行优化 + * [SDF控制标签] updatephysics_dxprocessislands + +1. 添加dxSpace构建类型选择 + * [SDF控制标签] collide_space + +1. 添加默认dxSpace类型(dxHashSpace)碰撞处理模块OpenMp并行优化 + * [SDF控制标签] dxhashspace_collide + +1. 去掉事件处理模块(worldUpdateBegin)中的线程池等并行优化措施,只保留OpenMP + * [相关文件]/gazebo/common/Event.hh + * [SDF控制标签] event_signal + +## Gazebo-exercise-0.1 (2019-04-01) + +1. 添加事件处理模块(worldUpdateBegin)中OpenMp、Tbb、线程池、C++11Thread等并行优化措施 + * [相关文件]/gazebo/common/Event.hh + +1. 添加并行处理优化控制SDF标签parallel \ No newline at end of file diff --git a/Gazebo_exercise/gazebo7_7.14.0_exercise/Exercise_README.md b/Gazebo_exercise/gazebo7_7.14.0_exercise/Exercise_README.md new file mode 100644 index 0000000..71e3ea0 --- /dev/null +++ b/Gazebo_exercise/gazebo7_7.14.0_exercise/Exercise_README.md @@ -0,0 +1,61 @@ +# Gazebo-exercise安装&使用说明文档 +2019-05-23 by airc_exercise@163.com +``` +______________________________________________________________ +| This is Gazebo-exercis-0.2 | +| by AIRC-01 | +| | +|---------------------- WorldUpdateBegin --------------------| +| Multithreading event_signal: ON | +| Multithreading event_signal: OFF | +| Using OpenMP with n threads | +|---------------------- UpdateCollision ---------------------| +| Using dSweepAndPruneSpace | +| Using dHashSpace | +| Multithreading dHashSpace: ON | +| Using OpenMP with n threads | +| Multithreading dHashSpace: OFF | +|---------------------- UpdatePhysics -----------------------| +| Multithreading dxprocessislands: ON | +| Using OpenMP with n threads | +| Multithreading dxprocessislands: OFF | +| This code is running with NO OPTIMIZATION ! | +|____________________________________________________________| +``` + +## 安装第三方依赖库 +由于Gazebo-exercise是基于官方版本Gazebo7_7.14.0进行开发,因此,安装过程与Gazebo7_7.14.0类似,需要首先安装一些第三方依赖库。关于依赖库的具体安装过程不在这里赘述,需要注意的是这些库的版本需要跟Gazebo的版本相匹配。 +- 安装ign-math_2.8.0 +- 安装protobuf-2.6.1 +- 安装sdformat_4.4.0 + +## 安装Gazebo-exercise +``` + mkdir build + cd build + cmake ../ + make -jX(X为编译时启用的线程数,其根据CPU核心数确定,不要超过CPU核心数) + sudo make install +``` +## 使用Gazebo-exercise中的优化 +当前版本针对Gazebo仿真流程中的预处理(WorldUpdateBegin)、碰撞更新(UpdateCollision)以及物理更新(UpdatePhysics)等模块分别进行了优化,主要采用了基于OpenMP的多线程优化,也有小部分其他优化措施。为了使用这些优化,需要在仿真的主世界文件(一般以.world结尾)中,添加如下所示的优化标签: +``` + +... + + + 1 + + + + ... + +``` + +标签释义如下: +- 标签:优化总开关。 +- 标签:用于设置模型预处理模块并行优化参数,parallel_type为1~5表示OpenMp优化(一般设置为1即可,其他是采用不同的任务并发方式),threads为开启的线程数;parallel_type为其他数字时表示不开启优化。 +- 标签:用于设置碰撞更新模块中碰撞空间的类型,值为1时表示SAP空间类型,其他数字表示默认的Hash空间类型。 +- 标签:用于设置碰撞更新模块中dxHashSpace::collide模块并行参数,当标签设置为1时,该参数没有意义;其他情况下,threads大于1,表示采用OpenMP并行优化,threads为开启的线程数,否则不开启优化。 +- 标签:用于设置物理更新模块中dxProcessIslands模块并行参数;parallel_type为1~5表示OpenMp优化(一般设置为1即可,其他是采用不同的任务并发方式),threads为开启的线程数;parallel_type为其他数字时表示不开启优化。 + diff --git a/Gazebo_exercise/gazebo7_7.14.0_exercise/deps/opende/include/ode/collision.h b/Gazebo_exercise/gazebo7_7.14.0_exercise/deps/opende/include/ode/collision.h index e89726c..288e8d3 100644 --- a/Gazebo_exercise/gazebo7_7.14.0_exercise/deps/opende/include/ode/collision.h +++ b/Gazebo_exercise/gazebo7_7.14.0_exercise/deps/opende/include/ode/collision.h @@ -824,7 +824,6 @@ ODE_API int dCollide (dGeomID o1, dGeomID o2, int flags, dContactGeom *contact, */ ODE_API void dSpaceCollide (dSpaceID space, void *data, dNearCallback *callback); - /** * @brief Determines which geoms from one space may potentially intersect with * geoms from another space, and calls the callback function for each candidate diff --git a/Gazebo_exercise/gazebo7_7.14.0_exercise/deps/opende/include/ode/collision_space.h b/Gazebo_exercise/gazebo7_7.14.0_exercise/deps/opende/include/ode/collision_space.h index bf7ef9b..1c89e9a 100644 --- a/Gazebo_exercise/gazebo7_7.14.0_exercise/deps/opende/include/ode/collision_space.h +++ b/Gazebo_exercise/gazebo7_7.14.0_exercise/deps/opende/include/ode/collision_space.h @@ -51,6 +51,7 @@ typedef void dNearCallback (void *data, dGeomID o1, dGeomID o2); ODE_API dSpaceID dSimpleSpaceCreate (dSpaceID space); ODE_API dSpaceID dHashSpaceCreate (dSpaceID space); +ODE_API dSpaceID dHashSpaceCreate2 (dSpaceID space, int number); //Added by zenglei@20190523 ODE_API dSpaceID dQuadTreeSpaceCreate (dSpaceID space, const dVector3 Center, const dVector3 Extents, int Depth); @@ -65,8 +66,6 @@ ODE_API dSpaceID dQuadTreeSpaceCreate (dSpaceID space, const dVector3 Center, co ODE_API dSpaceID dSweepAndPruneSpaceCreate( dSpaceID space, int axisorder ); - - ODE_API void dSpaceDestroy (dSpaceID); ODE_API void dHashSpaceSetLevels (dSpaceID space, int minlevel, int maxlevel); diff --git a/Gazebo_exercise/gazebo7_7.14.0_exercise/deps/opende/include/ode/objects.h b/Gazebo_exercise/gazebo7_7.14.0_exercise/deps/opende/include/ode/objects.h index 610c44c..5855078 100644 --- a/Gazebo_exercise/gazebo7_7.14.0_exercise/deps/opende/include/ode/objects.h +++ b/Gazebo_exercise/gazebo7_7.14.0_exercise/deps/opende/include/ode/objects.h @@ -83,7 +83,11 @@ ODE_API dBodyID dWorldGetBody(dWorldID world, int id); */ ODE_API void dWorldDestroy (dWorldID world); - +//////////////////// AIRC begin //////////////////// + // Added by zenglei@2019-05-23, Modified by YYY@yyy-yy-yy + // [Description] set parallel info for UpdatePhysics +ODE_API void dWorldSetIslandsInfo(dWorldID w, int type, int threads); +//////////////////// AIRC end //////////////////// /** * @brief Set the world's global gravity vector. * diff --git a/Gazebo_exercise/gazebo7_7.14.0_exercise/deps/opende/src/collision_space.cpp b/Gazebo_exercise/gazebo7_7.14.0_exercise/deps/opende/src/collision_space.cpp index a075208..d3b9f04 100644 --- a/Gazebo_exercise/gazebo7_7.14.0_exercise/deps/opende/src/collision_space.cpp +++ b/Gazebo_exercise/gazebo7_7.14.0_exercise/deps/opende/src/collision_space.cpp @@ -34,6 +34,7 @@ spaces #include "collision_kernel.h" #include "collision_space_internal.h" #include "util.h" +#include //Added by zenglei@20190523 #ifdef _MSC_VER #pragma warning(disable:4291) // for VC++, no complaints about "no matching operator delete found" @@ -376,13 +377,16 @@ struct dxHashSpace : public dxSpace { int global_minlevel; // smallest hash table level to put AABBs in int global_maxlevel; // objects that need a level larger than this will be // put in a "big objects" list instead of a hash table + int threadsforOpenMp; //the number of thread to OpenMp by zenglei@20190523 dxHashSpace (dSpaceID _space); + dxHashSpace (dSpaceID _space, int number); //set the number of thread to OpenMp by zenglei@20190523 void setLevels (int minlevel, int maxlevel); void getLevels (int *minlevel, int *maxlevel); void cleanGeoms(); void collide (void *data, dNearCallback *callback); void collide2 (void *data, dxGeom *geom, dNearCallback *callback); + // void collide_parallel(void *data, int threads, dNearCallback *callback); //Added by zenglei@20190523 }; @@ -391,9 +395,19 @@ dxHashSpace::dxHashSpace (dSpaceID _space) : dxSpace (_space) type = dHashSpaceClass; global_minlevel = -3; global_maxlevel = 10; + threadsforOpenMp = -1; } - - +//////////////////// AIRC begin //////////////////// + // Added by zenglei@2019-05-23, Modified by YYY@yyy-yy-yy + // [Description] set the number of thread to OpenMp +dxHashSpace::dxHashSpace (dSpaceID _space, int number) : dxSpace (_space) +{ + type = dHashSpaceClass; + global_minlevel = -3; + global_maxlevel = 10; + threadsforOpenMp = number; +} +//////////////////// AIRC end //////////////////// void dxHashSpace::setLevels (int minlevel, int maxlevel) { dAASSERT (minlevel <= maxlevel); @@ -401,7 +415,6 @@ void dxHashSpace::setLevels (int minlevel, int maxlevel) global_maxlevel = maxlevel; } - void dxHashSpace::getLevels (int *minlevel, int *maxlevel) { if (minlevel) *minlevel = global_minlevel; @@ -423,7 +436,9 @@ void dxHashSpace::cleanGeoms() lock_count--; } - +//////////////////// AIRC begin //////////////////// + // Added by zenglei@2019-05-23, Modified by YYY@yyy-yy-yy + // [Description] Parallel for collide void dxHashSpace::collide (void *_data, dNearCallback *callback) { dAASSERT(this && callback); @@ -529,47 +544,102 @@ void dxHashSpace::collide (void *_data, dNearCallback *callback) // same cells for collisions, and then check for other AABBs in all // intersecting higher level cells. - int db[6]; // discrete bounds at current level - for (aabb2=first_aabb; aabb2; aabb2=aabb2->next) + if(threadsforOpenMp > 0) { - // we are searching for collisions with aabb - for (i=0; i<6; i++) db[i] = aabb2->dbounds[i]; - for (int level = aabb2->level; level <= maxlevel; level++) { - for (int xi = db[0]; xi <= db[1]; xi++) { - for (int yi = db[2]; yi <= db[3]; yi++) { - for (int zi = db[4]; zi <= db[5]; zi++) { - // get the hash index - unsigned long hi = getVirtualAddress (level,xi,yi,zi) % sz; - // search all nodes at this index - Node *node; - for (node = table[hi]; node; node=node->next) { - // node points to an AABB that may intersect aabb - if (node->aabb == aabb2) continue; - if (node->aabb->level == level && - node->x == xi && node->y == yi && node->z == zi) { - // see if aabb and node->aabb have already been tested - // against each other - unsigned char mask; - if (aabb2->index <= node->aabb->index) { - i = (aabb2->index * tested_rowsize)+(node->aabb->index >> 3); - mask = 1 << (node->aabb->index & 7); + std::vector vecAABB2; + for (aabb2=first_aabb; aabb2; aabb2=aabb2->next) + vecAABB2.push_back(aabb2); + omp_set_num_threads(threadsforOpenMp); + #pragma omp parallel for + for(int index = 0; index < (int)vecAABB2.size(); index++) + { + int db[6]; // discrete bounds at current level + int k; + // we are searching for collisions with aabb + for (k=0; k<6; k++) db[k] = vecAABB2[index]->dbounds[k]; + for (int level = vecAABB2[index]->level; level <= maxlevel; level++) { + for (int xi = db[0]; xi <= db[1]; xi++) { + for (int yi = db[2]; yi <= db[3]; yi++) { + for (int zi = db[4]; zi <= db[5]; zi++) { + // get the hash index + unsigned long hi = getVirtualAddress (level,xi,yi,zi) % sz; + // search all nodes at this index + Node *node; + for (node = table[hi]; node; node=node->next) { + // node points to an AABB that may intersect aabb + if (node->aabb == vecAABB2[index]) continue; + if (node->aabb->level == level && + node->x == xi && node->y == yi && node->z == zi) { + // see if aabb and node->aabb have already been tested + // against each other + unsigned char mask; + if (vecAABB2[index]->index <= node->aabb->index) { + k = (vecAABB2[index]->index * tested_rowsize)+(node->aabb->index >> 3); + mask = 1 << (node->aabb->index & 7); + } + else { + k = (node->aabb->index * tested_rowsize)+(vecAABB2[index]->index >> 3); + mask = 1 << (vecAABB2[index]->index & 7); + } + dIASSERT (k >= 0 && k < (tested_rowsize*n)); + if ((tested[k] & mask)==0) { + collideAABBs (vecAABB2[index]->geom,node->aabb->geom,_data,callback); + } + tested[k] |= mask; + } + } } - else { - i = (node->aabb->index * tested_rowsize)+(aabb2->index >> 3); - mask = 1 << (aabb2->index & 7); + } + } + // get the discrete bounds for the next level up + for (k=0; k<6; k++) db[k] >>= 1; + } + } + } + else + { + int db[6]; // discrete bounds at current level + for (aabb2=first_aabb; aabb2; aabb2=aabb2->next) + { + // we are searching for collisions with aabb + for (i=0; i<6; i++) db[i] = aabb2->dbounds[i]; + for (int level = aabb2->level; level <= maxlevel; level++) { + for (int xi = db[0]; xi <= db[1]; xi++) { + for (int yi = db[2]; yi <= db[3]; yi++) { + for (int zi = db[4]; zi <= db[5]; zi++) { + // get the hash index + unsigned long hi = getVirtualAddress (level,xi,yi,zi) % sz; + // search all nodes at this index + Node *node; + for (node = table[hi]; node; node=node->next) { + // node points to an AABB that may intersect aabb + if (node->aabb == aabb2) continue; + if (node->aabb->level == level && + node->x == xi && node->y == yi && node->z == zi) { + // see if aabb and node->aabb have already been tested + // against each other + unsigned char mask; + if (aabb2->index <= node->aabb->index) { + i = (aabb2->index * tested_rowsize)+(node->aabb->index >> 3); + mask = 1 << (node->aabb->index & 7); + } + else { + i = (node->aabb->index * tested_rowsize)+(aabb2->index >> 3); + mask = 1 << (aabb2->index & 7); + } + dIASSERT (i >= 0 && i < (tested_rowsize*n)); + if ((tested[i] & mask)==0) { + collideAABBs (aabb2->geom,node->aabb->geom,_data,callback); + } + tested[i] |= mask; } - dIASSERT (i >= 0 && i < (tested_rowsize*n)); - if ((tested[i] & mask)==0) { - collideAABBs (aabb2->geom,node->aabb->geom,_data,callback); - } - tested[i] |= mask; } } } } + // get the discrete bounds for the next level up + for (i=0; i<6; i++) db[i] >>= 1; } - // get the discrete bounds for the next level up - for (i=0; i<6; i++) db[i] >>= 1; } } @@ -591,7 +661,7 @@ void dxHashSpace::collide (void *_data, dNearCallback *callback) lock_count--; } - +//////////////////// AIRC end //////////////////// void dxHashSpace::collide2 (void *_data, dxGeom *geom, dNearCallback *callback) @@ -627,6 +697,10 @@ dxSpace *dHashSpaceCreate (dxSpace *space) return new dxHashSpace (space); } +dxSpace *dHashSpaceCreate2 (dxSpace *space, int number) +{ + return new dxHashSpace (space, number); +} void dHashSpaceSetLevels (dxSpace *space, int minlevel, int maxlevel) { @@ -754,7 +828,6 @@ int dSpaceGetClass (dxSpace *space) return space->type; } - void dSpaceCollide (dxSpace *space, void *data, dNearCallback *callback) { dAASSERT (space && callback); diff --git a/Gazebo_exercise/gazebo7_7.14.0_exercise/deps/opende/src/objects.h b/Gazebo_exercise/gazebo7_7.14.0_exercise/deps/opende/src/objects.h index 22c1d80..6aac25f 100644 --- a/Gazebo_exercise/gazebo7_7.14.0_exercise/deps/opende/src/objects.h +++ b/Gazebo_exercise/gazebo7_7.14.0_exercise/deps/opende/src/objects.h @@ -204,6 +204,30 @@ struct dxWorld : public dBase { dReal max_angular_speed; // limit the angular velocity to this magnitude boost::threadpool::pool *threadpool; boost::threadpool::pool *row_threadpool; + //////////////////// AIRC begin //////////////////// + // Added by zenglei@2019-05-23, Modified by YYY@yyy-yy-yy + // [Description] struct parallel info for UpdatePhysics + struct ParallelParameter //Added by zenglei@20190515 + { + /// \brief the parallel type + int type; + + /// \brief the number of threads + int numbers_of_thread; + + void Init() + { + type = 0; + numbers_of_thread = 0; + }; + + void SetParameters(int type_, int threads_) + { + type = type_; + numbers_of_thread = threads_; + }; + }islands_parallel; + //////////////////// AIRC end //////////////////// }; diff --git a/Gazebo_exercise/gazebo7_7.14.0_exercise/deps/opende/src/ode.cpp b/Gazebo_exercise/gazebo7_7.14.0_exercise/deps/opende/src/ode.cpp index 9bff73c..f13305c 100644 --- a/Gazebo_exercise/gazebo7_7.14.0_exercise/deps/opende/src/ode.cpp +++ b/Gazebo_exercise/gazebo7_7.14.0_exercise/deps/opende/src/ode.cpp @@ -126,6 +126,15 @@ static int listHasLoops (dObject *first) return 0; } +//////////////////// AIRC begin //////////////////// + // Added by zenglei@2019-05-23, Modified by YYY@yyy-yy-yy + // [Description] set parallel info for UpdatePhysics +ODE_API void dWorldSetIslandsInfo(dWorldID w, int type, int threads) +{ + dAASSERT(w); + w->islands_parallel.SetParameters(type, threads); +} +//////////////////// AIRC end //////////////////// // check the validity of the world data structures diff --git a/Gazebo_exercise/gazebo7_7.14.0_exercise/deps/opende/src/util.cpp b/Gazebo_exercise/gazebo7_7.14.0_exercise/deps/opende/src/util.cpp index 38236af..fe1f31b 100644 --- a/Gazebo_exercise/gazebo7_7.14.0_exercise/deps/opende/src/util.cpp +++ b/Gazebo_exercise/gazebo7_7.14.0_exercise/deps/opende/src/util.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #undef REPORT_THREAD_TIMING #undef TIMING @@ -623,6 +624,51 @@ void dxProcessIslands (dxWorld *world, dReal stepsize, dstepper_fn_t stepper) cur_time = (double)tv.tv_sec + (double)tv.tv_usec / 1.e6; printf(">>>>>>>>>>>> start island spawn threads at time %f\n",cur_time); #endif + //////////////////// AIRC begin //////////////////// + // Added by zenglei@2019-05-23, Modified by YYY@yyy-yy-yy + // [Description] rewrite the logic for UpdatePhysics + if(world->islands_parallel.type > 0) + { + std::vector vecIslandInfo; + for (int const *sizescurr = islandsizes; sizescurr != sizesend; sizescurr += sizeelements) + { + struct dIslandInfo dIs; + dIs.bcount = sizescurr[0]; + dIs.jcount = sizescurr[1]; + dxStepWorkingMemory *island_wmem = world->island_wmems[island_index++]; + dIASSERT(island_wmem != NULL); + dIs.island_context = island_wmem->GetWorldProcessingContext(); + dIs.bodystart = bodystart; + dIs.jointstart = jointstart; + vecIslandInfo.push_back(dIs); + bodystart += dIs.bcount; + jointstart += dIs.jcount; + + } + switch(world->islands_parallel.type) + { + case 1: + { + omp_set_num_threads(world->islands_parallel.numbers_of_thread); + #pragma omp parallel for + for(int i = 0; i < (int)vecIslandInfo.size(); i++) + { + dxProcessOneIsland(vecIslandInfo[i].island_context, world, stepsize, stepper,vecIslandInfo[i].bodystart, vecIslandInfo[i].bcount, vecIslandInfo[i].jointstart, vecIslandInfo[i].jcount); + } + break; + } + // case 2: + // { + // //TBB + // break; + // } + // //TODO...待完善C++11thread等 + default: + break; + } + + }else + { for (int const *sizescurr = islandsizes; sizescurr != sizesend; sizescurr += sizeelements) { int bcount = sizescurr[0]; @@ -655,8 +701,8 @@ void dxProcessIslands (dxWorld *world, dReal stepsize, dstepper_fn_t stepper) #endif IFTIMING(dTimerEnd()); IFTIMING(dTimerReport (stdout,1)); - - + } + //////////////////// AIRC end //////////////////// #ifdef REPORT_THREAD_TIMING gettimeofday(&tv,NULL); double end_time = (double)tv.tv_sec + (double)tv.tv_usec / 1.e6; diff --git a/Gazebo_exercise/gazebo7_7.14.0_exercise/deps/opende/src/util.h b/Gazebo_exercise/gazebo7_7.14.0_exercise/deps/opende/src/util.h index af7efeb..71304ab 100644 --- a/Gazebo_exercise/gazebo7_7.14.0_exercise/deps/opende/src/util.h +++ b/Gazebo_exercise/gazebo7_7.14.0_exercise/deps/opende/src/util.h @@ -67,7 +67,18 @@ void dInternalHandleAutoDisabling (dxWorld *world, dReal stepsize); void dxStepBody (dxBody *b, dReal h); - +//////////////////// AIRC begin //////////////////// + // Added by zenglei@2019-05-23, Modified by YYY@yyy-yy-yy + // [Description] struct for rewrite UpdatePhysics +struct dIslandInfo +{ + int bcount; + int jcount; + dxBody *const * bodystart; + dxJoint *const * jointstart; + dxWorldProcessContext *island_context; +}; +//////////////////// AIRC end //////////////////// struct dxWorldProcessMemoryManager: public dBase { diff --git a/Gazebo_exercise/gazebo7_7.14.0_exercise/gazebo/Server.cc b/Gazebo_exercise/gazebo7_7.14.0_exercise/gazebo/Server.cc index 1dadfff..4db32ed 100644 --- a/Gazebo_exercise/gazebo7_7.14.0_exercise/gazebo/Server.cc +++ b/Gazebo_exercise/gazebo7_7.14.0_exercise/gazebo/Server.cc @@ -476,15 +476,15 @@ bool Server::LoadImpl(sdf::ElementPtr _elem, //////////////////// AIRC begin //////////////////// // Added by zenglei@2018-12-26 // Read the parallel parameter configuration in world file - if(_elem->GetElement("world")->HasElement("parallel")) - { - sdf::ElementPtr eventElem = _elem->GetElement("world")->GetElement("parallel"); - event::Events::worldUpdateBegin.SetThreadInfo(eventElem->Get("method"),eventElem->Get("numbers_of_thread"), eventElem->Get("size_of_block"), eventElem->Get("type")); + // if(_elem->GetElement("world")->HasElement("parallel")) + // { + // sdf::ElementPtr eventElem = _elem->GetElement("world")->GetElement("parallel"); + // event::Events::worldUpdateBegin.SetThreadInfo(eventElem->Get("method"),eventElem->Get("numbers_of_thread"), eventElem->Get("size_of_block"), eventElem->Get("type")); - if(6 == eventElem->Get("method")) - event::Events::worldUpdateBegin.InitThreadPool(eventElem->Get("numbers_of_thread")); - // std::cout<<"=======numbers_of_thread: "<Get("numbers_of_thread")<<"\t size_of_block: "<Get("size_of_block")<<"============="<Get("method")) + // // event::Events::worldUpdateBegin.InitThreadPool(eventElem->Get("numbers_of_thread")); + // // std::cout<<"=======numbers_of_thread: "<Get("numbers_of_thread")<<"\t size_of_block: "<Get("size_of_block")<<"============="<dataPtr->node = transport::NodePtr(new transport::Node()); diff --git a/Gazebo_exercise/gazebo7_7.14.0_exercise/gazebo/common/Event.hh b/Gazebo_exercise/gazebo7_7.14.0_exercise/gazebo/common/Event.hh index f35607e..ebdb71c 100644 --- a/Gazebo_exercise/gazebo7_7.14.0_exercise/gazebo/common/Event.hh +++ b/Gazebo_exercise/gazebo7_7.14.0_exercise/gazebo/common/Event.hh @@ -37,14 +37,6 @@ //////////////////// AIRC begin //////////////////// // Added by zenglei@2019-01-09 -#include -#include -#include -#include -#include -#include -#include -#include #include //////////////////// AIRC end //////////////////// @@ -255,8 +247,7 @@ public: //////////////////// AIRC begin //////////////////// // Added by zenglei@2018-12-25 public: - void SetThreadInfo(int method,int thread_num, int block_size, int type); - void InitThreadPool(int thread_num); + void SetThreadInfo(int method,int thread_num); //////////////////// AIRC end //////////////////// /// \brief Access the signal. @@ -518,84 +509,6 @@ public: (*vecCallback[i])(_p); } } - else if(6 == method_) //Threadpool - { - for( int i = 0; i < vecLength; i += 8 ) - { - int start = i; - int end = vecLength; - if(callbackPool && callbackPool->size() > 0) - { - callbackPool->schedule([&vecCallback, start, end,_p]{ - for(int index = start; index < start + 8 && index < end; index++) - (*vecCallback[index])(_p); - }); - } - } - if(callbackPool && callbackPool->size() > 0) - callbackPool->wait(); - } - else if(7 == method_) //C++11 Thread - { - vecThread.clear(); - int length = vecLength / thread_num_; - for(int i = 0; i < thread_num_; i++) - { - int start = i * length; - int end = start + length; - vecThread.push_back(std::thread([&vecCallback, start, end, vecLength, _p](){ - for(int index = start; index < end && index < vecLength; index++) - (*vecCallback[index])(_p); - })); - } - for(auto &thr: vecThread) - thr.join(); - } - else if(8 == method_) //Intel::tbb - { - switch(type_) - { - case 0: - { - parallel_for(tbb::blocked_range(0, vecCallback.size(), block_size_), - [&vecCallback, &_p](const tbb::blocked_range &_r){ - for (size_t i = _r.begin(); i != _r.end(); i++) - { - (*vecCallback[i])(_p); - } - }, tbb::auto_partitioner() - ); - break; - } - case 1: - { - tbb::affinity_partitioner ap; - parallel_for(tbb::blocked_range(0, vecCallback.size(), block_size_), - [&vecCallback, &_p](const tbb::blocked_range &_r){ - for (size_t i = _r.begin(); i != _r.end(); i++) - { - (*vecCallback[i])(_p); - } - }, ap - ); - break; - } - case 2: - { - parallel_for(tbb::blocked_range(0, vecCallback.size(), block_size_), - [&vecCallback, &_p](const tbb::blocked_range &_r){ - for (size_t i = _r.begin(); i != _r.end(); i++) - { - (*vecCallback[i])(_p); - } - }, tbb::simple_partitioner() - ); - break; - } - default: - break; - } - } } //////////////////// AIRC end //////////////////// } @@ -828,12 +741,7 @@ private: private: EventTPrivate *myDataPtr; int thread_num_; - int method_; - int block_size_; - int type_; - - std::vector vecThread; - boost::threadpool::thread_pool< > *callbackPool; + int method_; //////////////////// AIRC end //////////////////// }; @@ -845,12 +753,9 @@ EventT::EventT() { this->myDataPtr = static_cast *>(this->dataPtr); //////////////////// AIRC begin //////////////////// - // Added by zenglei@2018-12-25 - callbackPool = NULL; + // Added by zenglei@2018-12-25 method_ = 0; - thread_num_ = 0; - block_size_ = 8; - type_ = 0; + thread_num_ = 0; //////////////////// AIRC end //////////////////// } @@ -859,13 +764,6 @@ template EventT::~EventT() { this->myDataPtr->connections.clear(); - - if(callbackPool) - { - callbackPool->wait(); - delete callbackPool; - callbackPool = NULL; - } } /// \brief Adds a connection. @@ -908,24 +806,10 @@ unsigned int EventT::ConnectionCount() const //////////////////// AIRC begin //////////////////// //Added by zenglei@2018-12-25 template -void EventT::SetThreadInfo(int method,int thread_num, int block_size, int type) +void EventT::SetThreadInfo(int method,int thread_num) { method_ = method; thread_num_ = thread_num; - block_size_ = block_size; - type_ = type; -} -//////////////////// AIRC end //////////////////// - -//////////////////// AIRC begin //////////////////// -//Added by zenglei@2019-01-09 -template -void EventT::InitThreadPool(int thread_num) -{ - if(callbackPool == NULL) - { - callbackPool = new boost::threadpool::thread_pool< >(thread_num); - } } //////////////////// AIRC end //////////////////// diff --git a/Gazebo_exercise/gazebo7_7.14.0_exercise/gazebo/physics/World.cc b/Gazebo_exercise/gazebo7_7.14.0_exercise/gazebo/physics/World.cc index 1e47fff..7c6f500 100644 --- a/Gazebo_exercise/gazebo7_7.14.0_exercise/gazebo/physics/World.cc +++ b/Gazebo_exercise/gazebo7_7.14.0_exercise/gazebo/physics/World.cc @@ -247,7 +247,114 @@ void World::Load(sdf::ElementPtr _sdf) "~/light/modify"); this->dataPtr->lightFactoryPub = this->dataPtr->node->Advertise( "~/factory/light"); + + +//////////////////// AIRC begin //////////////////// + // Added by zenglei@2019-05-23 + // Read the parallel parameter configuration in world file + std::cout << "______________________________________________________________" << std::endl; + std::cout << "| This is Gazebo-exercis-0.2 |" << std::endl; + std::cout << "| by AIRC-01 |" << std::endl; + std::cout << "| |" << std::endl; + + if(this->dataPtr->sdf->HasElement("exercise_opt")) + { + sdf::ElementPtr optElem = this->dataPtr->sdf->GetElement("exercise_opt"); + // The configuration of worldUpdateBegin optimization + std::cout << "|---------------------- WorldUpdateBegin --------------------|" << std::endl; + if(optElem->GetElement("event_signal")) + { + sdf::ElementPtr eventElem = this->dataPtr->sdf->GetElement("exercise_opt")->GetElement("event_signal"); + int para_type = eventElem->Get("parallel_type"); + switch (para_type) + { + case 1: + std::cout << "| Multithreading event_signal: ON |" << std::endl; + std::cout << "| Using OpenMP with " << eventElem->Get("threads") << " threads |" << std::endl; + break; + default: + std::cout << "| Multithreading event_signal: OFF |" << std::endl; + break; + } + event::Events::worldUpdateBegin.SetThreadInfo(eventElem->Get("parallel_type"),eventElem->Get("threads")); + }else + { + std::cout << "| Multithreading event_signal: OFF |" << std::endl; + event::Events::worldUpdateBegin.SetThreadInfo(0,0); + } + + std::cout << "|---------------------- UpdateCollision ---------------------|" << std::endl; + // The configuration of UpdateCollision optimization + if(optElem->HasElement("collide_space")) + { + collide_space = optElem->Get("collide_space"); + } + else + { + collide_space = 0; + } + + switch (collide_space) + { + case 1: // Using dSweepAndPruneSpace + std::cout << "| Using dSweepAndPruneSpace |" << std::endl; + break; + default: // Using dHashSpace + std::cout << "| Using dHashSpace |" << std::endl; + if(optElem->HasElement("dxhashspace_collide")) + { + number_of_thread = optElem->GetElement("dxhashspace_collide")->Get("threads"); + if (number_of_thread > 1) + { + std::cout << "| Multithreading dHashSpace: ON |" << std::endl; + std::cout << "| Using OpenMP with " << number_of_thread << " threads |" << std::endl; + } + else + { + number_of_thread = 0; + std::cout << "| Multithreading dHashSpace: OFF |" << std::endl; + } + } + break; + } + + std::cout << "|---------------------- UpdatePhysics -----------------------|" << std::endl; + // The configuration of UpdatePhysics optimization + if(optElem->HasElement("updatephysics_dxprocessislands")) + { + sdf::ElementPtr isLandsElem = optElem->GetElement("updatephysics_dxprocessislands"); + parallel_type = isLandsElem->Get("parallel_type"); + threads = isLandsElem->Get("threads"); + + switch (parallel_type) + { + case 1: + std::cout << "| Multithreading dxprocessislands: ON |" << std::endl; + std::cout << "| Using OpenMP with " << threads << " threads |" << std::endl; + break; + default: + std::cout << "| Multithreading dxprocessislands: OFF |" << std::endl; + break; + } + }else + { + std::cout << "| Multithreading dxprocessislands: OFF |" << std::endl; + parallel_type = 0; + threads = 0; + } + + }else + { + parallel_type = 0; + threads = 0; + collide_space = 0; + number_of_thread = 0; + event::Events::worldUpdateBegin.SetThreadInfo(0,0); + std::cout << "| This code is running with NO OPTIMIZATION ! |" << std::endl; + } + std::cout<<"|____________________________________________________________|" << std::endl; + ////////////////// AIRC end //////////////////// // This should come before loading of entities sdf::ElementPtr physicsElem = this->dataPtr->sdf->GetElement("physics"); diff --git a/Gazebo_exercise/gazebo7_7.14.0_exercise/gazebo/physics/World.hh b/Gazebo_exercise/gazebo7_7.14.0_exercise/gazebo/physics/World.hh index 11ecf42..e1ca7cb 100644 --- a/Gazebo_exercise/gazebo7_7.14.0_exercise/gazebo/physics/World.hh +++ b/Gazebo_exercise/gazebo7_7.14.0_exercise/gazebo/physics/World.hh @@ -587,6 +587,21 @@ namespace gazebo /// Friend SimbodyPhysics so that it has access to dataPtr->dirtyPoses private: friend class SimbodyPhysics; + //////////////////// AIRC begin //////////////////// + // Added by XXX@xxx-xx-xx, Modified by YYY@yyy-yy-yy + // [Description] zzzzzzzzzzzzzzzzzzzz + /// the collide space type + public: int collide_space; + + /// the thread number to parallel the module collide + public: int number_of_thread; + + /// the method to optimizatize the UpdatePhysics + public: int parallel_type; + + /// the thread number to parallel the UpdatePhysics + public: int threads; + //////////////////// AIRC end //////////////////// }; /// \} } diff --git a/Gazebo_exercise/gazebo7_7.14.0_exercise/gazebo/physics/ode/ODEPhysics.cc b/Gazebo_exercise/gazebo7_7.14.0_exercise/gazebo/physics/ode/ODEPhysics.cc index 6a36171..8624946 100644 --- a/Gazebo_exercise/gazebo7_7.14.0_exercise/gazebo/physics/ode/ODEPhysics.cc +++ b/Gazebo_exercise/gazebo7_7.14.0_exercise/gazebo/physics/ode/ODEPhysics.cc @@ -147,10 +147,35 @@ ODEPhysics::ODEPhysics(WorldPtr _world) dAllocateODEDataForThread(dAllocateMaskAll); this->dataPtr->worldId = dWorldCreate(); + //////////////////// AIRC begin //////////////////// + // Added by zenglei@2019-05-23, Modified by YYY@yyy-yy-yy + // [Description] Select the type of collide space and set the parallel info for module dxProcessIslands + switch(_world->collide_space) + { + case 0: + { + if(_world->number_of_thread > 1) + { + this->dataPtr->spaceId = dHashSpaceCreate2(0, _world->number_of_thread); + dHashSpaceSetLevels(this->dataPtr->spaceId, -2, 8); + }else + { + this->dataPtr->spaceId = dHashSpaceCreate(0); + dHashSpaceSetLevels(this->dataPtr->spaceId, -2, 8); + } + break; + } + case 1: + { + this->dataPtr->spaceId = dSweepAndPruneSpaceCreate(0, 3); + break; + } + default: + break; + } - this->dataPtr->spaceId = dHashSpaceCreate(0); - dHashSpaceSetLevels(this->dataPtr->spaceId, -2, 8); - + dWorldSetIslandsInfo(this->dataPtr->worldId,_world->parallel_type, _world->threads); + //////////////////// AIRC end //////////////////// this->dataPtr->contactGroup = dJointGroupCreate(0); this->dataPtr->colliders.resize(100);