From 63fd23a93466f6183e8855b6948e34294defdfe3 Mon Sep 17 00:00:00 2001 From: Yuval Tassa Date: Sat, 16 Sep 2023 08:02:38 -0700 Subject: [PATCH] Remove `mjTIMER_ACCELERATION`, add `mjTIMER_ADVANCE`. - mjTIMER_ACCELERATION is not very useful, it's usually very tiny (0.5% for humanoid, 1% for 22humanoids). It basically times a single call to `mj_solveM`. - Added `mjTIMER_ADVANCE` to time `mj_Euler` and `mj_implicit` (which can be significant). - Moved `mj_transmission` to `mjTIMER_KINEMATICS` where it belongs (and used to be). PiperOrigin-RevId: 565936880 Change-Id: I26b8a067133594e5500ca1c809beb3518b4a8d9c --- doc/includes/references.h | 2 +- include/mujoco/mjdata.h | 2 +- introspect/enums.py | 4 ++-- sample/testspeed.cc | 2 +- src/engine/engine_forward.c | 13 ++++++++++--- src/engine/engine_support.c | 2 +- unity/Runtime/Bindings/MjBindings.cs | 4 ++-- 7 files changed, 18 insertions(+), 11 deletions(-) diff --git a/doc/includes/references.h b/doc/includes/references.h index e13b9bbb..e4b932b8 100644 --- a/doc/includes/references.h +++ b/doc/includes/references.h @@ -61,8 +61,8 @@ typedef enum mjtTimer_ { // internal timers mjTIMER_POSITION, // fwdPosition mjTIMER_VELOCITY, // fwdVelocity mjTIMER_ACTUATION, // fwdActuation - mjTIMER_ACCELERATION, // fwdAcceleration mjTIMER_CONSTRAINT, // fwdConstraint + mjTIMER_ADVANCE, // mj_Euler, mj_implicit // breakdown of fwdPosition mjTIMER_POS_KINEMATICS, // kinematics, com, tendon, transmission diff --git a/include/mujoco/mjdata.h b/include/mujoco/mjdata.h index c55d91a4..5f4124f3 100644 --- a/include/mujoco/mjdata.h +++ b/include/mujoco/mjdata.h @@ -72,8 +72,8 @@ typedef enum mjtTimer_ { // internal timers mjTIMER_POSITION, // fwdPosition mjTIMER_VELOCITY, // fwdVelocity mjTIMER_ACTUATION, // fwdActuation - mjTIMER_ACCELERATION, // fwdAcceleration mjTIMER_CONSTRAINT, // fwdConstraint + mjTIMER_ADVANCE, // mj_Euler, mj_implicit // breakdown of fwdPosition mjTIMER_POS_KINEMATICS, // kinematics, com, tendon, transmission diff --git a/introspect/enums.py b/introspect/enums.py index d9cc2772..4605a319 100644 --- a/introspect/enums.py +++ b/introspect/enums.py @@ -431,8 +431,8 @@ ENUMS: Mapping[str, EnumDecl] = dict([ ('mjTIMER_POSITION', 3), ('mjTIMER_VELOCITY', 4), ('mjTIMER_ACTUATION', 5), - ('mjTIMER_ACCELERATION', 6), - ('mjTIMER_CONSTRAINT', 7), + ('mjTIMER_CONSTRAINT', 6), + ('mjTIMER_ADVANCE', 7), ('mjTIMER_POS_KINEMATICS', 8), ('mjTIMER_POS_INERTIA', 9), ('mjTIMER_POS_COLLISION', 10), diff --git a/sample/testspeed.cc b/sample/testspeed.cc index 3c6dded3..7baf267a 100644 --- a/sample/testspeed.cc +++ b/sample/testspeed.cc @@ -239,7 +239,7 @@ int main(int argc, char** argv) { // save step time, add up timing of components if (i == 0) total = istep; - if (i >= mjTIMER_POSITION && i <= mjTIMER_CONSTRAINT) { + if (i >= mjTIMER_POSITION && i <= mjTIMER_ADVANCE) { components += istep; } } diff --git a/src/engine/engine_forward.c b/src/engine/engine_forward.c index d71d1d90..22bda474 100644 --- a/src/engine/engine_forward.c +++ b/src/engine/engine_forward.c @@ -118,9 +118,12 @@ void mj_fwdPosition(const mjModel* m, mjData* d) { if (mjENABLED(mjENBL_ISLAND)) { mj_island(m, d); } - mj_transmission(m, d); TM_END(mjTIMER_POS_MAKE); + TM_RESTART; + mj_transmission(m, d); + TM_END(mjTIMER_POS_KINEMATICS); + TM_RESTART; mj_projectConstraint(m, d); TM_END(mjTIMER_POS_PROJECT); @@ -400,7 +403,6 @@ void mj_fwdActuation(const mjModel* m, mjData* d) { // add up all non-constraint forces, compute qacc_smooth void mj_fwdAcceleration(const mjModel* m, mjData* d) { - TM_START; mj_markStack(d); int nv = m->nv; @@ -414,7 +416,6 @@ void mj_fwdAcceleration(const mjModel* m, mjData* d) { mj_solveM(m, d, d->qacc_smooth, d->qfrc_smooth, 1); mj_freeStack(d); - TM_END(mjTIMER_ACCELERATION); } @@ -609,6 +610,7 @@ static void mj_advance(const mjModel* m, mjData* d, // Euler integrator, semi-implicit in velocity, possibly skipping factorisation void mj_EulerSkip(const mjModel* m, mjData* d, int skipfactor) { + TM_START; int nv = m->nv, nM = m->nM; mj_markStack(d); mjtNum* qfrc = mj_stackAllocNum(d, nv); @@ -655,6 +657,8 @@ void mj_EulerSkip(const mjModel* m, mjData* d, int skipfactor) { mj_advance(m, d, d->act_dot, qacc, NULL); mj_freeStack(d); + + TM_END(mjTIMER_ADVANCE); } @@ -774,6 +778,7 @@ void mj_RungeKutta(const mjModel* m, mjData* d, int N) { // fully implicit in velocity, possibly skipping factorization void mj_implicitSkip(const mjModel* m, mjData* d, int skipfactor) { + TM_START; int nv = m->nv; mj_markStack(d); @@ -832,6 +837,8 @@ void mj_implicitSkip(const mjModel* m, mjData* d, int skipfactor) { mj_advance(m, d, d->act_dot, qacc, NULL); mj_freeStack(d); + + TM_END(mjTIMER_ADVANCE); } diff --git a/src/engine/engine_support.c b/src/engine/engine_support.c index d502a614..ad6ab7c6 100644 --- a/src/engine/engine_support.c +++ b/src/engine/engine_support.c @@ -82,8 +82,8 @@ const char* mjTIMERSTRING[mjNTIMER]= { "position", "velocity", "actuation", - "acceleration", "constraint", + "advance", "pos_kinematics", "pos_inertia", "pos_collision", diff --git a/unity/Runtime/Bindings/MjBindings.cs b/unity/Runtime/Bindings/MjBindings.cs index 61da4982..7984df84 100644 --- a/unity/Runtime/Bindings/MjBindings.cs +++ b/unity/Runtime/Bindings/MjBindings.cs @@ -129,8 +129,8 @@ public enum mjtTimer : int{ mjTIMER_POSITION = 3, mjTIMER_VELOCITY = 4, mjTIMER_ACTUATION = 5, - mjTIMER_ACCELERATION = 6, - mjTIMER_CONSTRAINT = 7, + mjTIMER_CONSTRAINT = 6, + mjTIMER_ADVANCE = 7, mjTIMER_POS_KINEMATICS = 8, mjTIMER_POS_INERTIA = 9, mjTIMER_POS_COLLISION = 10,