From d2708b0f73d5f0e0a40b36da21c6a0d15405e739 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Fri, 5 Jan 2018 16:33:13 +0100 Subject: Task scheduler: Get rid of extended version of parallel range callback Wrap all arguments into TLS type of argument. Avoids some branching and also makes it easier to extend things in the future. --- source/blender/blenlib/intern/BLI_kdopbvh.c | 7 +-- source/blender/blenlib/intern/math_statistics.c | 3 +- source/blender/blenlib/intern/task.c | 69 ++++++++++--------------- 3 files changed, 34 insertions(+), 45 deletions(-) (limited to 'source/blender/blenlib/intern') diff --git a/source/blender/blenlib/intern/BLI_kdopbvh.c b/source/blender/blenlib/intern/BLI_kdopbvh.c index bd16bc1a9c6..6e33f75fe69 100644 --- a/source/blender/blenlib/intern/BLI_kdopbvh.c +++ b/source/blender/blenlib/intern/BLI_kdopbvh.c @@ -798,7 +798,7 @@ typedef struct BVHDivNodesData { int first_of_next_level; } BVHDivNodesData; -static void non_recursive_bvh_div_nodes_task_cb(void *userdata, const int j) +static void non_recursive_bvh_div_nodes_task_cb(void *userdata, const int j, const ParallelRangeTLS *UNUSED(tls)) { BVHDivNodesData *data = userdata; @@ -929,8 +929,9 @@ static void non_recursive_bvh_div_nodes( } else { /* Less hassle for debugging. */ + ParallelRangeTLS tls = {0}; for (int i_task = i; i_task < i_stop; i_task++) { - non_recursive_bvh_div_nodes_task_cb(&cb_data, i_task); + non_recursive_bvh_div_nodes_task_cb(&cb_data, i_task, &tls); } } } @@ -1276,7 +1277,7 @@ int BLI_bvhtree_overlap_thread_num(const BVHTree *tree) return (int)MIN2(tree->tree_type, tree->nodes[tree->totleaf]->totnode); } -static void bvhtree_overlap_task_cb(void *userdata, const int j) +static void bvhtree_overlap_task_cb(void *userdata, const int j, const ParallelRangeTLS *UNUSED(tls)) { BVHOverlapData_Thread *data = &((BVHOverlapData_Thread *)userdata)[j]; BVHOverlapData_Shared *data_shared = data->shared; diff --git a/source/blender/blenlib/intern/math_statistics.c b/source/blender/blenlib/intern/math_statistics.c index fd7418a8f7b..cfadbba028f 100644 --- a/source/blender/blenlib/intern/math_statistics.c +++ b/source/blender/blenlib/intern/math_statistics.c @@ -46,7 +46,8 @@ typedef struct CovarianceData { int nbr_cos_vn; } CovarianceData; -static void covariance_m_vn_ex_task_cb(void *userdata, const int a) +static void covariance_m_vn_ex_task_cb(void *userdata, const int a, + const ParallelRangeTLS *UNUSED(tls)) { CovarianceData *data = userdata; const float *cos_vn = data->cos_vn; diff --git a/source/blender/blenlib/intern/task.c b/source/blender/blenlib/intern/task.c index afa20e3d766..030d4124e62 100644 --- a/source/blender/blenlib/intern/task.c +++ b/source/blender/blenlib/intern/task.c @@ -994,7 +994,6 @@ typedef struct ParallelRangeState { void *userdata; TaskParallelRangeFunc func; - TaskParallelRangeFuncEx func_ex; int iter; int chunk_size; @@ -1015,23 +1014,17 @@ BLI_INLINE bool parallel_range_next_iter_get( static void parallel_range_func( TaskPool * __restrict pool, void *userdata_chunk, - int threadid) + int thread_id) { ParallelRangeState * __restrict state = BLI_task_pool_userdata(pool); + ParallelRangeTLS tls = { + .thread_id = thread_id, + .userdata_chunk = userdata_chunk, + }; int iter, count; - while (parallel_range_next_iter_get(state, &iter, &count)) { - int i; - - if (state->func_ex) { - for (i = 0; i < count; ++i) { - state->func_ex(state->userdata, userdata_chunk, iter + i, threadid); - } - } - else { - for (i = 0; i < count; ++i) { - state->func(state->userdata, iter + i); - } + for (int i = 0; i < count; ++i) { + state->func(state->userdata, iter + i, &tls); } } } @@ -1047,7 +1040,6 @@ static void task_parallel_range_ex( void *userdata_chunk, const size_t userdata_chunk_size, TaskParallelRangeFunc func, - TaskParallelRangeFuncEx func_ex, TaskParallelRangeFuncFinalize func_finalize, const bool use_threading, const bool use_dynamic_scheduling) @@ -1059,7 +1051,7 @@ static void task_parallel_range_ex( void *userdata_chunk_local = NULL; void *userdata_chunk_array = NULL; - const bool use_userdata_chunk = (func_ex != NULL) && (userdata_chunk_size != 0) && (userdata_chunk != NULL); + const bool use_userdata_chunk = (userdata_chunk_size != 0) && (userdata_chunk != NULL); if (start == stop) { return; @@ -1067,7 +1059,6 @@ static void task_parallel_range_ex( BLI_assert(start < stop); if (userdata_chunk_size != 0) { - BLI_assert(func_ex != NULL && func == NULL); BLI_assert(userdata_chunk != NULL); } @@ -1075,28 +1066,25 @@ static void task_parallel_range_ex( * do everything from the main thread. */ if (!use_threading) { - if (func_ex) { - if (use_userdata_chunk) { - userdata_chunk_local = MALLOCA(userdata_chunk_size); - memcpy(userdata_chunk_local, userdata_chunk, userdata_chunk_size); - } - - for (i = start; i < stop; ++i) { - func_ex(userdata, userdata_chunk_local, i, 0); - } - - if (func_finalize) { - func_finalize(userdata, userdata_chunk_local); - } + if (use_userdata_chunk) { + userdata_chunk_local = MALLOCA(userdata_chunk_size); + memcpy(userdata_chunk_local, userdata_chunk, userdata_chunk_size); + } - MALLOCA_FREE(userdata_chunk_local, userdata_chunk_size); + ParallelRangeTLS tls = { + .thread_id = 0, + .userdata_chunk = userdata_chunk_local, + }; + for (i = start; i < stop; ++i) { + func(userdata, i, &tls); } - else { - for (i = start; i < stop; ++i) { - func(userdata, i); - } + + if (func_finalize) { + func_finalize(userdata, userdata_chunk_local); } + MALLOCA_FREE(userdata_chunk_local, userdata_chunk_size); + return; } @@ -1114,7 +1102,6 @@ static void task_parallel_range_ex( state.stop = stop; state.userdata = userdata; state.func = func; - state.func_ex = func_ex; state.iter = start; if (use_dynamic_scheduling) { state.chunk_size = 32; @@ -1180,12 +1167,12 @@ void BLI_task_parallel_range_ex( void *userdata, void *userdata_chunk, const size_t userdata_chunk_size, - TaskParallelRangeFuncEx func_ex, + TaskParallelRangeFunc func, const bool use_threading, const bool use_dynamic_scheduling) { task_parallel_range_ex( - start, stop, userdata, userdata_chunk, userdata_chunk_size, NULL, func_ex, NULL, + start, stop, userdata, userdata_chunk, userdata_chunk_size, func, NULL, use_threading, use_dynamic_scheduling); } @@ -1206,7 +1193,7 @@ void BLI_task_parallel_range( TaskParallelRangeFunc func, const bool use_threading) { - task_parallel_range_ex(start, stop, userdata, NULL, 0, func, NULL, NULL, use_threading, false); + task_parallel_range_ex(start, stop, userdata, NULL, 0, func, NULL, use_threading, false); } /** @@ -1232,13 +1219,13 @@ void BLI_task_parallel_range_finalize( void *userdata, void *userdata_chunk, const size_t userdata_chunk_size, - TaskParallelRangeFuncEx func_ex, + TaskParallelRangeFunc func, TaskParallelRangeFuncFinalize func_finalize, const bool use_threading, const bool use_dynamic_scheduling) { task_parallel_range_ex( - start, stop, userdata, userdata_chunk, userdata_chunk_size, NULL, func_ex, func_finalize, + start, stop, userdata, userdata_chunk, userdata_chunk_size, func, func_finalize, use_threading, use_dynamic_scheduling); } -- cgit v1.2.3