# Does tensorize support dynamic shapes?

**URL:** <https://discuss.tvm.apache.org/t/does-tensorize-support-dynamic-shapes/18607>\
**Category:** Questions\
**Created:** [September 11, 2025, 11:19am UTC](https://discuss.tvm.apache.org/t/does-tensorize-support-dynamic-shapes/18607 "2025-09-11T11:19:33Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![liubin](https://discuss.tvm.apache.org/letter_avatar_proxy/v4/letter/l/278dde/32.png) [@liubin](https://discuss.tvm.apache.org/u/liubin)\
**Post date:** [September 11, 2025, 11:19am UTC](https://discuss.tvm.apache.org/t/does-tensorize-support-dynamic-shapes/18607/1 "2025-09-11T11:19:33Z")

</div>

Does tensorize support dynamic shapes?

---

<div class="post-metadata">

**Author:** ![ysh329](https://discuss.tvm.apache.org/user_avatar/discuss.tvm.apache.org/ysh329/32/632_2.png) [@ysh329](https://discuss.tvm.apache.org/u/ysh329)\
**Post date:** [September 11, 2025, 11:20am UTC](https://discuss.tvm.apache.org/t/does-tensorize-support-dynamic-shapes/18607/2 "2025-09-11T11:20:11Z")

</div>



---

<div class="post-metadata">

**Author:** ![ysh329](https://discuss.tvm.apache.org/user_avatar/discuss.tvm.apache.org/ysh329/32/632_2.png) [@ysh329](https://discuss.tvm.apache.org/u/ysh329)\
**Post date:** [September 11, 2025, 11:20am UTC](https://discuss.tvm.apache.org/t/does-tensorize-support-dynamic-shapes/18607/3 "2025-09-11T11:20:14Z")

</div>



---

<div class="post-metadata">

**Author:** ![liubin](https://discuss.tvm.apache.org/letter_avatar_proxy/v4/letter/l/278dde/32.png) [@liubin](https://discuss.tvm.apache.org/u/liubin)\
**Post date:** [September 12, 2025, 5:34pm UTC](https://discuss.tvm.apache.org/t/does-tensorize-support-dynamic-shapes/18607/4 "2025-09-12T17:34:06Z")

</div>

I have a DSA-architecture NPU backend that supports vector addition computations of arbitrary sizes.

My current implementation performs loop transformations during the pass phase, converting the innermost loop into a fixed size of 32, then applying tensorize to the innermost loop. During codegen, this is replaced with a kernel function to perform vector addition with a vector length of 32.

However, the above approach has a problem: the innermost loop can only be tensorized with a fixed size of 32. If the input data shape is, for example, 1x33, it will not work properly.

Are there alternative approaches to solve this problem?

```auto
MAX_SIZE=32
@T.prim_func
def add(
    a:T.handle,b:T.handle,c:T.handle
) -> None:
    
A = T.match_buffer(a, (MAX_SIZE,), offset_factor=1)
    B = T.match_buffer(b, (MAX_SIZE,), offset_factor=1)
    C = T.match_buffer(c, (MAX_SIZE,), offset_factor=1)
    with T.block():
        T.reads(A[0:MAX_SIZE], B[0:MAX_SIZE])
        T.writes(C[0:MAX_SIZE])
        for i in T.serial(MAX_SIZE):
            with T.block():
                vi = T.axis.remap("S", [i])
                C[vi]=A[vi]+B[vi]
@T.prim_func
def add_impl(
    a:T.handle,b:T.handle,c:T.handle
) -> None:
    A = T.match_buffer(a, (MAX_SIZE,), offset_factor=1)
    B = T.match_buffer(b, (MAX_SIZE,), offset_factor=1)
    C = T.match_buffer(c, (MAX_SIZE,), offset_factor=1)
    with T.block():
        T.reads(A[0:MAX_SIZE], B[0:MAX_SIZE])
        T.writes(C[0:MAX_SIZE])

        T.call_packed(
            "add_mm",
            C.data, C.elem_offset,
            B.data, B.elem_offset,
            A.data, A.elem_offset,
            MAX_SIZE
        )

ADD_MM="add_mm"
TensorIntrin.register(ADD_MM, add, add_impl)

```
