From ddfd6220a873ae7281f02ab9caa723f9af3ce732 Mon Sep 17 00:00:00 2001 From: Maxime France-Pillois Date: Fri, 9 Feb 2024 15:01:11 +0000 Subject: [PATCH 1/3] [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" From 2f66db9e51a634a8701e8002093c5ae099c1002f Mon Sep 17 00:00:00 2001 From: Maxime France-Pillois Date: Fri, 9 Feb 2024 16:54:53 +0000 Subject: [PATCH 2/3] Adds imm-cmd-list execution for new tests + typo --- sycl/doc/design/CommandGraph.md | 2 +- sycl/test-e2e/Graph/Explicit/host_task2_multiple_roots.cpp | 4 +++- sycl/test-e2e/Graph/Explicit/host_task_multiple_roots.cpp | 4 +++- sycl/test-e2e/Graph/Inputs/host_task2_multiple_roots.cpp | 2 +- sycl/test-e2e/Graph/Inputs/host_task_multiple_roots.cpp | 2 +- .../test-e2e/Graph/RecordReplay/host_task2_multiple_roots.cpp | 4 +++- sycl/test-e2e/Graph/RecordReplay/host_task_multiple_roots.cpp | 4 +++- 7 files changed, 15 insertions(+), 7 deletions(-) diff --git a/sycl/doc/design/CommandGraph.md b/sycl/doc/design/CommandGraph.md index a0122bc529f29..9cc66626a2e78 100644 --- a/sycl/doc/design/CommandGraph.md +++ b/sycl/doc/design/CommandGraph.md @@ -213,7 +213,7 @@ 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. +all work associated with the graph has been completed. ![Multiple roots graph partition execution flow.](images/SYCL-Graph-partition_execution_flow.jpg) diff --git a/sycl/test-e2e/Graph/Explicit/host_task2_multiple_roots.cpp b/sycl/test-e2e/Graph/Explicit/host_task2_multiple_roots.cpp index 69b45c6cf0f84..064a22e53bdf6 100644 --- a/sycl/test-e2e/Graph/Explicit/host_task2_multiple_roots.cpp +++ b/sycl/test-e2e/Graph/Explicit/host_task2_multiple_roots.cpp @@ -1,7 +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 %} +// RUN: %if level_zero %{env SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=0 UR_L0_LEAKS_DEBUG=1 %{run} %t.out 2>&1 | FileCheck %s --implicit-check-not=LEAK %} +// Extra run to check for immediate-command-list in Level Zero +// RUN: %if level_zero && linux %{env SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=1 UR_L0_LEAKS_DEBUG=1 %{run} %t.out 2>&1 | FileCheck %s --implicit-check-not=LEAK %} // #define GRAPH_E2E_EXPLICIT diff --git a/sycl/test-e2e/Graph/Explicit/host_task_multiple_roots.cpp b/sycl/test-e2e/Graph/Explicit/host_task_multiple_roots.cpp index 2411f6174e6b2..23f83366362d7 100644 --- a/sycl/test-e2e/Graph/Explicit/host_task_multiple_roots.cpp +++ b/sycl/test-e2e/Graph/Explicit/host_task_multiple_roots.cpp @@ -1,7 +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 %} +// RUN: %if level_zero %{env SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=0 UR_L0_LEAKS_DEBUG=1 %{run} %t.out 2>&1 | FileCheck %s --implicit-check-not=LEAK %} +// Extra run to check for immediate-command-list in Level Zero +// RUN: %if level_zero && linux %{env SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=1 UR_L0_LEAKS_DEBUG=1 %{run} %t.out 2>&1 | FileCheck %s --implicit-check-not=LEAK %} // #define GRAPH_E2E_EXPLICIT diff --git a/sycl/test-e2e/Graph/Inputs/host_task2_multiple_roots.cpp b/sycl/test-e2e/Graph/Inputs/host_task2_multiple_roots.cpp index d2de979c3ab6f..c71f93d76cff6 100644 --- a/sycl/test-e2e/Graph/Inputs/host_task2_multiple_roots.cpp +++ b/sycl/test-e2e/Graph/Inputs/host_task2_multiple_roots.cpp @@ -4,7 +4,7 @@ #include "../graph_common.hpp" int main() { - queue Queue{{sycl::ext::intel::property::queue::no_immediate_command_list{}}}; + queue Queue{}; if (!are_graphs_supported(Queue)) { 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 index 4c0ec65c91816..d1ac0b4c1bb72 100644 --- a/sycl/test-e2e/Graph/Inputs/host_task_multiple_roots.cpp +++ b/sycl/test-e2e/Graph/Inputs/host_task_multiple_roots.cpp @@ -4,7 +4,7 @@ #include "../graph_common.hpp" int main() { - queue Queue{{sycl::ext::intel::property::queue::no_immediate_command_list{}}}; + queue Queue{}; if (!are_graphs_supported(Queue)) { 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 index 558f6a59a7cb7..68712d26aa31d 100644 --- a/sycl/test-e2e/Graph/RecordReplay/host_task2_multiple_roots.cpp +++ b/sycl/test-e2e/Graph/RecordReplay/host_task2_multiple_roots.cpp @@ -1,7 +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 %} +// RUN: %if level_zero %{env SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=0 UR_L0_LEAKS_DEBUG=1 %{run} %t.out 2>&1 | FileCheck %s --implicit-check-not=LEAK %} +// Extra run to check for immediate-command-list in Level Zero +// RUN: %if level_zero && linux %{env SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=1 UR_L0_LEAKS_DEBUG=1 %{run} %t.out 2>&1 | FileCheck %s --implicit-check-not=LEAK %} // #define GRAPH_E2E_RECORD_REPLAY diff --git a/sycl/test-e2e/Graph/RecordReplay/host_task_multiple_roots.cpp b/sycl/test-e2e/Graph/RecordReplay/host_task_multiple_roots.cpp index e7802a36b2fa6..685b701272e8e 100644 --- a/sycl/test-e2e/Graph/RecordReplay/host_task_multiple_roots.cpp +++ b/sycl/test-e2e/Graph/RecordReplay/host_task_multiple_roots.cpp @@ -1,7 +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 %} +// RUN: %if level_zero %{env SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=0 UR_L0_LEAKS_DEBUG=1 %{run} %t.out 2>&1 | FileCheck %s --implicit-check-not=LEAK %} +// Extra run to check for immediate-command-list in Level Zero +// RUN: %if level_zero && linux %{env SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=1 UR_L0_LEAKS_DEBUG=1 %{run} %t.out 2>&1 | FileCheck %s --implicit-check-not=LEAK %} // #define GRAPH_E2E_RECORD_REPLAY From b61c34b3011c0d6a4c498754c30751076985acc2 Mon Sep 17 00:00:00 2001 From: Maxime France-Pillois Date: Thu, 15 Feb 2024 12:07:03 +0000 Subject: [PATCH 3/3] Change UR_L0_LEAKS_DEBUG to {l0_leak_check} --- sycl/test-e2e/Graph/Explicit/host_task2_multiple_roots.cpp | 4 ++-- sycl/test-e2e/Graph/Explicit/host_task_multiple_roots.cpp | 4 ++-- .../test-e2e/Graph/RecordReplay/host_task2_multiple_roots.cpp | 4 ++-- sycl/test-e2e/Graph/RecordReplay/host_task_multiple_roots.cpp | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/sycl/test-e2e/Graph/Explicit/host_task2_multiple_roots.cpp b/sycl/test-e2e/Graph/Explicit/host_task2_multiple_roots.cpp index 064a22e53bdf6..ce2d805de5664 100644 --- a/sycl/test-e2e/Graph/Explicit/host_task2_multiple_roots.cpp +++ b/sycl/test-e2e/Graph/Explicit/host_task2_multiple_roots.cpp @@ -1,9 +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 SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=0 UR_L0_LEAKS_DEBUG=1 %{run} %t.out 2>&1 | FileCheck %s --implicit-check-not=LEAK %} +// RUN: %if level_zero %{env SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=0 %{l0_leak_check} %{run} %t.out 2>&1 | FileCheck %s --implicit-check-not=LEAK %} // Extra run to check for immediate-command-list in Level Zero -// RUN: %if level_zero && linux %{env SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=1 UR_L0_LEAKS_DEBUG=1 %{run} %t.out 2>&1 | FileCheck %s --implicit-check-not=LEAK %} +// RUN: %if level_zero && linux %{env SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=1 %{l0_leak_check} %{run} %t.out 2>&1 | FileCheck %s --implicit-check-not=LEAK %} // #define GRAPH_E2E_EXPLICIT diff --git a/sycl/test-e2e/Graph/Explicit/host_task_multiple_roots.cpp b/sycl/test-e2e/Graph/Explicit/host_task_multiple_roots.cpp index 23f83366362d7..4750c5ff69201 100644 --- a/sycl/test-e2e/Graph/Explicit/host_task_multiple_roots.cpp +++ b/sycl/test-e2e/Graph/Explicit/host_task_multiple_roots.cpp @@ -1,9 +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 SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=0 UR_L0_LEAKS_DEBUG=1 %{run} %t.out 2>&1 | FileCheck %s --implicit-check-not=LEAK %} +// RUN: %if level_zero %{env SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=0 %{l0_leak_check} %{run} %t.out 2>&1 | FileCheck %s --implicit-check-not=LEAK %} // Extra run to check for immediate-command-list in Level Zero -// RUN: %if level_zero && linux %{env SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=1 UR_L0_LEAKS_DEBUG=1 %{run} %t.out 2>&1 | FileCheck %s --implicit-check-not=LEAK %} +// RUN: %if level_zero && linux %{env SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=1 %{l0_leak_check} %{run} %t.out 2>&1 | FileCheck %s --implicit-check-not=LEAK %} // #define GRAPH_E2E_EXPLICIT diff --git a/sycl/test-e2e/Graph/RecordReplay/host_task2_multiple_roots.cpp b/sycl/test-e2e/Graph/RecordReplay/host_task2_multiple_roots.cpp index 68712d26aa31d..09d51f36526bf 100644 --- a/sycl/test-e2e/Graph/RecordReplay/host_task2_multiple_roots.cpp +++ b/sycl/test-e2e/Graph/RecordReplay/host_task2_multiple_roots.cpp @@ -1,9 +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 SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=0 UR_L0_LEAKS_DEBUG=1 %{run} %t.out 2>&1 | FileCheck %s --implicit-check-not=LEAK %} +// RUN: %if level_zero %{env SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=0 %{l0_leak_check} %{run} %t.out 2>&1 | FileCheck %s --implicit-check-not=LEAK %} // Extra run to check for immediate-command-list in Level Zero -// RUN: %if level_zero && linux %{env SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=1 UR_L0_LEAKS_DEBUG=1 %{run} %t.out 2>&1 | FileCheck %s --implicit-check-not=LEAK %} +// RUN: %if level_zero && linux %{env SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=1 %{l0_leak_check} %{run} %t.out 2>&1 | FileCheck %s --implicit-check-not=LEAK %} // #define GRAPH_E2E_RECORD_REPLAY diff --git a/sycl/test-e2e/Graph/RecordReplay/host_task_multiple_roots.cpp b/sycl/test-e2e/Graph/RecordReplay/host_task_multiple_roots.cpp index 685b701272e8e..3bc9aaabb8681 100644 --- a/sycl/test-e2e/Graph/RecordReplay/host_task_multiple_roots.cpp +++ b/sycl/test-e2e/Graph/RecordReplay/host_task_multiple_roots.cpp @@ -1,9 +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 SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=0 UR_L0_LEAKS_DEBUG=1 %{run} %t.out 2>&1 | FileCheck %s --implicit-check-not=LEAK %} +// RUN: %if level_zero %{env SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=0 %{l0_leak_check} %{run} %t.out 2>&1 | FileCheck %s --implicit-check-not=LEAK %} // Extra run to check for immediate-command-list in Level Zero -// RUN: %if level_zero && linux %{env SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=1 UR_L0_LEAKS_DEBUG=1 %{run} %t.out 2>&1 | FileCheck %s --implicit-check-not=LEAK %} +// RUN: %if level_zero && linux %{env SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=1 %{l0_leak_check} %{run} %t.out 2>&1 | FileCheck %s --implicit-check-not=LEAK %} // #define GRAPH_E2E_RECORD_REPLAY