From 0c463366a065f5e72de2c253f5b1d0ae3317bf0d Mon Sep 17 00:00:00 2001 From: Kyle Bayes Date: Thu, 5 Jan 2023 01:28:23 -0800 Subject: [PATCH] Reduce internal names hash map from factor of 1 to 0.5. PiperOrigin-RevId: 499762072 Change-Id: Id4ea606b5c534c55665485c9f71412523164d2ed --- src/engine/engine_io.c | 8 +++--- src/engine/engine_io.h | 3 +++ src/engine/engine_support.c | 50 ++++++++++++++++++------------------- src/user/user_model.cc | 47 +++++++++++++++++----------------- 4 files changed, 57 insertions(+), 51 deletions(-) diff --git a/src/engine/engine_io.c b/src/engine/engine_io.c index 26c8c581..024c987b 100644 --- a/src/engine/engine_io.c +++ b/src/engine/engine_io.c @@ -438,9 +438,11 @@ mjModel* mj_makeModel(int nq, int nv, int nu, int na, int nbody, int njnt, m->nuser_actuator = nuser_actuator; m->nuser_sensor = nuser_sensor; m->nnames = nnames; - m->nnames_map = nbody + njnt + ngeom + nsite + ncam + nlight + nmesh + nskin - + nhfield + ntex + nmat + npair + nexclude + neq + ntendon - + nu + nsensor + nnumeric + ntext + ntuple + nkey + nplugin; + m->nnames_map = mjLOAD_MULTIPLE + * (nbody + njnt + ngeom + nsite + ncam + nlight + nmesh + + nskin + nhfield + ntex + nmat + npair + nexclude + neq + + ntendon + nu + nsensor + nnumeric + ntext + ntuple + + nkey + nplugin); #define X(name) \ if ((m->name) < 0) { \ diff --git a/src/engine/engine_io.h b/src/engine/engine_io.h index de0c73c5..ca8430a3 100644 --- a/src/engine/engine_io.h +++ b/src/engine/engine_io.h @@ -23,6 +23,9 @@ extern "C" { #endif +// internal hash map size factor (2 corresponds to a load factor of 0.5) +#define mjLOAD_MULTIPLE 2 + //------------------------------- initialization --------------------------------------------------- // Set default options for length range computation. diff --git a/src/engine/engine_support.c b/src/engine/engine_support.c index a61438da..db944822 100644 --- a/src/engine/engine_support.c +++ b/src/engine/engine_support.c @@ -443,13 +443,13 @@ static int _getnumadr(const mjModel* m, mjtObj type, int** padr, int* mapadr) { switch (type) { case mjOBJ_BODY: case mjOBJ_XBODY: - *mapadr -= m->nbody; + *mapadr -= mjLOAD_MULTIPLE*m->nbody; *padr = m->name_bodyadr; num = m->nbody; mjFALLTHROUGH; case mjOBJ_JOINT: - *mapadr -= m->njnt; + *mapadr -= mjLOAD_MULTIPLE*m->njnt; if (num < 0) { *padr = m->name_jntadr; num = m->njnt; @@ -457,7 +457,7 @@ static int _getnumadr(const mjModel* m, mjtObj type, int** padr, int* mapadr) { mjFALLTHROUGH; case mjOBJ_GEOM: - *mapadr -= m->ngeom; + *mapadr -= mjLOAD_MULTIPLE*m->ngeom; if (num < 0) { *padr = m->name_geomadr; num = m->ngeom; @@ -465,7 +465,7 @@ static int _getnumadr(const mjModel* m, mjtObj type, int** padr, int* mapadr) { mjFALLTHROUGH; case mjOBJ_SITE: - *mapadr -= m->nsite; + *mapadr -= mjLOAD_MULTIPLE*m->nsite; if (num < 0) { *padr = m->name_siteadr; num = m->nsite; @@ -473,7 +473,7 @@ static int _getnumadr(const mjModel* m, mjtObj type, int** padr, int* mapadr) { mjFALLTHROUGH; case mjOBJ_CAMERA: - *mapadr -= m->ncam; + *mapadr -= mjLOAD_MULTIPLE*m->ncam; if (num < 0) { *padr = m->name_camadr; num = m->ncam; @@ -481,7 +481,7 @@ static int _getnumadr(const mjModel* m, mjtObj type, int** padr, int* mapadr) { mjFALLTHROUGH; case mjOBJ_LIGHT: - *mapadr -= m->nlight; + *mapadr -= mjLOAD_MULTIPLE*m->nlight; if (num < 0) { *padr = m->name_lightadr; num = m->nlight; @@ -489,7 +489,7 @@ static int _getnumadr(const mjModel* m, mjtObj type, int** padr, int* mapadr) { mjFALLTHROUGH; case mjOBJ_MESH: - *mapadr -= m->nmesh; + *mapadr -= mjLOAD_MULTIPLE*m->nmesh; if (num < 0) { *padr = m->name_meshadr; num = m->nmesh; @@ -497,7 +497,7 @@ static int _getnumadr(const mjModel* m, mjtObj type, int** padr, int* mapadr) { mjFALLTHROUGH; case mjOBJ_SKIN: - *mapadr -= m->nskin; + *mapadr -= mjLOAD_MULTIPLE*m->nskin; if (num < 0) { *padr = m->name_skinadr; num = m->nskin; @@ -505,7 +505,7 @@ static int _getnumadr(const mjModel* m, mjtObj type, int** padr, int* mapadr) { mjFALLTHROUGH; case mjOBJ_HFIELD: - *mapadr -= m->nhfield; + *mapadr -= mjLOAD_MULTIPLE*m->nhfield; if (num < 0) { *padr = m->name_hfieldadr; num = m->nhfield; @@ -513,7 +513,7 @@ static int _getnumadr(const mjModel* m, mjtObj type, int** padr, int* mapadr) { mjFALLTHROUGH; case mjOBJ_TEXTURE: - *mapadr -= m->ntex; + *mapadr -= mjLOAD_MULTIPLE*m->ntex; if (num < 0) { *padr = m->name_texadr; num = m->ntex; @@ -521,7 +521,7 @@ static int _getnumadr(const mjModel* m, mjtObj type, int** padr, int* mapadr) { mjFALLTHROUGH; case mjOBJ_MATERIAL: - *mapadr -= m->nmat; + *mapadr -= mjLOAD_MULTIPLE*m->nmat; if (num < 0) { *padr = m->name_matadr; num = m->nmat; @@ -529,7 +529,7 @@ static int _getnumadr(const mjModel* m, mjtObj type, int** padr, int* mapadr) { mjFALLTHROUGH; case mjOBJ_PAIR: - *mapadr -= m->npair; + *mapadr -= mjLOAD_MULTIPLE*m->npair; if (num < 0) { *padr = m->name_pairadr; num = m->npair; @@ -537,7 +537,7 @@ static int _getnumadr(const mjModel* m, mjtObj type, int** padr, int* mapadr) { mjFALLTHROUGH; case mjOBJ_EXCLUDE: - *mapadr -= m->nexclude; + *mapadr -= mjLOAD_MULTIPLE*m->nexclude; if (num < 0) { *padr = m->name_excludeadr; num = m->nexclude; @@ -545,7 +545,7 @@ static int _getnumadr(const mjModel* m, mjtObj type, int** padr, int* mapadr) { mjFALLTHROUGH; case mjOBJ_EQUALITY: - *mapadr -= m->neq; + *mapadr -= mjLOAD_MULTIPLE*m->neq; if (num < 0) { *padr = m->name_eqadr; num = m->neq; @@ -553,7 +553,7 @@ static int _getnumadr(const mjModel* m, mjtObj type, int** padr, int* mapadr) { mjFALLTHROUGH; case mjOBJ_TENDON: - *mapadr -= m->ntendon; + *mapadr -= mjLOAD_MULTIPLE*m->ntendon; if (num < 0) { *padr = m->name_tendonadr; num = m->ntendon; @@ -561,7 +561,7 @@ static int _getnumadr(const mjModel* m, mjtObj type, int** padr, int* mapadr) { mjFALLTHROUGH; case mjOBJ_ACTUATOR: - *mapadr -= m->nu; + *mapadr -= mjLOAD_MULTIPLE*m->nu; if (num < 0) { *padr = m->name_actuatoradr; num = m->nu; @@ -569,7 +569,7 @@ static int _getnumadr(const mjModel* m, mjtObj type, int** padr, int* mapadr) { mjFALLTHROUGH; case mjOBJ_SENSOR: - *mapadr -= m->nsensor; + *mapadr -= mjLOAD_MULTIPLE*m->nsensor; if (num < 0) { *padr = m->name_sensoradr; num = m->nsensor; @@ -577,7 +577,7 @@ static int _getnumadr(const mjModel* m, mjtObj type, int** padr, int* mapadr) { mjFALLTHROUGH; case mjOBJ_NUMERIC: - *mapadr -= m->nnumeric; + *mapadr -= mjLOAD_MULTIPLE*m->nnumeric; if (num < 0) { *padr = m->name_numericadr; num = m->nnumeric; @@ -585,7 +585,7 @@ static int _getnumadr(const mjModel* m, mjtObj type, int** padr, int* mapadr) { mjFALLTHROUGH; case mjOBJ_TEXT: - *mapadr -= m->ntext; + *mapadr -= mjLOAD_MULTIPLE*m->ntext; if (num < 0) { *padr = m->name_textadr; num = m->ntext; @@ -593,7 +593,7 @@ static int _getnumadr(const mjModel* m, mjtObj type, int** padr, int* mapadr) { mjFALLTHROUGH; case mjOBJ_TUPLE: - *mapadr -= m->ntuple; + *mapadr -= mjLOAD_MULTIPLE*m->ntuple; if (num < 0) { *padr = m->name_tupleadr; num = m->ntuple; @@ -601,7 +601,7 @@ static int _getnumadr(const mjModel* m, mjtObj type, int** padr, int* mapadr) { mjFALLTHROUGH; case mjOBJ_KEY: - *mapadr -= m->nkey; + *mapadr -= mjLOAD_MULTIPLE*m->nkey; if (num < 0) { *padr = m->name_keyadr; num = m->nkey; @@ -609,7 +609,7 @@ static int _getnumadr(const mjModel* m, mjtObj type, int** padr, int* mapadr) { mjFALLTHROUGH; case mjOBJ_PLUGIN: - *mapadr -= m->nplugin; + *mapadr -= mjLOAD_MULTIPLE*m->nplugin; if (num < 0) { *padr = m->name_pluginadr; num = m->nplugin; @@ -622,6 +622,7 @@ static int _getnumadr(const mjModel* m, mjtObj type, int** padr, int* mapadr) { num = 0; } } + return num; } @@ -642,11 +643,10 @@ int mj_name2id(const mjModel* m, int type, const char* name) { int* adr = 0; // get number of objects and name addresses - int num = _getnumadr(m, type, &adr, &mapadr); + int num = mjLOAD_MULTIPLE*_getnumadr(m, type, &adr, &mapadr); // search - if (num) { - // look up at hash address + if (num) { // look up at hash address uint64_t hash = mj_hashdjb2(name, num); uint64_t i = hash; diff --git a/src/user/user_model.cc b/src/user/user_model.cc index 1c1d622e..e6309eeb 100644 --- a/src/user/user_model.cc +++ b/src/user/user_model.cc @@ -1203,16 +1203,17 @@ void mjCModel::LengthRange(mjModel* m, mjData* data) { template static int namelist(vector& list, int adr, int* name_adr, char* names, int* map) { // compute hash map addresses + int map_size = mjLOAD_MULTIPLE*list.size(); for (unsigned int i=0; iname.empty()) { continue; } - uint64_t j = mj_hashdjb2(list[i]->name.c_str(), list.size()); + uint64_t j = mj_hashdjb2(list[i]->name.c_str(), map_size); // find first empty slot using linear probing - for (; map[j]!=-1; j=(j+1) % list.size()) {} + for (; map[j]!=-1; j=(j+1) % map_size) {} map[j] = i; } @@ -1242,67 +1243,67 @@ void mjCModel::CopyNames(mjModel* m) { // process all lists adr = namelist(bodies, adr, m->name_bodyadr, m->names, map_adr); - map_adr += bodies.size(); + map_adr += mjLOAD_MULTIPLE*bodies.size(); adr = namelist(joints, adr, m->name_jntadr, m->names, map_adr); - map_adr += joints.size(); + map_adr += mjLOAD_MULTIPLE*joints.size(); adr = namelist(geoms, adr, m->name_geomadr, m->names, map_adr); - map_adr += geoms.size(); + map_adr += mjLOAD_MULTIPLE*geoms.size(); adr = namelist(sites, adr, m->name_siteadr, m->names, map_adr); - map_adr += sites.size(); + map_adr += mjLOAD_MULTIPLE*sites.size(); adr = namelist(cameras, adr, m->name_camadr, m->names, map_adr); - map_adr += cameras.size(); + map_adr += mjLOAD_MULTIPLE*cameras.size(); adr = namelist(lights, adr, m->name_lightadr, m->names, map_adr); - map_adr += lights.size(); + map_adr += mjLOAD_MULTIPLE*lights.size(); adr = namelist(meshes, adr, m->name_meshadr, m->names, map_adr); - map_adr += meshes.size(); + map_adr += mjLOAD_MULTIPLE*meshes.size(); adr = namelist(skins, adr, m->name_skinadr, m->names, map_adr); - map_adr += skins.size(); + map_adr += mjLOAD_MULTIPLE*skins.size(); adr = namelist(hfields, adr, m->name_hfieldadr, m->names, map_adr); - map_adr += hfields.size(); + map_adr += mjLOAD_MULTIPLE*hfields.size(); adr = namelist(textures, adr, m->name_texadr, m->names, map_adr); - map_adr += textures.size(); + map_adr += mjLOAD_MULTIPLE*textures.size(); adr = namelist(materials, adr, m->name_matadr, m->names, map_adr); - map_adr += materials.size(); + map_adr += mjLOAD_MULTIPLE*materials.size(); adr = namelist(pairs, adr, m->name_pairadr, m->names, map_adr); - map_adr += pairs.size(); + map_adr += mjLOAD_MULTIPLE*pairs.size(); adr = namelist(excludes, adr, m->name_excludeadr, m->names, map_adr); - map_adr += excludes.size(); + map_adr += mjLOAD_MULTIPLE*excludes.size(); adr = namelist(equalities, adr, m->name_eqadr, m->names, map_adr); - map_adr += equalities.size(); + map_adr += mjLOAD_MULTIPLE*equalities.size(); adr = namelist(tendons, adr, m->name_tendonadr, m->names, map_adr); - map_adr += tendons.size(); + map_adr += mjLOAD_MULTIPLE*tendons.size(); adr = namelist(actuators, adr, m->name_actuatoradr, m->names, map_adr); - map_adr += actuators.size(); + map_adr += mjLOAD_MULTIPLE*actuators.size(); adr = namelist(sensors, adr, m->name_sensoradr, m->names, map_adr); - map_adr += sensors.size(); + map_adr += mjLOAD_MULTIPLE*sensors.size(); adr = namelist(numerics, adr, m->name_numericadr, m->names, map_adr); - map_adr += numerics.size(); + map_adr += mjLOAD_MULTIPLE*numerics.size(); adr = namelist(texts, adr, m->name_textadr, m->names, map_adr); - map_adr += texts.size(); + map_adr += mjLOAD_MULTIPLE*texts.size(); adr = namelist(tuples, adr, m->name_tupleadr, m->names, map_adr); - map_adr += tuples.size(); + map_adr += mjLOAD_MULTIPLE*tuples.size(); adr = namelist(keys, adr, m->name_keyadr, m->names, map_adr); - map_adr += keys.size(); + map_adr += mjLOAD_MULTIPLE*keys.size(); adr = namelist(plugins, adr, m->name_pluginadr, m->names, map_adr);