[Bf-blender-cvs] [5124812780f] tmp-task-foreach-pool: Add threaded handling of finalize callbacks for parallel range pool.
Bastien Montagne
noreply at git.blender.org
Fri Nov 22 15:53:56 CET 2019
Commit: 5124812780f7e246fe8eadb10a6fc3a55b7ffc25
Author: Bastien Montagne
Date: Fri Nov 22 15:51:46 2019 +0100
Branches: tmp-task-foreach-pool
https://developer.blender.org/rB5124812780f7e246fe8eadb10a6fc3a55b7ffc25
Add threaded handling of finalize callbacks for parallel range pool.
As suggested by @sergey in review comments, thanks.
Thhis will add a additional speed-up benefit to using those pools when
finalization computations are not trivial.
===================================================================
M source/blender/blenlib/intern/task.c
===================================================================
diff --git a/source/blender/blenlib/intern/task.c b/source/blender/blenlib/intern/task.c
index 94b6f80be00..e926cbb18bc 100644
--- a/source/blender/blenlib/intern/task.c
+++ b/source/blender/blenlib/intern/task.c
@@ -1418,6 +1418,19 @@ void BLI_task_parallel_range_pool_push(TaskParallelRangePool *range_pool,
range_pool->parallel_range_states = state;
}
+static void parallel_range_func_finalize(TaskPool *__restrict pool,
+ void *v_state,
+ int UNUSED(thread_id))
+{
+ TaskParallelRangePool *__restrict range_pool = BLI_task_pool_userdata(pool);
+ TaskParallelRangeState *state = v_state;
+
+ for (int i = 0; i < range_pool->num_tasks; i++) {
+ void *tls_data = (char *)state->flatten_tls_storage + (state->tls_data_size * (size_t)i);
+ state->func_finalize(state->userdata_shared, tls_data);
+ }
+}
+
/**
* Run all tasks pushed to the range_pool.
*
@@ -1493,17 +1506,12 @@ void BLI_task_parallel_range_pool_work_and_wait(TaskParallelRangePool *range_poo
}
BLI_task_pool_work_and_wait(task_pool);
- BLI_task_pool_free(task_pool);
- range_pool->pool = NULL;
BLI_assert(range_pool->current_state == NULL);
- /* Finalize and cleanup all tasks. */
- TaskParallelRangeState *state_next;
+ /* Finalize all tasks. */
for (TaskParallelRangeState *state = range_pool->parallel_range_states; state != NULL;
- state = state_next) {
- state_next = state->next;
-
+ state = state->next) {
const size_t userdata_chunk_size = state->tls_data_size;
void *userdata_chunk_array = state->flatten_tls_storage;
if (userdata_chunk_size == 0) {
@@ -1513,13 +1521,32 @@ void BLI_task_parallel_range_pool_work_and_wait(TaskParallelRangePool *range_poo
}
if (state->func_finalize != NULL) {
- for (int i = 0; i < num_tasks; i++) {
- void *userdata_chunk_local = (char *)userdata_chunk_array +
- (userdata_chunk_size * (size_t)i);
- state->func_finalize(state->userdata_shared, userdata_chunk_local);
- }
+ BLI_task_pool_push_from_thread(task_pool,
+ parallel_range_func_finalize,
+ state,
+ false,
+ TASK_PRIORITY_HIGH,
+ task_pool->thread_id);
}
- MALLOCA_FREE(userdata_chunk_array, userdata_chunk_size * (size_t)num_tasks);
+ }
+
+ BLI_task_pool_work_and_wait(task_pool);
+ BLI_task_pool_free(task_pool);
+ range_pool->pool = NULL;
+
+ /* Cleanup all tasks. */
+ TaskParallelRangeState *state_next;
+ for (TaskParallelRangeState *state = range_pool->parallel_range_states; state != NULL;
+ state = state_next) {
+ state_next = state->next;
+
+ const size_t userdata_chunk_size = state->tls_data_size;
+ void *userdata_chunk_array = state->flatten_tls_storage;
+ if (userdata_chunk_size != 0) {
+ BLI_assert(userdata_chunk_array != NULL);
+ MALLOCA_FREE(userdata_chunk_array, userdata_chunk_size * (size_t)num_tasks);
+ }
+
MEM_freeN(state);
}
range_pool->parallel_range_states = NULL;
More information about the Bf-blender-cvs
mailing list