Hey @srush,

Thanks for your valuable feedback! Please allow me to try to explain the design 
rationale below:

> **Q1.** There are strings for get_block?

Yeah. One design principle we hold for TensorIR is that all needed for 
scheduling is contained in the TensorIR python syntax, so that there is no 
"mysteriously hidden" information any more. Given a TensorIR script in python, 
we can schedule on it.

In the particular case, the string here is the name of the block in the text 
format.

Here is the example:

```python
@tvm.script.tir
def matmul(x: ty.handle, y: ty.handle, z: ty.handle) -> None:
    X = tir.match_buffer(x, [128, 128], "float32")
    Y = tir.match_buffer(y, [128, 128], "float32")
    Z = tir.match_buffer(z, [128, 128], "float32")
    # ⬇️  name of the block is "Z"
    with tir.block([128, 128, tir.reduce_axis(0, 128)], "Z") as [i, j, k]:
        with tir.init():
            Z[i, j] = tir.float32(0)
        Z[i, j] = Z[i, j] + (X[i, k] * Y[k, j])

"""Print TensorIR in python syntax"""
print(tvm.script.asscript(matmul))
"""
Create a schedule
  Scehdule is TensorIR => TensorIR
  so we can print the latest TensorIR at any step of scheduling
"""
sch = tvm.tir.create_schedule(matmul)
ax0, ax1 = sch.split(...)
"""Print TensorIR at any step"""
print(tvm.script.asscript(sch.func))
sch.fuse(...)
print(tvm.script.asscript(sch.func))
"""
We can print the loops and blocks too into syntax like:
     for i in range(0, 100)
"""
print(ax0)
```

> **Q2.** Why not have split go into a named out/in tuple to discourage this _ 
> style naming. It gets so messy so quickly

Agreed. We do find the _ style naming annoying in our experiments, especially 
when scheduling gets complicated and it generates really horrible names like 
`i0_outer_outer_outer_outer_i1_outer_outer_outer_outer_fused_i2_outer_outer_outer_outer_fused_i3_outer_outer_outer_outer_fused`.

We have some internal strawman proposals for syntactic sugars, but converged to 
a perfect solution yet.

**Solution 1.** Allow splitting by multiple factors + accept customized naming 
of axes.

```python
a, b, c, d = s.split(axes, factors=[None, 2, 4, 8], names=["a", "b", "c", "d"])
```

Note that the `None` in the factors means letting the schedule to infer.

**Solution 2.** Allow splitting by multiple factors + einsum-like style API + 
get axes by name

```python
i0, _, _, _ = s.split("i => i0, i1, i2, i3", factors=[None, 2, 4, 8])
# or allow retrieve by name
i0 = s.get_axis(name="i0")
```

We are open to new proposals too :slight_smile:

> **Q3.** Does this propose to fix the issue of having to repeat the identical 
> splits for things like shared and local buffers that need to be done later in 
> the code. (In order for compute at to work)

In short, yes, and it is solved by introducing a new scheduling primitive 
`reverse_compute_at`.

**Definition of `compute_at`.** Given a producer and a consumer, `compute_at` 
allows to compute part of the producer's region under one of the consumer's 
loop.

**Definition of `reverse_compute_at`.** Given a producer and a consumer, 
`reverse_compute_at` allows to compute part of the consumer's region under one 
of the producer's loop.

**Our typical usecase.** We have a heavy producer, like conv2d, and a light 
consumer, like what is generated by `cache_write`, or a small ReLU, and we want 
to fuse them for better locality.

**Why bother duplicated splitting in `compute_at`.** With `compute_at`, we are 
moving the producer under a loop of the consumer. First, user has to split the 
consumer, otherwise the user doesn't even know which axis to be computed at; 
Second, user has to split the producer so that the other tiles are correctly 
positions - that is why it is so lengthy and tedious.

**Why `reverse_compute_at` avoids duplicated splitting.** In this case, we only 
need to split the producer, then put the consumer under a specific loop of the 
producer. Then we don't have to do any duplicate splitting :-)

CC: @tqchen @Hzfengsy @spectrometerHBH @vinx13 @masahi





---
[Visit 
Topic](https://discuss.tvm.apache.org/t/rfc-tensorir-a-schedulable-ir-for-tvm/7872/44)
 to respond.

You are receiving this because you enabled mailing list mode.

To unsubscribe from these emails, [click 
here](https://discuss.tvm.apache.org/email/unsubscribe/2462cba174a272d5f70b53b64c084f41a5043bc4f07a0ffce9ee23ede404aa27).

Reply via email to