Changeset View
Changeset View
Standalone View
Standalone View
tests/gtests/blenlib/BLI_task_test.cc
| Show All 21 Lines | |||||
| static void task_range_iter_func(void *userdata, int index, const TaskParallelTLS *__restrict tls) | static void task_range_iter_func(void *userdata, int index, const TaskParallelTLS *__restrict tls) | ||||
| { | { | ||||
| int *data = (int *)userdata; | int *data = (int *)userdata; | ||||
| data[index] = index; | data[index] = index; | ||||
| *((int *)tls->userdata_chunk) += index; | *((int *)tls->userdata_chunk) += index; | ||||
| // printf("%d, %d, %d\n", index, data[index], *((int *)tls->userdata_chunk)); | // printf("%d, %d, %d\n", index, data[index], *((int *)tls->userdata_chunk)); | ||||
| } | } | ||||
| static void task_range_iter_finalize_func(void *__restrict userdata, | static void task_range_iter_reduce_func(const void *__restrict UNUSED(userdata), | ||||
| void *__restrict join_v, | |||||
| void *__restrict userdata_chunk) | void *__restrict userdata_chunk) | ||||
| { | { | ||||
| int *data = (int *)userdata; | int *join = (int *)join_v; | ||||
| data[NUM_ITEMS] += *(int *)userdata_chunk; | int *chunk = (int *)userdata_chunk; | ||||
| *join += *chunk; | |||||
| // printf("%d, %d\n", data[NUM_ITEMS], *((int *)userdata_chunk)); | // printf("%d, %d\n", data[NUM_ITEMS], *((int *)userdata_chunk)); | ||||
| } | } | ||||
| TEST(task, RangeIter) | TEST(task, RangeIter) | ||||
| { | { | ||||
| int data[NUM_ITEMS + 1] = {0}; | int data[NUM_ITEMS + 1] = {0}; | ||||
mont29: You can remove the `+ 1` then... | |||||
| int sum = 0; | int sum = 0; | ||||
| BLI_threadapi_init(); | BLI_threadapi_init(); | ||||
| TaskParallelSettings settings; | TaskParallelSettings settings; | ||||
| BLI_parallel_range_settings_defaults(&settings); | BLI_parallel_range_settings_defaults(&settings); | ||||
| settings.min_iter_per_thread = 1; | settings.min_iter_per_thread = 1; | ||||
| settings.userdata_chunk = ∑ | settings.userdata_chunk = ∑ | ||||
| settings.userdata_chunk_size = sizeof(sum); | 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); | BLI_task_parallel_range(0, NUM_ITEMS, data, task_range_iter_func, &settings); | ||||
| /* Those checks should ensure us all items of the listbase were processed once, and only once - | /* Those checks should ensure us all items of the listbase were processed once, and only once - | ||||
| * as expected. */ | * as expected. */ | ||||
| int expected_sum = 0; | int expected_sum = 0; | ||||
| for (int i = 0; i < NUM_ITEMS; i++) { | for (int i = 0; i < NUM_ITEMS; i++) { | ||||
| EXPECT_EQ(data[i], i); | EXPECT_EQ(data[i], i); | ||||
| expected_sum += i; | expected_sum += i; | ||||
| } | } | ||||
| EXPECT_EQ(data[NUM_ITEMS], expected_sum); | EXPECT_EQ(sum, expected_sum); | ||||
| BLI_threadapi_exit(); | BLI_threadapi_exit(); | ||||
| } | } | ||||
| TEST(task, RangeIterPool) | TEST(task, RangeIterPool) | ||||
| { | { | ||||
| const int num_tasks = 10; | const int num_tasks = 10; | ||||
| int data[num_tasks][NUM_ITEMS + 1] = {{0}}; | int data[num_tasks][NUM_ITEMS + 1] = {{0}}; | ||||
mont29Unsubmitted Done Inline ActionsYou can remove the + 1 then... mont29: You can remove the `+ 1` then... | |||||
| int sum = 0; | int sum = 0; | ||||
| BLI_threadapi_init(); | BLI_threadapi_init(); | ||||
| TaskParallelSettings settings; | TaskParallelSettings settings; | ||||
| BLI_parallel_range_settings_defaults(&settings); | BLI_parallel_range_settings_defaults(&settings); | ||||
| settings.min_iter_per_thread = 1; | settings.min_iter_per_thread = 1; | ||||
| TaskParallelRangePool *range_pool = BLI_task_parallel_range_pool_init(&settings); | TaskParallelRangePool *range_pool = BLI_task_parallel_range_pool_init(&settings); | ||||
| for (int j = 0; j < num_tasks; j++) { | for (int j = 0; j < num_tasks; j++) { | ||||
| settings.userdata_chunk = ∑ | settings.userdata_chunk = ∑ | ||||
| settings.userdata_chunk_size = sizeof(sum); | 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( | BLI_task_parallel_range_pool_push( | ||||
| range_pool, 0, NUM_ITEMS, data[j], task_range_iter_func, &settings); | range_pool, 0, NUM_ITEMS, data[j], task_range_iter_func, &settings); | ||||
| } | } | ||||
| BLI_task_parallel_range_pool_work_and_wait(range_pool); | BLI_task_parallel_range_pool_work_and_wait(range_pool); | ||||
| /* Those checks should ensure us all items of the listbase were processed once, and only once - | /* Those checks should ensure us all items of the listbase were processed once, and only once - | ||||
| * as expected. */ | * as expected. */ | ||||
| for (int j = 0; j < num_tasks; j++) { | |||||
| int expected_sum = 0; | int expected_sum = 0; | ||||
| for (int j = 0; j < num_tasks; j++) { | |||||
| for (int i = 0; i < NUM_ITEMS; i++) { | for (int i = 0; i < NUM_ITEMS; i++) { | ||||
| // EXPECT_EQ(data[j][i], i); | // EXPECT_EQ(data[j][i], i); | ||||
| expected_sum += 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++) { | for (int j = 0; j < num_tasks; j++) { | ||||
| memset(data[j], 0, sizeof(data[j])); | memset(data[j], 0, sizeof(data[j])); | ||||
| } | } | ||||
| sum = 0; | sum = 0; | ||||
| for (int j = 0; j < num_tasks; j++) { | for (int j = 0; j < num_tasks; j++) { | ||||
| settings.userdata_chunk = ∑ | settings.userdata_chunk = ∑ | ||||
| settings.userdata_chunk_size = sizeof(sum); | 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( | BLI_task_parallel_range_pool_push( | ||||
| range_pool, 0, NUM_ITEMS, data[j], task_range_iter_func, &settings); | range_pool, 0, NUM_ITEMS, data[j], task_range_iter_func, &settings); | ||||
| } | } | ||||
| BLI_task_parallel_range_pool_work_and_wait(range_pool); | BLI_task_parallel_range_pool_work_and_wait(range_pool); | ||||
| BLI_task_parallel_range_pool_free(range_pool); | BLI_task_parallel_range_pool_free(range_pool); | ||||
| /* Those checks should ensure us all items of the listbase were processed once, and only once - | /* Those checks should ensure us all items of the listbase were processed once, and only once - | ||||
| * as expected. */ | * as expected. */ | ||||
| for (int j = 0; j < num_tasks; j++) { | for (int j = 0; j < num_tasks; j++) { | ||||
| int expected_sum = 0; | int expected_sum = 0; | ||||
| for (int i = 0; i < NUM_ITEMS; i++) { | for (int i = 0; i < NUM_ITEMS; i++) { | ||||
| // EXPECT_EQ(data[j][i], i); | // EXPECT_EQ(data[j][i], i); | ||||
| expected_sum += i; | expected_sum += i; | ||||
| } | } | ||||
| EXPECT_EQ(data[j][NUM_ITEMS], expected_sum); | |||||
| } | } | ||||
| EXPECT_EQ(sum, expected_sum); | |||||
| BLI_threadapi_exit(); | BLI_threadapi_exit(); | ||||
| } | } | ||||
| /* *** Parallel iterations over mempool items. *** */ | /* *** Parallel iterations over mempool items. *** */ | ||||
| static void task_mempool_iter_func(void *userdata, MempoolIterData *item) | static void task_mempool_iter_func(void *userdata, MempoolIterData *item) | ||||
| { | { | ||||
| ▲ Show 20 Lines • Show All 112 Lines • Show Last 20 Lines | |||||
You can remove the + 1 then...