From ddfd6220a873ae7281f02ab9caa723f9af3ce732 Mon Sep 17 00:00:00 2001 From: Maxime France-Pillois Date: Fri, 9 Feb 2024 15:01:11 +0000 Subject: [PATCH] [SYCL][Graph] Avoid unnecessary inter-partition dependencies Improves management of inter-partition dependencies, so that only required dependencies are added. As removing these dependencies can results in multiple executions paths, we have added a map to track all events returned from submitted partitions. All these events are linked to the main event returned to user. Adds tests. --- sycl/doc/design/CommandGraph.md | 26 +++ .../SYCL-Graph-multiple_roots_partitions.jpg | Bin 0 -> 46298 bytes .../SYCL-Graph-partition_execution_flow.jpg | Bin 0 -> 70039 bytes sycl/source/detail/graph_impl.cpp | 38 +++- sycl/source/detail/graph_impl.hpp | 5 + .../Explicit/host_task2_multiple_roots.cpp | 9 + .../Explicit/host_task_multiple_roots.cpp | 9 + .../Inputs/host_task2_multiple_roots.cpp | 174 ++++++++++++++++++ .../Graph/Inputs/host_task_multiple_roots.cpp | 132 +++++++++++++ .../host_task2_multiple_roots.cpp | 9 + .../RecordReplay/host_task_multiple_roots.cpp | 9 + 11 files changed, 409 insertions(+), 2 deletions(-) create mode 100644 sycl/doc/design/images/SYCL-Graph-multiple_roots_partitions.jpg create mode 100644 sycl/doc/design/images/SYCL-Graph-partition_execution_flow.jpg create mode 100644 sycl/test-e2e/Graph/Explicit/host_task2_multiple_roots.cpp create mode 100644 sycl/test-e2e/Graph/Explicit/host_task_multiple_roots.cpp create mode 100644 sycl/test-e2e/Graph/Inputs/host_task2_multiple_roots.cpp create mode 100644 sycl/test-e2e/Graph/Inputs/host_task_multiple_roots.cpp create mode 100644 sycl/test-e2e/Graph/RecordReplay/host_task2_multiple_roots.cpp create mode 100644 sycl/test-e2e/Graph/RecordReplay/host_task_multiple_roots.cpp diff --git a/sycl/doc/design/CommandGraph.md b/sycl/doc/design/CommandGraph.md index fe785175e81db..a0122bc529f29 100644 --- a/sycl/doc/design/CommandGraph.md +++ b/sycl/doc/design/CommandGraph.md @@ -192,6 +192,32 @@ illustrated in the following diagrams: ![Graph partition illustration step 10b.](images/SYCL-Graph-partitions_step11.jpg) ![Graph partition illustration step 11b.](images/SYCL-Graph-partitions_step12.jpg) +### Multiple Roots Execution Flow +The following diagram shows the partitions of a graph with two roots +and a host-task in each branch. + +![Multiple roots graph partition illustration.](images/SYCL-Graph-multiple_roots_partitions.jpg) + +When executing this graph, the partitions were enqueued one after the other, +with each partition waiting for the previous one to complete +(see top of the following diagram). +However, for multi-root graph, this behavior adds unnecessary dependency +between partitions, slowing down the execution of the whole graph. +Now, we keep track of the actual predecessors of each partition and +only enforce dependencies between partitions when necessary. +In our example, the extra dependency is therefore removed and +both branches can be executed concurrently. +But as we can see on this diagram, this new approach can involve +multiple execution tails, which leads to difficulties when +we want to know when the graph execution has finished. +To cope with this issue, the events associated to the completion of +each partition are linked to the event returned to users. +Hence, when the returned event is complete, we can guarantee that +all works associated with the graph has been completed. + +![Multiple roots graph partition execution flow.](images/SYCL-Graph-partition_execution_flow.jpg) + + ## Memory handling: Buffer and Accessor There is no extra support for graph-specific USM allocations in the current diff --git a/sycl/doc/design/images/SYCL-Graph-multiple_roots_partitions.jpg b/sycl/doc/design/images/SYCL-Graph-multiple_roots_partitions.jpg new file mode 100644 index 0000000000000000000000000000000000000000..df21196f786d697c798ca1568f49cefabcc4465e GIT binary patch literal 46298 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 RWtjj2V8DL>5B{0^zW^Xw(hC3p literal 0 HcmV?d00001 diff --git a/sycl/source/detail/graph_impl.cpp b/sycl/source/detail/graph_impl.cpp index 0df0a3b8e2137..738b74ca61635 100644 --- a/sycl/source/detail/graph_impl.cpp +++ b/sycl/source/detail/graph_impl.cpp @@ -263,6 +263,18 @@ void exec_graph_impl::makePartitions() { Partition->MSchedule.end()); } + // Compute partition dependencies + for (auto Partition : MPartitions) { + for (auto const &Root : Partition->MRoots) { + auto RootNode = Root.lock(); + for (const auto &Dep : RootNode->MPredecessors) { + auto NodeDep = Dep.lock(); + Partition->MPredecessors.push_back( + MPartitions[MPartitionNodes[NodeDep]]); + } + } + } + // Reset node groups (if node have to be re-processed - e.g. subgraph) for (auto &Node : MGraphImpl->MNodeStorage) { Node->MPartitionNum = -1; @@ -761,7 +773,22 @@ exec_graph_impl::enqueue(const std::shared_ptr &Queue, }); sycl::detail::EventImplPtr NewEvent; - for (auto CurrentPartition : MPartitions) { + std::vector BackupCGDataMEvents; + if (MPartitions.size() > 1) { + BackupCGDataMEvents = CGData.MEvents; + } + for (uint32_t currentPartitionsNum = 0; + currentPartitionsNum < MPartitions.size(); currentPartitionsNum++) { + auto CurrentPartition = MPartitions[currentPartitionsNum]; + // restore initial MEvents to add only needed additional depenencies + if (currentPartitionsNum > 0) { + CGData.MEvents = BackupCGDataMEvents; + } + + for (auto const &DepPartition : CurrentPartition->MPredecessors) { + CGData.MEvents.push_back(MPartitionsExecutionEvents[DepPartition]); + } + auto CommandBuffer = CurrentPartition->MPiCommandBuffers[Queue->get_device()]; @@ -901,12 +928,19 @@ exec_graph_impl::enqueue(const std::shared_ptr &Queue, NewEvent->setStateIncomplete(); NewEvent->getPreparedDepsEvents() = ScheduledEvents; } - CGData.MEvents.push_back(NewEvent); + MPartitionsExecutionEvents[CurrentPartition] = NewEvent; } // Keep track of this execution event so we can make sure it's completed in // the destructor. MExecutionEvents.push_back(NewEvent); + // Attach events of previous partitions to ensure that when the returned event + // is complete all execution associated with the graph have been completed. + for (auto const &Elem : MPartitionsExecutionEvents) { + if (Elem.second != NewEvent) { + NewEvent->attachEventToComplete(Elem.second); + } + } sycl::event QueueEvent = sycl::detail::createSyclObjFromImpl(NewEvent); return QueueEvent; diff --git a/sycl/source/detail/graph_impl.hpp b/sycl/source/detail/graph_impl.hpp index 46bc15f7b8022..447ecebc3b7d0 100644 --- a/sycl/source/detail/graph_impl.hpp +++ b/sycl/source/detail/graph_impl.hpp @@ -496,6 +496,8 @@ class partition { /// Map of devices to command buffers. std::unordered_map MPiCommandBuffers; + /// List of predecessors to this partition. + std::vector> MPredecessors; /// @return True if the partition contains a host task bool isHostTask() const { @@ -1072,6 +1074,9 @@ class exec_graph_impl { std::vector MExecutionEvents; /// List of the partitions that compose the exec graph. std::vector> MPartitions; + /// Map of the partitions to their execution events + std::unordered_map, sycl::detail::EventImplPtr> + MPartitionsExecutionEvents; }; } // namespace detail diff --git a/sycl/test-e2e/Graph/Explicit/host_task2_multiple_roots.cpp b/sycl/test-e2e/Graph/Explicit/host_task2_multiple_roots.cpp new file mode 100644 index 0000000000000..69b45c6cf0f84 --- /dev/null +++ b/sycl/test-e2e/Graph/Explicit/host_task2_multiple_roots.cpp @@ -0,0 +1,9 @@ +// RUN: %{build} -o %t.out +// RUN: %{run} %t.out +// Extra run to check for leaks in Level Zero using UR_L0_LEAKS_DEBUG +// RUN: %if level_zero %{env UR_L0_LEAKS_DEBUG=1 %{run} %t.out 2>&1 | FileCheck %s --implicit-check-not=LEAK %} +// + +#define GRAPH_E2E_EXPLICIT + +#include "../Inputs/host_task2_multiple_roots.cpp" diff --git a/sycl/test-e2e/Graph/Explicit/host_task_multiple_roots.cpp b/sycl/test-e2e/Graph/Explicit/host_task_multiple_roots.cpp new file mode 100644 index 0000000000000..2411f6174e6b2 --- /dev/null +++ b/sycl/test-e2e/Graph/Explicit/host_task_multiple_roots.cpp @@ -0,0 +1,9 @@ +// RUN: %{build} -o %t.out +// RUN: %{run} %t.out +// Extra run to check for leaks in Level Zero using UR_L0_LEAKS_DEBUG +// RUN: %if level_zero %{env UR_L0_LEAKS_DEBUG=1 %{run} %t.out 2>&1 | FileCheck %s --implicit-check-not=LEAK %} +// + +#define GRAPH_E2E_EXPLICIT + +#include "../Inputs/host_task_multiple_roots.cpp" diff --git a/sycl/test-e2e/Graph/Inputs/host_task2_multiple_roots.cpp b/sycl/test-e2e/Graph/Inputs/host_task2_multiple_roots.cpp new file mode 100644 index 0000000000000..d2de979c3ab6f --- /dev/null +++ b/sycl/test-e2e/Graph/Inputs/host_task2_multiple_roots.cpp @@ -0,0 +1,174 @@ +// This test uses a host_task when adding a command_graph node for graph with +// multiple roots. + +#include "../graph_common.hpp" + +int main() { + queue Queue{{sycl::ext::intel::property::queue::no_immediate_command_list{}}}; + + if (!are_graphs_supported(Queue)) { + return 0; + } + + using T = int; + + if (!Queue.get_device().has(sycl::aspect::usm_shared_allocations)) { + return 0; + } + + const T ModValue = T{7}; + std::vector DataA(Size), DataB(Size), DataC(Size), Res2(Size); + + std::iota(DataA.begin(), DataA.end(), 1); + std::iota(DataB.begin(), DataB.end(), 10); + std::iota(DataC.begin(), DataC.end(), 1000); + + std::vector Reference(DataC); + for (unsigned n = 0; n < Iterations; n++) { + for (size_t i = 0; i < Size; i++) { + Reference[i] = (((DataA[i] + DataB[i]) * ModValue) + 1) * DataB[i]; + } + } + + exp_ext::command_graph Graph{Queue.get_context(), Queue.get_device()}; + + T *PtrA = malloc_device(Size, Queue); + T *PtrB = malloc_device(Size, Queue); + T *PtrC = malloc_shared(Size, Queue); + T *PtrA2 = malloc_device(Size, Queue); + T *PtrB2 = malloc_device(Size, Queue); + T *PtrC2 = malloc_shared(Size, Queue); + + Queue.copy(DataA.data(), PtrA, Size); + Queue.copy(DataB.data(), PtrB, Size); + Queue.copy(DataC.data(), PtrC, Size); + Queue.copy(DataA.data(), PtrA2, Size); + Queue.copy(DataB.data(), PtrB2, Size); + Queue.copy(DataC.data(), PtrC2, Size); + Queue.wait_and_throw(); + + // Vector add to output + auto NodeA = add_node(Graph, Queue, [&](handler &CGH) { + CGH.parallel_for(range<1>(Size), [=](item<1> id) { PtrC[id] = PtrA[id]; }); + }); + + // Vector add to output + auto NodeB = add_node( + Graph, Queue, + [&](handler &CGH) { + depends_on_helper(CGH, NodeA); + CGH.parallel_for(range<1>(Size), + [=](item<1> id) { PtrC[id] += PtrB[id]; }); + }, + NodeA); + + // Modify the output values in a host_task + auto NodeC = add_node( + Graph, Queue, + [&](handler &CGH) { + depends_on_helper(CGH, NodeB); + CGH.host_task([=]() { + for (size_t i = 0; i < Size; i++) { + PtrC[i] *= ModValue; + } + }); + }, + NodeB); + + // Modify temp buffer and write to output buffer + auto NodeD = add_node( + Graph, Queue, + [&](handler &CGH) { + depends_on_helper(CGH, NodeC); + CGH.parallel_for(range<1>(Size), [=](item<1> id) { PtrC[id] += 1; }); + }, + NodeC); + + // Modify temp buffer and write to output buffer + add_node( + Graph, Queue, + [&](handler &CGH) { + depends_on_helper(CGH, NodeD); + CGH.parallel_for(range<1>(Size), + [=](item<1> id) { PtrC[id] *= PtrB[id]; }); + }, + NodeD); + + // Vector add to output + auto NodeA2 = add_node(Graph, Queue, [&](handler &CGH) { + CGH.parallel_for(range<1>(Size), + [=](item<1> id) { PtrC2[id] = PtrA2[id]; }); + }); + + // Vector add to output + auto NodeB2 = add_node( + Graph, Queue, + [&](handler &CGH) { + depends_on_helper(CGH, NodeA2); + CGH.parallel_for(range<1>(Size), + [=](item<1> id) { PtrC2[id] += PtrB2[id]; }); + }, + NodeA2); + + // Modify the output values in a host_task + auto NodeC2 = add_node( + Graph, Queue, + [&](handler &CGH) { + depends_on_helper(CGH, NodeB2); + CGH.host_task([=]() { + for (size_t i = 0; i < Size; i++) { + PtrC2[i] *= ModValue; + } + }); + }, + NodeB2); + + // Modify temp buffer and write to output buffer + auto NodeD2 = add_node( + Graph, Queue, + [&](handler &CGH) { + depends_on_helper(CGH, NodeC2); + CGH.parallel_for(range<1>(Size), [=](item<1> id) { PtrC2[id] += 1; }); + }, + NodeC2); + + // Modify temp buffer and write to output buffer + add_node( + Graph, Queue, + [&](handler &CGH) { + depends_on_helper(CGH, NodeD2); + CGH.parallel_for(range<1>(Size), + [=](item<1> id) { PtrC2[id] *= PtrB2[id]; }); + }, + NodeD2); + + auto GraphExec = Graph.finalize(); + + event Event; + for (unsigned n = 0; n < Iterations; n++) { + Event = Queue.submit([&](handler &CGH) { + CGH.depends_on(Event); + CGH.ext_oneapi_graph(GraphExec); + }); + Event.wait(); + } + Queue.wait_and_throw(); + + Queue.copy(PtrC, DataC.data(), Size); + Queue.copy(PtrC2, Res2.data(), Size); + Queue.wait_and_throw(); + + free(PtrA, Queue); + free(PtrB, Queue); + free(PtrC, Queue); + free(PtrA2, Queue); + free(PtrB2, Queue); + free(PtrC2, Queue); + + for (size_t i = 0; i < Size; i++) { + assert(check_value(i, Reference[i], DataC[i], "DataC")); + assert(check_value(i, Reference[i], Res2[i], "Res2")); + } + + return 0; +} diff --git a/sycl/test-e2e/Graph/Inputs/host_task_multiple_roots.cpp b/sycl/test-e2e/Graph/Inputs/host_task_multiple_roots.cpp new file mode 100644 index 0000000000000..4c0ec65c91816 --- /dev/null +++ b/sycl/test-e2e/Graph/Inputs/host_task_multiple_roots.cpp @@ -0,0 +1,132 @@ +// This test uses a host_task when adding a command_graph node for graph with +// multiple roots. + +#include "../graph_common.hpp" + +int main() { + queue Queue{{sycl::ext::intel::property::queue::no_immediate_command_list{}}}; + + if (!are_graphs_supported(Queue)) { + return 0; + } + + using T = int; + + if (!Queue.get_device().has(sycl::aspect::usm_shared_allocations)) { + return 0; + } + + const T ModValue = T{7}; + std::vector DataA(Size), DataB(Size), DataC(Size), Res2(Size); + + std::iota(DataA.begin(), DataA.end(), 1); + std::iota(DataB.begin(), DataB.end(), 10); + std::iota(DataC.begin(), DataC.end(), 1000); + + std::vector Reference(DataC); + for (unsigned n = 0; n < Iterations; n++) { + for (size_t i = 0; i < Size; i++) { + Reference[i] += (DataA[i] + DataB[i]) + ModValue + 1; + } + } + + exp_ext::command_graph Graph{Queue.get_context(), Queue.get_device()}; + + T *PtrA = malloc_device(Size, Queue); + T *PtrB = malloc_device(Size, Queue); + T *PtrC = malloc_shared(Size, Queue); + T *PtrA2 = malloc_device(Size, Queue); + T *PtrB2 = malloc_device(Size, Queue); + T *PtrC2 = malloc_shared(Size, Queue); + + Queue.copy(DataA.data(), PtrA, Size); + Queue.copy(DataB.data(), PtrB, Size); + Queue.copy(DataC.data(), PtrC, Size); + Queue.copy(DataA.data(), PtrA2, Size); + Queue.copy(DataB.data(), PtrB2, Size); + Queue.copy(DataC.data(), PtrC2, Size); + Queue.wait_and_throw(); + + // First root + // Vector add to output + auto NodeA = add_node(Graph, Queue, [&](handler &CGH) { + CGH.parallel_for(range<1>(Size), + [=](item<1> id) { PtrC[id] += PtrA[id] + PtrB[id]; }); + }); + + // Modify the output values in a host_task + auto NodeB = add_node( + Graph, Queue, + [&](handler &CGH) { + depends_on_helper(CGH, NodeA); + CGH.host_task([=]() { + for (size_t i = 0; i < Size; i++) { + PtrC[i] += ModValue; + } + }); + }, + NodeA); + + // Modify temp buffer and write to output buffer + add_node( + Graph, Queue, + [&](handler &CGH) { + depends_on_helper(CGH, NodeB); + CGH.parallel_for(range<1>(Size), [=](item<1> id) { PtrC[id] += 1; }); + }, + NodeB); + + // Second root + // Vector add to output + auto NodeA2 = add_node(Graph, Queue, [&](handler &CGH) { + CGH.parallel_for(range<1>(Size), + [=](item<1> id) { PtrC2[id] += PtrA2[id] + PtrB2[id]; }); + }); + + // Modify the output values in a host_task + auto NodeB2 = add_node( + Graph, Queue, + [&](handler &CGH) { + depends_on_helper(CGH, NodeA2); + CGH.host_task([=]() { + for (size_t i = 0; i < Size; i++) { + PtrC2[i] += ModValue; + } + }); + }, + NodeA2); + + // Modify temp buffer and write to output buffer + add_node( + Graph, Queue, + [&](handler &CGH) { + depends_on_helper(CGH, NodeB2); + CGH.parallel_for(range<1>(Size), [=](item<1> id) { PtrC2[id] += 1; }); + }, + NodeB2); + + auto GraphExec = Graph.finalize(); + + for (unsigned n = 0; n < Iterations; n++) { + Queue.submit([&](handler &CGH) { CGH.ext_oneapi_graph(GraphExec); }); + } + Queue.wait_and_throw(); + + Queue.copy(PtrC, DataC.data(), Size); + Queue.copy(PtrC2, Res2.data(), Size); + Queue.wait_and_throw(); + + free(PtrA, Queue); + free(PtrB, Queue); + free(PtrC, Queue); + free(PtrA2, Queue); + free(PtrB2, Queue); + free(PtrC2, Queue); + + for (size_t i = 0; i < Size; i++) { + assert(check_value(i, Reference[i], DataC[i], "DataC")); + assert(check_value(i, Reference[i], Res2[i], "Res2")); + } + + return 0; +} diff --git a/sycl/test-e2e/Graph/RecordReplay/host_task2_multiple_roots.cpp b/sycl/test-e2e/Graph/RecordReplay/host_task2_multiple_roots.cpp new file mode 100644 index 0000000000000..558f6a59a7cb7 --- /dev/null +++ b/sycl/test-e2e/Graph/RecordReplay/host_task2_multiple_roots.cpp @@ -0,0 +1,9 @@ +// RUN: %{build} -o %t.out +// RUN: %{run} %t.out +// Extra run to check for leaks in Level Zero using UR_L0_LEAKS_DEBUG +// RUN: %if level_zero %{env UR_L0_LEAKS_DEBUG=1 %{run} %t.out 2>&1 | FileCheck %s --implicit-check-not=LEAK %} +// + +#define GRAPH_E2E_RECORD_REPLAY + +#include "../Inputs/host_task2_multiple_roots.cpp" diff --git a/sycl/test-e2e/Graph/RecordReplay/host_task_multiple_roots.cpp b/sycl/test-e2e/Graph/RecordReplay/host_task_multiple_roots.cpp new file mode 100644 index 0000000000000..e7802a36b2fa6 --- /dev/null +++ b/sycl/test-e2e/Graph/RecordReplay/host_task_multiple_roots.cpp @@ -0,0 +1,9 @@ +// RUN: %{build} -o %t.out +// RUN: %{run} %t.out +// Extra run to check for leaks in Level Zero using UR_L0_LEAKS_DEBUG +// RUN: %if level_zero %{env UR_L0_LEAKS_DEBUG=1 %{run} %t.out 2>&1 | FileCheck %s --implicit-check-not=LEAK %} +// + +#define GRAPH_E2E_RECORD_REPLAY + +#include "../Inputs/host_task_multiple_roots.cpp"