1#include <Core/Tasks/Task.hpp>
2#include <Core/Tasks/TaskQueue.hpp>
3#include <Core/Utils/Index.hpp>
4#include <catch2/catch_test_macros.hpp>
13using namespace Ra::Core::Utils;
16TEST_CASE(
"Core/TaskQueueInit",
"[unittests][Core][TaskQueue]" ) {
17 for (
int i = 0; i < 5; ++i ) {
19 for (
int j = 0; j < 20; ++j ) {
20 taskQueue1.registerTask( std::make_unique<FunctionTask>(
23 taskQueue1.startTasks();
24 taskQueue1.waitForTasks();
25 taskQueue1.flushTaskQueue();
27 for (
int i = 0; i < 50; ++i ) {
31 taskQueue1.startTasks();
32 taskQueue1.waitForTasks();
33 taskQueue1.flushTaskQueue();
34 taskQueue2.startTasks();
35 taskQueue2.waitForTasks();
36 taskQueue2.flushTaskQueue();
37 taskQueue3.startTasks();
38 taskQueue3.waitForTasks();
39 taskQueue3.flushTaskQueue();
43TEST_CASE(
"Core/TaskQueue",
"[unittests][Core][TaskQueue]" ) {
46 const int arraySize = 7;
47 int array[arraySize] = { -1, -1, -1, -1, -1, -1, -1 };
49 SECTION(
"no dependency" ) {
50 for (
int tidx = 0; tidx < arraySize; ++tidx ) {
52 std::make_unique<FunctionTask>( [&array, tidx]() { array[tidx] = tidx; },
54 auto tid = taskQueue.registerTask(
std::move( task ) );
59 taskQueue.printTaskGraph( oss );
61 REQUIRE( s ==
"digraph tasks {\n"
70 SECTION(
"parallel run" ) {
71 taskQueue.startTasks();
72 taskQueue.waitForTasks();
73 taskQueue.flushTaskQueue();
75 SECTION(
"one thread run" ) {
76 taskQueue.runTasksInThisThread();
78 for (
int tidx = 0; tidx < arraySize; ++tidx ) {
79 REQUIRE( array[tidx] == tidx );
82 SECTION(
"dependencies" ) {
84 for (
int tidx = 0; tidx < 4; ++tidx ) {
86 std::make_unique<FunctionTask>( [&array, tidx]() { array[tidx] = tidx; },
88 tids[tidx] = taskQueue.registerTask(
std::move( task ) );
89 REQUIRE( tids[tidx] ==
92 taskQueue.addPendingDependency( tids[tidx],
96 for (
int tidx = 4; tidx < 6; ++tidx ) {
97 int pred1 = 2 * ( tidx - 4 );
98 int pred2 = 2 * ( tidx - 4 ) + 1;
99 auto task = std::make_unique<FunctionTask>(
100 [&array, tidx, pred1, pred2]() { array[tidx] = array[pred1] + array[pred2]; },
102 auto tid = taskQueue.registerTask(
std::move( task ) );
111 std::make_unique<FunctionTask>( [&array]() { array[6] = array[4] + array[5]; },
113 taskQueue.registerTask(
std::move( task ) );
118 SECTION(
"parallel run" ) {
119 taskQueue.startTasks();
120 taskQueue.waitForTasks();
121 taskQueue.flushTaskQueue();
123 SECTION(
"one thread run" ) {
124 taskQueue.runTasksInThisThread();
126 REQUIRE( array[0] == 0 );
127 REQUIRE( array[1] == 1 );
128 REQUIRE( array[2] == 2 );
129 REQUIRE( array[3] == 3 );
130 REQUIRE( array[4] == 1 );
131 REQUIRE( array[5] == 5 );
132 REQUIRE( array[6] == 6 );
135 SECTION(
"remove with dependencies" ) {
137 for (
int tidx = 0; tidx < 4; ++tidx ) {
139 std::make_unique<FunctionTask>( [&array, tidx]() { array[tidx] = tidx; },
141 tids[tidx] = taskQueue.registerTask(
std::move( task ) );
142 REQUIRE( tids[tidx] ==
145 taskQueue.addPendingDependency( tids[tidx],
149 for (
int tidx = 4; tidx < 6; ++tidx ) {
150 int pred1 = 2 * ( tidx - 4 );
151 int pred2 = 2 * ( tidx - 4 ) + 1;
152 auto task = std::make_unique<FunctionTask>(
153 [&array, tidx, pred1, pred2]() { array[tidx] = array[pred1] + array[pred2]; },
155 auto tid = taskQueue.registerTask(
std::move( task ) );
164 std::make_unique<FunctionTask>( [&array]() { array[6] = array[4] + array[5]; },
166 tids[6] = taskQueue.registerTask(
std::move( task ) );
170 taskQueue.removeTask( tids[0] );
171 taskQueue.removeTask( tids[6] );
175 taskQueue.removeTask( 100 );
177 SECTION(
"parallel run" ) {
178 taskQueue.startTasks();
179 taskQueue.waitForTasks();
180 taskQueue.flushTaskQueue();
183 SECTION(
"one thread run" ) {
184 taskQueue.runTasksInThisThread();
187 REQUIRE( array[0] == -1 );
188 REQUIRE( array[1] == 1 );
189 REQUIRE( array[2] == 2 );
190 REQUIRE( array[3] == 3 );
191 REQUIRE( array[4] == 0 );
192 REQUIRE( array[5] == 5 );
193 REQUIRE( array[6] == -1 );
This class allows tasks to be registered and then executed in parallel on separate threads.
Utils::Index TaskId
Identifier for a task in the task queue.
This namespace contains everything "low level", related to data, datastuctures, and computation.