Skip to content

Commit f440479

Browse files
authored
[MISC] Cleanup PARA_LEVEL. Add 'GS_PARA_LEVEL' env var. (#1968)
* Cleanup PARA_LEVEL. * Add 'GS_PARA_LEVEL' env var. * Add global EPS to Data manager to please GsTaichi fastcache.
1 parent c0c6095 commit f440479

23 files changed

+431
-240
lines changed

genesis/engine/couplers/legacy_coupler.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ def _func_collide_with_rigid_geom(
190190
normal_rigid = sdf_decomp.sdf_func_normal_world(
191191
geoms_state=geoms_state,
192192
geoms_info=geoms_info,
193+
rigid_global_info=rigid_global_info,
193194
collider_static_config=collider_static_config,
194195
sdf_info=sdf_info,
195196
pos_world=pos_world,
@@ -241,6 +242,7 @@ def _func_collide_with_rigid_geom_robust(
241242
normal_rigid = sdf_decomp.sdf_func_normal_world(
242243
geoms_state=geoms_state,
243244
geoms_info=geoms_info,
245+
rigid_global_info=rigid_global_info,
244246
collider_static_config=collider_static_config,
245247
sdf_info=sdf_info,
246248
pos_world=pos_world,
@@ -500,6 +502,7 @@ def mpm_surface_to_particle(
500502
geoms_state: array_class.GeomsState,
501503
geoms_info: array_class.GeomsInfo,
502504
sdf_info: array_class.SDFInfo,
505+
rigid_global_info: array_class.RigidGlobalInfo,
503506
collider_static_config: ti.template(),
504507
):
505508
for i_p, i_b in ti.ndrange(self.mpm_solver.n_particles, self.mpm_solver._B):
@@ -509,6 +512,7 @@ def mpm_surface_to_particle(
509512
sdf_normal = sdf_decomp.sdf_func_normal_world(
510513
geoms_state=geoms_state,
511514
geoms_info=geoms_info,
515+
rigid_global_info=rigid_global_info,
512516
collider_static_config=collider_static_config,
513517
sdf_info=sdf_info,
514518
pos_world=self.mpm_solver.particles[f, i_p, i_b].pos,
@@ -730,6 +734,7 @@ def kernel_pbd_rigid_collide(
730734
geoms_info: array_class.GeomsInfo,
731735
links_state: array_class.LinksState,
732736
sdf_info: array_class.SDFInfo,
737+
rigid_global_info: array_class.RigidGlobalInfo,
733738
collider_static_config: ti.template(),
734739
):
735740
for i_p, i_b in ti.ndrange(self.pbd_solver._n_particles, self.sph_solver._B):
@@ -753,6 +758,7 @@ def kernel_pbd_rigid_collide(
753758
geoms_info,
754759
links_state,
755760
sdf_info,
761+
rigid_global_info,
756762
collider_static_config,
757763
)
758764

@@ -856,6 +862,7 @@ def _func_pbd_collide_with_rigid_geom(
856862
geoms_info: array_class.GeomsInfo,
857863
links_state: array_class.LinksState,
858864
sdf_info: array_class.SDFInfo,
865+
rigid_global_info: array_class.RigidGlobalInfo,
859866
collider_static_config: ti.template(),
860867
):
861868
"""
@@ -879,6 +886,7 @@ def _func_pbd_collide_with_rigid_geom(
879886
contact_normal = sdf_decomp.sdf_func_normal_world(
880887
geoms_state=geoms_state,
881888
geoms_info=geoms_info,
889+
rigid_global_info=rigid_global_info,
882890
collider_static_config=collider_static_config,
883891
sdf_info=sdf_info,
884892
pos_world=pos_world,
@@ -926,6 +934,7 @@ def preprocess(self, f):
926934
self.rigid_solver.geoms_state,
927935
self.rigid_solver.geoms_info,
928936
self.rigid_solver.sdf._sdf_info,
937+
self.rigid_solver._rigid_global_info,
929938
self.rigid_solver.collider._collider_static_config,
930939
)
931940

@@ -963,6 +972,7 @@ def couple(self, f):
963972
geoms_info=self.rigid_solver.geoms_info,
964973
links_state=self.rigid_solver.links_state,
965974
sdf_info=self.rigid_solver.sdf._sdf_info,
975+
rigid_global_info=self.rigid_solver._rigid_global_info,
966976
collider_static_config=self.rigid_solver.collider._collider_static_config,
967977
)
968978

genesis/engine/couplers/sap_coupler.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -377,14 +377,14 @@ def rigid_update_volume_verts_pressure_gradient(
377377
i_g = self.rigid_volume_verts_geom_idx[i_v]
378378
pos = geoms_state.pos[i_g, i_b]
379379
quat = geoms_state.quat[i_g, i_b]
380-
R = gu.ti_quat_to_R(quat)
380+
R = gu.ti_quat_to_R(quat, gs.EPS)
381381
self.rigid_volume_verts[i_b, i_v] = R @ self.rigid_volume_verts_rest[i_v] + pos
382382

383383
for i_b, i_e in ti.ndrange(self._B, self.n_rigid_volume_elems):
384384
i_g = self.rigid_volume_elems_geom_idx[i_e]
385385
pos = geoms_state.pos[i_g, i_b]
386386
quat = geoms_state.quat[i_g, i_b]
387-
R = gu.ti_quat_to_R(quat)
387+
R = gu.ti_quat_to_R(quat, gs.EPS)
388388
self.rigid_pressure_gradient[i_b, i_e] = R @ self.rigid_pressure_gradient_rest[i_e]
389389

390390
@ti.kernel

genesis/engine/entities/rigid_entity/rigid_entity.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1431,7 +1431,10 @@ def _kernel_forward_kinematics(
14311431
self._IK_qpos_orig[qs_idx[i_q_], envs_idx[i_b_]] = rigid_global_info.qpos[qs_idx[i_q_], envs_idx[i_b_]]
14321432
# set new qpos
14331433
rigid_global_info.qpos[qs_idx[i_q_], envs_idx[i_b_]] = qpos[i_b_, i_q_]
1434-
# run FK
1434+
1435+
# run FK
1436+
ti.loop_config(serialize=static_rigid_sim_config.para_level < gs.PARA_LEVEL.ALL)
1437+
for i_b_ in range(envs_idx.shape[0]):
14351438
gs.engine.solvers.rigid.rigid_solver_decomp.func_forward_kinematics_entity(
14361439
self._idx_in_solver,
14371440
envs_idx[i_b_],
@@ -1446,18 +1449,21 @@ def _kernel_forward_kinematics(
14461449
static_rigid_sim_config,
14471450
)
14481451

1449-
ti.loop_config(serialize=ti.static(static_rigid_sim_config.para_level < gs.PARA_LEVEL.PARTIAL))
1452+
ti.loop_config(serialize=ti.static(static_rigid_sim_config.para_level < gs.PARA_LEVEL.ALL))
14501453
for i_l_, i_b_ in ti.ndrange(links_idx.shape[0], envs_idx.shape[0]):
14511454
for i in ti.static(range(3)):
14521455
links_pos[i_b_, i_l_, i] = links_state.pos[links_idx[i_l_], envs_idx[i_b_]][i]
14531456
for i in ti.static(range(4)):
14541457
links_quat[i_b_, i_l_, i] = links_state.quat[links_idx[i_l_], envs_idx[i_b_]][i]
14551458

1459+
# restore original qpos
14561460
ti.loop_config(serialize=static_rigid_sim_config.para_level < gs.PARA_LEVEL.ALL)
14571461
for i_q_, i_b_ in ti.ndrange(qs_idx.shape[0], envs_idx.shape[0]):
1458-
# restore original qpos
14591462
rigid_global_info.qpos[qs_idx[i_q_], envs_idx[i_b_]] = self._IK_qpos_orig[qs_idx[i_q_], envs_idx[i_b_]]
1460-
# run FK
1463+
1464+
# run FK
1465+
ti.loop_config(serialize=static_rigid_sim_config.para_level < gs.PARA_LEVEL.ALL)
1466+
for i_b_ in range(envs_idx.shape[0]):
14611467
gs.engine.solvers.rigid.rigid_solver_decomp.func_forward_kinematics_entity(
14621468
self._idx_in_solver,
14631469
envs_idx[i_b_],

genesis/engine/entities/tool_entity/mesh.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ def normal(self, f, pos_world, i_b):
114114
normal_vec_mesh = R_voxels_to_mesh @ normal_vec_voxels
115115

116116
normal_vec_world = gu.ti_transform_by_quat(normal_vec_mesh, self.entity.quat[f, i_b])
117-
normal_vec_world = gu.ti_normalize(normal_vec_world)
117+
normal_vec_world = gu.ti_normalize(normal_vec_world, gs.EPS)
118118

119119
return normal_vec_world
120120

@@ -131,7 +131,7 @@ def normal_(self, pos_voxels):
131131
dec[i] -= delta
132132
normal_vec[i] = (self.sdf_(inc) - self.sdf_(dec)) / (2 * delta)
133133

134-
normal_vec = gu.ti_normalize(normal_vec)
134+
normal_vec = gu.ti_normalize(normal_vec, gs.EPS)
135135

136136
return normal_vec
137137

@@ -195,7 +195,7 @@ def pbd_collide(self, f, pos_world, thickness, dt):
195195

196196
sdf_voxels = self.sdf_(pos_voxels)
197197
normal_vec_voxels = self.normal_(pos_voxels)
198-
normal_vec_voxels_ = gu.ti_normalize(normal_vec_voxels)
198+
normal_vec_voxels_ = gu.ti_normalize(normal_vec_voxels, gs.EPS)
199199

200200
vec_voxels = -sdf_voxels * normal_vec_voxels_
201201
R_voxels_to_mesh = self.T_mesh_to_sdf[None][:3, :3].inverse()

genesis/engine/entities/tool_entity/tool_entity.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ def advect(self, f: ti.i32):
182182
)
183183
# rotate in world coordinates about itself.
184184
self.quat[f + 1, i_b] = ti_transform_quat_by_quat(
185-
self.quat[f, i_b], ti_rotvec_to_quat(self.ang[f, i_b] * self._solver.substep_dt)
185+
self.quat[f, i_b], ti_rotvec_to_quat(self.ang[f, i_b] * self._solver.substep_dt, gs.EPS)
186186
)
187187

188188
self.vel[f + 1, i_b] = self.vel[f, i_b]

genesis/engine/scene.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -871,15 +871,18 @@ def _parallelize(
871871
- for non-batched env, we only parallelize certain loops that have big loop size
872872
- for batched env, we parallelize all loops
873873
- When using cpu, we serialize everything.
874-
- This is emprically as fast as parallel loops even with big batchsize (tested up to B=10000), because invoking multiple cpu processes cannot utilize all cpu usage.
875-
- In order to exploit full cpu power, users are encouraged to launch multiple processes manually, and each will use a single cpu thred.
874+
- Parallelization only provides a boost for n_envs >= num_threads and ti_num_threads > 1.
875+
It is always disabled by default but can be enforced by setting the env var `GS_PARA_LEVEL=2`.
876+
- In order to exploit full cpu power, users are encouraged to launch multiple processes manually and set
877+
env var `TI_NUM_THREADS=1`, so that each process uses a single cpu thread.
876878
"""
877879
if gs.backend == gs.cpu:
878-
self._para_level = gs.PARA_LEVEL.NEVER
879-
elif self.n_envs == 0:
880-
self._para_level = gs.PARA_LEVEL.PARTIAL
880+
para_level = gs.PARA_LEVEL.NEVER
881+
elif self.n_envs <= 1:
882+
para_level = gs.PARA_LEVEL.PARTIAL
881883
else:
882-
self._para_level = gs.PARA_LEVEL.ALL
884+
para_level = gs.PARA_LEVEL.ALL
885+
self._para_level = int(os.environ.get("GS_PARA_LEVEL", para_level))
883886

884887
@gs.assert_built
885888
def reset(self, state: SimState | None = None, envs_idx=None):

genesis/engine/sensors/raycaster.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ def kernel_cast_rays(
193193
ray_start_world = ti_transform_by_trans_quat(ray_start_local, link_pos, link_quat)
194194

195195
ray_dir_local = ti.math.vec3(ray_directions[i_p, 0], ray_directions[i_p, 1], ray_directions[i_p, 2])
196-
ray_direction_world = ti_normalize(ti_transform_by_quat(ray_dir_local, link_quat))
196+
ray_direction_world = ti_normalize(ti_transform_by_quat(ray_dir_local, link_quat), gs.EPS)
197197

198198
# --- 2. BVH Traversal ---
199199
# FIXME: this duplicates the logic in LBVH.query() which also does traversal
@@ -269,7 +269,7 @@ def kernel_cast_rays(
269269
else:
270270
# Local frame output along provided local ray direction
271271
hit_point = dist * ti_normalize(
272-
ti.math.vec3(ray_directions[i_p, 0], ray_directions[i_p, 1], ray_directions[i_p, 2])
272+
ti.math.vec3(ray_directions[i_p, 0], ray_directions[i_p, 1], ray_directions[i_p, 2]), gs.EPS
273273
)
274274
output_hits[i_b, i_p_offset + i_p_sensor * 3 + 0] = hit_point.x
275275
output_hits[i_b, i_p_offset + i_p_sensor * 3 + 1] = hit_point.y

genesis/engine/solvers/mpm_solver.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,7 @@ def p2g(
369369
sdf_normal_cell = sdf_decomp.sdf_func_normal_world(
370370
geoms_state=geoms_state,
371371
geoms_info=geoms_info,
372+
rigid_global_info=rigid_global_info,
372373
collider_static_config=collider_static_config,
373374
sdf_info=sdf_info,
374375
pos_world=cell_pos,

0 commit comments

Comments
 (0)