Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/blenlib')
-rw-r--r--source/blender/blenlib/BLI_task.h20
-rw-r--r--source/blender/blenlib/intern/BLI_kdopbvh.c7
-rw-r--r--source/blender/blenlib/intern/math_statistics.c3
-rw-r--r--source/blender/blenlib/intern/task.c69
4 files changed, 50 insertions, 49 deletions
diff --git a/source/blender/blenlib/BLI_task.h b/source/blender/blenlib/BLI_task.h
index ccfa2b6e2e7..acfdd3729c1 100644
--- a/source/blender/blenlib/BLI_task.h
+++ b/source/blender/blenlib/BLI_task.h
@@ -116,15 +116,27 @@ void BLI_task_pool_delayed_push_begin(TaskPool *pool, int thread_id);
void BLI_task_pool_delayed_push_end(TaskPool *pool, int thread_id);
/* Parallel for routines */
-typedef void (*TaskParallelRangeFunc)(void *userdata, const int iter);
-typedef void (*TaskParallelRangeFuncEx)(void *userdata, void *userdata_chunk, const int iter, const int thread_id);
+
+/* Per-thread specific data passed to the callback. */
+typedef struct ParallelRangeTLS {
+ /* Identifier of the thread who this data belongs to. */
+ int thread_id;
+ /* Copy of user-specifier chunk, which is copied from original chunk to all
+ * worker threads. This is similar to OpenMP's firstprivate.
+ */
+ void *userdata_chunk;
+} ParallelRangeTLS;
+
+typedef void (*TaskParallelRangeFunc)(void *userdata,
+ const int iter,
+ const ParallelRangeTLS *tls);
typedef void (*TaskParallelRangeFuncFinalize)(void *userdata, void *userdata_chunk);
void BLI_task_parallel_range_ex(
int start, int stop,
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);
void BLI_task_parallel_range(
@@ -138,7 +150,7 @@ 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);
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);
}