()
| 723 | |
| 724 | |
| 725 | def test_nested_diamond(): |
| 726 | @tvm.script.ir_module |
| 727 | class DiamondInDiamond: |
| 728 | @R.function |
| 729 | def main(x: R.Tensor((32, 32), "float32"), w: R.Tensor((32, 32), "float32")) -> R.Tensor: |
| 730 | with R.dataflow(): |
| 731 | # matmul0 matmul1 |
| 732 | # / \ / \ |
| 733 | # sigmoid2 add4 sigmoid3 |
| 734 | # \ / \ / |
| 735 | # add5 add6 |
| 736 | # \ / |
| 737 | # add7 |
| 738 | lv0 = R.call_dps_packed( |
| 739 | "extern_matmul", (x, w), R.Tensor((32, 32), dtype="float32") |
| 740 | ) |
| 741 | lv1 = R.call_dps_packed( |
| 742 | "extern_matmul", (x, w), R.Tensor((32, 32), dtype="float32") |
| 743 | ) |
| 744 | lv2 = R.call_dps_packed( |
| 745 | "extern_sigmoid", (lv0), R.Tensor((32, 32), dtype="float32") |
| 746 | ) |
| 747 | lv3 = R.call_dps_packed( |
| 748 | "extern_sigmoid", (lv1), R.Tensor((32, 32), dtype="float32") |
| 749 | ) |
| 750 | lv4 = R.call_dps_packed( |
| 751 | "extern_add", (lv0, lv1), R.Tensor((32, 32), dtype="float32") |
| 752 | ) |
| 753 | lv5 = R.call_dps_packed( |
| 754 | "extern_add", (lv2, lv4), R.Tensor((32, 32), dtype="float32") |
| 755 | ) |
| 756 | lv6 = R.call_dps_packed( |
| 757 | "extern_add", (lv3, lv4), R.Tensor((32, 32), dtype="float32") |
| 758 | ) |
| 759 | lv7 = R.call_dps_packed( |
| 760 | "extern_add", (lv5, lv6), R.Tensor((32, 32), dtype="float32") |
| 761 | ) |
| 762 | R.output(lv7) |
| 763 | return lv7 |
| 764 | |
| 765 | # match matmul0 diamond |
| 766 | with PatternContext() as ctx: |
| 767 | sigmoid2 = is_call_dps_packed("extern_sigmoid") |
| 768 | add4 = is_call_dps_packed("extern_add") |
| 769 | is_call_dps_packed("extern_matmul").fork_to(sigmoid2, add4) |
| 770 | add5 = is_call_dps_packed("extern_add") |
| 771 | sigmoid2 >> add5 |
| 772 | add4 ^ add5 |
| 773 | assert ctx.match_dfb(DiamondInDiamond["main"].body.blocks[0]) |
| 774 | |
| 775 | # counter case: mis-match matmul0 diamond |
| 776 | with PatternContext() as ctx: |
| 777 | sigmoid2 = is_call_dps_packed("extern_sigmoid") |
| 778 | add4 = is_call_dps_packed("extern_add") |
| 779 | is_call_dps_packed("extern_matmul").fork_to(sigmoid2, add4) |
| 780 | add5 = is_call_dps_packed("extern_add") |
| 781 | sigmoid2 >> add5 |
| 782 | add4 >> add5 # not only-used-by relation |
nothing calls this directly
no test coverage detected
searching dependent graphs…