Changeset View
Changeset View
Standalone View
Standalone View
tests/gtests/blenlib/BLI_task_performance_test.cc
| Show All 13 Lines | |||||
| #include "BLI_mempool.h" | #include "BLI_mempool.h" | ||||
| #include "BLI_task.h" | #include "BLI_task.h" | ||||
| #include "PIL_time.h" | #include "PIL_time.h" | ||||
| #include "MEM_guardedalloc.h" | #include "MEM_guardedalloc.h" | ||||
| } | } | ||||
| /* *** Parallel iterations over double-linked list items. *** */ | |||||
| #define NUM_RUN_AVERAGED 100 | #define NUM_RUN_AVERAGED 100 | ||||
| static uint gen_pseudo_random_number(uint num) | static uint gen_pseudo_random_number(uint num) | ||||
| { | { | ||||
| /* Note: this is taken from BLI_ghashutil_uinthash(), don't want to depend on external code that | /* Note: this is taken from BLI_ghashutil_uinthash(), don't want to depend on external code that | ||||
| * might change here... */ | * might change here... */ | ||||
| num += ~(num << 16); | num += ~(num << 16); | ||||
| num ^= (num >> 5); | num ^= (num >> 5); | ||||
| num += (num << 3); | num += (num << 3); | ||||
| 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; | ||||
| } | } | ||||
| /* *** Parallel iterations over range of indices. *** */ | |||||
| static void task_parallel_range_func(void *UNUSED(userdata), | |||||
| int index, | |||||
| const TaskParallelTLS *__restrict UNUSED(tls)) | |||||
| { | |||||
| const uint limit = gen_pseudo_random_number((uint)index); | |||||
| for (uint i = (uint)index; i < limit;) { | |||||
| i += gen_pseudo_random_number(i); | |||||
| } | |||||
| } | |||||
| static void task_parallel_range_test_do(const char *id, | |||||
| const int num_items, | |||||
| const bool use_threads) | |||||
| { | |||||
| TaskParallelSettings settings; | |||||
| BLI_parallel_range_settings_defaults(&settings); | |||||
| settings.use_threading = use_threads; | |||||
| double averaged_timing = 0.0; | |||||
| for (int i = 0; i < NUM_RUN_AVERAGED; i++) { | |||||
| const double init_time = PIL_check_seconds_timer(); | |||||
| for (int j = 0; j < 10; j++) { | |||||
| BLI_task_parallel_range(i + j, i + j + num_items, NULL, task_parallel_range_func, &settings); | |||||
| } | |||||
| averaged_timing += PIL_check_seconds_timer() - init_time; | |||||
| } | |||||
| printf("\t%s: non-pooled done in %fs on average over %d runs\n", | |||||
| id, | |||||
| averaged_timing / NUM_RUN_AVERAGED, | |||||
| NUM_RUN_AVERAGED); | |||||
| averaged_timing = 0.0; | |||||
| for (int i = 0; i < NUM_RUN_AVERAGED; i++) { | |||||
| const double init_time = PIL_check_seconds_timer(); | |||||
| TaskParallelRangePool *range_pool = BLI_task_parallel_range_pool_init(&settings); | |||||
| for (int j = 0; j < 10; j++) { | |||||
| BLI_task_parallel_range_pool_push( | |||||
| range_pool, i + j, i + j + num_items, NULL, task_parallel_range_func, &settings); | |||||
| } | |||||
| BLI_task_parallel_range_pool_work_and_wait(range_pool); | |||||
| BLI_task_parallel_range_pool_free(range_pool); | |||||
| averaged_timing += PIL_check_seconds_timer() - init_time; | |||||
| } | |||||
| printf("\t%s: pooled done in %fs on average over %d runs\n", | |||||
| id, | |||||
| averaged_timing / NUM_RUN_AVERAGED, | |||||
| NUM_RUN_AVERAGED); | |||||
| } | |||||
| TEST(task, RangeIter10KNoThread) | |||||
| { | |||||
| task_parallel_range_test_do( | |||||
| "Range parallel iteration - Single thread - 10K items", 10000, false); | |||||
| } | |||||
| TEST(task, RangeIter10k) | |||||
| { | |||||
| task_parallel_range_test_do("Range parallel iteration - Threaded - 10K items", 10000, true); | |||||
| } | |||||
| TEST(task, RangeIter100KNoThread) | |||||
| { | |||||
| task_parallel_range_test_do( | |||||
| "Range parallel iteration - Single thread - 100K items", 100000, false); | |||||
| } | |||||
| TEST(task, RangeIter100k) | |||||
| { | |||||
| task_parallel_range_test_do("Range parallel iteration - Threaded - 100K items", 100000, true); | |||||
| } | |||||
| TEST(task, RangeIter1000KNoThread) | |||||
| { | |||||
| task_parallel_range_test_do( | |||||
| "Range parallel iteration - Single thread - 1000K items", 1000000, false); | |||||
| } | |||||
| TEST(task, RangeIter1000k) | |||||
| { | |||||
| task_parallel_range_test_do("Range parallel iteration - Threaded - 1000K items", 1000000, true); | |||||
| } | |||||
| /* *** Parallel iterations over double-linked list items. *** */ | |||||
| static void task_listbase_light_iter_func(void *UNUSED(userdata), | static void task_listbase_light_iter_func(void *UNUSED(userdata), | ||||
| void *item, | void *item, | ||||
| int index, | int index, | ||||
| const TaskParallelTLS *__restrict UNUSED(tls)) | const TaskParallelTLS *__restrict UNUSED(tls)) | ||||
| { | { | ||||
| LinkData *data = (LinkData *)item; | LinkData *data = (LinkData *)item; | ||||
| ▲ Show 20 Lines • Show All 164 Lines • Show Last 20 Lines | |||||