@@ -1500,6 +1500,170 @@ TEST_F(CommandGraphTest, EnqueueMultipleBarrier) {
1500
1500
}
1501
1501
}
1502
1502
1503
+ TEST_F (CommandGraphTest, DependencyLeavesKeyword1) {
1504
+ auto Node1Graph = Graph.add (
1505
+ [&](sycl::handler &cgh) { cgh.single_task <TestKernel<>>([]() {}); });
1506
+ auto Node2Graph = Graph.add (
1507
+ [&](sycl::handler &cgh) { cgh.single_task <TestKernel<>>([]() {}); });
1508
+ auto Node3Graph = Graph.add (
1509
+ [&](sycl::handler &cgh) { cgh.single_task <TestKernel<>>([]() {}); });
1510
+
1511
+ auto EmptyNode =
1512
+ Graph.add ([&](sycl::handler &cgh) { /* empty node */ },
1513
+ {experimental::property::node::depends_on_all_leaves ()});
1514
+
1515
+ auto GraphImpl = sycl::detail::getSyclObjImpl (Graph);
1516
+
1517
+ // Check the graph structure
1518
+ // (1) (2) (3)
1519
+ // \ | /
1520
+ // \ | /
1521
+ // (E)
1522
+ ASSERT_EQ (GraphImpl->MRoots .size (), 3lu);
1523
+ auto EmptyImpl = sycl::detail::getSyclObjImpl (EmptyNode);
1524
+ ASSERT_EQ (EmptyImpl->MPredecessors .size (), 3lu);
1525
+ ASSERT_EQ (EmptyImpl->MSuccessors .size (), 0lu);
1526
+
1527
+ auto Node1Impl = sycl::detail::getSyclObjImpl (Node1Graph);
1528
+ ASSERT_EQ (Node1Impl->MSuccessors .size (), 1lu);
1529
+ ASSERT_EQ (Node1Impl->MSuccessors [0 ].lock (), EmptyImpl);
1530
+ auto Node2Impl = sycl::detail::getSyclObjImpl (Node2Graph);
1531
+ ASSERT_EQ (Node2Impl->MSuccessors .size (), 1lu);
1532
+ ASSERT_EQ (Node2Impl->MSuccessors [0 ].lock (), EmptyImpl);
1533
+ auto Node3Impl = sycl::detail::getSyclObjImpl (Node3Graph);
1534
+ ASSERT_EQ (Node3Impl->MSuccessors .size (), 1lu);
1535
+ ASSERT_EQ (Node3Impl->MSuccessors [0 ].lock (), EmptyImpl);
1536
+ }
1537
+
1538
+ TEST_F (CommandGraphTest, DependencyLeavesKeyword2) {
1539
+ auto Node1Graph = Graph.add (
1540
+ [&](sycl::handler &cgh) { cgh.single_task <TestKernel<>>([]() {}); });
1541
+ auto Node2Graph = Graph.add (
1542
+ [&](sycl::handler &cgh) { cgh.single_task <TestKernel<>>([]() {}); });
1543
+ auto Node3Graph = Graph.add (
1544
+ [&](sycl::handler &cgh) { cgh.single_task <TestKernel<>>([]() {}); });
1545
+ auto Node4Graph = Graph.add (
1546
+ [&](sycl::handler &cgh) { cgh.single_task <TestKernel<>>([]() {}); },
1547
+ {experimental::property::node::depends_on (Node3Graph)});
1548
+
1549
+ auto EmptyNode =
1550
+ Graph.add ([&](sycl::handler &cgh) { /* empty node */ },
1551
+ {experimental::property::node::depends_on_all_leaves ()});
1552
+
1553
+ auto GraphImpl = sycl::detail::getSyclObjImpl (Graph);
1554
+
1555
+ // Check the graph structure
1556
+ // (1) (2) (3)
1557
+ // \ | /
1558
+ // \ | (4)
1559
+ // \| /
1560
+ // (E)
1561
+ ASSERT_EQ (GraphImpl->MRoots .size (), 3lu);
1562
+ auto EmptyImpl = sycl::detail::getSyclObjImpl (EmptyNode);
1563
+ ASSERT_EQ (EmptyImpl->MPredecessors .size (), 3lu);
1564
+ ASSERT_EQ (EmptyImpl->MSuccessors .size (), 0lu);
1565
+
1566
+ auto Node1Impl = sycl::detail::getSyclObjImpl (Node1Graph);
1567
+ ASSERT_EQ (Node1Impl->MSuccessors .size (), 1lu);
1568
+ ASSERT_EQ (Node1Impl->MSuccessors [0 ].lock (), EmptyImpl);
1569
+ auto Node2Impl = sycl::detail::getSyclObjImpl (Node2Graph);
1570
+ ASSERT_EQ (Node2Impl->MSuccessors .size (), 1lu);
1571
+ ASSERT_EQ (Node2Impl->MSuccessors [0 ].lock (), EmptyImpl);
1572
+ auto Node3Impl = sycl::detail::getSyclObjImpl (Node3Graph);
1573
+ ASSERT_EQ (Node3Impl->MSuccessors .size (), 1lu);
1574
+
1575
+ auto Node4Impl = sycl::detail::getSyclObjImpl (Node4Graph);
1576
+ ASSERT_EQ (Node4Impl->MPredecessors .size (), 1lu);
1577
+ ASSERT_EQ (Node4Impl->MSuccessors .size (), 1lu);
1578
+ ASSERT_EQ (Node4Impl->MSuccessors [0 ].lock (), EmptyImpl);
1579
+ }
1580
+
1581
+ TEST_F (CommandGraphTest, DependencyLeavesKeyword3) {
1582
+ auto Node1Graph = Graph.add (
1583
+ [&](sycl::handler &cgh) { cgh.single_task <TestKernel<>>([]() {}); });
1584
+ auto Node2Graph = Graph.add (
1585
+ [&](sycl::handler &cgh) { cgh.single_task <TestKernel<>>([]() {}); });
1586
+ auto EmptyNode =
1587
+ Graph.add ([&](sycl::handler &cgh) { /* empty node */ },
1588
+ {experimental::property::node::depends_on_all_leaves ()});
1589
+ auto Node3Graph = Graph.add (
1590
+ [&](sycl::handler &cgh) { cgh.single_task <TestKernel<>>([]() {}); },
1591
+ {experimental::property::node::depends_on (Node1Graph)});
1592
+ auto Node4Graph = Graph.add (
1593
+ [&](sycl::handler &cgh) { cgh.single_task <TestKernel<>>([]() {}); },
1594
+ {experimental::property::node::depends_on (EmptyNode)});
1595
+
1596
+ auto GraphImpl = sycl::detail::getSyclObjImpl (Graph);
1597
+
1598
+ // Check the graph structure
1599
+ // (1)(2)
1600
+ // |\ |
1601
+ // | (E)
1602
+ // (3) |
1603
+ // (4)
1604
+ ASSERT_EQ (GraphImpl->MRoots .size (), 2lu);
1605
+ auto EmptyImpl = sycl::detail::getSyclObjImpl (EmptyNode);
1606
+ ASSERT_EQ (EmptyImpl->MPredecessors .size (), 2lu);
1607
+ ASSERT_EQ (EmptyImpl->MSuccessors .size (), 1lu);
1608
+
1609
+ auto Node1Impl = sycl::detail::getSyclObjImpl (Node1Graph);
1610
+ auto Node2Impl = sycl::detail::getSyclObjImpl (Node2Graph);
1611
+ ASSERT_EQ (Node1Impl->MSuccessors .size (), 2lu);
1612
+ ASSERT_EQ (Node2Impl->MSuccessors .size (), 1lu);
1613
+ ASSERT_EQ (Node2Impl->MSuccessors [0 ].lock (), EmptyImpl);
1614
+
1615
+ auto Node3Impl = sycl::detail::getSyclObjImpl (Node3Graph);
1616
+ ASSERT_EQ (Node3Impl->MPredecessors .size (), 1lu);
1617
+ ASSERT_EQ (Node3Impl->MPredecessors [0 ].lock (), Node1Impl);
1618
+
1619
+ auto Node4Impl = sycl::detail::getSyclObjImpl (Node4Graph);
1620
+ ASSERT_EQ (Node4Impl->MPredecessors .size (), 1lu);
1621
+ ASSERT_EQ (Node4Impl->MPredecessors [0 ].lock (), EmptyImpl);
1622
+ }
1623
+
1624
+ TEST_F (CommandGraphTest, DependencyLeavesKeyword4) {
1625
+ auto Node1Graph = Graph.add (
1626
+ [&](sycl::handler &cgh) { cgh.single_task <TestKernel<>>([]() {}); });
1627
+ auto Node2Graph = Graph.add (
1628
+ [&](sycl::handler &cgh) { cgh.single_task <TestKernel<>>([]() {}); });
1629
+ auto EmptyNode =
1630
+ Graph.add ([&](sycl::handler &cgh) { /* empty node */ },
1631
+ {experimental::property::node::depends_on_all_leaves ()});
1632
+ auto Node3Graph = Graph.add (
1633
+ [&](sycl::handler &cgh) { cgh.single_task <TestKernel<>>([]() {}); });
1634
+ auto EmptyNode2 =
1635
+ Graph.add ([&](sycl::handler &cgh) { /* empty node */ },
1636
+ {experimental::property::node::depends_on_all_leaves ()});
1637
+
1638
+ auto GraphImpl = sycl::detail::getSyclObjImpl (Graph);
1639
+
1640
+ // Check the graph structure
1641
+ // (1)(2)
1642
+ // \/
1643
+ // (E1) (3)
1644
+ // \ /
1645
+ // (E2)
1646
+ ASSERT_EQ (GraphImpl->MRoots .size (), 3lu);
1647
+ auto EmptyImpl = sycl::detail::getSyclObjImpl (EmptyNode);
1648
+ ASSERT_EQ (EmptyImpl->MPredecessors .size (), 2lu);
1649
+ ASSERT_EQ (EmptyImpl->MSuccessors .size (), 1lu);
1650
+
1651
+ auto Node1Impl = sycl::detail::getSyclObjImpl (Node1Graph);
1652
+ ASSERT_EQ (Node1Impl->MSuccessors .size (), 1lu);
1653
+ ASSERT_EQ (Node1Impl->MSuccessors [0 ].lock (), EmptyImpl);
1654
+ auto Node2Impl = sycl::detail::getSyclObjImpl (Node2Graph);
1655
+ ASSERT_EQ (Node2Impl->MSuccessors .size (), 1lu);
1656
+ ASSERT_EQ (Node2Impl->MSuccessors [0 ].lock (), EmptyImpl);
1657
+
1658
+ auto EmptyImpl2 = sycl::detail::getSyclObjImpl (EmptyNode2);
1659
+ auto Node3Impl = sycl::detail::getSyclObjImpl (Node3Graph);
1660
+ ASSERT_EQ (Node3Impl->MPredecessors .size (), 0lu);
1661
+ ASSERT_EQ (Node3Impl->MSuccessors .size (), 1lu);
1662
+ ASSERT_EQ (Node3Impl->MSuccessors [0 ].lock (), EmptyImpl2);
1663
+
1664
+ ASSERT_EQ (EmptyImpl2->MPredecessors .size (), 2lu);
1665
+ }
1666
+
1503
1667
TEST_F (CommandGraphTest, FusionExtensionExceptionCheck) {
1504
1668
queue Q{ext::codeplay::experimental::property::queue::enable_fusion{}};
1505
1669
0 commit comments