Files
tilelang/testing/python/layout/test_tilelang_layout_inference.py
T
Lei Wang 27fc7eea36 [Transform] Validate fragment write owner compatibility (#2343)
* Stabilize parallel layout inference order

* Validate fragment write owner compatibility
2026-06-06 00:31:44 +08:00

65 lines
2.1 KiB
Python

import tilelang
import tilelang.testing
import pytest
from tilelang import language as T
@tilelang.jit
def _tilelang_issue_layout_free_inference_choose_smallest_replication():
@T.prim_func
def main(A: T.Tensor((128, 4), T.float), B: T.Tensor((128, 4), T.float)):
with T.Kernel(1, threads=128) as _:
A_frag = T.alloc_fragment((128, 4), T.float)
B_frag = T.alloc_fragment((128, 4), T.float)
S_frag = T.alloc_fragment((4,), T.float)
T.annotate_layout(
{
A_frag: T.Fragment(A_frag.shape, lambda i, j: (i, j)),
}
)
for i, j in T.Parallel(128, 4):
A_frag[i, j] = S_frag[j]
for i, j in T.Parallel(128, 4):
B_frag[i, j] = S_frag[j]
return main
def test_tilelang_issue_layout_free_inference_choose_smallest_replication():
kernel = _tilelang_issue_layout_free_inference_choose_smallest_replication()
source = kernel.get_kernel_source()
assert "float S_frag[4];" in source, "S_frag is not in the source"
assert "float B_frag[4];" in source, "B_frag is not in the source"
assert "float A_frag[4];" in source, "A_frag is not in the source"
@tilelang.jit
def _invalid_fragment_write_owner_layout():
def token_loop_layout_fn(i, j, rep):
return i * 4 + rep % 4 + (rep // 4) * 32, j
def scalar_buffer_layout_fn(i, j, rep):
return i * 4 + j + rep * 32, 0
loop_layout = T.Fragment((8, 4), forward_fn=token_loop_layout_fn, replicate=8)
buffer_layout = T.Fragment((8, 4), forward_fn=scalar_buffer_layout_fn, replicate=2)
@T.prim_func
def main():
with T.Kernel(1, threads=64):
frag = T.alloc_fragment((8, 4), T.float32)
T.annotate_layout({frag: buffer_layout})
for i, j in T.Parallel(8, 4, loop_layout=loop_layout):
frag[i, j] = T.float32(1.0)
return main
def test_reject_fragment_write_from_non_owner_threads():
with pytest.raises(Exception, match="Layout infer conflict"):
_invalid_fragment_write_owner_layout()
if __name__ == "__main__":
tilelang.testing.main()