[Bf-blender-cvs] [2b0f0ff] blender-v2.77-release: Fix T47763: 2.77 RC2 (Fluid) Particle Baking slower compared to 2.67b.

Bastien Montagne noreply at git.blender.org
Fri Mar 18 12:15:34 CET 2016


Commit: 2b0f0ffe0a5bde558eba71ed6d61b18caa22c792
Author: Bastien Montagne
Date:   Sat Mar 12 09:09:29 2016 +0100
Branches: blender-v2.77-release
https://developer.blender.org/rB2b0f0ffe0a5bde558eba71ed6d61b18caa22c792

Fix T47763: 2.77 RC2 (Fluid) Particle Baking slower compared to 2.67b.

Static schedule was responsible here...

Also, made a minor optimization in case adaptative (auto) subframes are enabled,
gives a few percent of speedup here.

===================================================================

M	source/blender/blenkernel/intern/particle_system.c

===================================================================

diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c
index 4d3e966..e9ce532 100644
--- a/source/blender/blenkernel/intern/particle_system.c
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -3289,15 +3289,20 @@ static const float TIMESTEP_EXPANSION_TOLERANCE = 1.5f;
  * step, after the velocity has been updated. element_size defines the scale of
  * the simulation, and is typically the distance to neighboring particles. */
 static void update_courant_num(ParticleSimulationData *sim, ParticleData *pa,
-                               float dtime, SPHData *sphdata)
+                               float dtime, SPHData *sphdata, SpinLock *spin)
 {
 	float relative_vel[3];
-	float speed;
 
 	sub_v3_v3v3(relative_vel, pa->prev_state.vel, sphdata->flow);
-	speed = len_v3(relative_vel);
-	if (sim->courant_num < speed * dtime / sphdata->element_size)
-		sim->courant_num = speed * dtime / sphdata->element_size;
+
+	const float courant_num = len_v3(relative_vel) * dtime / sphdata->element_size;
+	if (sim->courant_num < courant_num) {
+		BLI_spin_lock(spin);
+		if (sim->courant_num < courant_num) {
+			sim->courant_num = courant_num;
+		}
+		BLI_spin_unlock(spin);
+	}
 }
 static float get_base_time_step(ParticleSettings *part)
 {
@@ -3345,7 +3350,7 @@ typedef struct DynamicStepSolverTaskData {
 	float timestep;
 	float dtime;
 
-	ThreadMutex mutex;
+	SpinLock spin;
 } DynamicStepSolverTaskData;
 
 static void dynamics_step_sph_ddr_task_cb_ex(
@@ -3378,13 +3383,12 @@ static void dynamics_step_sph_ddr_task_cb_ex(
 	basic_rotate(part, pa, pa->state.time, data->timestep);
 
 	if (part->time_flag & PART_TIME_AUTOSF) {
-		BLI_mutex_lock(&data->mutex);
-		update_courant_num(sim, pa, data->dtime, sphdata);
-		BLI_mutex_unlock(&data->mutex);
+		update_courant_num(sim, pa, data->dtime, sphdata, &data->spin);
 	}
 }
 
-static void dynamics_step_sph_classical_basic_integrate_task_cb(void *userdata, const int p)
+static void dynamics_step_sph_classical_basic_integrate_task_cb_ex(
+        void *userdata,  void *UNUSED(userdata_chunk), const int p, const int UNUSED(thread_id))
 {
 	DynamicStepSolverTaskData *data = userdata;
 	ParticleSimulationData *sim = data->sim;
@@ -3444,9 +3448,7 @@ static void dynamics_step_sph_classical_integrate_task_cb_ex(
 	basic_rotate(part, pa, pa->state.time, data->timestep);
 
 	if (part->time_flag & PART_TIME_AUTOSF) {
-		BLI_mutex_lock(&data->mutex);
-		update_courant_num(sim, pa, data->dtime, sphdata);
-		BLI_mutex_unlock(&data->mutex);
+		update_courant_num(sim, pa, data->dtime, sphdata, &data->spin);
 	}
 }
 
@@ -3612,7 +3614,7 @@ static void dynamics_step(ParticleSimulationData *sim, float cfra)
 			    .sim = sim, .cfra = cfra, .timestep = timestep, .dtime = dtime,
 			};
 
-			BLI_mutex_init(&task_data.mutex);
+			BLI_spin_init(&task_data.spin);
 
 			if (part->fluid->solver == SPH_SOLVER_DDR) {
 				/* Apply SPH forces using double-density relaxation algorithm
@@ -3620,7 +3622,7 @@ static void dynamics_step(ParticleSimulationData *sim, float cfra)
 
 				BLI_task_parallel_range_ex(
 				            0, psys->totpart, &task_data, &sphdata, sizeof(sphdata),
-				            dynamics_step_sph_ddr_task_cb_ex, psys->totpart > 100, false);
+				            dynamics_step_sph_ddr_task_cb_ex, psys->totpart > 100, true);
 
 				sph_springs_modify(psys, timestep);
 			}
@@ -3630,24 +3632,24 @@ static void dynamics_step(ParticleSimulationData *sim, float cfra)
 				 * and Monaghan). Note that, unlike double-density relaxation,
 				 * this algorithm is separated into distinct loops. */
 
-				BLI_task_parallel_range(
-				            0, psys->totpart, &task_data,
-				            dynamics_step_sph_classical_basic_integrate_task_cb, psys->totpart > 100);
+				BLI_task_parallel_range_ex(
+				            0, psys->totpart, &task_data, NULL, 0,
+				            dynamics_step_sph_classical_basic_integrate_task_cb_ex, psys->totpart > 100, true);
 
 				/* calculate summation density */
 				/* Note that we could avoid copying sphdata for each thread here (it's only read here),
 				 * but doubt this would gain us anything except confusion... */
 				BLI_task_parallel_range_ex(
 				            0, psys->totpart, &task_data, &sphdata, sizeof(sphdata),
-				            dynamics_step_sph_classical_calc_density_task_cb_ex, psys->totpart > 100, false);
+				            dynamics_step_sph_classical_calc_density_task_cb_ex, psys->totpart > 100, true);
 
 				/* do global forces & effectors */
 				BLI_task_parallel_range_ex(
 				            0, psys->totpart, &task_data, &sphdata, sizeof(sphdata),
-				            dynamics_step_sph_classical_integrate_task_cb_ex, psys->totpart > 100, false);
+				            dynamics_step_sph_classical_integrate_task_cb_ex, psys->totpart > 100, true);
 			}
 
-			BLI_mutex_end(&task_data.mutex);
+			BLI_spin_end(&task_data.spin);
 
 			psys_sph_finalise(&sphdata);
 			break;




More information about the Bf-blender-cvs mailing list