Skip to content

Commit 13fd3c6

Browse files
authored
Enable fine-grained control over whether to enable air ping-pong buffering transformation passes (Xilinx#784)
1 parent 33df7ab commit 13fd3c6

File tree

3 files changed

+41
-20
lines changed

3 files changed

+41
-20
lines changed

python/air/backend/xrt.py

+7-1
Original file line numberDiff line numberDiff line change
@@ -48,18 +48,21 @@ def __init__(
4848
verbose=False,
4949
experimental_passes=False,
5050
omit_while_true_loop=False,
51+
omit_pingpong=False,
5152
):
5253
"""Constructor for XRTBackend
5354
5455
Args:
5556
verbose: verbose output
5657
experimental_passes: configure aircc to run additional experimental passes
57-
omit_while_true_loop: configure aircc to comit the while true loop it traditionally emits.
58+
omit_while_true_loop: configure aircc to omit the while true loop it traditionally emits.
59+
omit_pingpong: configure aircc to omit the generation of ping-pong buffering.
5860
"""
5961
super().__init__()
6062
self.verbose = verbose
6163
self.experimental_passes = experimental_passes
6264
self.omit_while_true_loop = omit_while_true_loop
65+
self.omit_pingpong = omit_pingpong
6366
self.currently_loaded = False
6467

6568
def __del__(self):
@@ -116,6 +119,9 @@ def compile(
116119
if self.omit_while_true_loop:
117120
aircc_options += ["--omit-while-true-loop"]
118121

122+
if self.omit_pingpong:
123+
aircc_options += ["--omit-ping-pong-transform"]
124+
119125
aircc.run(air_module, aircc_options)
120126

121127
return XRTCompileArtifact(xclbin, kernel, insts)

python/air/compiler/aircc/cl_arguments.py

+7
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,13 @@ def parse_args(args=None):
123123
action="store_true",
124124
help="By default, aircc may output a while(true) loop around per-core logic. If this option is specified, a while(true) loop will not be added.",
125125
)
126+
parser.add_argument(
127+
"--omit-ping-pong-transform",
128+
dest="omit_pingpong",
129+
default=False,
130+
action="store_true",
131+
help="Whether to run passes which generate ping-pong buffering patterns or not. This will only change the behavior for this program for npu devices",
132+
)
126133

127134
opts = parser.parse_args(args)
128135
return opts

python/air/compiler/aircc/main.py

+27-19
Original file line numberDiff line numberDiff line change
@@ -24,24 +24,32 @@
2424

2525
import aie.compiler.aiecc.main as aiecc
2626

27-
EXPERIMENTAL_PASSES = [
28-
"air-dependency",
29-
"air-dependency-schedule-opt",
30-
"air-specialize-dma-broadcast",
31-
"air-dma-to-channel",
32-
"canonicalize",
33-
"cse",
34-
"air-dependency-canonicalize",
35-
"canonicalize",
36-
"cse",
37-
"func.func(air-loop-fusion)",
38-
"air-label-scf-for-to-ping-pong",
39-
"air-ping-pong-transform{keep-memref-dealloc=true}",
40-
"air-isolate-async-dma-loop-nests",
41-
"air-linalg-to-func",
42-
"canonicalize",
43-
"cse",
44-
]
27+
28+
def get_experimental_passes(omit_pingpong=True):
29+
EXPERIMENTAL_PASSES = [
30+
"air-dependency",
31+
"air-dependency-schedule-opt",
32+
"air-specialize-dma-broadcast",
33+
"air-dma-to-channel",
34+
"canonicalize",
35+
"cse",
36+
"air-dependency-canonicalize",
37+
"canonicalize",
38+
"cse",
39+
"func.func(air-loop-fusion)",
40+
]
41+
if not omit_pingpong:
42+
EXPERIMENTAL_PASSES += [
43+
"air-label-scf-for-to-ping-pong",
44+
"air-ping-pong-transform{keep-memref-dealloc=true}",
45+
]
46+
EXPERIMENTAL_PASSES += [
47+
"air-isolate-async-dma-loop-nests",
48+
"air-linalg-to-func",
49+
"canonicalize",
50+
"cse",
51+
]
52+
return EXPERIMENTAL_PASSES
4553

4654

4755
def emit_wrapper(herd_name="segment", include_name="aie.inc"):
@@ -378,7 +386,7 @@ def run(mlir_module, args=None):
378386
"func.func(air-lower-herd-parallel)",
379387
]
380388
+ (
381-
EXPERIMENTAL_PASSES
389+
get_experimental_passes(opts.omit_pingpong)
382390
if "npu" in opts.device and opts.experimental_passes
383391
else []
384392
)

0 commit comments

Comments
 (0)