Changeset View
Changeset View
Standalone View
Standalone View
tests/gtests/blenlib/BLI_task_performance_test.cc
| Show All 32 Lines | static uint gen_pseudo_random_number(uint num) | ||||
| num ^= (num >> 13); | num ^= (num >> 13); | ||||
| num += ~(num << 9); | num += ~(num << 9); | ||||
| num ^= (num >> 17); | num ^= (num >> 17); | ||||
| /* Make final number in [65 - 16385] range. */ | /* Make final number in [65 - 16385] range. */ | ||||
| return ((num & 255) << 6) + 1; | return ((num & 255) << 6) + 1; | ||||
| } | } | ||||
| static void task_listbase_light_iter_func(void *UNUSED(userdata), Link *item, int index) | static void task_listbase_light_iter_func(void *UNUSED(userdata), | ||||
| void *item, | |||||
| int index, | |||||
| const TaskParallelTLS *__restrict UNUSED(tls)) | |||||
| { | { | ||||
| LinkData *data = (LinkData *)item; | LinkData *data = (LinkData *)item; | ||||
| data->data = POINTER_FROM_INT(POINTER_AS_INT(data->data) + index); | data->data = POINTER_FROM_INT(POINTER_AS_INT(data->data) + index); | ||||
| } | } | ||||
| static void task_listbase_light_membarrier_iter_func(void *userdata, Link *item, int index) | static void task_listbase_light_membarrier_iter_func(void *userdata, | ||||
| void *item, | |||||
| int index, | |||||
| const TaskParallelTLS *__restrict UNUSED(tls)) | |||||
| { | { | ||||
| LinkData *data = (LinkData *)item; | LinkData *data = (LinkData *)item; | ||||
| int *count = (int *)userdata; | int *count = (int *)userdata; | ||||
| data->data = POINTER_FROM_INT(POINTER_AS_INT(data->data) + index); | data->data = POINTER_FROM_INT(POINTER_AS_INT(data->data) + index); | ||||
| atomic_sub_and_fetch_uint32((uint32_t *)count, 1); | atomic_sub_and_fetch_uint32((uint32_t *)count, 1); | ||||
| } | } | ||||
| static void task_listbase_heavy_iter_func(void *UNUSED(userdata), Link *item, int index) | static void task_listbase_heavy_iter_func(void *UNUSED(userdata), | ||||
| void *item, | |||||
| int index, | |||||
| const TaskParallelTLS *__restrict UNUSED(tls)) | |||||
| { | { | ||||
| LinkData *data = (LinkData *)item; | LinkData *data = (LinkData *)item; | ||||
| /* 'Random' number of iterations. */ | /* 'Random' number of iterations. */ | ||||
| const uint num = gen_pseudo_random_number((uint)index); | const uint num = gen_pseudo_random_number((uint)index); | ||||
| for (uint i = 0; i < num; i++) { | for (uint i = 0; i < num; i++) { | ||||
| data->data = POINTER_FROM_INT(POINTER_AS_INT(data->data) + ((i % 2) ? -index : index)); | data->data = POINTER_FROM_INT(POINTER_AS_INT(data->data) + ((i % 2) ? -index : index)); | ||||
| } | } | ||||
| } | } | ||||
| static void task_listbase_heavy_membarrier_iter_func(void *userdata, Link *item, int index) | static void task_listbase_heavy_membarrier_iter_func(void *userdata, | ||||
| void *item, | |||||
| int index, | |||||
| const TaskParallelTLS *__restrict UNUSED(tls)) | |||||
| { | { | ||||
| LinkData *data = (LinkData *)item; | LinkData *data = (LinkData *)item; | ||||
| int *count = (int *)userdata; | int *count = (int *)userdata; | ||||
| /* 'Random' number of iterations. */ | /* 'Random' number of iterations. */ | ||||
| const uint num = gen_pseudo_random_number((uint)index); | const uint num = gen_pseudo_random_number((uint)index); | ||||
| for (uint i = 0; i < num; i++) { | for (uint i = 0; i < num; i++) { | ||||
| data->data = POINTER_FROM_INT(POINTER_AS_INT(data->data) + ((i % 2) ? -index : index)); | data->data = POINTER_FROM_INT(POINTER_AS_INT(data->data) + ((i % 2) ? -index : index)); | ||||
| } | } | ||||
| atomic_sub_and_fetch_uint32((uint32_t *)count, 1); | atomic_sub_and_fetch_uint32((uint32_t *)count, 1); | ||||
| } | } | ||||
| static void task_listbase_test_do(ListBase *list, | static void task_listbase_test_do(ListBase *list, | ||||
| const int num_items, | const int num_items, | ||||
| int *num_items_tmp, | int *num_items_tmp, | ||||
| const char *id, | const char *id, | ||||
| TaskParallelListbaseFunc func, | TaskParallelIteratorFunc func, | ||||
| const bool use_threads, | const bool use_threads, | ||||
| const bool check_num_items_tmp) | const bool check_num_items_tmp) | ||||
| { | { | ||||
| TaskParallelSettings settings; | |||||
| BLI_parallel_range_settings_defaults(&settings); | |||||
| settings.use_threading = use_threads; | |||||
| double averaged_timing = 0.0; | double averaged_timing = 0.0; | ||||
| for (int i = 0; i < NUM_RUN_AVERAGED; i++) { | for (int i = 0; i < NUM_RUN_AVERAGED; i++) { | ||||
| const double init_time = PIL_check_seconds_timer(); | const double init_time = PIL_check_seconds_timer(); | ||||
| BLI_task_parallel_listbase(list, num_items_tmp, func, use_threads); | BLI_task_parallel_listbase(list, num_items_tmp, func, &settings); | ||||
| averaged_timing += PIL_check_seconds_timer() - init_time; | averaged_timing += PIL_check_seconds_timer() - init_time; | ||||
| /* 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. */ | ||||
| if (check_num_items_tmp) { | if (check_num_items_tmp) { | ||||
| EXPECT_EQ(*num_items_tmp, 0); | EXPECT_EQ(*num_items_tmp, 0); | ||||
| } | } | ||||
| LinkData *item; | LinkData *item; | ||||
| ▲ Show 20 Lines • Show All 90 Lines • Show Last 20 Lines | |||||