diff options
author | Jeroen Bakker <j.bakker@atmind.nl> | 2020-04-17 11:00:54 +0300 |
---|---|---|
committer | Jeroen Bakker <j.bakker@atmind.nl> | 2020-04-17 17:06:54 +0300 |
commit | d923fb784f4f429c066ceb807c669a4308c1d9b4 (patch) | |
tree | 60b1cc5c5af606b1df26637b08f5b4bbc714c827 /tests | |
parent | 74fcb531de04e049d197274b2f376b2a92b3b2f3 (diff) |
Task: Separate Finalize into Reduce And Free
In preparation of TBB we need to split the finalize function into reduce
and free. Reduce is used to combine results and free for freeing any
allocated memory.
The reduce function is called to join user data chunk into another, to reduce the
result to the original userdata_chunk memory. These functions should have no side
effects so that they can be run on any thread.
The free functions should free data created during execution (TaskParallelRangeFunc).
Original patch by Brecht van Lommel
{rB61f49db843cf5095203112226ae386f301be1e1a}.
Reviewed By: Brecht van Lommel, Bastien Montagne
Differential Revision: https://developer.blender.org/D7394
Diffstat (limited to 'tests')
-rw-r--r-- | tests/gtests/blenlib/BLI_task_test.cc | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/tests/gtests/blenlib/BLI_task_test.cc b/tests/gtests/blenlib/BLI_task_test.cc index d4ab9de13c4..1f8c092c66a 100644 --- a/tests/gtests/blenlib/BLI_task_test.cc +++ b/tests/gtests/blenlib/BLI_task_test.cc @@ -27,17 +27,19 @@ static void task_range_iter_func(void *userdata, int index, const TaskParallelTL // printf("%d, %d, %d\n", index, data[index], *((int *)tls->userdata_chunk)); } -static void task_range_iter_finalize_func(void *__restrict userdata, - void *__restrict userdata_chunk) +static void task_range_iter_reduce_func(const void *__restrict UNUSED(userdata), + void *__restrict join_v, + void *__restrict userdata_chunk) { - int *data = (int *)userdata; - data[NUM_ITEMS] += *(int *)userdata_chunk; + int *join = (int *)join_v; + int *chunk = (int *)userdata_chunk; + *join += *chunk; // printf("%d, %d\n", data[NUM_ITEMS], *((int *)userdata_chunk)); } TEST(task, RangeIter) { - int data[NUM_ITEMS + 1] = {0}; + int data[NUM_ITEMS] = {0}; int sum = 0; BLI_threadapi_init(); @@ -48,7 +50,7 @@ TEST(task, RangeIter) settings.userdata_chunk = ∑ settings.userdata_chunk_size = sizeof(sum); - settings.func_finalize = task_range_iter_finalize_func; + settings.func_reduce = task_range_iter_reduce_func; BLI_task_parallel_range(0, NUM_ITEMS, data, task_range_iter_func, &settings); @@ -60,7 +62,7 @@ TEST(task, RangeIter) EXPECT_EQ(data[i], i); expected_sum += i; } - EXPECT_EQ(data[NUM_ITEMS], expected_sum); + EXPECT_EQ(sum, expected_sum); BLI_threadapi_exit(); } @@ -68,7 +70,7 @@ TEST(task, RangeIter) TEST(task, RangeIterPool) { const int num_tasks = 10; - int data[num_tasks][NUM_ITEMS + 1] = {{0}}; + int data[num_tasks][NUM_ITEMS] = {{0}}; int sum = 0; BLI_threadapi_init(); @@ -82,7 +84,7 @@ TEST(task, RangeIterPool) for (int j = 0; j < num_tasks; j++) { settings.userdata_chunk = ∑ settings.userdata_chunk_size = sizeof(sum); - settings.func_finalize = task_range_iter_finalize_func; + settings.func_reduce = task_range_iter_reduce_func; BLI_task_parallel_range_pool_push( range_pool, 0, NUM_ITEMS, data[j], task_range_iter_func, &settings); @@ -93,16 +95,16 @@ TEST(task, RangeIterPool) /* Those checks should ensure us all items of the listbase were processed once, and only once - * as expected. */ + int expected_sum = 0; for (int j = 0; j < num_tasks; j++) { - int expected_sum = 0; for (int i = 0; i < NUM_ITEMS; i++) { - // EXPECT_EQ(data[j][i], i); + // EXPECT_EQ(data[j][i], i); expected_sum += i; } - EXPECT_EQ(data[j][NUM_ITEMS], expected_sum); } + EXPECT_EQ(sum, expected_sum); - /* A pool can be re-used untill it is freed. */ + /* A pool can be re-used until it is freed. */ for (int j = 0; j < num_tasks; j++) { memset(data[j], 0, sizeof(data[j])); @@ -112,7 +114,7 @@ TEST(task, RangeIterPool) for (int j = 0; j < num_tasks; j++) { settings.userdata_chunk = ∑ settings.userdata_chunk_size = sizeof(sum); - settings.func_finalize = task_range_iter_finalize_func; + settings.func_reduce = task_range_iter_reduce_func; BLI_task_parallel_range_pool_push( range_pool, 0, NUM_ITEMS, data[j], task_range_iter_func, &settings); @@ -131,8 +133,8 @@ TEST(task, RangeIterPool) // EXPECT_EQ(data[j][i], i); expected_sum += i; } - EXPECT_EQ(data[j][NUM_ITEMS], expected_sum); } + EXPECT_EQ(sum, expected_sum); BLI_threadapi_exit(); } |