From 988a0e1aa99fb368ec1cec229118cb3b6543603c Mon Sep 17 00:00:00 2001 From: learning-chip Date: Wed, 29 Apr 2026 16:37:30 +0000 Subject: [PATCH 01/17] update dependency for new FA style --- .github/workflows/ci.yml | 8 ++++---- docker/Dockerfile | 12 +++++++----- docker/README.md | 6 +++--- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7d578d8b..a4b5a6fb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -47,10 +47,10 @@ jobs: env: RELEASE_REPO: hw-native-sys/PTOAS - RELEASE_VER: 0.31 - RELEASE_TAG: v0.31 + RELEASE_VER: 0.35 + RELEASE_TAG: v0.35 CLI_DIR: /installers/ptoas-cli - PTOISA_COMMIT: 0af942568a4f2868673da0a35b0f5b64f27a20d5 + PTOISA_COMMIT: 4d466a8e3cfa363281eb5e67449575eade5bf366 steps: - name: Install system packages @@ -84,7 +84,7 @@ jobs: - name: Clone pto-isa headers run: | - git clone https://gitcode.com/cann/pto-isa.git /sources/pto-isa + git clone -b feature_subtile https://gitcode.com/csjlchen/pto-isa cd /sources/pto-isa && git checkout ${PTOISA_COMMIT} - name: Install ptodsl (${{ matrix.install-mode }}) diff --git a/docker/Dockerfile b/docker/Dockerfile index 4af438bb..a6dcce17 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -15,11 +15,11 @@ RUN pip install --no-cache-dir \ pytest pybind11 nanobind setuptools wheel \ ipython jupyterlab matplotlib pandas -# certain operations need latest isa header, not CANN 8.5.0 default -# header on 2026/04/24 -ARG PTOISA_COMMIT=0af942568a4f2868673da0a35b0f5b64f27a20d5 +# For modified FA style +# https://gitcode.com/csjlchen/pto-isa/commit/4d466a8e3cfa363281eb5e67449575eade5bf366?ref=feature_subtile +ARG PTOISA_COMMIT=4d466a8e3cfa363281eb5e67449575eade5bf366 WORKDIR /sources -RUN git clone https://gitcode.com/cann/pto-isa.git \ +RUN git clone -b feature_subtile https://gitcode.com/csjlchen/pto-isa \ && cd pto-isa && git checkout $PTOISA_COMMIT # cache above layers unrelated to ptoas version change @@ -29,8 +29,10 @@ ARG CACHE_BURST=1 # ARG ARCH=x86_64 ARG ARCH=aarch64 +# https://github.com/hw-native-sys/PTOAS/releases/tag/v0.35 +# include the split pipes https://github.com/hw-native-sys/PTOAS/pull/606 ARG RELEASE_REPO=hw-native-sys/PTOAS -ARG RELEASE_VER=0.31 +ARG RELEASE_VER=0.35 ARG RELEASE_TAG=v${RELEASE_VER} ARG WHEEL_NAME=ptoas-${RELEASE_VER}-cp311-none-manylinux_2_34_${ARCH}.whl ARG CLI_TAR_NAME=ptoas-bin-${ARCH}.tar.gz diff --git a/docker/README.md b/docker/README.md index 8deb808a..99fd6dfb 100644 --- a/docker/README.md +++ b/docker/README.md @@ -3,10 +3,10 @@ Recommend using [Ascend Docker Runtime](https://gitcode.com/Ascend/mind-cluster/ Then, build and run docker image: ```bash -RELEASE_VER=0.29 +RELEASE_VER=0.35 sudo docker build \ --build-arg RELEASE_VER=$RELEASE_VER \ - . -t pto_dsl:$RELEASE_VER + . -t pto_dsl:fa_hack # for specific arch (x86_64 vs aarch64) sudo docker build \ @@ -30,7 +30,7 @@ sudo docker run --rm -it --ipc=host --privileged \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver:ro \ -v /etc/ascend_install.info:/etc/ascend_install.info:ro \ -v $HOME:/mounted_home -w /mounted_home \ - pto_dsl:$RELEASE_VER /bin/bash + pto_dsl:fa_hack /bin/bash ``` ## Appendix: NPU driver From f50aa64dd63cd853ee1c8060bbd054cefa2bcca5 Mon Sep 17 00:00:00 2001 From: Jay Zhuang <80731350+learning-chip@users.noreply.github.com> Date: Wed, 29 Apr 2026 18:46:49 +0200 Subject: [PATCH 02/17] fix clone directory --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a4b5a6fb..8cdb6791 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -84,7 +84,7 @@ jobs: - name: Clone pto-isa headers run: | - git clone -b feature_subtile https://gitcode.com/csjlchen/pto-isa + git clone -b feature_subtile https://gitcode.com/csjlchen/pto-isa.git /sources/pto-isa cd /sources/pto-isa && git checkout ${PTOISA_COMMIT} - name: Install ptodsl (${{ matrix.install-mode }}) From 51384f2e923c00fafd82e78534defcc1e3e22385 Mon Sep 17 00:00:00 2001 From: learning-chip Date: Wed, 29 Apr 2026 18:23:35 +0000 Subject: [PATCH 03/17] use clear case name for plot --- .../aot/flash_attention/cpp_ref/simplified/run.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/examples/aot/flash_attention/cpp_ref/simplified/run.py b/examples/aot/flash_attention/cpp_ref/simplified/run.py index 376fc457..4e667980 100644 --- a/examples/aot/flash_attention/cpp_ref/simplified/run.py +++ b/examples/aot/flash_attention/cpp_ref/simplified/run.py @@ -156,7 +156,7 @@ def test_flash(tile_s1: int = 256, head: int = 128): print(f"Tile S1 : {tile_s1}") print(f"FLOPs total : {flops_total}") print( - f"JIT flash kernel : {flash_ms:.3f} ms/iter " + f"PTO custom FlashAttention : {flash_ms:.3f} ms/iter " f"({tflops(flops_total, flash_ms):.3f} TFLOP/s)" ) print( @@ -164,20 +164,20 @@ def test_flash(tile_s1: int = 256, head: int = 128): f"({tflops(flops_total, npu_ms):.3f} TFLOP/s)" ) print( - f"torch reference : {ref_ms:.3f} ms/iter " + f"PyTorch Eager Reference : {ref_ms:.3f} ms/iter " f"({tflops(flops_total, ref_ms):.3f} TFLOP/s)" ) torch.testing.assert_close(o_out, o_ref, rtol=1e-3, atol=1e-3) print("vs torch reference: PASSED") torch.testing.assert_close(o_out, o_npu, rtol=1e-3, atol=1e-3) - print("vs npu_fused_attention: PASSED") + print("vs npu_fused_infer_attention_score: PASSED") print("") plot_path = Path(__file__).with_name("fa_compile_and_run_s1_plot.png") plt.figure(figsize=(8, 5)) - plt.plot(s1_values, flash_tflops_values, marker="o", label="flash") - plt.plot(s1_values, ref_tflops_values, marker="o", label="ref") - plt.plot(s1_values, npu_tflops_values, marker="o", label="torch_npu") + plt.plot(s1_values, flash_tflops_values, marker="o", label="PTO custom FlashAttention") + plt.plot(s1_values, ref_tflops_values, marker="o", label="PyTorch Eager Reference") + plt.plot(s1_values, npu_tflops_values, marker="o", label="torch_npu.npu_fused_infer_attention_score") plt.xscale("log", base=2) plt.xticks(s1_values, [str(v) for v in s1_values]) plt.xlabel("S1") @@ -195,7 +195,7 @@ def test_flash(tile_s1: int = 256, head: int = 128): if __name__ == "__main__": parser = argparse.ArgumentParser() - parser.add_argument("--tile-s1", type=int, choices=(256, 512, 1024), default=256) + parser.add_argument("--tile-s1", type=int, choices=(256, 512, 1024), default=512) parser.add_argument("--head", type=int, choices=(32, 64, 128), default=128) args = parser.parse_args() test_flash(tile_s1=args.tile_s1, head=args.head) From 243e57a18592444c99a5c430c6ca403da6313fd9 Mon Sep 17 00:00:00 2001 From: learning-chip Date: Wed, 29 Apr 2026 19:30:57 +0000 Subject: [PATCH 04/17] port new C++ ref to standalone jit launch --- docker/Dockerfile | 2 + .../simplified/fa_compile_and_run_s1_plot.png | Bin 0 -> 97477 bytes .../split_pipe/call_kernel_dispatch.cpp | 43 ++++ .../split_pipe/fa_split_pipe_s1_plot.png | Bin 0 -> 106494 bytes .../cpp_ref/split_pipe/generated_cases.h | 71 ++++++ .../cpp_ref/split_pipe/jit_util_flash.py | 222 ++++++++++++++++++ .../flash_attention/cpp_ref/split_pipe/run.py | 207 ++++++++++++++++ 7 files changed, 545 insertions(+) create mode 100644 examples/aot/flash_attention/cpp_ref/simplified/fa_compile_and_run_s1_plot.png create mode 100644 examples/aot/flash_attention/cpp_ref/split_pipe/call_kernel_dispatch.cpp create mode 100644 examples/aot/flash_attention/cpp_ref/split_pipe/fa_split_pipe_s1_plot.png create mode 100644 examples/aot/flash_attention/cpp_ref/split_pipe/generated_cases.h create mode 100644 examples/aot/flash_attention/cpp_ref/split_pipe/jit_util_flash.py create mode 100644 examples/aot/flash_attention/cpp_ref/split_pipe/run.py diff --git a/docker/Dockerfile b/docker/Dockerfile index a6dcce17..9076a9ce 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -22,6 +22,8 @@ WORKDIR /sources RUN git clone -b feature_subtile https://gitcode.com/csjlchen/pto-isa \ && cd pto-isa && git checkout $PTOISA_COMMIT +ENV PTO_LIB_PATH=/sources/pto-isa + # cache above layers unrelated to ptoas version change # change this ununsed arg if need to force rebuild later lines diff --git a/examples/aot/flash_attention/cpp_ref/simplified/fa_compile_and_run_s1_plot.png b/examples/aot/flash_attention/cpp_ref/simplified/fa_compile_and_run_s1_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..c79dc0efdee059209c04b5c98561d9293618fff1 GIT binary patch literal 97477 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

Fo{pm{rbn99iODX;@<#L#m|0Qx*fSI8gDEc>x) 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 +#include +#include + +#include "fa_performance_kernel.h" +#include "generated_cases.h" +#include "runtime/rt.h" + +extern "C" void call_kernel(void *stream, int headSize, int s0, int s1, int tile_s1, bool is_causal, uint8_t *q, + uint8_t *k, uint8_t *v, uint8_t *o_out, float *qk_tile_fifo, uint16_t *p_tile_fifo, + float *exp_max_ififo, float *pv_tile_fifo, float *global_sum_out, float *exp_max_out, + float *o_parts_out) +{ + if (is_causal) { + return; + } + + uint64_t ffts_val = 0; + uint32_t ffts_len = 0; + rtGetC2cCtrlAddr(&ffts_val, &ffts_len); + auto *ffts = reinterpret_cast(static_cast(ffts_val)); + + uint8_t *cv_comm_buf = nullptr; + +#define LAUNCH_DISPATCH(S0_, HEAD_, S1_, CUBE_S0_, CUBE_S1_, TILE_S1_, QK_PRELOAD_, CAUSAL_MASK_) \ + if (headSize == (HEAD_) && (s0) == (S0_) && (s1) == (S1_) && tile_s1 == (TILE_S1_)) { \ + LaunchTFA<(S0_), (HEAD_), (S1_), (CUBE_S0_), (CUBE_S1_), (TILE_S1_), (QK_PRELOAD_), kFaCvFifoSize, false, \ + (CAUSAL_MASK_), kFaCvFifoConsSyncPeriod>( \ + ffts, reinterpret_cast(q), reinterpret_cast(k), \ + reinterpret_cast(v), reinterpret_cast(p_tile_fifo), exp_max_ififo, \ + global_sum_out, exp_max_out, reinterpret_cast(o_out), o_parts_out, qk_tile_fifo, pv_tile_fifo, \ + reinterpret_cast(stream), cv_comm_buf); \ + return; \ + } + + TFA_FOR_EACH_CASE(LAUNCH_DISPATCH); + +#undef LAUNCH_DISPATCH +} diff --git a/examples/aot/flash_attention/cpp_ref/split_pipe/fa_split_pipe_s1_plot.png b/examples/aot/flash_attention/cpp_ref/split_pipe/fa_split_pipe_s1_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..f2d8ffb9a92bfb5e0a5fb804cbafb0d1525b3814 GIT binary patch literal 106494 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%0Am?M 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%0Deqpq`oq?<_$HCs;O=@80HQhJ5(B?(}ec`hB z!^Kz_Ea|wcL3RH8Gr&(Lv9Q$E6O3n3O9J`L0W((%i|YWjPC?_V*ay>J4HQqQ6dsKnZEllB?X!As2c{jHnz6sh>3k61Ni#Q8$B>mke06liZj>az(tYm z(i}gS_G@U%Jg7E-bT=*J{>g)}p+$kjty>sC9V%yO1^^x3W+x5oj9TbVw69D;0s_$N ziS6}Fz%*uz-+-+0i?%2|4YC^1DvyJNpGH>eGx894;sX1xTIP`1RZ=!_Se~?Ly{R?} z2n^-;u)J%$pa)!{i)WHECOb#NA%kZ7} z0RO>gVjAF)Q8o|G4RC0=FiyDx=k)km2;|NoB=H5W)7jNE3OD8sh_4Xc{sLoFI8gOD z{lHWzsi^2rd<~!J$)<)~fsBL|^mPQ#R@cxl2G5^IwyNu95f~EE0B7Ueg$q6}U!F%J z|4#2^lv0F%+n7WaL78z#iD3Y$zk-R0$?mc51W$&-p5)|Ybc(!-i;LgZpd&+wN7h9V zB9zDm<*d;pBbsD za)RU#>$hTxzBPV?rINM4cjSSiNQ0$azxvqNSO(Ryk#t|XGJz; zb7`q{FfSSXcr+i5{sI`FT?8|OALuYQEyHH$!3{>KN=Opm0;P72l$61u>cAn_aalX? zAUK{k#KQwfrU0O6U!a)~7#BafxX221adprcgsC-N#4_LA##38iuV7m38YG^efvYGG z40zx|fb^+jEgsb4ZuKD?%Pbx~52K_noWMRq2(sY@I230M98NZBzFqC`dx1&aV3c$qkY!&M-ql8?GWNQ5-FJajCIXEKcQN05oA<)9U08(5Pn&v2@nhsbelyZVi zssj&G55`@+f~P{84b(hzz>uOu3Z#P0dt>9DZxdV#LJ{neNX9AKb=yoJf>5>tWrjfj zb8CBV4-XnmL#r87)KCX#(yY)iAzUbX10phL(ap?!A0}jri{HJA`gh>#>tE8{7k6-Q zNbhl49lP^hIUNfryPJH`v)IT~t<=sqdV0=m;a_!SP)6|oMRE3T`Y^QK{`mDD(rDPT zKd=82GPL8e{`=5<50zilfh9mSR3L}}<9G#}288f5XfT+6um-ANG?jsdpWu^GmyZ}aKL>cBP08S0XtT!=(rmc zW$9FTIL*BG0~MxG5S0+Qj>iribXZDmHRFfJ3BL~$SkR~8@7fyi425tLHgGILMLV~& z4IZBzjb!Y>>oo#P{BG2C16#bMzYQJNhG`wr{IRzoO=4a0^;bIZNqjG~#A_U?qSkJdYC(s3d z-0(-M*qMgTxrZi>5R2c!c?u$}QQ#bFLDzw{LPF)jz+pbs&R(8NLA8S=SkTNK-u|%z z)H;vQ$fV4X4P_hjK=B2Wj6pWh0CEWpRCx}xp4OlOdQN(vTnyfP&i*YZ(FBk7*S3Li zu>$g$@}?C65;IK14Ah3O4=$v|=!$*a_-hY_o`J>=+~O*%z3yB{vjbtGgHThMCh+?pa>WP z7kWI_gYJ$6bO + +#define TFA_FOR_EACH_CASE(MACRO) \ + MACRO(3072, 128, 1024, 128, 128, 256, 4, false) \ + MACRO(3072, 128, 1024, 128, 128, 512, 4, false) \ + MACRO(3072, 128, 1024, 128, 128, 1024, 4, false) \ + MACRO(3072, 128, 2048, 128, 128, 256, 4, false) \ + MACRO(3072, 128, 2048, 128, 128, 512, 4, false) \ + MACRO(3072, 128, 2048, 128, 128, 1024, 4, false) \ + MACRO(3072, 128, 4096, 128, 128, 256, 4, false) \ + MACRO(3072, 128, 4096, 128, 128, 512, 4, false) \ + MACRO(3072, 128, 4096, 128, 128, 1024, 4, false) \ + MACRO(3072, 128, 8192, 128, 128, 256, 4, false) \ + MACRO(3072, 128, 8192, 128, 128, 512, 4, false) \ + MACRO(3072, 128, 8192, 128, 128, 1024, 4, false) \ + MACRO(3072, 128, 16384, 128, 128, 256, 4, false) \ + MACRO(3072, 128, 16384, 128, 128, 512, 4, false) \ + MACRO(3072, 128, 16384, 128, 128, 1024, 4, false) \ + MACRO(3072, 128, 32768, 128, 128, 256, 4, false) \ + MACRO(3072, 128, 32768, 128, 128, 512, 4, false) \ + MACRO(3072, 128, 32768, 128, 128, 1024, 4, false) \ + MACRO(3072, 128, 65536, 128, 128, 256, 4, false) \ + MACRO(3072, 128, 65536, 128, 128, 512, 4, false) \ + MACRO(3072, 128, 65536, 128, 128, 1024, 4, false) \ + MACRO(3072, 128, 131072, 128, 128, 256, 4, false) \ + MACRO(3072, 128, 131072, 128, 128, 512, 4, false) \ + MACRO(3072, 128, 131072, 128, 128, 1024, 4, false) + +struct GeneratedTfaCase { + int s0; + int head_size; + int s1; + int cube_s0; + int cube_s1; + int tile_s1; + int qk_preload; + bool causal_mask; + const char *name; +}; + +static constexpr GeneratedTfaCase kGeneratedTfaCases[] = { + {3072, 128, 1024, 128, 128, 256, 4, false, "case_float_H_128_S0_3072_S1_1024"}, + {3072, 128, 1024, 128, 128, 512, 4, false, "case_float_H_128_S0_3072_S1_1024"}, + {3072, 128, 1024, 128, 128, 1024, 4, false, "case_float_H_128_S0_3072_S1_1024"}, + {3072, 128, 2048, 128, 128, 256, 4, false, "case_float_H_128_S0_3072_S1_2048"}, + {3072, 128, 2048, 128, 128, 512, 4, false, "case_float_H_128_S0_3072_S1_2048"}, + {3072, 128, 2048, 128, 128, 1024, 4, false, "case_float_H_128_S0_3072_S1_2048"}, + {3072, 128, 4096, 128, 128, 256, 4, false, "case_float_H_128_S0_3072_S1_4096"}, + {3072, 128, 4096, 128, 128, 512, 4, false, "case_float_H_128_S0_3072_S1_4096"}, + {3072, 128, 4096, 128, 128, 1024, 4, false, "case_float_H_128_S0_3072_S1_4096"}, + {3072, 128, 8192, 128, 128, 256, 4, false, "case_float_H_128_S0_3072_S1_8192"}, + {3072, 128, 8192, 128, 128, 512, 4, false, "case_float_H_128_S0_3072_S1_8192"}, + {3072, 128, 8192, 128, 128, 1024, 4, false, "case_float_H_128_S0_3072_S1_8192"}, + {3072, 128, 16384, 128, 128, 256, 4, false, "case_float_H_128_S0_3072_S1_16384"}, + {3072, 128, 16384, 128, 128, 512, 4, false, "case_float_H_128_S0_3072_S1_16384"}, + {3072, 128, 16384, 128, 128, 1024, 4, false, "case_float_H_128_S0_3072_S1_16384"}, + {3072, 128, 32768, 128, 128, 256, 4, false, "case_float_H_128_S0_3072_S1_32768"}, + {3072, 128, 32768, 128, 128, 512, 4, false, "case_float_H_128_S0_3072_S1_32768"}, + {3072, 128, 32768, 128, 128, 1024, 4, false, "case_float_H_128_S0_3072_S1_32768"}, + {3072, 128, 65536, 128, 128, 256, 4, false, "case_float_H_128_S0_3072_S1_65536"}, + {3072, 128, 65536, 128, 128, 512, 4, false, "case_float_H_128_S0_3072_S1_65536"}, + {3072, 128, 65536, 128, 128, 1024, 4, false, "case_float_H_128_S0_3072_S1_65536"}, + {3072, 128, 131072, 128, 128, 256, 4, false, "case_float_H_128_S0_3072_S1_131072"}, + {3072, 128, 131072, 128, 128, 512, 4, false, "case_float_H_128_S0_3072_S1_131072"}, + {3072, 128, 131072, 128, 128, 1024, 4, false, "case_float_H_128_S0_3072_S1_131072"} +}; +static constexpr std::size_t kGeneratedTfaCasesCount = sizeof(kGeneratedTfaCases) / sizeof(kGeneratedTfaCases[0]); +// clang-format on diff --git a/examples/aot/flash_attention/cpp_ref/split_pipe/jit_util_flash.py b/examples/aot/flash_attention/cpp_ref/split_pipe/jit_util_flash.py new file mode 100644 index 00000000..40853f09 --- /dev/null +++ b/examples/aot/flash_attention/cpp_ref/split_pipe/jit_util_flash.py @@ -0,0 +1,222 @@ +#!/usr/bin/python3 +# coding=utf-8 +# -------------------------------------------------------------------------------- +# Copyright (c) 2026 Huawei Technologies Co., Ltd. +# -------------------------------------------------------------------------------- + +"""JIT compile split-pipe fa_performance_kernel.cpp + host dispatch (LaunchTFA).""" + +import ctypes +import os +import subprocess +from pathlib import Path +from typing import List, Optional + +import torch + +ASCEND_TOOLKIT_HOME = os.environ["ASCEND_TOOLKIT_HOME"] +_SPLITPIPE_ROOT = Path(os.environ.get("PTO_ISA_SPLITPIPE", "/workdir/pto-isa-splitpipe")).resolve() +_SPLIT_PIPE_DIR = Path(__file__).resolve().parent + +_CV_FIFO_SIZE = 8 +_CUBE_S0 = 128 +_CUBE_S1 = 128 +_SUPPORTED_TILE_S1 = (256, 512, 1024) +_DEFAULT_TILE_S1 = 256 + + +def torch_to_ctypes(t: torch.Tensor) -> ctypes.c_void_p: + return ctypes.c_void_p(t.data_ptr()) + + +def _npu_arch_flag() -> str: + return os.environ.get("NPU_ARCH", "dav-2201").strip() + + +def compile_flash( + kernel_cpp: str, + verbose: bool = False, + timeout: int = 600, + extra_sources: Optional[List[str]] = None, + splitpipe_root: Optional[Path] = None, + output_lib: Optional[str] = None, +) -> str: + lib_path = output_lib or str(_SPLIT_PIPE_DIR / "flash_jit.so") + root = splitpipe_root or _SPLITPIPE_ROOT + + includes = [ + f"-I{root}/include", + f"-I{root}/kernels/manual/common/flash_atten", + f"-I{_SPLIT_PIPE_DIR}", + f"-I{ASCEND_TOOLKIT_HOME}/include", + f"-I{ASCEND_TOOLKIT_HOME}/pkg_inc/runtime", + f"-I{ASCEND_TOOLKIT_HOME}/pkg_inc", + f"-I{ASCEND_TOOLKIT_HOME}/pkg_inc/profiling", + ] + pto_extra = os.environ.get("PTO_LIB_PATH") + if pto_extra: + includes.insert(0, f"-I{pto_extra}/include") + + flags = [ + "-fPIC", + "-shared", + "-xcce", + f"--npu-arch={_npu_arch_flag()}", + "-O2", + "-std=c++17", + "-Wno-ignored-attributes", + *includes, + ] + + sources = [kernel_cpp] + if extra_sources: + sources.extend(extra_sources) + + cmd = ["bisheng", *flags, *sources, "-o", lib_path] + if verbose: + print("compile command:\n", " ".join(cmd)) + + subprocess.run(cmd, check=True, timeout=timeout) + + if verbose: + print(f"generated {lib_path}") + return lib_path + + +def load_flash_lib(lib_path: str, check_type: bool = True): + lib_path = os.path.abspath(lib_path) + lib = ctypes.CDLL(lib_path) + + if check_type: + lib.call_kernel.argtypes = [ + ctypes.c_void_p, + ctypes.c_int, + ctypes.c_int, + ctypes.c_int, + ctypes.c_int, + ctypes.c_bool, + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.c_void_p, + ] + lib.call_kernel.restype = None + + _ws: dict = {} + + def _alloc_workspace(s0: int, head: int, tile_s1: int, device): + # Intermediate GM layouts depend on S0/HEAD/tile_s1 only (see demos jit_util_flash). + shape = (s0, head, tile_s1, str(device)) + if _ws.get("_shape") == shape: + return + + torch.npu.synchronize() + + if tile_s1 not in _SUPPORTED_TILE_S1: + raise ValueError(f"tile_s1 must be one of {_SUPPORTED_TILE_S1}, got {tile_s1}") + + num_s0_blocks = s0 // _CUBE_S0 + slots = num_s0_blocks * _CV_FIFO_SIZE + + _ws.clear() + _ws["_shape"] = shape + _ws["o_out"] = torch.empty((s0, head), device=device, dtype=torch.float32) + + _ws["qk_tile_fifo"] = torch.empty( + (slots, _CUBE_S0, tile_s1), device=device, dtype=torch.float32 + ) + _ws["p_tile_fifo"] = torch.empty( + (slots, _CUBE_S0, tile_s1), device=device, dtype=torch.float16 + ) + _ws["exp_max_ififo"] = torch.empty( + (slots, _CUBE_S0), device=device, dtype=torch.float32 + ) + _ws["pv_tile_fifo"] = torch.empty( + (slots, _CUBE_S0, head), device=device, dtype=torch.float32 + ) + + # Match demos/torch_jit/flash_atten/jit_util_flash.py layout for LaunchTFA intermediates. + _ws["global_sum_out"] = torch.empty( + (num_s0_blocks, s0), device=device, dtype=torch.float32 + ) + _ws["exp_max_out"] = torch.empty( + (num_s0_blocks, s0), device=device, dtype=torch.float32 + ) + _ws["o_parts_out"] = torch.empty( + (num_s0_blocks, s0, head), device=device, dtype=torch.float32 + ) + + default_causal = False + default_stream_ptr = torch.npu.current_stream()._as_parameter_ + + def flash( + q: torch.Tensor, + k: torch.Tensor, + v: torch.Tensor, + stream_ptr=default_stream_ptr, + is_causal=default_causal, + tile_s1: int = _DEFAULT_TILE_S1, + ) -> torch.Tensor: + s1 = k.shape[0] + if s1 % tile_s1 != 0: + raise ValueError(f"S1={s1} must be divisible by tile_s1={tile_s1}") + _alloc_workspace(q.shape[0], q.shape[1], tile_s1, q.device) + + lib.call_kernel( + stream_ptr, + q.shape[1], + q.shape[0], + k.shape[0], + tile_s1, + is_causal, + torch_to_ctypes(q), + torch_to_ctypes(k), + torch_to_ctypes(v), + torch_to_ctypes(_ws["o_out"]), + torch_to_ctypes(_ws["qk_tile_fifo"]), + torch_to_ctypes(_ws["p_tile_fifo"]), + torch_to_ctypes(_ws["exp_max_ififo"]), + torch_to_ctypes(_ws["pv_tile_fifo"]), + torch_to_ctypes(_ws["global_sum_out"]), + torch_to_ctypes(_ws["exp_max_out"]), + torch_to_ctypes(_ws["o_parts_out"]), + ) + return _ws["o_out"] + + return flash + + +def jit_compile_flash( + verbose: bool = False, + clean_up: bool = True, + kernel_cpp: Optional[str] = None, + splitpipe_root: Optional[Path] = None, +): + root = splitpipe_root or _SPLITPIPE_ROOT + kcpp = kernel_cpp or str( + root / "kernels/manual/common/flash_atten/fa_performance_kernel.cpp" + ) + dispatch = str(_SPLIT_PIPE_DIR / "call_kernel_dispatch.cpp") + lib_path = compile_flash( + kcpp, + verbose=verbose, + extra_sources=[dispatch], + splitpipe_root=root, + output_lib=str(_SPLIT_PIPE_DIR / "flash_jit.so"), + ) + func = load_flash_lib(lib_path) + + if clean_up: + try: + os.remove(lib_path) + except OSError: + pass + + return func diff --git a/examples/aot/flash_attention/cpp_ref/split_pipe/run.py b/examples/aot/flash_attention/cpp_ref/split_pipe/run.py new file mode 100644 index 00000000..1ede740e --- /dev/null +++ b/examples/aot/flash_attention/cpp_ref/split_pipe/run.py @@ -0,0 +1,207 @@ +#!/usr/bin/python3 +# coding=utf-8 +# -------------------------------------------------------------------------------- +# Copyright (c) 2026 Huawei Technologies Co., Ltd. +# This program is free software, you can redistribute it and/or modify it under the +# terms and conditions of CANN Open Software License Agreement Version 2.0 (the "License"). +# Please refer to the License for details. You may not use this file except in compliance +# with the License. +# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, +# OR FITNESS FOR A PARTICULAR PURPOSE. +# See LICENSE in the root of the software repository for the full text of the License. +# -------------------------------------------------------------------------------- + +# Split-pipe FA: JIT compiles pto-isa-splitpipe fa_performance_kernel.cpp (TileSplitAxis etc.) +# plus call_kernel_dispatch.cpp. Case list is generated_cases.h (see jit_util_flash / generate_cases.py). + +import random +import math +import argparse +from pathlib import Path + +import matplotlib.pyplot as plt +import torch +import torch_npu +from jit_util_flash import jit_compile_flash +from ptodsl.utils import get_test_device +from ptodsl.bench import do_bench + +_DEVICE = get_test_device() +torch.npu.set_device(_DEVICE) + +NUM_ITERATIONS = 15 +WARMUP = 10 +SEED = 1 + +random.seed(SEED) +torch.manual_seed(SEED) +torch.npu.manual_seed(SEED) + + +def attn_flops_matmul_softmax_scale( + batch_size: int, + s_q: int, + s_k: int, + h: int, + include_scale: bool = True, + count_exp_as_flop: bool = True, + count_max_as_flop: bool = True, +): + flops_matmul = 4 * batch_size * s_q * s_k * h + flops_scale = (batch_size * s_q * s_k) if include_scale else 0 + + rows = batch_size * s_q + softmax_ops = 0 + if count_max_as_flop: + softmax_ops += rows * (s_k - 1) + softmax_ops += rows * s_k + if count_exp_as_flop: + softmax_ops += rows * s_k + softmax_ops += rows * (s_k - 1) + softmax_ops += rows * s_k + + return flops_matmul + flops_scale + softmax_ops + + +def tflops(flops: int, ms: float) -> float: + return flops / (ms * 1e-3) / 1e12 + + +def fa_reference(q, k, v, is_causal=False): + scale = 1.0 / math.sqrt(q.shape[1]) + scores = q.float() @ k.float().T * scale + if is_causal: + mask = torch.triu( + torch.ones(scores.shape, device=q.device, dtype=torch.bool), diagonal=1 + ) + scores = scores.masked_fill(mask, float("-inf")) + attn = torch.softmax(scores, dim=-1) + return attn @ v.float() + + +def fused_attention(q, k, v, is_causal=False): + scale = 1.0 / math.sqrt(q.shape[1]) + out, _ = torch_npu.npu_fused_infer_attention_score( + q.unsqueeze(0), + k.unsqueeze(0), + v.unsqueeze(0), + num_heads=1, + input_layout="BSH", + scale=scale, + next_tokens=0 if is_causal else 65535, + ) + return out.squeeze(0) + + +def test_flash(tile_s1: int = 256, head: int = 128): + if head != 128: + raise ValueError( + "split_pipe generated_cases.h currently instantiates HEAD_SIZE=128 only; " + "regenerate generated_cases.h with more heads if needed." + ) + + s0 = 128 * 24 + s1_values = [1024, 2048, 4096, 8192, 16384, 32768, 64 * 1024, 128 * 1024] + bad_s1 = [s1 for s1 in s1_values if s1 % tile_s1 != 0] + if bad_s1: + raise ValueError(f"tile_s1={tile_s1} does not divide S1 values: {bad_s1}") + + dtype = torch.float16 + q2d = torch.randn((s0, head), dtype=dtype).npu() + flash = jit_compile_flash(verbose=False) + + flash_ms_values = [] + npu_ms_values = [] + ref_ms_values = [] + flash_tflops_values = [] + npu_tflops_values = [] + ref_tflops_values = [] + + for s1 in s1_values: + flops_total = attn_flops_matmul_softmax_scale(1, s0, s1, head) + + k2d = torch.randn((s1, head), dtype=dtype).npu() + v2d = torch.randn((s1, head), dtype=dtype).npu() + + # Custom bisheng FA kernels do not tolerate do_bench's default 256MB L2 flush between iterations. + ref_ms = do_bench( + lambda: fa_reference(q2d, k2d, v2d), + warmup_iters=WARMUP, + benchmark_iters=NUM_ITERATIONS, + unit="ms", + flush_cache=False, + ) + npu_ms = do_bench( + lambda: fused_attention(q2d, k2d, v2d), + warmup_iters=WARMUP, + benchmark_iters=NUM_ITERATIONS, + unit="ms", + flush_cache=False, + ) + flash_ms = do_bench( + lambda: flash(q2d, k2d, v2d, tile_s1=tile_s1), + warmup_iters=WARMUP, + benchmark_iters=NUM_ITERATIONS, + unit="ms", + flush_cache=False, + ) + + flash_ms_values.append(flash_ms) + npu_ms_values.append(npu_ms) + ref_ms_values.append(ref_ms) + flash_tflops_values.append(tflops(flops_total, flash_ms)) + npu_tflops_values.append(tflops(flops_total, npu_ms)) + ref_tflops_values.append(tflops(flops_total, ref_ms)) + + o_out = flash(q2d, k2d, v2d, tile_s1=tile_s1) + o_ref = fa_reference(q2d, k2d, v2d).to(torch.float32) + o_npu = fused_attention(q2d, k2d, v2d).to(torch.float32) + + print(f"S1 : {s1}") + print(f"Tile S1 : {tile_s1}") + print(f"FLOPs total : {flops_total}") + print( + f"JIT flash kernel : {flash_ms:.3f} ms/iter " + f"({tflops(flops_total, flash_ms):.3f} TFLOP/s)" + ) + print( + f"npu_fused_infer_attention : {npu_ms:.3f} ms/iter " + f"({tflops(flops_total, npu_ms):.3f} TFLOP/s)" + ) + print( + f"torch reference : {ref_ms:.3f} ms/iter " + f"({tflops(flops_total, ref_ms):.3f} TFLOP/s)" + ) + torch.testing.assert_close(o_out, o_ref, rtol=1e-3, atol=1e-3) + print("vs torch reference: PASSED") + torch.testing.assert_close(o_out, o_npu, rtol=1e-3, atol=1e-3) + print("vs npu_fused_attention: PASSED") + print("") + + plot_path = Path(__file__).with_name("fa_split_pipe_s1_plot.png") + plt.figure(figsize=(8, 5)) + plt.plot(s1_values, flash_tflops_values, marker="o", label="flash split_pipe") + plt.plot(s1_values, ref_tflops_values, marker="o", label="ref") + plt.plot(s1_values, npu_tflops_values, marker="o", label="torch_npu") + plt.xscale("log", base=2) + plt.xticks(s1_values, [str(v) for v in s1_values]) + plt.xlabel("S1") + plt.ylabel("TFLOP/s") + plt.title( + f"Split-pipe FA TFLOP/s vs S1 (S0={s0}, head={head}, tile_s1={tile_s1})" + ) + plt.grid(True, which="both", axis="both", linestyle="--", linewidth=0.5) + plt.legend() + plt.tight_layout() + plt.savefig(plot_path, dpi=160) + plt.close() + print(f"Saved plot to {plot_path}") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--tile-s1", type=int, choices=(256, 512, 1024), default=256) + parser.add_argument("--head", type=int, choices=(128,), default=128) + args = parser.parse_args() + test_flash(tile_s1=args.tile_s1, head=args.head) From 26e3eb5f4226aadc4e71e90ee7f2ae7d73c3e64c Mon Sep 17 00:00:00 2001 From: learning-chip Date: Wed, 29 Apr 2026 19:35:44 +0000 Subject: [PATCH 05/17] change default tile_s1 to 512 and update plots --- .../simplified/fa_compile_and_run_s1_plot.png | Bin 97477 -> 115541 bytes .../cpp_ref/simplified/jit_util_flash.py | 2 +- .../flash_attention/cpp_ref/simplified/run.py | 2 +- .../split_pipe/fa_split_pipe_s1_plot.png | Bin 106494 -> 106576 bytes .../cpp_ref/split_pipe/jit_util_flash.py | 2 +- .../flash_attention/cpp_ref/split_pipe/run.py | 4 ++-- 6 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/aot/flash_attention/cpp_ref/simplified/fa_compile_and_run_s1_plot.png b/examples/aot/flash_attention/cpp_ref/simplified/fa_compile_and_run_s1_plot.png index c79dc0efdee059209c04b5c98561d9293618fff1..76f48baac35cf2184d5afd6589b33f7195263563 100644 GIT binary patch literal 115541 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

UW@i5J<;51D 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

Fo{pm{rbn99iODX;@<#L#m|0Qx*fSI8gDEc>x) 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%0AMLn{g47YD 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 KWbXP&$aU~QA3;u~g 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%0Am?M zav!3WobDX;?fh)xyi~vK0<_}fh*<%e9TZ|MYej5pp!@4V_}jTYh!_V~E+G)i5()|g z0Cxgu#Da*ja{m?(abjf;dA{nGwl(H+zrRmyx*XT=^4n2DeBRC)8BsxI&ye8Kar=&i zRAA*?*;Z&K!9j81a{&YwjQ7*PoZ%}F!qldB-9gl+@07NJ`B+qp8P+xvR<9lRiap#d1<^ zN*_Mc6->Z9;3Imd8J)mO0|{>Hl8ji*&cT4aPj=S`8<{r(o&g!S2ZOvgkU5;@L${&- zO%jNxT>>u+$`9zQu--;s0f2j(*u(OG3IAj+f; z{ss{7{Wba`pD+piSMbKB6QExiqM{aHq|lev$9{s_?=65Yr6I3T7MY&Qdd9hiGv|JL zbJwLct;XYPgRf-uWkX+qh*uP=n%=yYDr)DVq&()a1fpbp#TJ)zH_FXtJ;5(70Ies? zk+;B|ap-@<1o5Y}ukRAbE1r96t>BTS-s*cjRH%LrEOiJo&SUotg^Y6}x#Z$yiWVr* z0mvPI^^C<%h}ZPXufeQ~U^6QPDIKBakdqA~!{Ly0^&w+VKpqDVJ7;o4YIBou`&YH- z`f2w_Q?sSXT)7*SQ0)dzVYHRSlJ^lMJmLY`%JN(Pg*cfQXfO@#8H7iB!3qRF3Kfx& zmkCK7fBIX)ptCp_#MO`($){_Z+mbaUVY(4gnvHXbdqQT~{e;lKCth=YGi3{hTU5h3wIQBic% zaEu8yO{vWcUs&W4*oHw+{0K9VD=RA>fN!^2s#HPrRv1)5p}^=56C7%K$&ilP7n^|H zL_;|NE}7^%zVzUN!xs|7?gENcS<4n;sRY&zyd=w$!*%gcI*VDIYV~D>QDiXG=r=tX zT(t6D?jMj!iA_V0aP=kOzWlfG*Sed7Wsw9Qm|dyeN!K6VmE$3G z{F1qtp4@S%sGz1}Su%?=YXP5SwHg07eLC_Txv;VF^_NFimN2OgOR=cC-`mT%ex?|~ z-*yR7Yv}*{u&>AJhfXaS{oF*QIU!OtfaAnKfqV@kr_jNqTtq$F$DgtLkLPlC_nP>3t)#vcyp8>t1yf4z3^#FA~$RNn6yD%UkJ z0zf%L<<8~dtKW$A9+&+lC-hUHOoWTVzaI?N1>M4yM zVQHKJ-3xx+2`;op>fkNLzI?d@reQ-NHVuK){`2RL2zY%;L9_;0ljsqu4&1$fmk_QO z*7GG0h_w9tH=t>31&;qu4|B;|$aZuZHURPw@CzdBM=+RPB_hJ4!9<1~5C{zmF9q^| z+&b7wA0gZ{3>)D9x&AseH5|~w_o{In7`J%KvUCi&E<=T>%($1tYO4AYtO?2wdMou5 z)MqMX@XsQfjyyF8=tmejxd0pa3E~AAdxK)Bsr>~eu*s1o0!F*+K->q8SOC1U$bca1 zimIL`ur!Dcfbj5$`v^I7Kl{^x2)bx7UK|c$g&x45Kl?uuiI>9lKg)m7k#hJito>9- z;IoIC-q=iOHpeH^jwvSr)2e&qs^)6cgU@=aNMdo_B~z16x{OdQfXDHyaq|4ohxug_ zsu>J%6?Jk~ZYPt~y_{|Gt{?dA;NU<&LUI8Gj^R6_51$Q}SAMt}6I#i_s&#YJOr`Bo zaYQcrktjAiE#OXE4{icxAqzaz2zgr4_iwE)B(-&VnZ;y_z`Tes(=Y*E1|zlV5!S(j zOh$Q@#s8CG+ zOu5Q;#4-nZN|o6Z;AO-yLZ|f)JC`~CxL;c8Q(G{4#ro{ydeh-eE}2Uw?+<9+hT4y7 zQ@K**#mVA4rT3}|>0$y-2=D`ipa&6jAJt}v;mHu*3R)&y;KQ%0_qN)!#}QsErvGoE z^ymqoVOlCll1Do;a`l$On>a|9%=nlvdvv)B_h1x5R71n-^xGJc?trC@Q6TAYsV@tkIMxBt9&(UXB`p+~hwmj-^m|9M23`{J?#!J8EJ z!33g+uj6>E}o^G zLG+=ejDESBkhZmOzvnMYjHncGH|D00TB@S+Uqo76<+Q}_=NV^WoYmcG5cFLh@7nhX(D`X!iQW+Z~2G>2>%$6GeFi;gwf(zGll>BKttpM z?K~bvP2pgh^E*n5r0Trn&v(UjnhEzJ3$gO9mRl-VQK}Fb*Ys^K*!tyO|Idt515fY zA$R~j2kPispmM-ZgeYQm>(jh&Wy!KA8+Zm2V44>Iw?T6reESdsX`qo&@_#A1n3!Gs zV`%@#EQ;zHRCTj|Ni=MMs#C^flNl_(UtdNC2P*U-n?0o{m~axH^;CgHV%4Z@0WlY8 zUn?!gFC%3Xx=YPvA;5lQoao@E`^z2#;*oyr>yy(+hx&?mG$uB{ZUYi1GTj5E@y|y* zcIYlL`HXvrPT)CjWWqiI;4@R?t-EcKgI+f7S4h+{cr$O7$j<3rZ9WkD8b#GpKbN5V zBa(3`%=5yWy~w*^M0ZEn^3}{qR?kRACT%!L(14o?M6vvDDyV+cFWtHK=QsCnOX;nW z_sUPR;=O{J-z*n+xrLYO6&q18a<*hvzL+Jgj(j z02a_pfOMP=d>}Nz>Au?ibdKF`0kP>S~9fA$ZBj zgEDXMvl(fisD7+b6$3035RD8^(!>D)559Xs1#yk^ABABi<7>RRc{}-|7EYk2gC6Pf z{C|2QqcA8lS(852OTQOWlNSpN1ZZBqi!t5AlXmeRzq9%@3G*#03A+wH>Y(}jSh!#h zp%YPhCkLBYW5{$AfC{yG7gq2?8#Lpz7|x;9o1*6?`Ix>#f9HEaz65pQ^ToO*rXr}> z@azvbR)Z zXYY|wLRLr!WrRpJ8I?VWRI+@=lEz{_wV;S&-KUE>%O|vd49j2aUAb; zh;7YsSN!OZix#^t1jMu7?Ce8sf)p?po`R2#20i4wCBP={%+GMB~QY@#Oi{3u_c#+af^akw*&cHcMz{}Cy4AKPxD3AhQ-vX%%@-u_F zRHg;G{^Tl1;836`2b>q<3AA5~oIXLF_jdns8$LYJUAS0q*;#!xj3o~v$pp~rXLAhR z20(8NZ8J(%l$h5FhU|(uAlIRtR!CQ4;ko_gBxp69zo$ec(;GrxP03?^=F}cY2Bg^9 zmubTGv7hwBt4)gUPG9#JDY2}g6=EpUYP44_uO99+ObsPcc9+LI1K5WUbM@-gYS8yQ zL78lDjxDaN)Iuq|1h#6_)u4nS+wUC=Y7ht{VGYp$z%Yk3@&!sq#>H7FYrDC*eaHcG zKMho(x5MKgUk18H;73*X^s>4o4`Tt}MC+{_srT~Q)s~glp%>1#Jy&jvJ;R!}J+5?3 zOK|MOnKO#Jhq&H5XF6Lpo6p(HP5%J5=O`RosGdibJ$MGPZG+JKA!`&^X3zscTm|?c zVWs(lmS7Z!iaOvAPTTyS9G7{ zswz8P;H+?3yOvhb_|a7a3}FszobsNb>pDgPQoELyhbDYyd>#OwtCGP}F0vPV)_1%_ zBdgfF6v7}4avv$K4_CMO7R2frXgFRt&%bR+=vdI$n~~VXY$NhnE`D~&G4rZpvo5=9 zhU(D7E7k8kO?fs$W+ZPF*EWPA)Z?vF25W43-D{tZdNg17b{ccknvBpp2k8WLiO48mY#r@TUuf}c zX@kI;0RJ5OtHNyJ$zEDsBY`eOYg;vzkocpfllN5Nz!4A@q~+%BoNE30q8-6F6yLvp zns)f4xrE)NxYy0hP(O8S8tje$(VW?wo}VXxv#ZDrUV(u9_+fyrtit==LVF9J-Usk) z6nqFcsSl_$hu(wE3#rbR;Jq6Ijs(#|$aR$mI=0!Nw^Sg%K_-95-@||$B{?mPD!v!K z2_Rv>J#&{iHz_k=paJweUX!kfuwgtPoQp(qA;ZfXS|rf00w_<*rkT}kd*{w2kd=U3 zXV+D9H(M2Q9hAv73vx~@8rlyTOq)8#!-E7^1RCJ^p|_Si-1h(uY0uW>M_D8&na5tW z_b>+a!N|o3oHkOi>I?x!hm4YNjq$N4L8A=m0mqP#bygWD`e4uh65sJBK? zAJn!5|3-l{KqpX$a)7|D9=xX@6x*~{O+#82&mXy>T}?EGX#pDOe}B=B$85RAv&hDa zh={yUW3l^MhgY5vCR(XTlA;LIKkW8uP-@Jk?k_Hl_<}nHc9&caHWoagm8Zf{%@o#@ zZu=sdFKArYwCa=LSVanpWdqh3X?N4me2biyq*}*=e8iu?H8=)Bng;Nf;lCQrH^Buu z5g(%k8fa+Nj#zPn;1@~ar@&JOwA3LC64Q4v2!N*;;QqKLZg2x3cn03xjg$1RIg1EB z^vCz<9jS&h4~ka^S)wwFP9c>e%#mEW)N34(_UgOgPu%qOS6bP5M-Tczu-YRPWBvs$ zWF$bTUnuD&#ou_D2D7l$;0&32ANitcv2hcEo<#7y0ske*4tAvGa4`O}qzGB6Z+?h)hT`_!D1 zdFpZhN~#*m12??ms;d{&J!;o*l*BfZ+wa^k+E_J(h$qJ2v9U2PwB3PFgbXWbD9(;h zpY;fBP@~A!x0Zz03}IHX1xD>YC%sVvt%luc_lY2#jMClaK=Osl8RecW#Pbt zGtZ9Hh?|n%`X~S%7zxN{Yr1{3<(SD&tkOYtkPl)oD2}D{`Sp9Ct}|ujXlm1Y*z@U2 zCiKKAbc}mr@Q^UqW=Rv&-1eIdGIJSe(<5-FL&DwxHbH-@cYkCKY0WZey|fz|oCbX> z2YmOqsH-0B8l2hGtWCi&u-Ot?6D=iNDQjbWy3HL8sE8HCYiuR{dz9=JWJ!+jFOk9V zTkzlNO_zhy&!HlP4buvJE8-v#X97#|I^g2qy!pYq(3KI^z6^>3v@D2VpEG=`f@CNn|VS{}FGezvZhvnZ$7;wB$fJ2Lx zZ5Rq$C{T`J%)b;dqi=_DR>_4N&Y_G5(8K6ex>3Nv?FHWvIN@tXaaD*U1T_STFhCR^ zqEk^}1cf_Fv_dHaP>ecpeKWv{Pr!v*7@uPD=vofAg=NDnNaMeIez?FLDd`TErPzC z2NV5-8;7QTTD12^5Z@`xr5pguFXU`o2L2yuWg%ka80fX7`jNUBoEZ&JEvA_HlFxQ$ zkpT-W_i9_MG<@1M7QIiFSC6y_@04%)<}}842{V@5GAtBr;BTG#mZhQbY)$gA*~g9n zMLRWUNZztU;Yo}P(~roX93sAkbu`*0d>iN;!1eKZ<6Nk;g=`{}ZC!xVcJKaPqH4ZniO~ zjtZS)PExZxpIdvCC;Z+W!!>d1Tr&SUm|WM4@TkwaA`wyt^1h18sfjt>Cs|xL5~o9; zr$uO*wp;S?-7#}fzLI{MN-kU#ZqUzpW zGN1Y)v;iT-<`xC)PsalT@G%dzi_ zN+u3T?TZe}=a(-05=72G(g#DD6t~f0ltdNbgT8BLgt2XHaWna`s0W+N9Byd4U}b=` z9mVXS2shH(!{Asph}++3>2&}O`?2xAHrgp(eG}`{JI;5?(y?wMb*#PIz{Y8XA@lNv zbz11;6wXEw$BfD^VdLkN8UNmVcKVW7n^g9~Y8R%66FB_Tfp!Xw5$61ci5*WPQ|h~g zWezK-y!e<+&yzcYttp*a5>Ru~4@u~-AT<6DjP*-$2X!{|GmBJ!Rzv4Tzw)|-0n1s+%#ExTBWkPT&eFh zT7oYd4SlQ$^T3=r#A$Q$aO7$KbMX(=IVUD9B)kVqgA8&f1G9gDn1>&LaECGcKg)&X zbdd`i!R6D{WtKCx-`-J#^>;aDJqAL{*fc4`Y^b$_GmyEUeifG)w06ebVnA$tDztNS z!u|N@&v1uCdwMQz<>_y(;&YWvw}pD=J0(CUc48mi1SYK@i?PWUM8ztubIv7_UZdwm}{Fk0A>3>la1`b+otk_(e z22jTM$pmwiDnxzJ=Y0A3(2w-~q?)@cX7ZoYtg>nB_81qJ8JCRr6lN!O#n*?!KXk-n z7_*~gF1yzL78vhS?Tel&O){AvS5u`=gJTyFJ4h9DqD9T>@5W~l)Evt-hFw1!FktpN zc7b#6Iyumk+oC(59Axm~QnwqQ`r)V48cBS2Q+KL9)l^od@)3ognZ90O-%c<2^JBmZ zu$mWdGlY!)6WeaW!^_+I=KiYuHNm9u$C!bJ##ScSz)3`lwu|Q`h$9Ia)IPUQ|G0X! z@OtFa7OGbO>B-$jqj&peodT%ttGng*3qA=4wUuI5u`j6)p&0&^j1Pr z$LYbLgm!0_z1{ey3Ab0R%3j-coC^wdzPFd1z|^GK+S;B->XOvoThGy$l+E6l?j&Y~ z6-~JR6%qSEq3>Ts=eW|^PG+Sr@ye;ec5jrt*NPgkTR05K%d)v-SLNIIEM7*f4_B~l z5O);3;P6RK@Y3<0wtkWx$>AThH*8@|V0%ZcMF?wbJjZ=w^>UGVlN=HX6jxfA<&nu_ zR7w*;5;{NskwRC74A%RQY0R5I0jr8iBC1RLbU?I?^9A?ZKM93buEU^PuK3k=&rFp2T-FFW3ihZPTj9Nj z%uO5HYgXaMrV~k?5xn%cuS>oz)l{xYG>OzT18u`O-z+wGvS1Se{IQG{aALk zyZd~tM}F%JO;JPp+<-zH*_8Y4llO9@Fa5C6 zJ7pO>SO+KF5&CfH;+1#FIjgKzlBGNlUcq4ei|C*|gl{nSe={Ah)AvjJ%RNo)6Gm;V zqFQ7H1Y~3E&jwN}rFRCbD|c&0zg-i&NvrQpUz5llD=G0MCppwp@^G@*%m?|<5VI~9 z4nE!^pTC4EO*5aAQ19KlQJHOUrgV~?VY5PydX_KaW;U!P$Xq3LwlPxm9#E)xaCYy7 zO|Z4OMq{ChBXbGKbK20sXRMYWo_$DHa^iT0ll+1GSwYJ8NIqcyUWkuD_D2D?4NkBaBen(H++-5gcOL^gkK}=1BNl!7{vZ=K?72k?%R0`z8UJD}#Ql$L=N*4TvI9 z+W>0S4Uh|re*b=Jx%4RbyFdfuzX!tx`YP`WqyG~Sp4U;r+3?;jF2vUrZh^5fQ{o=L z$Ox-OKoiJF_W!UU(I zk>D9=`2Y~(aN7L9JQGc~m8g-$h0YScs|CN+6=}`XN}tQDW}kcs8qV4Am9vYIw;r1u zWorF4lWE5WH>x2RI;=!p8&mK1(p32uH`+9VWhPU=@>*-_O9_?SGXF>y0t?2~=A>q~ zpaPQT%%P^=3v5|8BU`s_nsYBo_nqdO+k$_S&x=zlS}^UaDrCRcex%4V(y z!qR{TIt8pgV4<}j0y-jpz#icGisfe3zzDD!h3N5mR?iK+QAozL=a>5uZybVaT zA4Q?=phJJDM(GiaT4MCj(My9ak33!%LYhIn&DgR74s|41LbAV?Dj66|6o;V{3a5vd z0&2(;0uf{Jl6F%uI0=yy7A)5hIwyy~X9&N6k}vWg;69LwKd0IqZGpDN6_@TNzPb;a3LN=^COvtcA7dLFsCaX-aS{Xbt z7eXso`gt?ofGV;ndt8@%bMpNK!MmyKC&s)Q$hHJ@AKhkK%BdT6TR8^z2lCMYcjpQ5 za$mueSPhBRD3U)6uNoLp6n=>v>Vd{=fuw(AeB2vCjFRB-O3idz@cI&-wl0u||I!Ga z39ImNi}plpB#1@9Iv}R4SH%3>*g%o3+|!DBU?oTGGzy;vsPpCptiu@b?L{v{8$$FT z66XOx+yKcy=x>MN6DPCWz8$6olU0p|C;buVYr%45FLn8^7C=4HnOJhfc;L!5gu0j6gR=I(r7&r$JQWbKCG5*p8wV5_3(K@TPnt^h(lyR}(u z)ZC9Xl8Ix@rexCFW47~KlYkM!923s|=I>+4Y8LgRi zW4q+G`P^9OnT0b&b2#EMk>Kq*bdbym?1Xz95V?V50O2E{i5ct=+5 zwtqWc@s|mH2L*1Q^Zm2L7f#^6(v)~$Aoi9s=d*xA_Fy-=%TuV--$aGS#CC0!ObpG{ z{qQ((pW@B)IK22kJTYveiS)%%y;Ew@T`6LEr(#miu;97f3`vIVZFTC#mMIa%m!l$u zTNI|#uax*e@RVm`)bG}n^OSc3t$2t{Vgs{}4>K<}cTC&z zGZ#vbd1$~?2#mv{IpJ0bV^!t9SwX_Fc^n+_c5B}(>fgVCJCw}xn^V)mXERbi0`z3 z;IMA9F9SnQy*n(9>A6TzG_l<^Q4X$V6Ez##-|*<}EgQYL(t2wNE>TU))Y6z};n7Z8HZ1QLnB zL8_BcRKc+Ir`9DAOrS{?tzLLpWwH{~`mKDkXT}GwmGQ-$?2l&d!O;oXyt30fy$bwy zMJnH@Z4$dtMjUWF%C;`DXIXmFyk4_&kZ78Y*zL+Kz0On6Y1CH4(~>T5L-WCt)AU)d z$)04BQe6YiQEdb-yFB_1BAN&FTk;E>`WE-jc}wW%=)|=3O#_7i86hJelYp2}Ym!aK z3N!*<4MiLyHKRO8ICM%t4S{m{Fq}X!Wqm}lcOVh-(V;U< zx$W(bvdvV}Z{x3r z@raWB3Udx?Ai-&=mQef!TyMxo1BDS6sQgh4ZKg(r8gUk-0tfBG0f!N-ed+4M@1!?D zW{vI|Umj`|x8migW>Ovr6-DjXFib*sQKhjvu6wb+5!EfU6CscY674XUw1}ESR8fL!rAlFPb$Pkw z<)ud`G8vMZ2|#Px2v!s?0B%vlE7VcmfyL)f{r?Jk!^Y?#F*g>5M>c@`$_orJqwrRy zKD|7MJXxNem|v1mmeQ?T>wt?J3C85{UANHz%t>_wJF~l zjv|7ixXR3`egQpkeu3nSN^c-p`DH)Y^7f@N$B!S!09pUlj2pyG;0hAxD7s~?Mkc=+!1r8!ZgNTnf!&Y z)M&e4~(mhf@Wp}lWHl=YgJNdODG>tiOlJHqwKOV1ft*7bPU_gWWq4*`x$ zNEl4aPNdHG8gt4oAY6LQ4#nS ze$m!p2P?TnWP37YgUMpbS#D_#U2Rc)o;{~lUhC4ESAVM8raevyDr{twK+4wb+6kdoB+oU8eWDwTr8y>OYkt*#mC z$)DZA3PSN;watC&$Mtf1?p>0}JTLa4F5v9lUAaYu8zW9CI0ePa3>y{tr;P)`wgf^b$iG zk&4zqC{Emi288dUe^0r@uVw$7-S^7gO1=9B;}Ad3gG7=}Ld7xA3|;s5;XZZc-FQ5X z^B)Q5E3lX;Jyh@jO z8N~{M+39`aZ4@*2>d**;({h4%FLs>?&Wps3!tJYvzTx^*cO72(2emYSU1d=(*tZ~_ zUplRE=TXezV7a>a*ozy&-w5d~Y@Q8(%KC^PUN9X)DKD{iZIxU$RYzs&qa^>&clKh{ zdu5VXZUp)HH8a8fVhI7sNCEo+q*sjK{spZ+1t8-eqOBhRTt{%dqhvRoG z+g^~JmMMhvofjG;OakejN%AVb^8Sg#Pz|ccNX&D{oZ2V!e6TP;o4;tcwbh|>t=^Yp zlQh1%9ktl9WS+I2^(|8PosN}kVN55~Wzpu!CtPod zGDgr|WA(2%oj6h2o_72IXZOc#%Gui`^$AC&U4$-Ey>OFp`3=h;1e#K&{xy_10Y{joYk z6(db|1e&rO8%qUY>0mEIDRAc^sKvd~6XhW73IjQ4;O2tGOVQN+-R}FxOVmf&6gJ{Z zWBeTCbheobUO2d6d@dZ3TsVARLqX!Cd{@xi_+!3R5iCrJs`Xe)=S)6>)e)5fReY-~ zmGn=!?&9d=yPa7wdjANKGPB8nJmL(9q$>e<1-7hrpFfxC-QU2c1(gxZN^Mau zP5)ZZ8{P5U0g-BX`Q@BUl+Jqeb?C7m_r-~U4$A>cKD)P z^^%`++!NV6b9r&#{)G4zrJ{V*?RGVYcgx&PQ!bpfeMNN0r)InN679+N0TkYGb&69% z-xyU+5z=m7f75h3R`d3gC56T@e;lQ}SPmj(B2cV1eFT64=xy}9A-d&dFBx@U$$325 zry(KA^E!+w^=55cDG>5KF@X&O49c@~@1=l723&xkkqIziSNSb4-%9KLZntS&z~eid zakYimot=Qi;YW+YhU2ZNph(9oiR|XvymtUBB^Vey-1toRvB(oi+7Y!oOw?Hm4L?WNaq{xY5q z3O|cq>0(nxe7CljeS~ZKio#UA^rYj#}W?b*iPhTGSee~?OQ88vQpA4{% zIS$d&a2i6WDI^d$qe%i8vL@&f8!3Ripg<9ub*q zzctHmxfpTq_jR}LH%L)=38(>zgETvT^hYMbkrNoU`@IH%8BKT|oAd1KwMfcp1m+&HgXN{5njtV*B7 zM6>YiD@y)kIi)D&lD%;f$8KB>99`!;oA!Q(x?8p=cW;>7J$oiXv4*1xaY^a=R?|4M ziB1oy(me3O17`o+_9(p>{ZrscI~r9Ym&<@Bj$2GTcmEikxJ}X0>iIBlLw9z{{Q@1> z_7az2@Q;ip+A%*+0gI4KI_P#lc8!Qoq*sC5%;Utw2OvrsXi;*2jS4mdAT?GLf$10& z4T`3)#15|g|NAET9QQv_VrUXPFfmTW4Tcom$VJP^8Rp_eOVzd$iq8s^Hex#3N}hM) zNnoEO?>Du=i-5CTRuZ)Ry8v_|#c6x(QIK*0ThQ0(Xs~J=8Ln?|EJRKi=Ti&Kc~S#^jNWDwB$-~KSN+`f!w|E?AL7B z4GP9N^P4we-Q_SDG;T=`MeXJ)TP!LJ16c9kaRWA6X0b#OBPIOeDV4+2l$Ti^%&ZUeRt5S@Ue4|AM?f?1AYKmCa%X~5f%@(D%5;$uH) zJ&Sfc@!|`HHMx~cKtk?iDI4FQGZ0@aQ(hku)SrCexY}c;#R6!;v9&#B&7;6HG=Sap z6KJq2pq(I{3xn+6ow@003wtWK`Y;lZN_(a8$I=p4IViSWk-*K~em6E=K0{41Mde~z zCrnr))5__#2zu6(sm21r;lh>`8Y<7ODub+Uog%%Yb_p242HMvasM@A!W?E^mjT7D<>w2GEv3$cE09OC@st25H+se|Pu^ejjN5;a&pl_f9<@h?g>{!B2R)V%_4 zVmf?JFt4N!WCSB~BPDiBt51roR61qIXZgu7&W0a_mMY_NRedtUM2DiHco;FQpff}6 zD3y#lNLGH8z>~}a`{NKcw#?r8>gpAQrb9V$Sz21IB^E}MLFOTv(+qPtBO*&~b>ghf z^frPfFo-xBCI3L#jvPrz{K}wg7=Zz54vH9Lkc1x7c5&q5tr(r`hJT`UnU=x9!S)iH z{WM8{N1`Gj3g#5BrnP|I9;c+V&~$`B<2W;FIF7R5E&&c`HuLv`f(7H@mD0cOkT8zd zN^3Sq1IBZ7V`gzbNqV0H0Zas`LD>G=tSE8 zDRM^#4Hu$pA-w}UdA{vsz)*e#psVipO+%Gk4wiWMh}f8`va*tZ72#96{=ezm-_Y#^ zz|DXn-q0x9YZ<##cT?zkGhTUINuPCWZf>rD1&W^8_o&7I1148Dq~}ME7ybbAzlCIW z^QPPqL^zuMSxd|?!x}}3K6kCo|KGkfB5CZLQ89J z6Q|k$P*ut*eFr`rt(C6?hJ)iN8-L(R2?Un>m>;CV9H*u}x*yO}r0?Ls14AvfNBZC_ zJb-~5h9(UI)q^XrzmfAQy0*U)aA#DSuTC$h`6{K2E z-*BMbyL%MXQqE7UZq?-Cm+`y`$k|nIudE~+pk~{$P^B?o^6GGoR~!`gftZ1-Ed#vs z8?P5i7M)i4zC@z$e7)tKp+TuZ8vI1pat@AL@)*)lP+{Ka9Rzd~B7OOFz5!?q_?)+o z&nUp6j3+$PlqUJ!+VtkcSNNbIQFJVg-pAi;+SDvWN8nYFI%d7Ftj(P2_(XMTyMj$| zL;XgHiuEY$-bTv-bJj+Dar+x-2R1oI>ItKG~#3*C(U|=_R9WLoqLe@bSSlqNGGhqNIP#Hcj(H>PT z)gTo(3M%b5AxC`ZhSRkR8NpS7>ytP|@qy*+&6|^e@qDKEPca}XoC>cfK6=S!rgETB z|HuhnH<4#%J@t)L)6FVUFOM1Efl4J{Hv&ZffN2Ek{yFf1$fWmF%Jz1+wOx6F2=7f;xbnD|EcW8ncotYbTf?O8L+M{Xyy3t@ zz$AEh8} z-~IPK4pJF%hGZnoLk~DwGrYW~&+(?2N2VeBQ0@7*rTQ*xG8@b%tIs-$d`h`!9X0gi zSo9+6G0m^JMr*@`DSN`eHNIIeR=bm<;hO?0X!%74{ja>%*;WvcYTY@HuiG|sQRg** zC;srGIB!VmINRS{5BfQCz0Sc*lOaX@=R=;w*M|1jan{ZesM?#kuM6WG7ygCw8+WJ1R4brd*mOgQrZ4Hp#S^=uSU zSz2i(6;*JaP(eu%*qD6?`s!AT3C8WRpWLIGJq3=RomWO;ouBSX=&ZT5OfFsaVrtG) z1FRt7oVVVNafUn)=ors-0bi1s;|Cz}!J_zCSn|{J{}y_EK0+qvj^;aWX?yL-9T-w* zeyX#6>T%xrQCv)`h3gBsOEwO-wMgPAoohSm%eW@eO%Ky@ZY_M?IJ-@FOZ&OY{k-%x zx^pDW#;2lC=?*QNsm+oagwnnSV>%P$3(wE@II7dK9R1tey(jHGoowX(bOK_~qN}(M zr6m#Dtr}c_96Yu!X}8$!I;`&H%H>9}o^YRN|B_`H6zT!&%0^LRTD|Np#UkaE-|4zN z%)4m^LIOd#02C4w{<=L^XoZn_{nrXC=mzy3WBCrL6lPg8TjPeJiNye?{mvxd0T1 z3QM(%$!53mS7%RYKj|)t+^Pz5a!yk9%3Qn=nk(rKCi*?$A0D5Mh+-tNuZ?958NO>A zObe8gg7;1I=Y7|~vfBH&W*K{t&EmTGjL=k9HI@1xwb^-!h}7{}(+c+y$K>(kt1Uwd z+hRgJ(^|ilC6Wo=?XvJ?XnMTAH4r>*nq73h9~9J_FXirwP+n6=?YO4>>APdJojDG) zgUM#d%cI15Pj>Cj(!b|6dcK+@?rrOV{Ui5VJcO{mU)amPw|6^NEC3+23D)BgWj<-7 z#;e`k9ect((|%?9(pm0!fYNLq*OWv3%#fsM z^}o01la)ltHm#9=YZ$1pk?HsIDkR;T(JLE^eUCc!^t;&iuRQx@mXMYIe8aI*7zBhX zV?%y6;iDQmx(n~7?~~x8bRC9kEG);?JLkt*y=>^DpPyyhf`w&1-krX`CrR*rzoUt` z;|HG4m-(J1lDv-fqhNiNiX#Jw{Xwo%IAr61-9Z||iTjmUU*jAGZf^R52)OFUp zhfg?HPOLDvTmR=dp-|)Bq1tP#+|rMFJ%k^LYM#E@0-}ly=DdSt;OasLmg_9z>$tZ; zMON|ce7`e=tTr_t>^Lkjofj+7`su;Fa6?PfmKTyR_WKVwtH+&C9`-C7R{Gzl3PM>1 zs&tj5-zn4p@dSj1#(0tS#KHK5y)t)~av`Jct|#UbW4DTK>qL_FE-;;4UK8b6%m`}O zYa6=%=!)HIn}e0F+m+R-@z0UwB^d`FzD;XaU6cXvY&Z{!mja+A!GN~hxFf^Ubm;PxiOh>Er7~h zp!Bv(Kc~x<`KFU#u)WsLaTT@29HXd(w)JzwK{0e8U6D+#ADrU$l>F7|t@zIJ@kI)6 zKIQyy(!Wk56=ts&m%kL)GtZpAEU)9BH{w>_$lRfT)=lj(^4AgA%{~Y>4eD=})%4;1>Qn z6FOcjDfzZWs^Keknt9v>xJmVXOTrCf9ocgB*&gw`&Sedq`+qvK8taVUNzjBq`8Gd( zsfJUPo_OUl9hcG%LurmwlWIa-+q3=WdUbpwYwsSU8(qPi{%)2UH+&OU?9z`2cw#fM z*(lZIip%wct31EIi-JU4+!sD91U}kdaV73poDRm#c3Qq)p?L3uTRxGJ|6t3s^wezG$ zV7|=te64V6AGL?@QlpvR_vkQMr162HRn(G|rJT5zzW9DEG&uI6_p?*_M|r`t$1!AF z^9y#IGK?5cjih?Axk`!Rj_#9lkN^GX++QbovZu}6g!;yru~!y0j(ClEYuzN%ezR;X z(LN#lQgosm`Z+uYe#)OKAiAxkcaIQHYb3ge`K7m1v1CFc(<$M`)dlmVw2;* z`)29q3+rRgy?IJCUWVgFR`n1QU39OhB;=mh=&Q;OvhSP{u2DsAV$HhCR!CgoQApMZX5X=seke}vt&jT=f)N#$Cwf`B87E1r29EBE&Eq>stue|F zi}h_`JxQhsu{`xqXk=9?mldt&Qepy3(@XPW9cYj2m`)S>{#kx1C1X+6#%PPNu^Q&^ zW@(TP6Z&0dCcNbDrgWp(ZpUr<=C=FV-A$)sRg@datxTURsMm{)|Lrq<&v@#)Sd3_! zo!|PXU(5QK@T*3GOparwK26~k&%;L-(~NE=dy7V`8TIvC&%0WZtE&FxEsy)$F6%=# zuaolt)KX)^4~R0k5QBh>X!+DF@#rb6zh}U7(WWW>&pq2}i;Z>pvF7OE5<7pwy=dmf zJEPyQ<@*FL((Hccb#WV!k7g9LyBS3cj+_`v{Bek*!0=N3j0}x)zNJ_nLTgbDBJ1foRYn7r&arm2^w#pu2lYX=1JT4Owl?f*hj{Yh25Vgcz|~EB>7X zdvFe-J1&~3f9Y)X_%(VN$s0Eq|7R0Vh9|@aUwoWM6c*0jd*J@yQs>CG!&xI)dL~Ax z;o+9e^;2_6A(3H>y#~R~r%rhZv-EW*{pT{k+TV8V2d_50zp{sod;EDQbFXCcz0t{c ztwd@)a_>G~l?kOEeLJ`?I$j)RKj)vRWOUVw7T*bOHq)SAH(TP?o2QXJl}Fabz6Md3 zYLpu@pLZ{1K5$pR8waf3B-WK=$ttLx3^$$*xrp7dxW@8omiD}c(ZkIh6&9BIuf1~7P4}idGv?9 zHuEHGv0j`i<1U zRD?z3_?@3TzG<X?>2m5qpODx7rPDbwyRJgapm{kI@(7bAHsK%CsR$vUx%RAIb^w%kon(Z)cKf% zy}&?2?630=T@cj0&!XkXtF{k+h^!%OIclX&vLLFBtCKxu&>s}Ta!=|p(b(O<#(G_! zo40;s50Z&muBqi^g}(c{Vts$V4dL@&?$fCDBot)^&8Zzp66zUgAniD(DdXCzTjg;lN zrz*4?6?2oHEH~Q#$+ou|I8@h^ar?w^nb4;(F(?{o*Ein#?_EdzxSnp*!&1p;Y3Ook zYOlp&_sX#)526T?+1Ynostl|@WqEw9C=Y}=Y@NL+hI4wmV~5N;l0f}U;h(RQ{95F* z$?IA}^^n@7A3xN}uvIAjUNl_ft)zj5PKP|GH#Kwakrzd;tDJB+OsJN}-48!|%=p`t zz%AD}k?l^4BJ`0nPwkQz{XLXxVN1S*E&0l@DuHZ;{@-2L_%zI>AxoU5h;nz+WeRN~ zMgDD*R9UIlTvSP~gC$)I%JisuO{u@A-Ad9^b*ldR*q_|oUs@q@WicjoBUjo5qMa}0 zY;L_7OMBOP4fX=mQqtE$&O2{CFR}Y3HR?#~su(}WfqXIT#)rtSsT`E!o5l4UM+F~+d?%8MC<((!au=4FNz`+)Fb@&i2kd_lK zxp!Nen))P!9COxmTQA#k%5P38XD0Icl z7#ryk$Y=BdO&4LX=o&ew2ywmMVIa5EVSa!D@p$w6!lDp!n&3Jw7|vk`YIPbkNd`fS zzye0r5v!kNVv_z&de!W2Ewd#Q?tH4PZP=1`+ftJiBVN@p@coeoc65exRAiX1a=&y_ ztvF`mMK>-x?>6hdx7T2X;|Ty$EokNQU|uqkm)&uy6Di*(;w`Nr7b)L--fX)CZ8DCraetUSHFy+gH9JGo=z z5%>2$C->G*;awJkpYGxp?2qhKJh#xo8(t0ej*1n^38}JiqA-?E+9&FqRVwD2#fTSL*`? zjju3W0l9@>>_iYKKTm+C=~l=j%EC{Br(Sh6) zLUv0RD7+CO@&gWxWex*vx8tQ!kM(By>Bu_`{XAob%m^NR7o(S{>AJ5<6idn4`$h9s za7d68OYcdj&CamjsapX&b_BxoC4h*5CHGVztZ*>!SEjwcFD532UM@^m$y8_Pd%4mv)4jw+ZBPBDvQTXbp~vGcNq9HT z+h{lWh@DYf8+Yt9p(;$4Sn!Q;5pZRndq;*__0%THi6bcH)Qy_PR_S*+;f;S!4Bvy* zj~u>zpukAf2ase>gXC;^bq6MNE&LpK=prvKkLNTMcNFJf+1&*KuZyS1zA{d5{ptD` z8jV91-#uqqTK(2(uaMR~k~K+bylB#Wa`u%emnz|8P3w{9ygLWZcgzL*&F~1hb--c=LYj3(YW=X5JgPAHwG@tZ;ML z_g^*rcC)#-bzx9wZsp2XImb*(*Q>TUzHkD?Z&FvvcXO@{C!>u0p;Q zjI7FE6|UmD=KO5V<8D854up>x4mZ7s=jNh073aX#e~4(5IwvtNCy__2tQChCrY2z%A~Gg(SpPrheDjw~p|5dJ>o zAOL@}Y8k_?Tg#yG6a+J({3KYUz}|(*j3)5y&*T>3KfFVE(hL4iM-P}ZaO(%JQX+4HPA=TZ#A6&*6Y3#i$ zU*3!*NBh^jw}&dU9W4*c?g>pqdtSLIdi?I&Mc2(KhNDMXd~SZbg27TOVXR*3&G3BI zqo$JE*$@}h7hj@VS(TZ?GM(1b2==fzCj~k~CiH+3d+WyRbNm}8>T{cDcsk<8u95-O zD1jy>LhM>SSP8Zy+BSdA6w~wf+h&ZY*dbNF z%qWE?p*gxxAtw~ZwB*@OG?x?XVIZUR^6nl46~VL-_mIYuv($Q!-*|mzaIPi_X1z{7 za(wVrk%KMAVBiYx?F`Fe9rNNV9DzH@1RWAGsV>BbzKKlC;Agy zlmHL%ml&?bogZvRU%2;vJib8fGiSYzyjUXa968diBaCMVQHUcsuSK}X_6+RQ{9rc7 zW`olk3nKtSvGq@@UIQac{>F{?I9SVSYHIl&%6?Y$fBFc~vQFk0XQy2nXt!$5h@W@O zHVYYj&T5o8&%wZo4S>Rfb`|HfdZys}5AzDH<2y}6|LeN!FwUou2N$d2;vzwCr&0^$S@ zf{ohha{)G*4X(!@+e$9xCeYE@*$z^9k=>0khVHV?3$d*rj41v|E!Lj&w=$<0%Hhs% z{=T(ywT)fmahC25z7{7Z@z8vZDY3h9ERDhhiaLk{M%GW1!Ua}-A~JXeXNc0a>&0PKeZWDC1cn7BWF z(5~mKJVzFbJzASKb17{ipJZ_G;nVFmN~NJxi1t9*d+()jwD;cow4e9)l*{FQe!st-=lyq5i&1EBettI{gQT2XsEx6=kBg?ZE)Dv(FK3ces02=iC&)yx|OfAwKOrGJ- z&nKX?bmO*GSv!PI9yxMk;arsa!{5*#?fVOoVO#4D92b@I6?bOM2FZVB=KiC>ORJw4 z?@o2X)_7bEPPy5dY3;foM2nx0zc<)OO}8xi2|E|)@xNY)m%n;n0dyRw;;Ad*$ax~; z&4m+mX~G`!){&tIc4?S~Yb$j9HXI3BzKq8XS6HzP4W*P0j}WRlxkhn1Fe5Wk_Z+*Rs6jkOVxU(gcDvaHYL&|*HwMVi*)nb z7t+jU3#oTIUH_n#e}LVbVDA5Xl3HpD0_s*SiFn{pn{(5U7WACem{Pp^m7}Ucnq-rH z^CWe)#m&Or?>cvU{i)NmB^tf{{m{rdbsQ|z_g+Lll}N-{z`bBRwI<_xpP9;ycqU4P zMfp^A3%oixwyLzJMYUOOPHu~0d2AohOVL8`bmU^>v45Gm5;y_!>}!-&S9{+Y!)iTH zRnl;ep;-d14+V9;#c8_vEtSGq-G!3m_y?C~HC3^Q#oHOMYJ+ z6083sFCcf6{~1AQRKlICs}FnnhqVKxQ7HTynB-Z5V14p-ON^)3jtT8eg4Lp0wsg)}CEApoa<* z^5l1ITwiGL3M)4d2U8y~1<3b>84#jP|Kc99W+iWz`Sj0~y*7zacL3Vp3U%9Ap}Bn3 z*R1fV%YOA`9iLN{W;b_N7oC&VA;R|TOzlRFQB?d07P{2qr&UB~y8wDF+M*ZtiYm|b ztJ^N@I_i-)_M{7~@a;y0&&{Wuba}WNu(33Iv*~92#5J5bz9?QOLa}7r2j{EjLc|z# zhZ1AH_B`dBI&Uh%o?y(=)br_>#Z(tl{#H}olBrE3zrJY0O;=_3TJY0&FZ~~3-kRX$ zmD$F0jIGmq#o3grgXA5Bx&P24xUoD!v?s{PKQ(6|H(<|rRk&?AElyi`YDmhCeha&x z)>!u({Z;dnOdDP}3sQi|(qAuz6%8k=w;H+n+jms?G`xWG`+G@%tK+- z{w+KkpwvgG5!T^T>m($#9g6g$8$QQ=u(`HH#Q~kxY+iEcf_lM4bmE2s7I*pL8~P$L zAykzk_+7L&Lh^73%cmA}uE_j||MgEvYMWe&9X)Klz@_Q&&mEo_$v$}vc|^jWC1fF= zr7qPJU~I(_TsjmQQPN+f0n0*X7^^-4f9GAD4K!}*uqU0*uq8yW%trWr<%7tp2ZJN@ z=~e!R70DQz#C(acHQUvM(IegH(c<(QQtI8{Yn=K<;`OKC&xVUDZSy+2VcmRAxhz_H zaH+SCU*kQCMb>Km^I@E0hW$ClwvQHX_0+Nmkk2dR3FxmI9wEdL{v`jiEhHhs0If5) z=&>{l@R*dO3FH9ew{=n}d#ioAle&%Sr0;aP*h;-3OcOFR&15lt-}mmzpqbvu@X= zBn|e?WqfR3iV4??c$<9Iw^ImrBg8RhZBdtwA=xBs|JCD0UOkX$|1jwc{0|UrRMWbi z*Em>a6_;#8Oq=FGL}RqTXKEemDLoo)!LGkW{(0%tRhJC?`u8b8-${EWigzV?+V-2E-`74;2Tn}$*}%x{&>vJg*Z*h?D= z;|Du3Gxbowm9c-af5+E@|8E?@NZZe6t=Q8#MfynB2x(ADwxceV%Dhi!c6ex{E%U_7 z3zF6K_3m&^upzi`{`WOvl4GLCnJ5}S4ar|0RlUv2wk?p&`=WM6MN#P}$HtIN0u z%XV3|M!W80XqA@h6O+um!sAhks$PV#C9rEr&%cwP30~{r$;kxElb^32;46)9;!YYq zn8?!>zS>tEV4T4cg1m+F&1k?gC(PcTmp@wQyZh4!gZ`v*Qu^il584tdT8(cREeQ5` z8&5T(01@_g(n#hj+nD5U!kkwmN_IEmxxx5+2IVe7CEW4)F|g2dh*u;QFPW#{@SUNM zYV5S|D39$UdTINJ#Gtet{dh65d6ZXPg z^a^3$Ds*v@Hsti^w0Pnd&S;@|aNBThT3iN%21L5!vO*V5{rhn>Isw;4{fWcAt@^6B z8gquV@E^ueRa8u6|NbsUZ>oq(BX1Kb@qM__VMSf`b2NBy3aPw5lHT=u+^7@0#^9*~h#gv^oV$ZGxi{4r} zmK_T?SzE)c`-{zM!NxIBeR;Kc*z37W%MYUm0PSaFhdhHR;q^a$2@4FWd&WD$ZG`b@ zScE;*8@>~dy`Zk7&H;YM6dV`9D}GAz>}xk~kGyZ2e@Fr`dwO>2QNh~BTskl(KH;7I zuI`Z2S7&>DMG|hL8n0B;ZNdF95g!>7jk>X70I804U-gx}LDW#HUTwyQ?@<`LC(qp9 zE-QWIxPMYI@Y)mCO;KT`YM^!np_Q6qAy}+J?)JN<;Yv0>y z`JWjk0{kv%?F($l`D{w3Oe+SX@px(-+5)pLDwP#A|NMwaZZM$U<)x6QAx=1Uuo@$> zhfb49IGjJ^iU|HA;;8AfdzBaXTyuH-+@yV`x-s>P*Q2xy(T)4G)|1brLKyNTW_N6$ zWp($TLXFy#v-)BUFZ?6?bp%_=p1KPJ6=xTsn6!K0|soW&<^%5NXc4k2cHy3%nigGp;z=d%^QmPR6TrauOGc@<{nF-hc`%jZWZPYTm7 zE0jrLrgA)=v@VyOyCAObd`aAt$^$6woHg-Q?q*n9urJW3!&rj(@r{MmRS(!Da!Kx= zI3S`NMkf6k_H=s8;kCtEcSO+ez3F>|e5}usxugmt-m&US_iz%8n?(f~7Z|Pm6TKj0 zJ?mCJ)Fkkm(1o{>u}Z@g{3H`*&RwA|*PVs^`2APJ#oCL1HD=g;mHtPD{|3G=_1>+* zUY@V)g)Z9;*ex9yHfgbgV};Hw9Uc1ra0*h)aIRi zjfBnY&{|ztCI4$&SiWKqIxlz8M|k;PwUIHF9!qd-F)2}F@zYVPznC+Yiq?^huAESa z%ZIm*Qlp{pRZF)7Lw_I}TF8Ee!95gT`6~;2O=g1qu~GIa`f=s-9Rl6Dgd~dww1)ru zG0{(Umzyf-zgfuSkQbQVxc}__XxD;gSqtyybnM8{QUF^Yfmlq-xpU`S(Tw!Ji9XR$ zCI<9NWm1~*=O@vl;YI#br1(aj_Q7|AjUq-wXBKH;zK)%Vd@+pntIKFSAGxSnhL)Of z2)zEEi}h#dM+b+$^ExC%>3;aAbU_zQ zhkygvuQk4}3uw@XF0jRaqJA%SKV!z2Hte~gB8sYvFv=Xw$5^~Fh8CK{f>#{c8h!ZL zcbY9XtRMJ)52N4=DiaR=?~?>ywL<6HIU%7aHM^kSdMy9IxC7ivJv)RIP5)y1>r6&S z{M{}QJ@~3pOM+ACo4ols%QCmKcLvWFDES-C#(fNwyExeILyhAy_FD+i2n-p7NriD5 zlOm1J(5)r{_M(`U0ffq%f0kv^`2vBv0Vak}LIjBBpU-y#c)54k4jj%1^OvZQa2Rah z3JLd*;v6F=2Q!K&D-!jmE-n2NUtq66^RwPaO$Ha|&SD))!@bIG8DQg6%*J}lr@J*J zLfG%57IbfG+_>7Wf<1*-lLGJcp4*%jDcwLysljGL=omf$NrugU;3Fl*kib~A31Ct zDOqu+e_p~q^Iob|nidi0e%!P8*R2^ArAdh^=gIv?>h*Fu81o73+o!%@7kfRHPzqEB zxWtGrNf$$G&kF#gKLQxL?j#GS64(+6!Tbro*F%W+K_c9d$Spq_etIDxTIf|`UCIZ0 zk^mIcRyQ_QewGY+vWPdG7Ym_5U|mV+c=So~qVGN{ zQ_~@UU}bD7e2NJVrS)SBsGwG*sck4iS|3TXT6fPW4EcC%99GA%ecdrr*iHN(l=j3bB$x7T+S&-w6KX!yd8%Hdzm_v`7ilvTo%n zDmnLCF)f$T06|BgfRSXfaJhZ^ zI1se>D3t>HjCQA^S-|aR=uxJ$8!aN8S}5>ZT+BB&FaVh%F>%?SW7OwkH9>&3r3)T1 zPs^m;Eoe>Q>YF*!I7s(^XoJ>@XY`s-kCttUiMbm$>_zbUc`O*v{*k_2sRW8JAkxXf zpa8NI@`PeP&=M2tDzaspPA^ZaQ3L`6-&5oD8`;a%ih`p_)wJB8Ptnk5xDt-zt_e;8bS#I)GE!lyPBSb-1zgt?`yapXH zBu1^OpkOL52X7h*1xbnPj+$`dhZdND*;&?Pb7YTjz62zlGELbl5f3_?r>(~9(-q>j zpUjRTQ%fC}zHVFQz3eCl&_0?8P|m*S!fHE-1epm?J^>)Pck(;}!Mh~!* zn+ouA11{}fFL4&iHhztbc#y+mH;Fsc%6VKM+SC5l=)m+OF5tuhF%-HXG!-F`^<~#L z$5%h!dYtv2y3)rt_(sCpFnqk-;d3+74?Fbs6&OS=F$>A9sfu}@v{Zx(=W_6Sv2=hA0HS7VRz!7@S$iYTf3RO)3Z{J=(mz9Rj3ODJ2o{&-P3h&ldEkUQr%>+R~x z`BHZ%*l=)_n@U!*omA+?ZLtJTy)mr^6Z_X`%v)K6a3;)V_t0jae8QfGN&{c6p#6$#bTpkA#HOIr*iE}`Ku9J5 zWO2Oo^TU0zb*lLO7pX%i9bH{W=qjUc^6~aY3Wp)w!>rf-vpU7NBz_m&ocH|tP6+qR|0CDyBFjd^O4)< zmmP~}C99~0e0p5i+Hvv`-BJ9=_=6c;3?JAlI^b=B`=K==I3;V7RHfx#<*?Nk^!t>e zuyA$PKFBe$tqAC2vLSesHPtn++_mKEs?m$D^H5|AP#*`GUMN?{((GGhKf3xNeFN`o zPv)wfr9)L22tbpVcz?4)w3U-@r5%6lzHMmQT6u@NPQ6RCgD%UL(5TDtL?E=Pw+!gm zAK@=H53Sz$BxXUs{Z8UH0Rd~q;MkZaR2$-;LascxKeAh1E{cR7ppZQ_X$#McO(VB$ zYUS?0nz^9!)+{%wn4?L6As@R=T@juu&~B}AKDqsLL~F6(bZ^OjPC--(=BJ|)ci&=% zx_gp$O;BNwuL^Z?G1cP{a_@PbL&3@iaQ{DUiw|(TC28L$4s^JpS zo=WfZ1*OAz0fC+=J9v3Tzeoi?*<3M%Sb@%|LZlZNq#yAR9J9GTZyss|C}Y6&?@Q7u zPMDt}f;R1gKGn4xy?f6^32%WS{Kp;xb)mgVYDPj2ZVc6HrTtNr>6Pi>>)>#N2!~@x zr=f}pIqDn>%Sle7wwqE?ueNz$0z%>xAd1=X^Sli-Rzet{dZ80A>z}`T`6w049Iu}9 zU0tido)b8z%l%h>O~8=#0oZl$Lt|U=p!6Csa6+yugnYUL%)^dnhH!l_GKhnp9|`M1 zjeYKpr$Y-O>dhW@2d$GO6AN!~K1=s2TR| zdoyx|V8#anW30e7j+sjv7ifl{Lgxm&SYJ}p}4E zuO|JwV#-qCf<>!f+p~gR%Xo?jhHQrW>01R7y|qP%m7x}{m2J!<74>e5#^Rr`%K}0`sEs zCovd8K6%kgo^kFAeHo{}X|WKJUqcL`VlcczeU>j=lQL+Sf&JwTT~I`X4_M+En3<&#xM~_f{R7_Z z6OnU+LRZCBw6J%g#VtD^*gs2&wjwr&iExLrZ&HaWqxP8y?su7|^Y>h$wun#qvAr=@ zUPyI?V^4|9xc)q8jrV_MJ-BFvn^Q?h@(_}42L(>!;c1FGe@QyUU7{ zyWB&b#C;aGaq#DhvZkJ&ch)MLO;|5Spu_P8jeWBLL4$v=0;V-0ZMeWl*Q&R-H_wv+ z6v*b>4WjHSr`R)$+DoA(tfk1s#UuBE0|(`6q?OB8yj%FHm?by%YTSD&t$(tx>#V;} z|9m>-?omuG!jeD$rD=XgD&H<;E9s7^d-0Yqm78teWOJI>armQZdt}c=G z>{)kY%@KlxJS4Zydcu$T1h>=qegDs=J*mQ|*DZH+pYSmCCib1bfe4jE@>ds@8FE>u%!U|$79EBm$qTN1o z=9P1*K=)f#!Xt-1$Uk8`Wz16_H4C2?fb*@pWeh?pkY4y?%>qi}j^yVh+Be}G*aAW9 zke7?IySuw)+PQfSH)QS;ADbTTc~E>LEgM4NPEDC1nU#_$INsR!@T~(;ErqxY&9rX z2#xI<4`_t_3|5#@G&<{7`lXj9`+WAH;>A1M>{Dp+_jl^PC$5`Oy01qi;;>~M+uC7X z7A0gE6h9obG5jtsYD1YC|AtDtE{W0GgnNMGgf9rb!Xio;qcybYG}upkUTnu`giWJrlHqUBWF)NqyYutfQ+8 zsD`y~kkJYSFEtOhYT`Gi6q*(l>qSjGbjqF=*(TkKXlQacKXWv{d#Lx!#LKpq^Y^e6 zOaiMM=ov0=^18lxa~c^#p*^({gs@040#ezG1W>r2AV%5{khU)bD1dstz?8tq|J8?E zXn+u!{KsWVx>Wv0oZCL9nA}!lx_`lb7shDM1Mf((VBXrtsJyiqRXwWo`MsO;a3RVM zj7EwxUR(b+q)1o7%s4ePp zpiX*dG*qh+$@PJja3m!M#G6VLhLOm>LcJud@A!?Kwtw$gU!rEhk7KdxX72j!wajf4 zIp447cI?nurj19?&Tb(8^82$Cs8}c;W@jgYK6U_gyz=r6R9BkzlNXVqV(S@1Nul1E z)22qAaRaxC?U71*UPqFvT(qGpNX0$)7?j6N7o2~LPtzTI=1lI1YIsK3^{P+LbYwLt^Jd_tIy3llGK;e7P zXRt}WQPF|RRmgg-N8~1q;&w+89HA& zVOlslAewe)_BBkiuD z^~8e7u)=Z)OW@$!d#zr5Zgx8bLo4=s?#|P|c>)JBD2gox=J_skwC40BDzYG;76_Pr zWj|$r$Ti(GguJS*c*lBXY$wvyP^}R-qE&se(rGaZD#Y3n5t;U9ZqChb%E~vjg2x>0EQa$!Tux|pv91Z{-p_p|B_GIr{&$&PHk+Ll$yR*|@xE7bs)>wPmLoH+?Ol0kYZI z>h;rqro55DKHMW9Fe~+UU>iv2+#9g0WzCtJjV=2@Myb>Ipg} z@p3t~2mZ1fRm102M9+G%wEj`j+(lTtz`Jj%f*W zqedNjf(?Bq4ppeXE=h{e6pPwedzYm8nv{dD{^r()wOTHau83X~U(G`q=}m1foD-R;Lrf91I-ZR2S*B0=+v==teFMCL(efY8sIh@`ow%HZ)1_=n2MKZlE|w_pZ#ACY`4%_BQW#{3!+IFYx>jUWKDmStdbQ za54)V#u_xqyPm{jQGkH(UsgyTk{%M&1~NxD5)?yN*c+HMdV16WXhXIwILcK8$qAhR z7WCPebpFm-_nJunJbdq6!I{<_X|PzI-^&vnauI#UZi0RNOC@IH-6mw=GyOW>;#R{w zt_vc(_!wDXy^=<`kLNKn$aUY3Td98|PJsqqo;DyZaIGJ#J+bAFbJ<11)u%g@)**|i*Ym$9L7~oI626MLupDg1C@5~XtukWlFidE2ShG7L6Ri*RLBRpgIZMTG(wykdVuSx( zihoP}C78?A)v4J=4)hkE-wOm$$nObw-#Qrs=JMbjfyHiPR`ytV);KCKBBz?Rc#8p- z4EdXmts4;%l)L)``M=v54HHOri2yd_5>A8sQK;m;f5KAKulj#DE~a6VDOLdv8$!}; z7;5@boR22cwd2Ypg($|SOOy%Zq{22ZG%cc4m*sRyC=6{#%eaNS5>l7}A!|M8O!yl{m-%$LdKy{O-}g{(Z7L1G0I$=Gh-4_RqdPtI)E z5cYNNL^-PM%W{viP{m@YpwHIURHzVetpN=5W5W)yWoc_`AAIPPz8{f!nvkaz#Im;= zD_`+=z$X4d{6pG5kwk*|L1tSlqGB~>q&-@7vnm@94(Y5<;Wy4UUq`_)QFIG!^*m zQf)G@Gu%tXkLN%Uhs)l@q6rpf6T6OLycwfz0uGFLO^`$?4*mLKU^iX~%s~iz7?&v} zynasrzJMR;Q6@~L^FPFnRAbR3FC>dPVeFR;lLis7>$j(tREmg&8vOb*i96m|K?mP;~!?d(38-16Tp4M zYzP0s2SBIb-A@oyyWsHvB>xvL{+k>S7x--vLt+{E?c}jWtx#k86x^U(&*7@ji1T0H zdcEikrXG{r@g-%rG!y2EC7Hn;H4I|1f0Bq?$Q%EDGBZycM*-@f1J*d`H^c+OmKzNA z2s;3X8_QBQB2=$^%k<>gvvdO=cx3e$c{lW>HEhn@Sz~dgvP=8+hG5JWGw65r3 zF#IPt#Oa{FXjri3oAAVDMH9F+e$X~RR^nGPe5fNRw-Q%>q0Qq#mt;y|7kM(#eExH6 z>|xaQ&Q8l`Nn-E>m7tYr$S@FS@aYpMPP9h?$=~PL*Cp;k_5fyJZweBS=DaS8{?p(W z`MUi?(r98lc?m(y@dVY?sqK1rGJOJ z$w81ti=Zj^Vb!C=zn1J|l}z6C^CIliL7U|;C8+WD2YR{iy(R!9;!iX1{3FW2f29&9 zXWoc_w=f|g;mHEAe2w>k`X#3Gg<*u8Zl7Oz_Od@~Gn%GV^X1KH%H3MdxNBpQ8jZ2h z71L^35>dQzsWN8l6u{+mrX2hGld(Fc;Fq6`JCVcMx0*?%RlmXKn4uic%hR*5@OZrV zqW496BIILrb<-Q;G6v5Wb1%-E5kb*C4k#0CBSy6uB^ zlvXL93x%!fFtnwrNPTRiCR`rbUaGf4pr*zi9tL#Rv5YGIhW>kc)eV2WBiSdv1`S^= zhG+P)pQdzGyq4}0uplWG$SrG2&uJcuG84GTu=@2jY5uoid=sgj3usE*8|60sF302w z;$9%?pn&vmRVGzt1}INYPocKu-JNx3k8h)5VOy`fiGrb!H%cRHJrV_Fu9P1uV)hS(K$PNi+ zL;s-EwyaXM6->mnRNX!7-)1n|nGt6FINY(jYQW7datu*_?C&?Z+|7Ja$?C zwAISo>&gKp#ZsgQ4~R`$d;8L|G8{10mO=FAlacBGo#?Dbb)=Tl9r%EP0beR=Ys=GT zH%`-&YgOmh%TETX31|uWGo@mk5%1IEsu$86c3!Cn=i+<0aA`-qud6X;#8T;!m$2I7 zmZJfc)wn6iL3LJ`8H2TTV&(i8LxFZU^ovk+anfC+_L4AHW zYk$2LBW}C5vp#R%e~ix26{xN<&6Hny;DJW?e(+2^0oUv{__kFtj7ZL$IkPaAH(#oE z9WhB)H#7uC6B84=Ee=;f0PsVI;6yqq;R1RB1@j3e@0b4mRm~qoNYsOeum8r0V-Ajq zfk|VNFrB2ad6$$cR>59r#T-)F72rSU5nDpND|ke?At*g3%7I3Nn-BmJ{AB)SB<142 z=Z{7+oSTw?uX-aN!L9`4$?F1DJ8js!%78vUgaYvT{3%?hhfzwZfYuanqI$2aSV91% zRN*{~>d!AoBH_Hb*0ap$g8Y2M83vg=$?7?0z>2h{=1UBs-gTGL0r>DXfjh!-p%fWy zPEPx2WF{8%{q-v1rya5- z1b~Zh`_~Kq<+1T`UAST>S0Sg(vv%tL)t9(l1(jYo$2-=r!qFR1d-`lwzl>L}T7c<@ z=POg6Ln1-XYW^5rLTHN);$V2P-Ssr51Cb}2a+0Xx6MlrhT%EHpF-q&`=!iT(sA90H z8e179ROpnzl|bq|AtRLj@?~hE09F#r**GYyAKdEX6l95C>=Ys*Y7qg3#!aYywrYjd zKs#r6WCsLO-yTX+A<-A9y!8Bt;cI3Gh4m*4J}P5R*#QTDr-J~JoLS928EjVE;h|n>5Y&&e=hydI`EpYbfH%FW3!Q6its)4^Ky+w zO7&NgB~=*uQ)lEUmiZdo{3CQ-Mk4>(n-}G#gi1?Gk?Pr%X*3}cM-RUY=nmQv+(3~P z1FA6#Rt^qg6bM^1X3#5(IZg{;@LRko*ke3Ca^MSBGGH{yPz8fQScAUGl@NNXpc*|Z zLGei0V-Oc zs?d23f*2(Ut=63>sUlgMLSeXSU>L_wYhB`~TkQQdKT?Is*?MTb)pzx1@$pCQhAaT=$>6Ki-_L}v4-)l(Xz5J8z3ID(}IxW;3EdDXDyZ|^E-yUrU z6g8~INVqf1d9|xh3jlDOHjI`_C}I>aYX3ht#|;e)Az1?#mMMjA{|E2*7r>bL_*50K z3Y06xU0)x%O?CWm-mzD&Jxm(ia{gk~=1igfA<~t^kmq%bYdDIL#xged>-Mjd>{xVp zT4z!1I@Jx_d~Mr9jJv$giFpRk8Z%=G!B3j#6qyaW2;mv*?Q6vfec)PRI6K|Mnazwf zOMtVx5$?71>kZsvJ)2Nii`o(u?-1Mpb|Pg?7~H6kSmF<|JV^D#%;ADK{f7Bsx}BG8dq6m+oyI0nn6E{#Gb5j zj*gB#1i=fk>%daTj8*MC=y(eY0Mr52*;%Y{0`TpT*EF17B+JmRfDv@;S;h3rXSBpT z6pK?M9uVlPYibHz9vK|`_==NvdD;>LYo4Z5o{o2RXLmXI9DCP{eRC#bokfZ@NXPKj+ukvhLHd}eFNbrRBd0&zx)4^R>n%|!1#e(&;Ti|Waw__ew5%*HYU3L{Xk^%Kr?gHc zJFAdgo?H1jG-b2ZmD!P@%KD@0lSAWKW%Q(FBE;z0kB3Xak6!P!D@sp8;=$!MMrj$((21|!r;0&UNV|bn{6ZUptYb9@~DcFmibHCxc!%C{m zu{;tkj&sUbnMRi%{oHSI=89ATwaYLb+e7KK(x zP}D!&S6T|+_diN^=xR-?=q%VQfTo&Q-Spb6=4pvUHpR|my&Gysd>Tf7{6Wt~Ymp<9 zjkJT%;S?hb3;O*@i#36STjI{RxF+PT?klC!5rWFoywYauolIK9e@+Ygs*Z2nX_%N# zpB4Z}>YnaC(UM`TYzqtcUsbhJO<5A+bTjq7%(NoXtCvA^7#7~Gy; zp@$G;xc5>GAY}x&767Ct+LO=>gnMnwe`0%T9xT7LWj)!{*zLB#pX}ulX>?4dY$B6- zm#O^0@@HJTF#+E`t}gKToR7!pGu-u)-xE0qC^|UR{W3*i*85!;u3l}_?3aBB$rSa` z!gSCY3Y&riJhy<$`Nc&$Q-1vT5h*T**ImEyy*CtKY}i4fL#48o(@~HG!FPdLL;?gT zMfekw-dqw0)Cd!HDSW~5Onu*xqO8|ScApWhkp+ls{c>K;aqN`@_;8OR(IAb;#jAuQb`<_$I2po*I4(M*4FpImXVn;*~JC8^ltGy|m!T&&|xhGz7OaY39EHuE3 z>B7>BP=pZj2Ej0k039Nw=}6o|!1!w#eo~~}0Dfx^M12U#B2axo5B3=ltXQHOZow`u znhOZ7gR!43XzY{h8*b9oPqiK&BzaX-$r_*v>q=9Ma8+!%j75s-q)}M!Q!arOT8OZN z@m|4#2jz&ur{XGyvTajmO@OSLA@~T$RN$oh{4T`lw*4f(pjiilRvQ=(t4V`#7j}U+=v{D`Qb3>Ab^Owt8>6@ND!Bu^4*)36igz#_EE^$X-2>+ zjjN(ek178b5`8B$-HyUqzxg-WB$|S{fJh~6C6Ea+-y(Osmes1Ru$1swTUqBXc#tY@ z_Hc5$5j!M*Y(vw*8pisnh$-R(Y$?kN5Ab%hiiUyE*&;WT<==^ql zSd0ij%)pDQ9M%u;_bgTMD{WFew6qX2H4gk=2@T%HjMqTTi%suyp3!Z`|DS^&ur+}f z1Xo-}C;<*%o9jK9-kEI4^7#zR&?7JHfO%pE>YqFxb1v0jv~IQ5ISR6BPx{WN5c8#o zmk=cI_=PcYN;TfbB6qsA0mkN>PA4@It?nTyaDN?&XY7qMpcQqYL(RN%Sq(_#1f|k; z>HNYAxKEX@r%cIl#lHl5vV@_W8^Dgdp2ocBYnF9))td^gqH)`4+zYKXv3UScjR%8= z%Ey0>0$tu1)gK5J94jD_eop9Zo6nv=d^BqVhRuWE^BT&jW^R6L+d-F;30^eK{!PBX z>p>%`>& zzFb?b5Ra!Fh`DQ^$0AW3q)Ndm?%U5!Ta`u=YRt-#S>C23|FQkoDjtvZLBPiWj{7eX zkjk)GYUR7jiM!WVpOHxDoJzi`4qTadWpU zEEGW08#!ft=u$2nNH;;hcwl)Cyl;0M2LH^B8=4q>a78usSK<5Ma#oBmPCvnnyJL10 zuIpFS16`wt@LZ8&x#bXfiw&?nSf`Np;O}7K&!SP_Z4{q3Uw>HH!2u5TM(2p|UF0y^ z<#n_xh3t&ayxh6onrqr$qq00$ zA|Svx&=@xo*IbCmuf$)`O{vZ}>NLr(!0e;@?nICn&G@C?%dk|$TF~h&PWK#fhreH< zHy*K2(iNma8EK-JHa7qIT>;fc=ir}sR^lUJ1Yf920lIqO-W^vn1+h|{b9ZhWfBfMI z0v?L`JxA~z5M4r3)NdXO%uypn6yzJz58ul)d`}ea{*1Q^v4Z)%8!>9EnB5EFrLT`5 zZfdMm*tu@K1?yP6kGpUCJIEcR>5<1a(2D=Gnww0Ms|-v)gbp2L zdtwSoU-{{)EH6&uZKlrqyq!6l!$q%i#FL9U5evqPW@4?`@WKrZ4cVTT!*VZRlR}$~ zLI9^5W}qnuhzRi#=Y1%Fxney|A}ApG`9n2Nc*&#ERs}ST7s6j?FzuTOe`LSeytfoHUc&&+-0 zNDe8ExN3pi=KS{W6P6I4;cu9uTF@uQ~R!jp$HmzDL=$ACLi`^R4!acc0q_=& zw?ykc8`94q1$8Il)fbunhy{a1{jhi)bO^u((`>XcX?eyCo@db!L(sv7<&W`vUpkql zJQR!8u~_e#=%z3KB3w9OgxS^0qx0Kyz4-LbNcZ!o=VASZLWq6iD@)biYtz54Y2$eg z^vfF9tz>43lvY(oosbv*c-mb+|6aZ?>q<9XToX3OGB+wcR_sQ>3HwGHQGalK2h|~F zHE-|11Kdo|BnnZnZq>WII<*Jh?@EY1sT_><8QN-f>vl5a#_}}XA2_wa(oV3qi+rCy zkv6~YB@>hPfhI%G7}=|y?a3BDTVAI}e2eSL*9Rh;WflN?9(*_udo=acyd2?}Xx9nf z9fvE@fhSNOp5xMGZIH{b+<;h*s)N*&gOv%QJ^?a6^CmFB2Y7CsrcPs})v@+k9eber zuFNI?+1bdz%Ro_wdkGS`(Q3#^-kosC zGb8O#WC)eh>E5P{_r|uSb;ejf2Yw>|ai{4OMJxtKKMo#NY-kCfPEh z?fDSz_kjSFKwA1YK*4i567RFr`-S7X`MDrfq_>?wRt!N`BX=QC0o3xY`VHZ?(hLM9 zTiE4S;$`FXhN=q4zHTmD)Egz6yFNA>E7DXM+ybISf=hkHZNhT&Xcb!`9X4(nWW|Xx zy?>MvUwG+`*y2vYWyBNPbQW?KX1`}FT5YBAZabj^acdJ7makO54((nzPq9VJY@m^UiR{P@ZmoO;%lYXbE>@ z5fl>^VR>(&g#8qay{CK^iRn_ZoG|MxK!x1*c>{ym?cU4_W+hcy!Xf4kQ-bVq!_@9? zhx(CDVtS%%4Lshn0HneJf5KAWnP<6n?8L+E?DbL&;WY>0yPN2+lA_P-p9)}AM9=9Z)2W6$(H3sb=W>{@-9cS1jzBG9%hEI z8=@~zOYs8RaFnamz*N{xw$8^EQI`gv{eLB4bWTBPvcL@Q?WP;4r5vcq=Q&+l;84R{ z+2p_)@c+5vr2}ep+X;wMmKIcJl~?%w=eJ(eVj8*om-tw1Mj-MPQ4zIsyv)rTlpnO} z;OThPR@>eeO-ilhsx|B!Y<|rCsE%{o#(u6*TSfbIv5Wu7%ts;_bbcoti|;dA6SsEk z&z*216=PUF&%J0Hr)COYoF$v(K8Lcs%jWP59X7_I8$IBIun3>z#E$0Or&F#y8!YfA ztyBQ#4K+d5;w6y%=92k{l^VEI3`Wq5Cr{z1DT)E5;Fv#nb}l0)O#GPxW?d?x`OMtg zwrY~T=-r$Z!oL2ULPuo%7H>P%#w>pa5?ty?u8aN7n=KdU#D*VRJjfB}sN5y>!LLfI z<^)I9wjRwXBMp31^VKUT;aQpT#4@rJA<7weR5@NJ!L>OZwIQM4OKiw^4O=9TMc54K z3lJ0f!O$ZX8$2UAqKe&3L*H7n5T;!bdiiU_5}V}F;q$sVLDnuuDJh>VR!D=8IL~vq zt!VOBrZM5Ct{?x*N;!iLY=SnBBaq#3`pHO`#YmT0LtiPeV)Q=cO^^N@@Y%uXt2ea< z65EA>bU%e`V)p%fZ$~Gmk1YZ-LhnUA;9^B^Fug;>r)1`52`(W4-(|(I@yaF0>uB-~p4aRMt)AGU=8`YsSwH zCz`z8yi>Dnc(Z_4hLqTyV_brG1teoq;`fg1er~p5_>_sJ|3M zOmuP_&10JlG0v##s02T|=Pd)s4?~taXkY-dKPx!KLCmx;-cpCmVu<|TjV>wnm9gh( z-WTuKITourg-5y-9TT<9;&K+aY_Vy~5H5tI90j~Wz^L=WG^HTS#70G|kWqfTQ-B8p z*5|8tWLZnrs|rKSL!Yv_ZA6Zj^|xy6Z`JWAY&HYf!}YF1N8@rbHAE^~Xc)+w4~~kp z+|CCR_O?^cH|?7jC~-Fg+t7MZw=ZOj7{U+)94sC}a^Ju@jX?u@K}S~)*s z=yFH-uCZeDFHY*T41C23t6MLrD;n}6$TJ_2LkIXs*U5)$1MQn>`=?c+-jk3x_hiMs zGO%1Hwry5iNl0^R@-%^Z_EmJxs;acZd8BXS?CuWs`YgRQXe>jb@!v$9L-XOw!sOq!3sYoVm4|bPsAwhPUuz-KrJjeN|Ci64y7shHWU z{<+QfNUk*4<{^*ND=v-^fceEn{`mpOm$aViv-{tyj@4I%PiO?k=b&jtk#M0hoG9gv z3HB|6Bpk?aoO~_^1oX!*BJ3*;;t1!R%8Pscfg0)o_5bJogtgBJ>Q%n$JN(|l?cA%#qFgCVWiaPp#Vn6Q3 z_3N??ewkkz7PlUhElNoYElYfuLZq*X0|xuS=03P=K=lM8p>TMAOI!Y*Ee#%( zm(@z!=%0d+N>v}h4TkSZDszG6XAm=v^bVkq^z2tXbP(h@d^oN5W^8L$PaMGqx49tlA(GXRcBhyq`{Yg(FlKpMYU507*N7k-oAIyF$xYqte0ASv&D9wI`? zoOBdTdJ08FXFOdfg7$}Qp z$#jOwy&wPjdOjAKPa!*+G}>v60x2>C8wbGAlFp648B7}*pfK*dzl)`^=)0`0yVV4QHnhGQGENt{HQ(KGtBrAYEJo)_poOChI5GD zIAmMTQo43W*duZ2kb6)JSpHpr$u_JZ>j8nC!JJm6eeK*I+H!Sq@etUbOOD;UcA_xi zfVI3vdD5n|4Q#}dmH?3}xlrIC8PzsXn1t3zXkGP5>EFmWbTh4phAOCL<)#%R2ny|6!U9)l|$%;XRW1cdlcrGDw-- ztdnRY0?)xjHRBXO)+e-VBI)NHa&mH%?1q3+6RZt~Cv8*!d>K6D;b5>JFSOzbIuvfoU@6a2#zRke(HHE2kQ+zr+uPwY&(WxSF9_Dv z1#t|@wPGkg_PJih^e48x$2F?w-HA_WXZ&?VUfeq@hp>b?oq_U;Tr?WjsiWZL{ zf*=-gkamK82A)&?X(PMH_m8mOSv2h+Ou$D=zU0f0)Doqu0L}s}#EZ;t?#-`-!JC4E zLKsKXZ8 zznpQ2n>#CStR`3!zWz)&-jc#X!CTeV8HRM&V3F}rHjZ~;d4(l&{TM_cTG_v$HBAXE z56AP1!P`CbjJq*2mj5Y2x2De3rpX^NP=VZpoJ+2dV7~g8u;<7KEm&Kxm@`F&gjl1i z&bFOQohBnC#f5BVRB?&hvH8vSFYICS^;k=SybM}MS7Bab!wX0WV;Xk-|H_z_^QXAp={w{dHIb;s2rQD}bt6+i*7>k|H4~tuzACA%Y-{q;wf{ zNH-#(l!TzP(jC&BQW8=d>F)04ehWSI-+RxT(U~)6VC}uWc;DxJ;=E^XW((MSYV326 z)2pQ7{ByhVfrSQyY15!0L4pBFR9gE5cvXUq>o6E_Ex>BnxMvS+;Spf6(Jc3N;{hQ4 zm!QA*=E~S-NIuZo`Ygf!+UUBCI4(Xk@wL<34=AfA#xaV4vANtOpF(|~NgVzg4$VTAnu@e>)Bm)Kq{(yxJg>+C-TGjjUVE_~#6gD}% zLj=N@FFK1X`5bSvyMH5wsP9@P(zn4_fb6L`W@`$QZ){=g^I48Tayd|>%^ zb^_%1DlNLd9My9x>&8ER%Zbb`R8X`qkZW@S9RhR>0;l;$ewc(dK-aHRVS@m=tYbi) zR<3h*IpO~^ZG@tKzkmww6+E8;h=q%QC=HTg|21vQp`m#i4f=j705=s=<2YGKf}AFL z$T7y54_ok9C$#lWq=Jqt(D}=l=!^)?*w(H3D;z2+D!Ev048WM!K3Z~c2yEy1{DY|G z+ajNcp0)5f8KD{ym#Y+1wlw`U=QjNjWu8JB()6#YT^a0J1YuxC;C#N*X6dT%*937@ zIsu>)Z+v~Xst9m@HXEdq%L3bG+UOR8r4`l67k#GN9bDMk76fg-)>HVP*C3Gy89()P zKeFXH%htJ;bw0f!tUeH<4*;@G5PkTUMj(W4!sQZ$KaNSw>dN;76tkF4;u7}OG5xPO zoRzs}^KT_OsCGUIJGqEWR&z)slvnMC=%mG_=s5bqEN}r7rzU`Jy;bPqvIgv|z$hbN zMk$pxuk>&GWPX2RV(Zxz{%Ww*A3hf@GIKW108#}-x(MMt69DqqE=l~haD~F($S&qQ51V6W@_^~|&Y!xtSOank z%0LrojZS5?%X3{>1x{ZCl&)bnFD6a&f$HmDnDq|iX{bsA{(oFB6=`;0%zJRQtXEG{ z=UPY2dv>Qd5~YpU!1Vm-iDRQ?7;EM>AnCrlnkcQ@Fk4f3Iuc#uxQs1c` z%xvTsH_aLLnejl=0j>WO#GpI}d7H_q)uS)%lAlh)EO{0AB{viqJ+?#f_~k7yWC3D6JW)S#;JjnyIj;HlWD+hZp-d ztVrIm5XbNA^7CPQRXjD^ed6E~yc`2q6${0A;PF?_nYQih>a)|fMIpiZ#C+MuJl?hC zh~)nsMeXbVzYLX&lR%E&*1p@)b^)+xQ^&DRi-q)dG#^zHBko6V7_Fg03=)tjH^1GB z0!f(vMac%9u74=m)9 zAVl!u<}cab5PSp3`=X*)QLaUM%u5M+Bxv9^j}Bo{UjvNFq>pVTp0JF2G-ivWTHa-F z#8^_OmvA&GA%TK1`CK+qbGm@h zhG0EXUqFQK;ZrDdkSt@Tw z^WSy(m#1O-&eXpJIwz5LI zouI`z_Bs@J=Z}Y%c??*B+6se zYcGcQ(ARi6Oq!}e!2E#{icb7XE;0vUOq**<9`Bs5!U#B~iiWJ01Qs|`oRDkAk5k^Z zPyTb4)JH;W|I#zegY&g(Q(mBcrMb)r0dBI-i=>ZDn(w)nuhpn|fDoT;$MVrW+YEi0 zYAB5M_eo!;6W4Es35AaRdH3xV7=ZwhV7LS534mP(!3FAFvZ@e4ol;Ms4hl^`XL5>{5q-Y%spse z1(ef(h)fO>;4j67y=&*x>Hg801ClG-TjT7yyW|6Yd5}^w)d1s0{L1_|7hX<-W>|c! zi+cV6&RPhVXJUu=znlY<1AKmFAPQn@d&O-8NVS0P^qcqpYtvqa!L{cXC|sDqP_rwb z%>LwhGyaOm&{1In9~ubkA*<%=?HC4$UH^OR&D&Ij@B)dqaD`V-s^JKLFJ0Oc>LIG~ z8=vq@%~6%c9&$9WxrL<@p(*KRY+$nnZdd7dpOBp=af-mpAJV8g0%os`>L|9k*{` zZU7ieo!u>2n`Hy&s$|_pxA!oR$L4sygkvz8%*l`U>@y<|qaVNsoct`R>T= zaC2!eqDtG5ErL87;;e8lh%B{`*=vaf{Op@9y^iL<>3y=}yN3NZY1AXiECxE8RNp`s zCo#x1she~s{Z>Y=IdsO2`yEYq)eh`g!Q-8lu;bn7m=8+!SEUvz51>h)TAtJaCCP+y zN$n_e-E^zHu8akcr^BL1Cp>D-CN9}oUH6Af%f&5zGodv>yX zb^(H~lL8(Fxv=vz=2$*b+iC8f)Ztg$x4CIWH{Io{Ke`{^68BEJ=Ch_aMR@Gaf3Cm( z0f@hUyAW$sIuE)Fm7EnlheFQHsXP8`QIE#ayg&n#NqzEVJ;QptQ15*xQ zq76I)Xk7VR7`Pbnh5Uy&V{%umL6&r%~`KAgh#pgKK~tzvx$rlyF3(EFy5 zg7PN+$7xxIT4m+e$#VI$Hx%tq&>Ali!U=?8I9JGaenR1VP*%3&J~8fvJ6Mj{XKKVF z_*oSHc^=0kr7Ufks%u5^ofSKmAiOs|`@>w8DSds4W`j95% zUQlxm@8XMaoc~haqcW8ACdLQ8k&5;|m6#}pyu^Gej$TEmhL=zv*)P914^@CNH~Dnq z>4ZK)qHzpF+5Jd!~WXRjKr;+8~QcB$;O)E#!~#=Oq7= zu?khVzpbAofh(TsPRysM41YO#-LCJ+l4v#$c)+k@=l=BAW%w(t(%d&-Dg{CqEMg)) zzS#=(2>AF?9k^CJn|KMnS&O`vJ2DpJ<6xocRYy|( zU(5I=K7V2J6W;CBS>J1c8n8}=qHZ7y32?ctLdl&dZA1po&hO7_@8)d|nD0AREe?=8 z^+IPlRaMP=1bvZT(ZDH%AMUH=w0|FjG)pFCZIc>zXMb$v1xqftJPw-AjD?JoX*wHG zdkP;g+jUo}ADQxK3Ee)W12nPscc$+630!Be7Gpz+MZlsF5fQQCGXln3@MoaT0O{|| zz=0@tRhUfedq(YQvu=S3uw(iz^wYPiy|-bOAZTZ=BPs8}GR$hLXDm&N7+61H0qq~b zE;MNR4I2N09sj=U19cLB9X801EaDdUl`WF4A|Je|87Vp)DASO4u6=wm*bChz?c6Vj zD(k_W2K_{Ey{jf)A1Y4;AqqvB#9uK@06RYN;`oVVlP>pso|N;IVF@@_k_QY%Z(u`; zdz>qBZ?1)Ro9tjgKnyLmoGJr_^>~`*dPlWU!(WkIP&F@W0!@#8-|v52^MI*hcNbKd z!2B5?y}y4&w482Dc*x78jYd%nQ@gy93XE+2d^BNylvTXeU9omi$OMx>Xy^LvmmAa*ow44HsSZyrR_kzf=FPAwu>EW zYCN$g$;hoCBzKS_Ev>uTeWK~`g0N2Tlp=poht?Xhf4F~K=0(>D-OrI-;(5*m9C)PEQGd&kbr_r@y;2Oug_&`Yw0=7t1MitrR*ozi2$ zX?$^V@X5&pO#CB*#`QCFC~7Eo1SoUPKhgLC>yF=;z~9ioUk>6+#`gj6O2xR{bxD_V z3bIQ9t&6BcE73<{|1L`eN*tR-(>U#G+snlhnj<)q$_-kY$H|YB&=Pl~pl5v#s)>IG zKFz)Q-1&pY2+$hUn?-BYec2N&y?4R_Y>$_w$ypUmdL6v_dnd@3sOpAHi>{<3E2zLg~Z-M!+^QDyjvtP?qWh90z_V&t{!3fe9|-vb;0b z)xE7_^5IRwPhY!KA!X_(5ruoR3j2C+G7zlS_?hfw?k4Ub_V>0hk6<-n^%;;K4l-DS zo1u2=8YlVtI|;Q#UYD43-;)P|V(_o~@k~Igh!rF{0g5%CL5D2cwzq9+_Id;>9M+;K zs_AK@Y}aSyg@j-7{*`~A$x}n9HMFe(m;g(_$o=rLn%IMPzcnzA)@FC~NzNIwi$)V# zo=C%%;#FuywkS$MG<^7a>%&{*#ViV6_ENeZ3~7Lg8nEdj$NSQ410cmhT zz;MP7%8COxdMDp^w^i674vjEh*aFAlvrU~?|DF&kMaM7EGuSk-v;*>C^Bhk%{=h*_rw-yWOYgi>vZOc#UpzR} zo7A4Kv!h(t250rQ&d6&UIRB+h!e3**zf{TqCcu5wpZbLF^&%FSHU>QJiY7d(fLu?& z{o9xP5F)wP{8nkc_4kMD-N1zOk+XA!u$B{(KtiY&8(q}X&k%9?bm|qV3PD@So&3OTYO$rK5%}5%jV~>22E?q@1`{{wdB-%$`fO6-{Dt%V4flo0P&G_> zU4=aR_Tr1z)g@RH+C^bN3-$kT1b67*UYiH>L69ydG0PTm2i9|G7K|1}44 zMxFKmD&-r%?EOBJTL`AnQ+q|g@%%A(m#{nc@9*Y^y$cS8tXuI22xzO+)PO=0Nc)d! zzSD%Wt|w$M^S<8M{rW1t<`2p>R?ay(h*c;l`CN3#IDl9H+_ziM0_-a&!L77&>O$BjFqi%%o$=+*ljFVdB%qwn zITJca1b+FFSb$gRNeQg5u0y2e-$L^PNaYr1UH5QnvUX>GKym752c#LpVAj@KMpSci zb4buM`0gR+l^Q55jJB%XPwoSATXe|o9l*i>g#vIZ3z2L%a8NFejaai6cvU)TwC3b# z3F}+4Zdvf@=7@K^@*=bbrZQAGPs>x< zd)Uuov6*6;&SOZa8{k04;a3oeISf3;kM((SJCyY@a`-hk*&Qi|6SZ$dnq1UQlvp|E zFTN(xe0itSCE8cP$qk7D(s1f!2=2|Z6hxAK%Sh*$_!XlyZ2vL=Ozcilej8!uVcb2L zvvd0`V*}y0kmoW|gAqiL0Mm%aVq!4BTurkVJTm#+E1x*p*l++Nk+(pD4$Z0a1N{7e zB{4Y~4!M|_S+))!zls6XvE%0WJzP$NWU%ER>t8^^$i2Mj0JOJYsGvSY00Rm=e_%Zd zJmhrqAyw|yBn1G1Myktg+8+NmyH^+ty1)qo$=N}mcU~+HunPTmbnirkEfN&nyLeN3 zAlukf(?#zFh9CUUoIJBN=wkt`D_ni%k1~^~UAgfp+fW{;T5m^Vk?#n-vCJAXC^=s; zkWP^*(5h8pOu@0gC$O&gYwMOdqJ>)mm@?#6@gS_aL6bgU2OFS}(F}ZRRR6e^Ur&pB z9Cdo&9S*~(W#C)vlRj_Q*9959=s`rRO<=0;4{VesSL=XDn-K_T_yiJ>A+N;BI>!wy z$TSn^lXv6Byubp)1|y(Hz$F&Mf>TxYzWIiqFU>PkmXa+)nEUGc3?2YvJKvjO{NTC0A&cS3vg3}}x!K8yg_auXQd{4BH7u1-Le zT~&YjxwD7YaKB&ELgX_I9B7UpPBS35;~#po7i|l#LSdf9Gw=M4c{Viw$uM_wz^nuc z4Z^bIxb-mY&8^iw&;J&ozk!1IE5$5i;6u1RQj{`s#;#N04GgpI(9Iu;9s-B^>3>Th zZU2%&&PAAxb^svw#}7G(M;;}Sp8sMVDmM5WSJHL%Y~jX^NsnJq5#3!s`!F}-HrNbR z$Dk5yf~vu2&YboO-E7Ck!azfGR*Gyfr_TSY1k6yYLXi5Hn27TvV)Jwg_(Q;8AVkBD z?n#Bs3?i(dyBiy5o6%q_&x%vq;UFfx1%xKTV8U*PCB5Q-(wP;^x1C*ktiVL3wVzT` zq=Y`eOTsDq`H!Y@sd~wnkGdRJ?dPEA4Q-?-DsGc;|G9Z1hV=6K2L46R3%g|jI3GJZ+E9T5#Ki$1s2dn#-iTq>e+(}4#onX>`#2ogjDauUB=}>TLd~R7zpmKgR-fbz z9G2d@WQ;Cw?zN(W5Tv|8HLxBo!H`RnvYvd3>WmU@S3p=KuvER>Aio23uru1FsKh>4!M6HHJuZKom!`moYMt{js3i*;D`YFxcM z=^!JFiiIpl#Ai}>Md|j56D!-_ zY(K`evBw?^8Ty0{&XYCo{8smZ(SFKWzc=}+0NgTNu5c~ zmD73!@n0;8<<0j#$#E<|ejsuqxm1cBg=3B0pb05qh{=vtc!yGwB49_t&R8xyew;Ot z5ADu@^yK9FbIDyZ=5#DnpBUcfvm2I+&9`IZ0-LD{$goP^*M81?rdTDl!8#rU{krBD zTy2ZBxiK_m|AK~^7MH%ex?ZyjIOT5ig*&$e9dC7?abid-EI&EAyXqXw7(r(Ie!j)o z4$CVi%}Np&u>gLd3bM48)kz6~4-wUAqvn1Lm zy(I>XKdSOhCn_G!8R%7-CX_$+gA<3e@I0ca$~TnIogY~+)^u^E_pICwYAwSnz#A9d zw;GSNXRaC4)9n)=j^3dv5m|?mBCNaNemXOgDuE8GKvxn5Fa@$4;$Gf1f5?Boi!ks9 zd)suT!SRFcg&1AckZO_9fSP`-flI^7#A5@~`~H&O`q>XyGGr7D7ruNParBI9Edvq0 z?X$Q*E<`H zh=bg#2$_YeCaCVhsui~OxBR70W?HE{C7%b$)FaWJ?_3s}NTAqKVyyBPcNG_{wli6X zl>ah{tN%_V>(A0?je3FVNhv4Bzp;BSxoEV~m@LPq>$BKCiOU$&Jxd7V{`s5tMV51{+oAvUPDo-Sfl4sufv*`PvhRaIawu-Q>B#hQG+v0 zC1<*{!X}YoE~1?9Q(avO(AHL0-JX9lIcAH>emOmodQu(|)VjClFV<{CWx}XYCzVhj z5atwG<9qOOxcLs&i?JG2Jxw7S&P{Sx#y7QZsx$rAa?_Fds^w))7gCWvqU^>yZQQ?O zi^{Q1WH3$M(5#WT7cpkH;C9PF^xw;J?s{2L3kxTFbZp(8*Y+96sT zmou5dHmuXKSDn;$Fr^oEwQ%0ca+0BJ27TO}xi?fhBO`5KLB{0c^Hn2_>1c-cOKS6_un7BvA}C#ucNn zyOFfsgDDC8hlzW{u4ew(tzvv7h!feA@Aj z&^H09O8jt3aK43iU{zgL+7bSkWlN2Q581_RH_G6QNq&g>-H4b*e+E z8*p2m5LXjIHDeRG4>ch)U|? zhaxN{l=tBBj5M>x$Zq+)`*aLEmEHo6WBr9G#-{nzTKL#<&(U2w;eRcb>rIk_C^sLR z@T~Q?`^+stHtKxH#g^^;R-XbQZ<>tO6)ALfo zGBX=)G!cHo*=y-`eC7Ce_Km#bO`n_*qz~);6PwDVqgw8stFPUi&mXBiP}j0ZBI3fv z4R(h;p?;#Xu+Du zbnG#%Sfh{NcXgY=HeW;?>yY)6k90`X}ZPyV|0_U2Pszsvyv-hFsG{E^?~jOYE*&~aUGVhpXV z7BRfW7U8=@kXe&uEmM3S`xZ?~B#`>cqpD>WY*Y)T8deX&C# zQ)M@VCvcgLhL+pjqbhagDQs}vP33t?5=ABJy5i9`OF4SZRo$TW?)uz~QUAJr zgfmxzR&CAUg=WDwp^H0TAE%65(MSxw5=${XI^j4cGR?Xd?T>(R% z%=3V-fr3C2%cn{-?_tnZaeZ@r*d-aUIh&RR6@>^X^l%;c9nh;!PAB2})?H~>i;?wo zx9jJm)5K@%OztQ?7k;HgH1aDg8B{$1t2%uTew%G$)15G6|4BM}q_bcHdPAs=;RU6b z12d){B5;6H+9nR8%qvO9pCT6uW52)q;dSNrRgud?vvCe4%%G=69CY{bVAD%k--ATs zOU@h;6F`yX`kIZUSpVfziajbto#>wMB>yfBX7&x1GTaTGThLPy&@vw8o~47AJvP7{ zlT@T-O;+eau{_ZF<~KX>|d3wYs;rTRT!`+ zylWjd^qAf-4WE({h zma32#_%Qq-%kjgFe&wUP)X1J9S6u3pdhb-yGFZymP+DfnX+48}dAxiy^t1I|)q7jb z0?rwyomXRR&H>y<+d)aF$d4V|1)mSHitMS9CSPHhn&zS?T;0XS?-|7+Dd|4L@QwN) z{0;l~lGC7p<=*X)D^jt!As$P{8xu6??UsM{938gj@}B|)x?A77x>t%)nIA5sB-iw; ziqyIb+w6UM#UdB_&|UM)b?ewQo0CQW55)(O_AAntpWD$=6G3>0)oklcoz2X)xyPSc z5AW9B9p{}D(INJt7?j}+(jO?COne2YN*;Oz)0GGqwr(`f1krDo+qhUNj ztm~%iDXQsMhXe4t8)zv(#B3bzJ z7jEQPfRVBt%L|-MY+N3%FN{a!TeBiH4$G|MECR2J^2!yhb4iL2dFdu$Ax{Uu9d&0Y zCNAJ0@kzP0ruB$emXp3X6CQ8T819+_nFw{mr|11oZ7KOKL%3f~e-!2-WAbTEk_pnc zHqCFCDTjrpJi9)YGRX`PKU5L=iTe~57AA6L)y4_xs|T?kEzEUYEZG(nPp*p0TqagH zSYQz`wB2E7$#^u{2%5PLe8qquoVmP5)`nZHwM1j$wU3J2N9@Lhre8Q`3ylp7Za&n; zohJ)8NIwcRtPQpKe5PW+Z8Ox|Z^y5)O6Y9Cs^mEAUcV~aFj<~PPp3ypBeehGj)fS! zq#Dic^Cy~^zlzRa#RNKNp!V`IOxettmYT>TjJJ6|s(RkvQR2la(_}U|N?t5tk@1h{Gfq(02lY_fvd^$=Mapq zl*JeJA%{=nsqfI)Zjs}a%PkFF%?ZZ)eK*P(+NOt#I0La(Ymm`EH#ILO^gQ~7(Zb9} z>0ZV15u#~)Z^3}ccVnoNs8sT8`)@XESOX3gEl{%A%RJ;p8W!K`k4rQ(mp8}#qNwb? zcv665S1v1zbSE=nThzmgfpfOr5JptY5N&^>D)mSi+#LmfFkz6Dh%Msw&(5G>)hLiMkc+Cx+`Z;`?WE_R9AsF#;)t_G zF{o3Mf`+@6MpWbL{nJTW_Bpl9toFUz&NJ^j;UPl}KZp8f2{5s0pU9v-X8aZbHK^fo zpJ1t0l3A)W4;~Q79Ntl%CoAr}`wA>#$`(oShxdLq~V09eoT6jHiL@hYK@GdX+;SLW43tZj<^* z-YX)3v%gJ)cWju%JfBN<;C;4n@)EaHJcJB@u!PMTcba&`7l%8<(36+p;9^|zM6f@| zqcSERHjiJ+JL14uOFP6zyeq^)h|7Pdwk9m^hWl~x2DvL2-mL*sd1$!0iUrzTOS^L9 zWW9nm;GoFqer%&K|EnXESao_YSSVM}9bpK2*zF8^c_Towqo~5v{?;3JA%RN29z(fs zF1_(RnqiZC+tra1jJ+bG7R;7or*CwA1I?}>L#~WAngu_cz04YuV{ZPGs*hsA;8g`R zg`*LuDac^@#3WCr-a%XX&(^RjcQzt4ShWQ<|GT@p9QMmf<;T>Uo7t3DKYqe-@WU-IU=~yq*wSF018vF8qN*7aY+xI0S24sF86NVvHRgQw~$zlSojvcBpUkKrD3DVOb0dmhg^AkJNrL=uq7CO@7Fe zLM((99GK`W*V7>SM&8K9oUCe1fLc z^Ubsm;Tc()5SdIPARxn$CAg5>1f zd0GN$k(i*)f;%fk&Qk141^3ZOPy%O@FjtJyFHZKpzHcG1)FhOtXM{>hO7(WkUy>51XSam%uu%e>1X6WTi6?yX=&tqjk$$ZhF85j8fSR6n=HQ_G^8%0|wPw(PI zOU7$RBLH0`Ipr`=tSBz{;#V?Lr%D|EWcQiV2e?hy5jGheA?|HQF1+#bfmo>59V7y` z(1S{CL?xhDqoqZlSw8oIHZM5!tzi&uRHNtYy0h3TtG`!x`R(W&H@5UQs3NZ;)gLduj8;FYk3hs^k zKz{-Lv~sw*Y`owUb`*Hg($nBQjqt+HI+5fIS#R>Hc%t9}TtFX4;$JD!f>M$+=b&t8 zOlbk5MgCP{8@LYNX=VJ~eOH3*_#y*Ae5xj?59yb7s^kU=oi4N;UrG-JLR(@S833Vd z^G1@wb>m54JZHPgN>&~{#Y&>MEF=UW;D}r%9`$KO53IuQ<(O_?pp_P6q`&CVD4(?S zlo&x*QLG>F){Hx2yk4{Br2Xzm*zV7#l{aVI$1D&d0 zwZ<1b-)QRqE{SJO$>1&7X5TOmdTe5=CmQT(w?%eXrwNg<64~jIAS3w%@OV0uOE7!e z%?D`7AjZ(sQ^d%~NV7ZRoq}~k*^jPc8d}_y&yt11zZAc~80h_tY-LzpV6B2W{Aw$h zL}l|y4%}#})ng>09A)KXc#EL^(lWS58t zag0w9l!t~iHqDc?ye)LXt1Q>DWQEQgRu}C;VK2e#614|M2TxsQvNLlyz>-LpP<)vD zGTE42{Td8>#ffH+C+>o1Zu#Ft7TJFIb10`K2tv%LVA`BSK*%h?9Wh=lg9 zVvp>u(YqJ1QwbKcHIFK0JVlU`$83YDC0R^gt=6{>&0SsPDy!c6V_I}g`IppiuU8f3 z40YCAQeJ){6($@o&M-C_lyJ_eP4Jr8qCz^X-#XtZ`{aL+j%Z7OATKy7%@%f)VI_@z zM-++gFpc|GMOn*Xow9K(6UG$s@zG|@gR(c*_2z%dW+`-^?CfkxjSj~03e+6X{(!Ds zS;tbi5&!nGpC7p1pIdO#_8)=Z>W|}kbYYwo;H^@;Unv?0 zCyjeQA87I_D)x{!`3osuRr&?6C7;>`rTw{TgQz$_wza1(vd94FI%3;@|7@#&JOSJ< zP^Zqbct%A2Av&ZNc9AaK(eMzCq=$3J7mfd~cMtj@P6X*e$$yviZLYXTAD{Z%_H8P< zOHZV78t^b}y>1T&zqGBg^Yzn($=9ZQTJ9x79>(X!9JG$8PmNVLg)I1@Fh9FB>WQFm zs|$L$&yzribAQ3n2PQh@trn^tx`=!e znc7)vJMdF9Q}h38?JNQcR&!Aqe1jSePr3(#Z^*!s4%wxVNWJAn1}_&`he0XcIEbnC=u zzi^-mk?}G2moTukV_{&}e-lxAVKS4?x$qt!LOA*&!C(F8s%$S`@jP`^BU1gpZ9wWJJzX&O~l$Owd-*0 zSZ13MRR;LqV|cO zQTt4Ac~_BJ|MpJ_Kxb$s0n z!Voiytfq$nvulum{MJ0b5|uOrEAqt2Cl&(rToLq5=I3lY|J2+R!)V|t{Ls&yI_J+7 zq1_UdlLbmksYV>|c!q5!6q&=LiHg128zE1WBR_yWaPOxI-ZcIlFW90J&rs~S&vus{{wdatO$R`pL6E*z8dJ&O5W4tsOi zx#dV~IU&Gw#8bZfT&x2&j}-!^W^!Q(q3^;8X3{pjUD(LXy}ymcxt)AWGWYQE!wjUr zrR({?aITT*UCxMTGcS1GFA7Fy2isD#lKukw+9uP*!;VlnmUe=8-I{;i(sq{6dLWGU zPk+9Cy!Jr#k+L&+V_LwMyUQs1w>u}>2d!$PexEwuBaJ`7=*$ALU0E-kju9acXy=Vg z&Y82hYK4_E6^qQf*5#2qhljM~wnd9yO-1UFVsOOR_a7W#A7MzD$uXt3$+vx)G)`9T zJZDX~9x3U0E;%B&jy;ivd3(`);M0`>4LM2;Vt0A3E5^ui@P*~4gPV9F?K9~F;bbaV zY44{&m$o%MK$e#1^DHjELJGsw?9Dhu1FoVp;oE=-EUZtggm+Bke?GZ0C))6nM~PS6 zm;>Tobmqs`${S*zJMXcqFD%o+=kB2 z=Wj>MSiOc}QY)#cp?G;+S;1BEzp4jW<0Q0!y39l``|mbnrYuSmD+s5g3fCcjlUyZV z43Gh2y(C8~xxvPnk!$^|enfTaetXouEV|5xqbnWs>D?@%+H*(Q`n%-}ce43s;9F)5 zUGMl&gA@?YCXqsOqdmVo*xg2Y%o5>$QS5}x?{mb62va3OWCRzSKA(x3Xp)k_E6_+T zn;7&mp}F0=`uIf54jrh_|KfN^idBsOV;d-75GDr9Nxlc)MgjypC<&I&Q)l(WZmafa zHo4>0s zSfZ$k_$a-_oHp~Eo&b}A}e&xPn*7X#?u>x|60x3F1qmCddc(TCRh{HZrK-OSgDl^c&d=SMG^=n)sWzaw; z$@UYzAd-r4`qvmI_7hSXWTk!c*E^v#6W(7!Iy{h!wf1-85S>rE;EBut^9Ef_@e}mq z?Lt+d`4J7V(v%JnGR>@b@&>nC*WlVUf-ub%4H6Ot2UT;%AhsAtZkPj!&TYW3!YCSc zJ~nlUN{zf(v!|f4iwgsZFOX*xt%wMvzSjkhLV|!FU^F@&JACi}#FL4aGTV}mDIX+O zpyy4xS_xHJa{!3WsHae5`%uZjj``iZN=ja1=$>F9D3BcEr+l<@^SV81hb93t=r-5v z3j@1BlVg|mk-fY+M80o%V5blH4IgQ^z-$S?8SIDip&*6|U)d>H3Bc5;&lmN*#}hym zq7O&FChSQ%+Flat#B8W9=MM3S=;eeM5hw)S8yseXcVVEeuQSy(Hm3DFoK&3a;LGCImAsp}&rA42W^|e0AVGXv$N#yIL{$WJs$hfP#o$#AJiJtOa zr{%lW`VGzXtq(-^yxfj=yGX#zY!!^r;Mm^Ti3rE zxDAI~V6ao7cks(Tst?7pm>uvs`W1*CzAT&^vle$}XQ3nxdiKb*S*6>$ql1S~otOr6 ztlGO}(@H<7N!}h*vLGabaRPJ&-nQl9U~<1TDDzo_VYSnTYej6B=-vu^*yh1U#=fKM z#Z>(QiA$p=5~+vCr@RdWnG&A(9z&ub%Szw>dv7MI) zX6IV&Cc)~GPh4AzfuSANso$xiv|#3*y}g`+lsI~P7N2j4P?p_R0eyX0l~;X(XL@Jt zBUkM3mp65(y@RAc#nA7lkn?ScqCb4VqtP zam*K$C#~t0X1Fe+3!Cp15N}^0gy#EH6_FAk+*zXPznal!{Co79$+Fnng_|dD$|q%R2|97eP5mN&6emo3-1+sf$Cv%Zc;!fTt4Wo zKWDy$2~L-w1DKMA1{yFv`Bql46k8%7>?xuf%!Af5w=~fDr*mcW2SB;9v^=J7fEETU z{dL(=Z19?8=>*{vqegXlb~Y1;fqD2vsiK=l_m|^G8NZa6Fq#b=(y~SC*2?VHuev|z zJ>p<}L7M(pUeev5W+nC(rr#c1RRgE>mwjfB1&UpnxUxsq&;#^RVu^J%C7cRW|FRY_Bm7o8tTcfAR>*Kr zRH@7y_5^E^%m5p=Iuckwt7cy;a((LR#8(f7G_kqWAAQL~AkFsiXEL4oZkAkx`d-~N zyh~;|jo)Z(jC0AbYamPLM}&V|PsCKSp9QJi-kZ=mbQ!Ze&Wd=9L?CJx(K2{6B+ z=HmLM3m?>-WYnli2W(-(sX7lU2l?+uPuTa{hZbnG!$SuA2P#y}1!vN|5j}=HI5oLQ z2IkU@7b`yV*)QWMT-ae|*mPE!lZxWZoQlVv7}AS(;nJoujGeM$vo8Cd&crj|$D9YG zjCkQiQHp#L^kjP<^uDmV_3ELMN0R6Hj?}lc6;n~g8U{Urf-EuUz?6c1iZd+uLZ53YK@WzS65FoYytWFyC&Pl<?6}-Q1ZuaU`1E^l#0y|Ifl%Eyn zJS&8*>r5l`YMZPhKD+*QBVU!xI5_QS(j^s}=i58b4>7H-c!r|HY#&f`#&h58NqwaJ z`q!+3_DwVEz>1tZH(!W-=DvZxveaLsp`j4~%89tytc(kxo!I%>^zYvvs|bNTQQ68< zId?Y5TClQvFY`*cvYTC3>!y;J?UmKC_^DHpdB3S)WwTse6=dAAj zUTubC4h}ad>Hiv}EqbgqRf0a}S>;-NC0a#*fHFN}Oj?|~z3tnmshO5l{#z zE3oO);qz9#3!A4Rm7P45W3MZ1vn%$NdQ(yg(UOrMR(H+LcQO!>-2^r)ON1A!uiRQ6 zCg$S858$HQ9;8>fq!!~EII-!tC()`*AD`XqZdX5gs=bz%F!u8Rl#McJ3r88Oa5%(6 zHROSKs5MG{jmnMN2i(??dFGw$)(xv3F2|=0&8w0q|52!Ay=VJ#+Gtb3g z^>}*+4@O^=GE!>oFAl7w@}rZ*2C&5WbCAJHPqtQpJgMY?p0XZhV0!8c>^^P}|2*^3 z125x4tGlY{CduDBb>7J+ir&>G(&ax8CYQZL@b+Gv4p8d$7%~d#x)AzRln8HGveRCh zIPkDbGq=lF+711VoSfi!bv88z^=62`kj!*|A&$^9G9qGnZq9dfRBL^ze#%Uv2Y7%Y z!GKNd#1~6PLWnCGIZ=6hXn4s}H{#idf(d?DzJM?<2E%9FbY$MqHj7NQ)14#kD-;ie9S&}@sLKvBCOv*{ z?dh1JaALRyu!)wpvsg}UgJ6wOQAPH4}kjDu&f}4hHCY{C!1Gc!5Ym5VCH&QSQrAjzE=#g zdcUflE}BGJ<5)>J5G_hBFW&Ty_eG3xIAO+n^0B9p$i%3)c=Qv50|^IQ&F z&+gz0$mQpwbfFXreccvH7vd-o_l=F|LG`Hm;_y&}58>DAZ4GbAShZ!-PcdE0 zl*W7as&3JGC&(3CX-H=)o|!D};<{EUL#{(}I5(y3QDfa&RfIR+x+IyV8*~%I^~3A z_uW*XxB-p;N-Pq2X~7UMdzb(wjOaqFLw4h_f7bzYq+I>RoE??PNwO=)c;WNzT>3dG zsu1V`n2?i02zUjZ77RZ$FmzW%28pXw@>R<=w=A5FuNbR!%e~3>Hy^nfA2#>`2B1F2 zr(id1jkz9e`koH5II620NwN2D!%g`8>9_ijr|JxQQbUTK%YxlHo>}7$b#Lu=Rc*b^ z%U>Q9^fj}Y5r*BoG$TUfAB%k4S?hvw6HSUgl>mORBLwBV6>B;@yx(22Yr>p%o?9sv z*Fy9P;*8r1fKl$AyoJUR4I%?Mbe$Scd<=OOb96` z0@3Md;OGjv#%P3^K$AZZvA-tA%;BgCyjsXDsj9He4WG+%y6WB}du&VSHEv&Pmse7G zY^xI?=9^p5co|ffC=0O?Y<1|H9_Y2e+ETGU*Q_xzQcK_;-#^&Q#@MjagU%CQVlzuv z-&y`1rdP&P#m;A3#TmzlCp7k;fl?JRBCkx< zBD0G?!Az~MqT}L$VVE!ti~e}5?#6m>DP0bcZK3jqj2X_l^#O}WN%mif;{sdb?VbI$ zk7gMKCE2Oph=?vT=)zh{2gkjj$)=gsR?0qsy9tpfvtaus$LQ^Mt~>QXr#cr|Xv82& z&Z>n}StVibQRR4JNa+bl_ii_>+uU*vMSQfXF4&C5yZLj^+@~{{U&R^XX4qA(oH1Lv zW<;rAwqIsR_R3paJX04ljDKkM{zEj4&v26cdL`*A&&RyJVi>@GJ(#6a?^6wkU-N9} zF3;>$%OTp>b&1~FHQr~ZbHPP(WJw?It^C}+xs~{k6k`0?dzP+L)C8V1kC?)4D$Y%k zl1&cIZ_349l$|*IBQM~io1}tNw~?(0At!EH_4f$D126wa?Ka5`>Ip18f_&&R3*jkE z3~cS<6N`>MGA?=P7w>G7GdV_z@wtZbQC7$nBWfG1j|+CjD7^&oU#v!NW!h~OcNjJ| zj()1!Y>St?>epNt86FoO0>uC03r|ED?0{lj#pP(3=Dn^*$;HHQzR%^7mGFm>$dP(| zbLtLP)j(~Jal}v?ZLKuevlLO?V7M^i*{$>RG{M)c-F}yZ{g{Y}Ul$Vu2?(EW#_BAZ z3%BVu)6u+Wx^;QZCgw!g;LGgPPqB@hW=$TDr`XxqfpI|Lnfyu~2Ey&XlP*)CS!JV1 zig^$nN{0ev8iGTC5z!v7on8JTF><7>y?7*Z^$geYBD)emG$~y4P+)r}d%p_7AS4o2hqfRw#9I4kk_4_~yJ4iQs=l zFhJ(MK4rCA_KS(EoZ}K+B=D>tOHH7BAhw%V)1Bm)~UdNWIcCG=Fp6 zGcu&uUAoTdT3?SRJz?y3ZI4Uh**$1j;~x|>;f-DR#}*_yyj?-U!f>IQ=Vo4iIlI3f zHM?Fo*8;Db+;q|XMcS5)9_AXGXl=tdN*3-`k*F*9yxqJ-?jG(ZHs>5{usRL|KiANp~dAJTTj!#C}vA-YgO3@IY!eHrt|td2=Oa6y@e14|#=$rhE0S z$_2^WF2NQ1!dX;msl}Z*YE{tAmm$Z|ki0?W-C6s1 z+V*{qpBm>Uq`m*W$aF*fvF3MFOWeNJA+M=owr1an%iVA{s6MFoVibu0{;2S12)9xX&cw3u z(xl3|=|JQ9#Xc}~CM>9Z0_3E7SXci4$ZTXPaYCIQFa3t3e|r@ap9}YERds>l_Ki zA}GROJG5$F(*L6>-*ePW|JvnlGe%Tiel*FmMMRi#U_oWY3AJB%DBwNLU>CU#JExVS zk;;?0mg?6t*Fe!{m+^FRN2X%G2r=~Jp;p%qcFb{R6A?M}D(I@fv9^_6nc|AtU+Umj z8jY_MPM;K)x<7JnYQP8i6qq%`7u69%WA?FN9P6Z9I0LJpXVD-fp+OmAfL}ICWbdUC zdujPpeUKrWH{YzP%xp`8FF==AtchhQY54#OtpF!Ve;~|+$l8KzVA38-% zfAkM7Esut#f5>h?7n+Rw+_1^1%G@q)#JLRYpq6k~0|qXQjS`p@{Upn5R7de~{xnAC z8`W%OO&9Es%%(@C+jj~iakRr})^UxFb^<Hs@9ufXG z@pz#zoNK>Vo=67$5r}ic$zQ#gweAR~3_lax{`3)>!88!a1H+qy=a&gVI6NkuRvfPr z<*gzbdoR1^3QXw)^z0{9KfzK+@K3E?h8!a@B4-?MFLzK|!vwW!$=#csH=cZAle#~A zz1dv&J?kf8hA4*972X4m=CNM?h&tzNPPpui`%*j~OEWz+HsNbyHk6B(_KHDI?lB>r zN0^pLVWDb#ex=s5|7s}5!=+19Jd{$tu@Omj_|+vkNj^H8PZBd^M(#soQ;?1M)RzNPp&vfOvYPbJdG>5ALY zaFIV}D9qGW36+`VdHd;rf86rb;d7{GT8tM-T+iT2;x*+AD?9O{XtiJXJ>)CgT=|BS z(Q9vWOZ%zlgrsqa!tFvO={oiLv2U1rtvV{$7a+yY?2N4*Z^?dD`<;I2l~>+(7@h_l zArd{JL#n|6NZ1-dH2~mBLdg<|Pr@>f2^tj3*lWeauivu#aV49Hpl`D8D^s(WvKk3! z>cUkbPIHz>%na-IVV;1tfW(cY5m|lz8N!hYh`JY>uJZ@ApGxa=D@A&Z1|ss``I*OxucQm&K~)dGedVxlML1cEKgO*SKSVx@ocBJzIyuX>+BKU^DcrN+ zvAUvmK#>;amsPnDd*A|b1aAx7r_Atj$Ynx7^Ok`2zq}&J1uGV{6UIk6!$``}>I=obcPWhxyVnOsx{WoH4~CqMDwe;bIrVQ*v2Q&* z6>4iKjVKiBv6F>GM*6{!;orAvu`c>xU_HdTspZknC7}Z+uk~RZXq7Js$5;7@?4H_? zIQn%sL)}RoP!k||MoJtMMfH`%ezMg)Z%t__x8;;^p5AHXJ)xc%d`SuF9n-udj^2tc zKU$dVsr_#|{|YkG(Jl)cC)kJFqHnPgQ{^g$C9O*j=tP~c5>)G$_&VJ#cGd5%;#(^` zv?j9FhmbLijf1%%{NWp4C>if805aKbafy~ zo^&dSJgE2`$H*!%7SSY9g<~vfIVMfx!Sw6W<0D_R+VWhNdY%Wgk%1uOFZ+C0u#_e5VPdvI(6M3n=e1r6&<{5P4zraBcjim~-m!KuyPG$5bUujPUk$ z$Co=iv|e+UA*<;?VoEc2GWem^&@&6))1q_Auchc<47aLz2A&bV`h@btJGz~`Z~1a^ zTE9AXz~IZ&Iud!G=b&*y#=OTyGdCTwo??4*soc9qA~#q-cBK8#sNeja0Wp1dm%hCh zb@$#*V$mIz9kMf@D@(BhnbKQa4_jOUM$Uw5{kM}AK$$3q99AUH+V+p{_B_pb+CF05 z&0LsU*|=z_?-*%Zb!jj1@d=GXGkp;Or)>ex3<~g7q>W6~6O7*M2{|c0Ue5?<(YN$O zYP`jZCF-hnSA~N|%iR?=hDWH{Dj=)3J^gPqwBa+t%P6W)6mgj znQ+(USA3gmmKNFx@_Z6$@IhH+ex;;SihCDplau+|Pq=lv+nc$ral%C2+H)-`gRdt{ z`_i-fOTJZiZ{s|D6zrhHG0uDYF~c7)`B#zrzT0oD=&6bc=4IQX|M|!xZE6;})2k#qPNWC{73d4!m*y_XfdS=;!L2Mz6^mA1LYc zy&g1uJ7YT6l4@!7$s9r2kOY;>g!~AO%t=gruVreif)ECt(a}>rbbKQubMpUvLt@_8 z5ab-4xT%bK2q8+4;0acy@@8j#iuY zNv%V$=dO|4f=IwEg4fgB_{3Qg}0$WJVW9fysPRB?(8=tkk%mpbL#;j{Kya~qJ79At*wJfe{eBL8xY)GUNN0VxHR2WXn=+ruU2Rg0@e`}f zoSVDbp6dF{JZUch6;o&tK^AkB-dBr`LAPW+ui=oyi$zY@JX>R&n-h5Eu-lt>6%E1pn0Egl7mIBm|QEyr6gm#OlI945=%g0j0#WCxPkK zOze*$#EhK3e!u?aw|wcfjo51<-Y)JHwbN@#&X;K!F`!Wg8KI!4)GijouxTyo|{3% zVAj&seD{2!U%EAj>$vF(mUr@e8t8t*L(sv!G1L6gWsOh%pr?-c;~ksqJBe(csS}Fy zTcIWM@ykZ-xYXr6j--PckFsG_!*0yR$F8n--Fwic!TrmI>gxg=@Tz&0DYwYLxa%@C zJd$3IO&2^B`-9I-*fSUq15u01`Ub&LD733+j@{q~cEskZg*Azs#=`!cw=Qe=Vb2#f z=SE^?)@CPnVc8)kE2pU$^y7ydV}yf}7`+J=ApE+20Q9ka19g1o#ga?(h*nHG10wP# zw8Rx>Ce|R9`xTHYtJ@St_n_kLJ*|K{p_NdW3U&^5;BMM2NE)k!R$|ng_%V=LJSpg2 znEXa)M=H;&J%4e&W%`ntFmF7^Ptw82iXBuw1~1Js>BuXMy@@&oC+DMP^Cbov>Ak`? zCo{Ub-_dOc5j)+VzkkUh8WUH1Pl9)A2JbC0bcAom`#sc0dZn(n_)8x^TdbR2_)~SF>{zlhx z?-;uja`E#^c6Rf5sgLakSP)zQ;~iZlrn$m~6^f0@TuKEcp`cP9sYbo*?x`&apyZ+1 zji^jOXLR<;1uHZ6wLv$75_D@i((kZU9Q`JPyeNl z^K2Gl6+a8h9`jG_&_8W$R8RU0Dg+m$Xf=*-Y@hu;Cx935^z=$sH!tz@HzY!j!CG0yA03~hZ6kH?D>i- zzw`+|KI9*k>1osz{SvU@b>&Krd+ocIt}+!nK>?KsH%05IG5)^Tmft<(QrE7v)oyfk zsS^EKUdioI>8Wm1|1CTDlZ#hJPZ91(%RP~0-HYnSkr@hT-a)BeYmc1oortdO_7Q?F zPn-CO#dPHjxCw<%`cn<)SyYN|P93*ohfm3S`WG3|uyauD+Oc}iOGJCgz;n5r;r_Rr zq&!^JN@9Pij;Hun9WVQMJxKLd&vXc!lj|&mE%>{#?C*=<7?|4nb&*kE;k$T|5B^EP zef0gZZ(iT}dH1Y3t+?&)wps$5`*TUpUzUALPoJNo52JYWpPLD_M^H@6AD>Fi?naB~ z0=%re_SxSz;^7Jh*>{IE4zipa@-l_U7kO!YH7Q_1{ki z{KD}h<4$gcC5%l^M3hE8y`Ea?+ls0&-@l?ll?(fFNK} zUX1!G{8zQne}3cRt_#IXm}nvaeRbC6;NWcB1PU95T!M~i26iwSY6H<7{P)Av@M;_c zm%3;c5++Zbqoh0oYSSPx4$PzNMiCeoSXOF0^b%?;M{E7mn*1Ku{t?XoU8wb6&jK`V z?^BPhvXRkl4a<7yU;6Cz>kHrGgeX8~uw8YuCz6zsl9-j1l^%WEa|L}&i;&aRXMe+d zsZp3}Bij=T z5!~ohBolHeFm^XGVpPsl$3mRuGmGWq<$uyG&S$~ufwD&RfBV$AxK^ha85!9hT7ii< z0~3c0b7jrUSYT%1>dth$J~WAZP(_lCpkubtSIKoCFXa8sUcy9te0)@84l&R^cP*QA z0kA}Aim5ll8JeE|sbBdYt_wW)i5MYQ60gqYwl`5xWclv*&_Mp}+a`tKs}z6L3I2WS z|3Q9y4~Dw%tt1{kgo)0uH_>~b62m~4n3)Fz<8zrma{K!F&UB;_6sTt!$10@xNF_hh z&gR{F#GchNYiGpwTO(QFR+>`3=E(0sBtiN9qYoXk3+mZFjda<`zTa4bCL<=$9<^e% zmpOks%T1-Yx>O)LPy505u*b3tcICs)_# z3VH-Iyr=B#?ZG(lW-6w4MF}{9hA9xeY8@_~o}O^dE{ljz`w>v{WD?-xV<8h06Ep$> z1FTusVDuvq!vk?RS~oa3on>O(Wa#MV5HAqNl(nErmt^x@#Sg8^T8dvD|@BvYffNMPrbB(XV&k&ceMaY`kxIe)YULW;F1TY z+}801x2f^yq5j_-$A3|b|9~pAU*F#^)Pwx(NH6m?Ky$~xUf~q_m@sMT&+BV2q~HF2 z3v_}+hot{`+34fa`pnGTJ?7ldx5_u_LT9zVU;n>;BiaY@uU82NJ?cWGt>)l#~VW>ph+`G^ikn)`N|hOz+|TR z<`N;4HCm2Cz8(j=H8AJ7rly9B$BfKlZ(t-bDXA`Po^EGya&olh6t%d5!g=_@qtGuG ze)iF9d-6@23IF;-$VNMD4LMpv{fFN7D2|o&bsw?!)j(wpxMhN_YJbtvv-WHFmC^Zm zJg|aS85qV}ct?D+vx{AVV&Wq^Jrs!;&LFB%>e#^v!30$W^ z?h!Nmo5(g!81|BDyTA|pxN+}$~xR&)i|f874s(o(pi-muq`bng|qyl{~qNR^Hk zzJ%6eoWb_i>S;F22-!jxt?4Bl8He6U7&rd@rx76;nLj{*bdhnuBV`VYU#O3^CD7rJ z(EavCMHQ!EYaNWC#isS?>X{oT&YtDWFPvoa+zD*iw1C1?=-Vu2XU8QdBy^6P`~^Ju zub&dszR-H4H@;0(>qBntIn>0`%e?am3nO%LcBbX$C-2dAWd#AIe$g^$s-}7L#{k%n zWapX>6!C<*PRBa3grsL=)Y-NP`GMN%GA%8})2B~YR#rrz-81yZ9hq9jLFAN_d{D{O zZNIa=08C&V!o$M6pt5Eh99HX5mMvEvPa+KsC4lbu@V`RKmP+v&LoVf~S7?b5_MwW^ za|p{DQf;UAUE_y4ZJxM@*n2sD7;WyaVNr4it~U;X_6CQ^pnYReaA`0^VW|S37jFQ} z;SPY=0H$Z$d+YQmJDU_#H-v~!YHBJfh^hxS$p$A0 z3*peK!vSmgB;OqMP2eBJ(v+Zw&*NO9pO>u{3wvI`y~PlPuGrF9N7yEQ(8C!AE&_(A z_?uZW9k#mHEG$37LC1F*+N-rD7 z0`(Jhu)i!J&YOLPSjagF3TDuzJ}C`_@+=L6u(Go9vXIcw*yr6{mkv{yitP^q@?5J? zF%A%bcO3kFPGOO=yW>hHtZ!eQo>eLZn}FUx4%2QHbV76ZyLU`r9I%k^s3=A-bkci< z1_p1(u3x<>u4&uCtvC9`7i?T#!C~oqR=$gfGYn3xZ%@9Tc^$k`#q2iJ)oDL#+091GE>*Xfp^2X(5Cau3JUUgD^mWHH5PvCq6!&OvI!7GuX=dXIOaB@!?1v zxMs_>-6D%2lidYqw0!}OgoTiI*y#fqx5;Zb0ApaS%#J+u2*$oo_b(QYSnM9f!!=PY zcgp=d_0Cj!`95^YzUi_5x!xM;gfhE&-U++AL@&Ys-_(`WRX9{(w6~8>8T>6B?^ouy zT(s*_q-P8E^YYD`stBRukbPvIbwisDqF3#OF$P%YJSd5IhvvD+gSTfsgf484EV@Y} zFNY4-;*b0R0*Sf74vtMUy&4M3Tc4B5?SbW}dH2RpYEtkn zt(rVdX6OZFyFyMuAv3?>Qn6i2eMp1&CnV6wtEd?EZ$dB@;78>mi4IB`18gi;3ywH1*byCFIro+RKU2@A)rlbP1uiIx$iQ14mefo1Z_& z&b1s74jlJ5*ifsndww&%`?^8-0C!m$|tg?t|eaSw4X3P@nAVY=kDx^U&F^ zfA#2agFc_j>Z{;VZrqs>azJ4WC&+In46ranlV{V=aRUion&EfvENVI#= zXW4P49bd&?DKEyC!}i>7PEGM-P%eDQ(h397oeyhpdR2nTYk6 z&&uW|2@DGugE1Akz1pg(j5anllqRyW({OkpDJ%Zy(fj&cDCp@}YXxJ+TD06>cpr+8 z#LD-U%JiV7O`sE}IpE;a#^TQPi&uZxPZjsB%%d5f| zA%!6tBk0_|)H9T;?{{rHEjYEEyda?c{2*Nsn)>B^Pc zVDhb-S&O5n9+=S~!BxGzyD6*5k=o~xIsih4Rqbl?XOLQjyWvlhkj+e<;|)=$`DW!Ea5fHu`wczYbDd#*ut>jR`{GOKI}zBVlU zlU#EsL&fyk-d}4oaF;Q8(l)Jb3hkbx+vtgji8Gh>M*XP!BM{9Jo8(zM+zM^WBAM)- zK#UXEILPr zv9PZQ9Yhon5uuu+`?TKea%Tm^W&IVFuAYZm%OeD|Cj|us*&)vrxLE5)AOYh9=H}+m zTC1`))3#|k`wB4UClC~8e{*=?EB44`v*gB`fxVIj*oNAh%ZXREm`&SM%)#^O0OxVK zP(2tPTiwiaZ?X7&$E;PG&=w6N|nfErn!Vu+0+ZZj&a^gQ$k%J;$>O6)39WVo>0UK;M2hSBDf1@ zsD&v-x7;?z7<$a6>3d{7)L;Xa)}DYjJseJzrB2^N!8}@q9DlgZ zaE6@g>yoYF)+4ugjmk!wx=s{4fzA-&3s{w`o!xgUMP^fHbuVXl#Ht91DAUMw@W;HT`nc>~=XX`77?zh+1 zAY!P66RLxrVy9nEPp$NuX4^NP@{Rk})|H&!d|zXmE6qy9%?VnQE2VorXL0R4Vxk&jOp+0bb z_MdTpHELXI6A6V_0>)GHCVq`rwKazkOej?|;P9&&BSX7_e0X^H^LU6rMjW8;q1z81 z5~Ei11TxhUZMbFK9hcqz8=MY;ps^YB{0LlR6&V1ew7OKbJofYyRrPHGAs@#P_ns-A zBe#Y*O$gh?p_UFTAix=aD4-n$&aDx=$4aN7EZis$qeA3IjrXZl^q&AV>tD$V2egSC zQ34lcUbzIPXC<;~AB$Nzqxwpy;4`>117pMb+3tIrk6PYwql)^&-T9WHi{n;sdEuYE zu)t_>ihlhIVkfW%s{0=(0M=D=wh5j<0OQdEv@+n!Ugguuim3$|KJ*^If;fln{+pYF zREA6Wu_>kkG%uM=)AyEPUXJwIl|H=~zb9}m9jdad^L{}aI*p;Y*jQEw7wQ26O4~{R z+xMncQBx93BI?wUIsl=M)JKM+ZjkswF#wc9YuxtoHHu>cIQs%_Wi)+Xj}g~pVPWkI zjpEi4Ji5M2@EQmq3VDoUGhHL{S37N<*_#rP;r$d;n)`N>t5x>*TzdA4?QN$H=b%78 zKR+iJxDor=W)3IyLF|nRS$TPRy~F*TW4v>)yFo-nMRkm4Y`0$s-S*NTxs%6puM!Bu z7H2!a9s@&%MQ~!q3pX+fpmGO8k|?nXKwQd~Q>>Bj5!Mr5&qZfjFAehLi{Uri`$|Ma zlsWui-K9b`?{UCv+$%t*fP)`1@u2Paa)JFw&#pJj$jY}KzncpaYpfeDIr>8!gl#~Xgy085!_e?*fr^|F`?=O2E<@XN%_@Vpm%P&A9+{CpeB|v!g#VEc6 z^E^FrbXbhgC@3h@9UY7uy&W!o(+rdp%M>=ZM~IpR6dbWm&GXz4*4NPJG%0ji|0$8# zy4KSU*OlSTbuA_fu#bwg6a)kW>Ar#%Ws5u=VK(~jiP2-2OKon%7t|77?@4oqVHj-W=h+4de{zB!;Rr&;lv^qFy zEJXmvIE>q`Ld5)is(iFIZT^QzVagaDOnKl;SLlgDPYll4vpnfaPh>IWaA<`O))hNW zST*}ax-M5l+LqW8QSe$^@Y;DiBi37~Qpgaer>_sV0vaf&Qg-})y7g@wVrVRyho=Gq z1Brn7BQ-EExXi%NxbP^(w#SY-^19Y}$ifEKvzt@_Tc)kXaha#)BmKEDsM?M@?!vhl)+pFj7`@twWI z|M*-yP?|+MfnkISqv0yr&M@g^W_@Iz@zXP@*=wpHhyDD}6{vBiEG$^u3 zH5Qgf#sJ+FI#s~ee=%~fK?sj#6e(iNU0f{*4{V;57ABC~-y+jI>yBvW}ayZh2g=K-H zL+pU^&tPyw(VMx-xuwZ~-xYI{VCjdm9E!{WSDO!)$PFPP>EIW@_-xQj0_-F$(z`&r z1{WT;Ixp`c^#d)x+--?$?F#hE_7!c`b%KSxiZp-vVorxpP*BuEqmXNe|H%Fn?-=AM z(616B?5@7Qnnz)FqEV}v_90k0FQrf?fy;3erjkCL!+^mkzE-!Ot*t!<@jWT&bxlI_1Reo*;RC_rwG;@chn|!z z?vy9B{_M_ghrO`aO@0i_6v+THGxHr74F`uCjDK=h53pKeFpqAmnXT%=iBo4UFhxj} zgWV_Dd#I%34_O@?Uol!L_jP&e-F0Jm0Nilfp3L1MA|*9c4pv8x4JlyB%K`!#Q7ur=`{+j!DpMV zea?b?Vjh&ZdskhCYd}F>p7w4qIUSM~X|AOeJJjev4-~6$EZ<2d;EGbD%QJD6z$cuC zMMr5461v45t2y$Z2n}yqlzyY}ZBhJy14aCEn`ySsm|EvkHDef@&S;r552>9+6Rx$39kIWv|N zA3ikbH|)zZP~PHbD7pKANlVF%~pNLP_zI)1lexr<-w)~#7}^fzl{m;9A;D<9qv8Z^4=W&a0tocG3cq`1YqA9K428k zTmxL<5V)YCI2Z_U-%))W4d1GYn2=&k9aUAM=`KYHfa}y~Z-%9U=G$um*u*?TO1@UeSy|!v4!vy7eZ5PWYE4x%b~(UMg|{xUj=HFIXnU{*jw(* z`OMq9(EuSXcf^{PVG+1Uxbl!yz;%PCO~aEH7z*N#7SR;YlUmzNYg2TX81LDMG0 z1igx61y_CQccHo!31f;W-)MyAWOiEe7K<3$Wjfv?-CNum&r_jHvnNQLK z!G%XgMcZ9;rY>Z7%%l!mVg-7Z)}Tqe8_;FPF=1Jkdt=Z=?|6^hrqMPYa06Lzx^BOh zgBD;=L7Yy!aH(QsX2V5ENeKx%&k@3S?V9!6O$`naczE@bp47upsp;0K$FfuN^0aPi{Bi^sSk@@=HHOIlaY-q5ngDO!BfVpSj*@kHky zJ<@FS>sT61OO5*izAp$S{lRg%2$?XREqk66ZP!Ka=-hA^eTV=b&z>30Z~tkw7s!94 z8iLTwBIC9=AtcE!60$g_vSKEbz`m>rX_wkvLw@;^YI_l4!sa3Uo}qaL@PlX}GPGo6 z_dImVH!mKv2{eue+Y_iCJmRyvv-7s{Vrtf-{XP-;e0L_2boGNgpqXE@v!@dl z+X~-Uw*YmJ_W3gzM6VdShr%bS1(wUbPf@%5c)brfka8ApH)F4H4vU>O6F5KFe+nd9d==@;_b%9@x*7>EOC?}`8 zo7ef%RYP5!9BGb<=QKPEa1N9tPa&FAqjUu95F_B&n$~l5hl`6#7j!iU%gAlRi}4-6 z=9*g*00@Ek%J|4H;Fa^7&&ED5+=`?^I|BIuZF5%SXg~kj&h+`Mw6j!t(iY$2R*zsl zD*@kQ2^aOPLvh4fhn;Mj@Lq=T*`lDJGi4#x zJSk?zre~|6GnfKG2mv{oPcR!mSx3NcT5GQIJ;saLlV*YuZ{DcK5*TkS4WV!h{i16u zGI4@^Tq+9g?iI!dknn`ekPm#2+wXgZ*CQUoQGfjI{_-0Qi*ss!-wP0ewJ$v{ou2H(8`oQ!IfM@3(e=l(c# z%5>zL2uI&A`t@REtM>pS1pyZyQ``j~&$|N8h=U|LE)SD%6avCkJcqbWJC1QGH}V0= zx(%dg<^%fpw{Ne3J7YrpSH~Np&G#VT&kCK7AY+%~f6aBssumy9s7xxIuw96Qmi87x zh%Oe$5mLgUBAvFW zGDO7Z3P*uD{R|FQ=BTx)=@!r^fZ%0Deqpq`oq?<_$HCs;O=@80HQhJ5(B?(}ec`hB z!^Kz_Ea|wcL3RH8Gr&(Lv9Q$E6O3n3O9J`L0W((%i|YWjPC?_V*ay>J4HQqQ6dsKnZEllB?X!As2c{jHnz6sh>3k61Ni#Q8$B>mke06liZj>az(tYm z(i}gS_G@U%Jg7E-bT=*J{>g)}p+$kjty>sC9V%yO1^^x3W+x5oj9TbVw69D;0s_$N ziS6}Fz%*uz-+-+0i?%2|4YC^1DvyJNpGH>eGx894;sX1xTIP`1RZ=!_Se~?Ly{R?} z2n^-;u)J%$pa)!{i)WHECOb#NA%kZ7} z0RO>gVjAF)Q8o|G4RC0=FiyDx=k)km2;|NoB=H5W)7jNE3OD8sh_4Xc{sLoFI8gOD z{lHWzsi^2rd<~!J$)<)~fsBL|^mPQ#R@cxl2G5^IwyNu95f~EE0B7Ueg$q6}U!F%J z|4#2^lv0F%+n7WaL78z#iD3Y$zk-R0$?mc51W$&-p5)|Ybc(!-i;LgZpd&+wN7h9V zB9zDm<*d;pBbsD za)RU#>$hTxzBPV?rINM4cjSSiNQ0$azxvqNSO(Ryk#t|XGJz; zb7`q{FfSSXcr+i5{sI`FT?8|OALuYQEyHH$!3{>KN=Opm0;P72l$61u>cAn_aalX? zAUK{k#KQwfrU0O6U!a)~7#BafxX221adprcgsC-N#4_LA##38iuV7m38YG^efvYGG z40zx|fb^+jEgsb4ZuKD?%Pbx~52K_noWMRq2(sY@I230M98NZBzFqC`dx1&aV3c$qkY!&M-ql8?GWNQ5-FJajCIXEKcQN05oA<)9U08(5Pn&v2@nhsbelyZVi zssj&G55`@+f~P{84b(hzz>uOu3Z#P0dt>9DZxdV#LJ{neNX9AKb=yoJf>5>tWrjfj zb8CBV4-XnmL#r87)KCX#(yY)iAzUbX10phL(ap?!A0}jri{HJA`gh>#>tE8{7k6-Q zNbhl49lP^hIUNfryPJH`v)IT~t<=sqdV0=m;a_!SP)6|oMRE3T`Y^QK{`mDD(rDPT zKd=82GPL8e{`=5<50zilfh9mSR3L}}<9G#}288f5XfT+6um-ANG?jsdpWu^GmyZ}aKL>cBP08S0XtT!=(rmc zW$9FTIL*BG0~MxG5S0+Qj>iribXZDmHRFfJ3BL~$SkR~8@7fyi425tLHgGILMLV~& z4IZBzjb!Y>>oo#P{BG2C16#bMzYQJNhG`wr{IRzoO=4a0^;bIZNqjG~#A_U?qSkJdYC(s3d z-0(-M*qMgTxrZi>5R2c!c?u$}QQ#bFLDzw{LPF)jz+pbs&R(8NLA8S=SkTNK-u|%z z)H;vQ$fV4X4P_hjK=B2Wj6pWh0CEWpRCx}xp4OlOdQN(vTnyfP&i*YZ(FBk7*S3Li zu>$g$@}?C65;IK14Ah3O4=$v|=!$*a_-hY_o`J>=+~O*%z3yB{vjbtGgHThMCh+?pa>WP z7kWI_gYJ$6bO ctypes.c_void_p: diff --git a/examples/aot/flash_attention/cpp_ref/split_pipe/run.py b/examples/aot/flash_attention/cpp_ref/split_pipe/run.py index 1ede740e..f7e61fb8 100644 --- a/examples/aot/flash_attention/cpp_ref/split_pipe/run.py +++ b/examples/aot/flash_attention/cpp_ref/split_pipe/run.py @@ -94,7 +94,7 @@ def fused_attention(q, k, v, is_causal=False): return out.squeeze(0) -def test_flash(tile_s1: int = 256, head: int = 128): +def test_flash(tile_s1: int = 512, head: int = 128): if head != 128: raise ValueError( "split_pipe generated_cases.h currently instantiates HEAD_SIZE=128 only; " @@ -201,7 +201,7 @@ def test_flash(tile_s1: int = 256, head: int = 128): if __name__ == "__main__": parser = argparse.ArgumentParser() - parser.add_argument("--tile-s1", type=int, choices=(256, 512, 1024), default=256) + parser.add_argument("--tile-s1", type=int, choices=(256, 512, 1024), default=512) parser.add_argument("--head", type=int, choices=(128,), default=128) args = parser.parse_args() test_flash(tile_s1=args.tile_s1, head=args.head) From 8eaa9f5b128746bc0f6d201d737b268bc6f95751 Mon Sep 17 00:00:00 2001 From: learning-chip Date: Wed, 29 Apr 2026 19:41:39 +0000 Subject: [PATCH 06/17] copy over full source code --- .../split_pipe/fa_split_pipe_s1_plot.png | Bin 106576 -> 105389 bytes .../cpp_ref/split_pipe/jit_util_flash.py | 40 +- .../flash_atten/fa_performance_kernel.cpp | 998 ++++++++++++++++++ .../flash_atten/fa_performance_kernel.h | 43 + .../kernels/flash_atten/pto_macro_fa_gu.hpp | 59 ++ .../flash_atten/pto_macro_fa_softmax.hpp | 219 ++++ .../kernels/flash_atten/pto_macro_matmul.hpp | 212 ++++ .../flash_attention/cpp_ref/split_pipe/run.py | 4 +- .../split_pipe/scripts/generate_cases.py | 228 ++++ 9 files changed, 1784 insertions(+), 19 deletions(-) create mode 100644 examples/aot/flash_attention/cpp_ref/split_pipe/kernels/flash_atten/fa_performance_kernel.cpp create mode 100644 examples/aot/flash_attention/cpp_ref/split_pipe/kernels/flash_atten/fa_performance_kernel.h create mode 100644 examples/aot/flash_attention/cpp_ref/split_pipe/kernels/flash_atten/pto_macro_fa_gu.hpp create mode 100644 examples/aot/flash_attention/cpp_ref/split_pipe/kernels/flash_atten/pto_macro_fa_softmax.hpp create mode 100644 examples/aot/flash_attention/cpp_ref/split_pipe/kernels/flash_atten/pto_macro_matmul.hpp create mode 100644 examples/aot/flash_attention/cpp_ref/split_pipe/scripts/generate_cases.py diff --git a/examples/aot/flash_attention/cpp_ref/split_pipe/fa_split_pipe_s1_plot.png b/examples/aot/flash_attention/cpp_ref/split_pipe/fa_split_pipe_s1_plot.png index fde07212cdc857064875b0850f5d140bacf30735..3a9c375b00b6a8c4cb3a778d184f3084f4547612 100644 GIT binary patch literal 105389 zcmeFZbx@b<`ZxLolu(e65~M`Br5ov#?(Xi81|<{(5fMR<5Jc(jR1}aFl#otA8j+BY zb3JSAz1Dl)-#c?=&dmAmteL$L{nqo`_kCTTy1p?QcNFk0QCvcyPY5fgd71at1!y?sh(RExl|}YL-48F77@qj#jjOwqD+j?ryxCJlvc@?6eL( zJ|5m8TwJdIJc85R%bx4KvF`x93XX@Op*IReo{szvP02Un843-BQj)!`B+B^Y0~Mr&(ZOY}-=M-IlE>Rer&GpI(Rd@ZIIMq}&I zzG>TTzgP-5&lV<9q`ikhH~+^(pL4lyMQQ8h%c+3qaGp*nY`RDS>A(MvM^W08Ed0N} z!QT)2Frz8{`+$dNxff{veK;Lv98vf`Po|3`=T=4${pY3NQC9E%|0n;yxM2nQCMMTs zg0{tfZBCNa*492zyy@ZLAvIQN%HuXARBTjp$^Fpy*)~k%(X#h z8JbuxryzFU!Txf~4-_U@PoEN<{`#VxDi&}{OkCX3&JNSr+1Y39E6(lPw}m|BP~_J8 z)C#6A`uqAmw}u4uy%fIs;0o1nzG_ED2RA=|loai|{&Yb~6G0iz^-+%IKga8<->R63 zOG+$lY$9u2Cvy}Ms8es*UK%YmedIh=S`eJU%F61ozor{}IDI!&(49IsIGC3B5*-2d z+>amKL594%yq2!6c-q?9uk-Q>rsNruEa5(2cz~s!{$*13 zcV%sVVt@VmB{G^|U%rc#gQH_5E9|jE$nm?*PR!@epRdlei0YLX zMNLha)ST#^7Z3kROieXd7s96&dq-v-e2+!@O?Jr10XGlNJ-Ejcb?yoFSs|od2{i7j zUtU*K*$<8y%FE;w4Z3ua-=L?j2s!a!Dh+e1|I!1*#ho8bi+-d#tOU9ZE?_p)R1KwVoYJMvIX|R*S_ENU!bm z3(j)W)6-*S&ve0iPu{d87x7`ncz6H)eW#MiMqjqOp}NHDwQkcBH*LS@NlT;azu~nX zSZx%-`#wMaN>lZ#?%=z3QhA%9e}1oEro27goA~@7=j8;o%CtAH&+2E)5!>@WXMNwk zHO%ZC{P^-?#-{fLY$mf*QcB6A?C`_m5&NZ2iTk6yA3sK({p{uPrDo#iPxjrKGTh`bF)X1l6mFuK{ot2f=is#hy^tYCvL;u1MS2!sYA*G{-fg`?>1@37l-m;VvQwjwq zTc5RNFbD|=RcQ&z1zab}o12@XB^V;B$-kmMA;=k}2|K+fI2(MGgoMPy+xtT_9wh-a z^<&sPi}N2I)cgD(5^xz0za4@3qcLAr0ol#%?d>8o5m@-8HRgVP0*|i?=Ty6#9Bkro zK7juw_8vq>dri7dR4WyEahkU_&m8amIN5INg6m7n%)9~ztNCyysNQS&618M#+_PuI z*Cj)*d#?;Ehw{_#IS{~8Otw8&`d;Mfe1CvXV>R0vvO1i188tWeKEj~VMk%A~2wn{h zrTs?LF<5SY{B2ff?4ZO6u2;kL*4EaeA8)ffpa9s|+1=paz_TCB?C7Ei!?!%av z+js69 zs`r>j|2~j0d2_#5WwO?lkeE0Uiqm3y)a8c>2?}<0jBYc{G5hOdAG*77Y;A4*=cC9x zHpY39yPhcLAq5c5C|#oBPTTnzeoRb^qMBNVy5!jf6%`ezMV7;_mEe7gYR;z`yw_Wv zM@B_?PD-9^RB_+Br6nSN`!*U1DFp^Cf&2p*q7Q!k@_~D?09Q7}?*jJ{bErK=$J5tW z&cY(QXE48!n3PnSos^!Nn?TfWL(0d8&&$h;fQl*}-jMjsn>U{Z2IS$96MEC{&yYn}F2ndu-VHnvCKCMS7O zs_djyu*(Xk?yx3%O=bvrN*4uQdzzDT!_LmG6IC91c04lKv-WejxA^tz*P}mIR~`J0 ze>vujdc>|@pXCtzKA1I#D*wH=Qe>CEJ`*H-qG5Ubwex>mV7OC(+EY^!k$Rm5ki$C%W2Ws6~kpq>!=Phd- z-0W`D6C_nZg@UV=FG0o3gqTy1AVmA&_r3# z;nvZ@Bd+>o*g2nd6MdASM-Ju4J?ULW4wdBjDFzo8SIuMsjU+W(Bsxkg@E7)W>xo;$ zfU~=MLdPRAjC`kgpYMIwk|#}@{RzK)`&M3C+xhvG45bgJj0beeXV0FYP&59Ec&VwW zUmHT8oLf3M894{My_3NmeB@zZWF(*@OycG3T@iHXhSHe)x%DyTDhlQ8?Tz$*U+Te+ zA1`2F;^x zERQgK_cPUBkMi;u-rUKE1;`2O0wk zhmKX3hPaMLkc=P8M8azcyEC2=i;0OTH7zX%aD_kMnf2>pEu3qNXqqqeE#Ke2Sc6GD zQ|p?pw^Arv?*lDnw8Z!UwRqsW;b9^H0Ri$`HrS!(XLsWhG?T2*WB8p%QK-<9O+j2L z5#ob`13)n{hg;JXZqp*qo!I^87b;_7PY;(~kk?%lo&Q8L&bUkbN^ z8^g{e4jF=Gnge!z{%rrEE{TU4Z}5IApJYs)_T&ixluiuPOz@uC(b3V@CUp%Bg5&*l ztn9+3(2ykF{4X`m`djA(1qG~inm*@LlA&TZiDHHu7Z$97q0N&EdC&^JtBr`jX!QAU z{{^r80-U(po}Lw*%fg-u7Y?a~LymniCP_(1-cL%H_H3#&MHc_u0otbrTi!#wkrB_Pr$_P`W?iw6-(< z!K8itg?*-GLwrmO4y^7alu+oYP)|<}g-_|5oK-hx7Z(#}Q!A?*TT=}fQXyxBWxWFf zol%#`szt&a9GJ-xpfek78k^R+P1m0nrSC+!18O~5%}w}RVl0@Np8jECf&%*P2S9=R z6X&ogJL9hL!qQ`2y?PanUQXEgAA`0~@e~hz22oK;(Ysq8c?ZQX+}+(%U%Yq^n|y0) zD^=M0P3P5|Q`n^BaMuon*B2KfYDvWhTBU74eSw|i+5kY5<^+o+1Ys)j)qb0^6l0s z^xx*JB%Ok7agKA zBr8wDCnF;xrJ^$3=5f*z#Cd3y)krdvD7Hp*bPG>UPm1ljfIU06HUx@~26i+yHj1(^9-`h!oNVwWPx=Q0 z@SrvlB>!j_WoBj$i1=+7YzL{Omp;7pA};-cEgT|Ww(%j!&^ zs0`Jc#OeCB=xr3aNykS!#g-alU|q368F+YQ%X z|3t|2^mOuC;d)F{_2!@a7}%CxUF@u^g*AVo$js&>%G_s~3x1NTJZHB=rB+n%sHmzg z<(XVcQ_a*qtE#O?3g;7Gq_jFa-rpasDBUV3TpJ^5LXExrnosAmORbR~%7MTht`$aE zviys*bg~TQ=H~VF^{D(b+PSDbwE>E+{4sEvu5 z%SHNSZaceoH^%P)p0*w>HmvvCq<~jNpkMRP9yU}sG$%_qMXbiXQPI&0aCo6i@F3t7 z7LJ~Q;UaV!B1Y3b<^0Dd(8fX1n&vm`--c`4L!w$9x=gQJ7EVrhH3?CaCrszHel$!z*4 zR9VXb1#I|e046u!yx-lP>41{W6Y$d}?>So_i${3URG_Sn zImw!iiKCP`FyOykz@&~LRC+!qz;;bDrgJ9Y-JG-5l$Dh=bacMXJrGzfEiRVT(jxMM zy9gkf0=5yifIz1LO~~uoP}Ev*7^{&-QBju22$LLzcp%?Ijq}^xR(@S~-?xQL0<+)y zUPScusk%(n6YlQre(LFI?@nTB(1Y$#d>byfYcz9Cz9G~{+=>yU7hrQ}?v|~Bd=zAG}n&O>1@~~4#IgBp6(s-zr zE-(+DQOoe4#JFw&ZWIRU*T%Q2uU@_S^y!mSaIhFcQ8qSQpud+79P8`o@UhxGijDOd zU2AD>z7F>hQ-lBdgNBBH64&P(#+bnBKP`Kyrt#rGEtL%n6amOacrrbSzgYq2k>Bpr?BoLC9FkJadB~t z+P|G9R0@~5nf;l~EyI$t8do#}P0jZi?i=G3 zMx&2;;Ig-B@|8TN8jVDm7vz|U3$L@EB&kaPoBotY?_5$hd#sWCyREpumjy0I> zkL^#ox0Tei9`BdY;j7Jf#~!NmD?pDKx#RJ3)Y#o~l7y6WG$7d6*cdY$wqVIjB{OXJ ziW&bgSs-zOh6zngqHJtz&N~%rT4!lamX_~x0AkvR(fNqJIS&f@ z)=N2A*?ci|pi0hP-r!-pgH4<5D;#z-kF_PPyH{0STpTCrm%?fKj8RKN2=I(x#iPc- zjWv#^6vv;d8LrNjWECFv9PM_|jJVzX{nOS>OGr1N!n&){y6Z82qnPiI57Cp(YLv_4 z)Z!m-UA9uXy|Wt|8}c;jlY@zGVrSD1dkd-M<>fb;wp+gxhBgM`GcyPN0pwOU1l3#r zuj*Zb=tfXGb)86_fszGyt=Oc22@$%ctjk-m8o)I_3f?NGIC!&Dj zedz1Moeev0nRu=bOBvnJAbjiAEk0@{rR2+GoPbZYHgmsQoX3uaeEX=>SgG#UPP5LFqsGbTD=Ew7!^K&R(F21h!3UVq3n&)4h!v+%lS@( zduNBU9|i^<8nlv0|avyx@;kpMzgSv`!~a}$Xkqzj6xyDe0Bh0 zOu0bY@kI1RDAL%MF5L&&FdCnxv^Ke5;n;lkH8X-ESXqbbIo0|{Mo8RSe=`OiY!rBf z><>$q5s%4%0GhnbtME=?Q1j&60AN;hLMz8ugl*m~aRFazJSa zhrU?w{#jBtb3ZF9tH-*jp~3U&m#_S_r6RF|tFK?*{P^)BbBUF{eb=VKxYtekJ9BB%nbVzP&0Y3Jxhai<$8EqTU*aQ3k%B>dF^qruvH~vhkY`v z(4nClcBC|&d;)bm>;w|Pw9=pg0T@PFIwBkB>FMR?=f7L%c$D746nkG_8|`9;{ST-( z>D2%b84#s@jSql2BBFpIVNh;?CgQvH`k4;AMmw~bp)zyHJhY$AKX-R;!)aI(!`B#b zRZf?UF8!)%raRUWbk}ENoKR|HqX3V`XH_Hbf{ZWhYD70d%>k`bp60rfDTb3>xSpbT zQ)|*zhBL+6d?L-+;|CDt>p~tVsgXVXs-g~%MCO;4E@b=qVYo4?HIBK>wwgMA_PKod zGJtPPDE_EI#(qtH-t}CCgnArnP&c%kTNYG?p)+_ceIhKemneB;W!D|{=eNT0yQ$cv z<5V8&`uYOHQlv#4&W0(-$z60`Mi19F4@q8^INqol99=sAet!S%OaKE3|E%Y zt{aKiqobp~ZqD}h51`OqMKoQw3p`dIvGXFat#J_z3rKN==c0T~R{?$&So7x9*mx6LH)NGKJv9p~HmKqz$KzpDu3k+{N{V>+5W9J|lMRc@-Z8keTJurAuiwGZW2Nh1$;=O1DKLt9_oKZbp9X{qza@%Nw;100

e|My3WK?({uWl+W^W~V?jkzZ8 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 literal 106576 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%0AMLn{g47YD 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 KWb, prefetch, sync, …) + +Kernel sources live under this directory: kernels/flash_atten/ +""" import ctypes import os @@ -15,8 +22,19 @@ import torch ASCEND_TOOLKIT_HOME = os.environ["ASCEND_TOOLKIT_HOME"] -_SPLITPIPE_ROOT = Path(os.environ.get("PTO_ISA_SPLITPIPE", "/workdir/pto-isa-splitpipe")).resolve() +PTO_LIB_PATH = os.environ["PTO_LIB_PATH"] + _SPLIT_PIPE_DIR = Path(__file__).resolve().parent +_KERNEL_DIR = _SPLIT_PIPE_DIR / "kernels" / "flash_atten" + + +def _pto_include_dir() -> Path: + """PTO_LIB_PATH may be the repo root (contains include/) or the include dir itself.""" + root = Path(PTO_LIB_PATH).resolve() + nested = root / "include" + if nested.is_dir(): + return nested + return root _CV_FIFO_SIZE = 8 _CUBE_S0 = 128 @@ -38,24 +56,19 @@ def compile_flash( verbose: bool = False, timeout: int = 600, extra_sources: Optional[List[str]] = None, - splitpipe_root: Optional[Path] = None, output_lib: Optional[str] = None, ) -> str: lib_path = output_lib or str(_SPLIT_PIPE_DIR / "flash_jit.so") - root = splitpipe_root or _SPLITPIPE_ROOT includes = [ - f"-I{root}/include", - f"-I{root}/kernels/manual/common/flash_atten", + f"-I{_pto_include_dir()}", + f"-I{_KERNEL_DIR}", f"-I{_SPLIT_PIPE_DIR}", f"-I{ASCEND_TOOLKIT_HOME}/include", f"-I{ASCEND_TOOLKIT_HOME}/pkg_inc/runtime", f"-I{ASCEND_TOOLKIT_HOME}/pkg_inc", f"-I{ASCEND_TOOLKIT_HOME}/pkg_inc/profiling", ] - pto_extra = os.environ.get("PTO_LIB_PATH") - if pto_extra: - includes.insert(0, f"-I{pto_extra}/include") flags = [ "-fPIC", @@ -112,7 +125,6 @@ def load_flash_lib(lib_path: str, check_type: bool = True): _ws: dict = {} def _alloc_workspace(s0: int, head: int, tile_s1: int, device): - # Intermediate GM layouts depend on S0/HEAD/tile_s1 only (see demos jit_util_flash). shape = (s0, head, tile_s1, str(device)) if _ws.get("_shape") == shape: return @@ -142,7 +154,6 @@ def _alloc_workspace(s0: int, head: int, tile_s1: int, device): (slots, _CUBE_S0, head), device=device, dtype=torch.float32 ) - # Match demos/torch_jit/flash_atten/jit_util_flash.py layout for LaunchTFA intermediates. _ws["global_sum_out"] = torch.empty( (num_s0_blocks, s0), device=device, dtype=torch.float32 ) @@ -197,18 +208,13 @@ def jit_compile_flash( verbose: bool = False, clean_up: bool = True, kernel_cpp: Optional[str] = None, - splitpipe_root: Optional[Path] = None, ): - root = splitpipe_root or _SPLITPIPE_ROOT - kcpp = kernel_cpp or str( - root / "kernels/manual/common/flash_atten/fa_performance_kernel.cpp" - ) + kcpp = kernel_cpp or str(_KERNEL_DIR / "fa_performance_kernel.cpp") dispatch = str(_SPLIT_PIPE_DIR / "call_kernel_dispatch.cpp") lib_path = compile_flash( kcpp, verbose=verbose, extra_sources=[dispatch], - splitpipe_root=root, output_lib=str(_SPLIT_PIPE_DIR / "flash_jit.so"), ) func = load_flash_lib(lib_path) diff --git a/examples/aot/flash_attention/cpp_ref/split_pipe/kernels/flash_atten/fa_performance_kernel.cpp b/examples/aot/flash_attention/cpp_ref/split_pipe/kernels/flash_atten/fa_performance_kernel.cpp new file mode 100644 index 00000000..ef96b38e --- /dev/null +++ b/examples/aot/flash_attention/cpp_ref/split_pipe/kernels/flash_atten/fa_performance_kernel.cpp @@ -0,0 +1,998 @@ +/** +Copyright (c) 2026 Huawei Technologies Co., Ltd. +This program is free software, you can redistribute it and/or modify it under the terms and conditions of +CANN Open Software License Agreement Version 2.0 (the "License"). +Please refer to the License for details. You may not use this file except in compliance with the License. +THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +See LICENSE in the root of the software repository for the full text of the License. +*/ + +#include +#include + +#include "fa_performance_kernel.h" +#include +#if defined(__DAV_C220_CUBE__) || defined(__DAV_C220_VEC__) +#include +#elif defined(__DAV_C310_CUBE__) || defined(__DAV_C310_VEC__) +#include +#endif +#include "pto_macro_matmul.hpp" +#include "pto_macro_fa_softmax.hpp" +#include "pto_macro_fa_gu.hpp" + +#define UF_ENABLE 1 + +using namespace std; +using namespace pto; + +#ifndef FFTS_BUFFER_FLAG_ENUM +#define FFTS_BUFFER_FLAG_ENUM +// Buffer flag values for FFTS pipeline coordination +enum FftsBufferFlag : uint32_t +{ + BUF0_QK_READY = 0, // Buffer 0: QK data ready + BUF0_SM_CONSUMED = 1, // Buffer 0: Softmax consumed + BUF1_SM_READY = 2, // Buffer 1: Softmax output ready + BUF1_SV_CONSUMED = 3, // Buffer 1: SV consumed + UPDATE_READY = 4, // Update stage ready + UPDATE_CONSUMED = 5, // Update stage consumed + CV_BLOCK_END = 7, // CV comm slot block end (CV_COMM_CTRL reserved in TSyncCVID) +}; +#endif + +enum CoreEvtID : uint32_t +{ + QK_EVENT_ID0, + QK_EVENT_ID1, + PV_EVENT_ID0, + PV_EVENT_ID1, +}; + +// ----------------------------------------------------------------------------- +// Performance tuning knobs (high-level) +// +// The kernel is a cross-core pipeline (Cube + Vec) with explicit FIFOs: +// QK (Cube): compute_qk -> qk_tile_fifo (fp32) +// P (Vec): compute_p -> p_tile_fifo (fp16 x_exp) + l1_exp_max_ififo +// PV (Cube): compute_pv -> pv_tile_fifo (fp32) +// GU (Vec): compute_gu -> o_out (fp32) with running rescale/update +// +// Key knobs that impact throughput (see runTFA<> below): +// - CUBE_S0 / CUBE_S1: tile sizes for QK/PV cube matmuls (compute intensity vs. buffer pressure) +// - qkPreloadNum: pipeline warmup depth (more overlap vs. more L1 FIFO footprint) +// - *_TNBuffers: ping/pong depth for Mat tiles (overlap) and Vec tiles (latency hiding) +// - QKV_CV_FIFO / PV_CV_FIFO: FIFO depth between stages (avoid backpressure) +// ----------------------------------------------------------------------------- + +// Inline macro used for small, performance-sensitive functions +#ifndef PTO_INLINE +#define PTO_INLINE __attribute__((always_inline)) inline +#endif + +// Detect build-time macros and expose as constexpr flags for clearer conditionals +#ifdef __DAV_CUBE__ +constexpr bool DAV_CUBE = true; +#else +constexpr bool DAV_CUBE = false; +#endif + +#ifdef __DAV_VEC__ +constexpr bool DAV_VEC = true; +#else +constexpr bool DAV_VEC = false; +#endif + +constexpr std::size_t MAX_TILE_L1_BYTES = 512U * 1024U; +constexpr std::size_t MAX_VEC_UB_BYTES = 192U * 1024U; + +template +constexpr AICORE std::size_t tile_storage_bytes() +{ + using ElementType = typename TileType::DType; + return static_cast(TileType::Rows * TileType::Cols) * sizeof(ElementType); +} + +template +constexpr AICORE std::size_t tile_buffer_total_bytes() +{ + return tile_storage_bytes() * NumBuffers; +} + +template +AICORE inline uint32_t assign_tile_buffers(TileType (&tiles)[NumBuffers], uint32_t base_offset) +{ + if constexpr (NumBuffers == 0) { + return base_offset; + } + + constexpr std::size_t total_storage_bytes = tile_buffer_total_bytes(); + static_assert(total_storage_bytes <= MAX_TILE_L1_BYTES, "Tile buffer L1 allocation exceeds 512KB"); + + for (std::size_t idx = 0; idx < NumBuffers; ++idx) { + const uint32_t tile_offset = base_offset + static_cast(idx * tile_storage_bytes()); + TASSIGN(tiles[idx], tile_offset); + } + + return base_offset + static_cast(total_storage_bytes); +} + +template +AICORE inline uint32_t assign_tile_buffers_union(TileA (&tilesA)[NumA], TileB (&tilesB)[NumB], uint32_t base_offset) +{ + static_assert(NumA == NumB, "Union assignment expects matching buffer counts"); + if constexpr (NumA == 0) { + return base_offset; + } + + constexpr std::size_t stride_bytes = (tile_storage_bytes() > tile_storage_bytes()) ? + tile_storage_bytes() : + tile_storage_bytes(); + constexpr std::size_t total_storage_bytes = stride_bytes * NumA; + static_assert(total_storage_bytes <= MAX_VEC_UB_BYTES, "Union tile UB allocation exceeds 192KB"); + + for (std::size_t idx = 0; idx < NumA; ++idx) { + const uint32_t tile_offset = base_offset + static_cast(idx * stride_bytes); + TASSIGN(tilesA[idx], tile_offset); + TASSIGN(tilesB[idx], tile_offset); + } + + return base_offset + static_cast(total_storage_bytes); +} + +template +AICORE inline void allocate_cube_tile_buffers(TileQType (&qTiles)[NumQ], TileKType (&kTiles)[NumK], + TilePType (&pTiles)[NumP], TileVType (&vTiles)[NumV]) +{ + constexpr std::size_t total_bytes = + tile_buffer_total_bytes() + tile_buffer_total_bytes() + + tile_buffer_total_bytes() + tile_buffer_total_bytes(); + static_assert(total_bytes <= MAX_TILE_L1_BYTES, "Total cube L1 allocation exceeds 512KB"); + + uint32_t l1_offset = 0; + l1_offset = assign_tile_buffers(qTiles, l1_offset); + l1_offset = assign_tile_buffers(kTiles, l1_offset); + l1_offset = assign_tile_buffers(pTiles, l1_offset); + l1_offset = assign_tile_buffers(vTiles, l1_offset); + (void)l1_offset; +} + +template +AICORE inline void allocate_vec_tile_buffers(TileDataF_T (&srcTiles)[SrcBuffers], ReduceTileF_T &m1_local_max, + TileDataF_T &input_reduce_tmp, ReduceTileF_T &l1_local_sum, + ReduceTileF_T &m2_global_max, ReduceTileF_T &l2_global_sum, + ReduceTileF_T (&l1_exp_max)[ExpMaxBuffers], + TileDataH_T (&x_expT)[XexpBuffers], TileOutT (&pvTile)[pvVecBuffers], + TileOutT &runningOTile, TileDataF_T &triu) +{ + constexpr std::size_t float_tile_bytes = tile_storage_bytes(); + constexpr std::size_t reduce_tile_bytes = tile_storage_bytes(); + constexpr std::size_t xexp_bytes = tile_buffer_total_bytes(); + constexpr std::size_t out_tile_bytes = tile_storage_bytes(); + constexpr std::size_t union_stride = (tile_storage_bytes() > tile_storage_bytes()) ? + tile_storage_bytes() : + tile_storage_bytes(); + static_assert(SrcBuffers == pvVecBuffers, "src/pv ping-pong buffer counts must match for union allocation"); + constexpr std::size_t union_bytes = union_stride * SrcBuffers; + constexpr std::size_t total_bytes = union_bytes + xexp_bytes + (reduce_tile_bytes * (3U + ExpMaxBuffers)) + + (float_tile_bytes / 8 * 1U) + (float_tile_bytes * 1U) + out_tile_bytes; + static_assert(total_bytes <= MAX_VEC_UB_BYTES, "Vec tile UB allocation exceeds 192KB"); + + uint32_t offset = 0; + TASSIGN(runningOTile, offset); + offset += out_tile_bytes; + offset = assign_tile_buffers_union(srcTiles, pvTile, offset); + + TASSIGN(m1_local_max, offset); + offset += static_cast(reduce_tile_bytes); + + TASSIGN(m2_global_max, offset); + offset += static_cast(reduce_tile_bytes); + + uint32_t tmp_float_offset = offset; + TASSIGN(input_reduce_tmp, tmp_float_offset); + offset += static_cast(float_tile_bytes) / 8; + + TASSIGN(triu, offset); + offset += static_cast(float_tile_bytes); + + TASSIGN(l1_local_sum, offset); + offset += static_cast(reduce_tile_bytes); + + TASSIGN(l2_global_sum, offset); + offset += static_cast(reduce_tile_bytes); + + offset = assign_tile_buffers(l1_exp_max, offset); + + uint32_t tail_offset = assign_tile_buffers(x_expT, offset); + + (void)tail_offset; +} + +// Helper to assign an accumulator tile to one of two ping-pong UB addresses (0x0 / 0x10000). +// Keeps a per-type static running index that toggles on every call. Caller may pass +// `initial_id` (0 or 1) to set the starting buffer index on the first call for that tile type. +template +AICORE inline int assign_running_acc_tile(AccTileT &accTile, int initial_id = -1) +{ + static int running_tile_buffer_idx = 0; // per-instantiation running buffer index: 0 -> base0, 1 -> base1 + if (initial_id == 0 || initial_id == 1) { + running_tile_buffer_idx = initial_id; + } + const int id = running_tile_buffer_idx; + const uint32_t base_addr = (id == 0) ? 0x0u : 0x10000u; + TASSIGN(accTile, base_addr); + running_tile_buffer_idx ^= 1; // toggle for next call + return id; +} + +template +AICORE inline void compute_qk(QKPipe &qkPipe, int tile_id, int sub_tile_id, __gm__ half *q, __gm__ half *k, + TileMatQData &qMatTile, TileMatKData &kMatTile, TileQKData &qkAccTile, + QKSlotGlobal &qkSlotGlobal, uint64_t qkMatTileEventId, int accTileEvtID, int blk_idx) +{ + if constexpr (DAV_CUBE) { + constexpr uint32_t Cube_S0 = CUBE_S0; + constexpr uint32_t Cube_S1 = CUBE_S1; + constexpr uint32_t Tile_S1 = TILE_S1; + constexpr uint32_t kTileFactor = Tile_S1 / Cube_S1; + constexpr uint32_t Cube_HEAD = HEAD_SIZE; + + constexpr int QKP_CV_FIFO = QKPipe::RingFiFo::SLOT_NUM; + static_assert(QKP_CV_FIFO >= 1, "QKP_CV_FIFO must be >= 1"); + static_assert(Tile_S1 % Cube_S1 == 0, "TILE_S1 must be divisible by CUBE_S1"); + + const int s0_index = blk_idx * CUBE_S0; + const int s1_index = tile_id * static_cast(Tile_S1) + sub_tile_id * static_cast(Cube_S1); + if (sub_tile_id == 0) { + TALLOC(qkPipe, qkSlotGlobal); + } + if constexpr (CAUSAL_MASK) { + if (s1_index > s0_index) { + if (sub_tile_id == static_cast(kTileFactor) - 1) { + TPUSH(qkPipe, qkSlotGlobal); + } + return; + } + } + using GlobalDataQ = + GlobalTensor, pto::Stride<1, 1, 1, HEAD_SIZE, 1>>; + using GlobalDataK = GlobalTensor, + pto::Stride<1, 1, 1, 1, HEAD_SIZE>, Layout::DN>; // BNSD - (N, K) layout + + GlobalDataQ qGlobal(q); + GlobalDataK kGlobal(k + s1_index * HEAD_SIZE); + + wait_flag(PIPE_MTE1, PIPE_MTE2, qkMatTileEventId); + + if (tile_id == 0 && sub_tile_id == 0) { + TLOAD(qMatTile, qGlobal); + } + + TLOAD(kMatTile, kGlobal); + + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + +#if UF_ENABLE + pto_macro_matmul(qMatTile, kMatTile, qkAccTile, AccMode::InitFinalSum); +#else + wait_flag(PIPE_FIX, PIPE_M, accTileEvtID); + pto_macro_matmul(qMatTile, kMatTile, qkAccTile, AccMode::Init); +#endif + + set_flag(PIPE_MTE1, PIPE_MTE2, qkMatTileEventId); +#if !UF_ENABLE + set_flag(PIPE_M, PIPE_FIX, EVENT_ID0); + wait_flag(PIPE_M, PIPE_FIX, EVENT_ID0); +#endif + + using QKStoreGlobal = + GlobalTensor, pto::Stride<1, 1, 1, Tile_S1, 1>>; + QKStoreGlobal qkStoreGlobal(qkSlotGlobal.data() + static_cast(sub_tile_id) * Cube_S1); +#if UF_ENABLE + TSTORE(qkStoreGlobal, qkAccTile); +#else + TSTORE(qkStoreGlobal, qkAccTile); +#endif + + if (sub_tile_id == static_cast(kTileFactor) - 1) { + TPUSH(qkPipe, qkSlotGlobal); + } + +#if !UF_ENABLE + set_flag(PIPE_FIX, PIPE_M, accTileEvtID); +#endif + } +} + +template +AICORE inline void compute_pv(PPipe &pPipe, PVPipe &pvPipe, int tile_id, int sub_tile_id, __gm__ half *v, + TileMatPData &pMatTile, TileMatVData &vMatTile, TilePVData &pvAccTile, + PSlotGlobal &pSlotGlobal, PVSlotGlobal &pvSlotGlobal, uint64_t svMatTileEventId, + int accTileEvtID, int blk_idx) +{ + constexpr uint32_t Cube_S0 = CUBE_S0; + constexpr uint32_t Cube_S1 = CUBE_S1; + constexpr uint32_t Tile_S1 = TILE_S1; + constexpr uint32_t kTileFactor = Tile_S1 / Cube_S1; + constexpr uint32_t Cube_HEAD = HEAD_SIZE; + constexpr uint32_t TileElems = Cube_S0 * Tile_S1; + constexpr int QKP_CV_FIFO = PVPipe::RingFiFo::SLOT_NUM; + static_assert(QKP_CV_FIFO >= 1, "PV_CV_FIFO must be >= 1"); + static_assert(Tile_S1 % Cube_S1 == 0, "TILE_S1 must be divisible by CUBE_S1"); + + const int s0_index = blk_idx * Cube_S0; + const int s1_index = tile_id * static_cast(Tile_S1) + sub_tile_id * static_cast(Cube_S1); + const bool is_last_subtile = (sub_tile_id + 1 == static_cast(kTileFactor)); + const bool next_will_be_skipped = (s1_index + static_cast(Cube_S1)) > s0_index && CAUSAL_MASK; + + if constexpr (DAV_CUBE) { + if (sub_tile_id == 0) { + TPOP(pPipe, pSlotGlobal); + } + if constexpr (CAUSAL_MASK) { + if (s1_index > s0_index) { + if (is_last_subtile) { + TFREE(pPipe, pSlotGlobal); + } + return; + } + } + + using GlobalVT = + GlobalTensor, pto::Stride<1, 1, 1, HEAD_SIZE, 1>>; + + wait_flag(PIPE_MTE1, PIPE_MTE2, svMatTileEventId); + + GlobalVT vLoad((__gm__ half *)(v + s1_index * HEAD_SIZE)); + TLOAD(vMatTile, vLoad); + + using PLoadGlobal = + GlobalTensor, pto::Stride<1, 1, 1, Tile_S1, 1>>; + PLoadGlobal pLoadGlobal(pSlotGlobal.data() + static_cast(sub_tile_id) * Cube_S1); + TLOAD(pMatTile, pLoadGlobal); + if (is_last_subtile) { + TFREE(pPipe, pSlotGlobal); + } + + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + +#if !UF_ENABLE + if (sub_tile_id == 0) { + wait_flag(PIPE_FIX, PIPE_M, accTileEvtID); + } +#endif + +#if UF_ENABLE + const AccMode accMode = + (sub_tile_id == 0) ? + (is_last_subtile || next_will_be_skipped ? AccMode::InitFinalSum : AccMode::InitPartialSum) : + (is_last_subtile || next_will_be_skipped ? AccMode::AccFinalSum : AccMode::AccPartialSum); + pto_macro_matmul(pMatTile, vMatTile, pvAccTile, accMode); +#else + const AccMode accMode = (sub_tile_id == 0) ? AccMode::Init : AccMode::Acc; + pto_macro_matmul(pMatTile, vMatTile, pvAccTile, accMode); +#endif + + set_flag(PIPE_MTE1, PIPE_MTE2, svMatTileEventId); + + if (sub_tile_id == static_cast(kTileFactor) - 1 || next_will_be_skipped) { +#if !UF_ENABLE + set_flag(PIPE_M, PIPE_FIX, EVENT_ID0); + wait_flag(PIPE_M, PIPE_FIX, EVENT_ID0); +#endif + + using PVStoreGlobal = + GlobalTensor, pto::Stride<1, 1, 1, HEAD_SIZE, 1>>; + TALLOC(pvPipe, pvSlotGlobal); + PVStoreGlobal pvStoreGlobal(pvSlotGlobal.data()); +#if UF_ENABLE + TSTORE(pvStoreGlobal, pvAccTile); +#else + TSTORE(pvStoreGlobal, pvAccTile); +#endif + TPUSH(pvPipe, pvSlotGlobal); + +#if !UF_ENABLE + set_flag(PIPE_FIX, PIPE_M, accTileEvtID); +#endif + } // end loop + } // end if DAV_CUBE +} + +template +AICORE inline void compute_p(QKPipe &qkPipe, PPipe &pPipe, int tile_id, int row_slice, __gm__ float *exp_max_ififo, + __gm__ float *global_sum_out, __gm__ float *exp_max_out, TileDataF_T &qkVecTile, + TileDataH_T &x_expT, TileDataF_T &input_reduce_tmp, ReduceTileF_T &m1_local_max, + ReduceTileF_T &l1_local_sum, ReduceTileF_T &m2_global_max, ReduceTileF_T &l2_global_sum, + ReduceTileF_T &l1_exp_max_ififo, TileDataF_T triu, QKSlotGlobal &qkSlotGlobal, + PSlotGlobal &pSlotGlobal, uint64_t pTileEventId, int blk_idx) +{ + constexpr uint32_t Cube_S0 = CUBE_S0; + constexpr uint32_t Cube_S1 = CUBE_S1; + constexpr uint32_t Tile_S1 = TILE_S1; + constexpr uint32_t kTileFactor = Tile_S1 / Cube_S1; + constexpr uint32_t Vec_S0 = Cube_S0 / VEC_CORES / kTileFactor; + constexpr int QKP_CV_FIFO = QKPipe::RingFiFo::SLOT_NUM; + static_assert(QKP_CV_FIFO >= 1, "QKP_CV_FIFO must be >= 1"); + static_assert(Tile_S1 % Cube_S1 == 0, "TILE_S1 must be divisible by CUBE_S1"); + static_assert(Cube_S0 % (VEC_CORES * kTileFactor) == 0, "Vec rows must divide evenly across tile slices"); + const bool initFlag = (tile_id == 0); + if constexpr (DAV_VEC) { + const size_t subblock_base_rows = + static_cast(Cube_S0 / VEC_CORES) * static_cast(get_subblockid()); + const size_t row_offset = subblock_base_rows + static_cast(row_slice * Vec_S0); + const int s0_index = blk_idx * Cube_S0 + row_offset; + const int s1_index = tile_id * static_cast(Tile_S1); + wait_flag(PIPE_V, PIPE_MTE2, pTileEventId); + + if (row_slice == 0) { + TPOP(qkPipe, qkSlotGlobal); + } + + using QKLoadGlobal = + GlobalTensor, pto::Stride<1, 1, 1, Tile_S1, 1>>; + QKLoadGlobal qkLoadGlobal(qkSlotGlobal.data() + row_offset * Tile_S1); + TLOAD(qkVecTile, qkLoadGlobal); + if (row_slice == static_cast(kTileFactor) - 1) { + TFREE(qkPipe, qkSlotGlobal); + } + + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + + // Extract per-slice views into the per-core reduce tiles so each slice writes into its row range + using ReduceSliceTile = Tile; + // reduce tiles live per vector core; offset only by row_slice within the core (no subblock stride) + const size_t reduce_slice_rows = static_cast(row_slice * Vec_S0); + const uint64_t reduce_row_byte_offset = reduce_slice_rows * sizeof(float); + + ReduceSliceTile m1_local_max_slice; + ReduceSliceTile l1_local_sum_slice; + ReduceSliceTile m2_global_max_slice; + ReduceSliceTile l2_global_sum_slice; + ReduceSliceTile l1_exp_max_slice; + + TASSIGN(m1_local_max_slice, (uint64_t)m1_local_max.data() + reduce_row_byte_offset); + TASSIGN(l1_local_sum_slice, (uint64_t)l1_local_sum.data() + reduce_row_byte_offset); + TASSIGN(m2_global_max_slice, (uint64_t)m2_global_max.data() + reduce_row_byte_offset); + TASSIGN(l2_global_sum_slice, (uint64_t)l2_global_sum.data() + reduce_row_byte_offset); + TASSIGN(l1_exp_max_slice, (uint64_t)l1_exp_max_ififo.data() + reduce_row_byte_offset); + + // Extract current slice state from full-length reduce tiles + wait_flag(PIPE_MTE3, PIPE_V, pTileEventId); + if (initFlag) { + pto_macro_fa_softmax( + x_expT, qkVecTile, m1_local_max_slice, l1_local_sum_slice, m2_global_max_slice, l2_global_sum_slice, + l1_exp_max_slice, input_reduce_tmp, qkVecTile, triu, s0_index, s1_index); + } else { + pto_macro_fa_softmax( + x_expT, qkVecTile, m1_local_max_slice, l1_local_sum_slice, m2_global_max_slice, l2_global_sum_slice, + l1_exp_max_slice, input_reduce_tmp, qkVecTile, triu, s0_index, s1_index); + } + + set_flag(PIPE_V, PIPE_MTE2, pTileEventId); + set_flag(PIPE_V, PIPE_MTE3, EVENT_ID0); + wait_flag(PIPE_V, PIPE_MTE3, EVENT_ID0); + + if (row_slice == 0) { + TALLOC(pPipe, pSlotGlobal); + } + using PStoreGlobal = + GlobalTensor, pto::Stride<1, 1, 1, Tile_S1, 1>>; + PStoreGlobal pStoreGlobal(pSlotGlobal.data() + row_offset * Tile_S1); + TSTORE(pStoreGlobal, x_expT); + if (row_slice == static_cast(kTileFactor) - 1) { + TPUSH(pPipe, pSlotGlobal); + } + + set_flag(PIPE_MTE3, PIPE_V, pTileEventId); + if constexpr (INTERMEDIATE_CHECK) { + // On the final row_slice, emit the exp_max for this subblock only (Cube_S0 / VEC_CORES rows) + if (row_slice == static_cast(kTileFactor) - 1) { + constexpr uint32_t SubblockRows = Cube_S0 / VEC_CORES; + using GlobalPMaxFloatSub = + GlobalTensor, pto::Stride<1, 1, 1, Cube_S0, 1>>; + using ExpMaxSub = Tile; + const size_t base_elems_pmax = + static_cast(tile_id % QKP_CV_FIFO) * static_cast(Cube_S0) + subblock_base_rows; + __gm__ float *p_ptr_fp32 = exp_max_ififo + base_elems_pmax; + GlobalPMaxFloatSub pMaxGlobal(p_ptr_fp32); + ExpMaxSub l1_exp_max_rowmajor; + TRESHAPE(l1_exp_max_rowmajor, l1_exp_max_ififo); + TSTORE(pMaxGlobal, l1_exp_max_rowmajor); + } + } + } +} + +template +AICORE inline void compute_gu(PVPipe &pvPipe, int tile_id, int num_tiles, __gm__ float *o_out, + __gm__ float *o_parts_out, TileOutT &runningOTile, TileOutT &pvVecTile, + ReduceTileF_T &l1_exp_max_ififo, ReduceTileF_T &l2_global_sum, uint64_t guEventId) +{ + constexpr uint32_t Cube_S0 = CUBE_S0; + constexpr uint32_t Vec_S0 = Cube_S0 / VEC_CORES; + + if constexpr (DAV_VEC) { + wait_flag(PIPE_V, PIPE_MTE2, guEventId); + const size_t subblock_base_rows = + static_cast(Cube_S0 / VEC_CORES) * static_cast(get_subblockid()); + + using PVVecGlobal = + GlobalTensor, pto::Stride<1, 1, 1, HEAD_SIZE, 1>>; + PVVecGlobal pvGlobal; + TPOP(pvPipe, pvGlobal); + + if (tile_id == 0) { + TLOAD(runningOTile, pvGlobal); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + if constexpr (CAUSAL_MASK) { + if (tile_id == num_tiles - 1) + pto_macro_fa_gu_single_and_last_tile(runningOTile, l2_global_sum); + } + } else { + TLOAD(pvVecTile, pvGlobal); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + + if (tile_id < num_tiles - 1) { + pto_macro_fa_gu(runningOTile, pvVecTile, l1_exp_max_ififo); + } else { + pto_macro_fa_gu_last(runningOTile, pvVecTile, l1_exp_max_ififo, l2_global_sum); + } + } + TFREE(pvPipe, pvGlobal); + + set_flag(PIPE_V, PIPE_MTE2, guEventId); + + if (tile_id == num_tiles - 1) { + set_flag(PIPE_V, PIPE_MTE3, EVENT_ID0); + wait_flag(PIPE_V, PIPE_MTE3, EVENT_ID0); + using GlobalOutT = + GlobalTensor, pto::Stride<1, 1, 1, HEAD_SIZE, 1>>; + GlobalOutT outGlobal((__gm__ float *)(o_out + subblock_base_rows * HEAD_SIZE)); + TSTORE(outGlobal, runningOTile); + } + } +} + +template +__global__ AICORE void runTFA(__gm__ uint64_t *ffts_addr, __gm__ half *q, __gm__ half *k, __gm__ half *v, + __gm__ half *p_tile_fifo, __gm__ float *exp_max_ififo, __gm__ float *global_sum_out, + __gm__ float *exp_max_out, __gm__ float *o_out, __gm__ float *o_parts_out, + __gm__ float *qk_tile_fifo, __gm__ float *pv_tile_fifo, __gm__ uint8_t *cv_comm_buf, + __gm__ uint8_t *profile_buf) +{ + uint64_t tStart = get_sys_cnt(); + + set_ffts_base_addr((uint64_t)ffts_addr); + if constexpr (DAV_CUBE) { + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID0); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + } + + // Rename dimensions for clarity: S0 (rows total), Cube_S0 (per-block rows), S1 (cols), HEAD_SIZE (inner) + constexpr uint32_t Cube_S0 = CUBE_S0; + constexpr uint32_t block_rows = S0 / CUBE_S0; + constexpr uint32_t Cube_S1 = CUBE_S1; // per-tile S1 chunk + constexpr uint32_t Tile_S1 = TILE_S1; // logical tile along S1 + static_assert(Tile_S1 % Cube_S1 == 0, "TILE_S1 must be divisible by CUBE_S1"); + constexpr uint32_t kTileFactor = Tile_S1 / Cube_S1; // sub-tiles per TILE_S1 + constexpr uint32_t Cube_HEAD = HEAD_SIZE; + constexpr uint32_t Vec_S0 = Cube_S0 / VEC_CORES / kTileFactor; + constexpr uint32_t VecGuRows = Cube_S0 / VEC_CORES; + static_assert(Cube_S0 % (VEC_CORES * kTileFactor) == 0, "Vec rows must divide evenly across tile slices"); + + // -------------------------- + // Tuning knobs (pipeline) + // + // qkPreloadNum controls how many (QK -> P) tiles we warm up before entering the steady-state loop. + // - Larger preload improves overlap (Cube/VEC concurrency) for long S1. + // - Larger preload increases FIFO footprint (qkGlobalTensorNBuffers / pvGlobalTensorNBuffers / + // guGlobalTensorNBuffers). + constexpr uint32_t qkPreloadNum = QK_PRELOAD; + + // Buffer counts for optional double-buffering (default 1) + // - srcVecTNBuffers/xexpVecTNBuffers: Vec ping-pong for QK load and x_exp output + // - *MatTNBuffers: L1 ping-pong for Cube stage (K/P/V) + // Keep these small (1-2) unless you have measured stall bubbles that require deeper buffering. + constexpr uint32_t srcVecTNBuffers = 2; + constexpr uint32_t xexpVecTNBuffers = 2; + constexpr uint32_t outOTileNBuffers = 2; + constexpr uint32_t qMatTNBuffers = 1; + constexpr uint32_t kMatTNBuffers = 2; + constexpr uint32_t pMatTNBuffers = 2; + constexpr uint32_t vMatTNBuffers = 2; + constexpr uint32_t qkp_tile_fifo_size = CV_FIFO_SIZE; + constexpr uint32_t pv_tile_fifo_size = CV_FIFO_SIZE; + static_assert(qkPreloadNum >= 1, "qkPreloadNum must be >= 1"); + static_assert(CV_FIFO_CONS_SYNC_PERIOD >= 1, "CV_FIFO_CONS_SYNC_PERIOD must be >= 1"); + static_assert((qkPreloadNum > 1) || (kTileFactor == 1), "qkPreloadNum must be > 1 unless kTileFactor == 1"); + + // Define tile types for first QK matmul + using TileMatQData = + Tile; + using TileMatKData = + Tile; + // Accumulator rows must match Cube_S0 (per-block rows), not logical S0 + using TileQKData = TileAcc; + + TileMatQData qMatTile[qMatTNBuffers]; + TileMatKData kMatTile[kMatTNBuffers]; + TileQKData qkAccTile; + + // Define tile types for second PV matmul + using TileMatPData = + Tile; + using TileMatVData = + Tile; + using TilePVData = TileAcc; + + TileMatPData pMatTile[pMatTNBuffers]; + TileMatVData vMatTile[vMatTNBuffers]; + TilePVData pvAccTile; + + allocate_cube_tile_buffers(qMatTile, kMatTile, pMatTile, vMatTile); + + // Assign accumulator tiles using ping-pong helper. qk starts at 0, pv starts at 1. + assign_running_acc_tile(qkAccTile, 0); + assign_running_acc_tile(pvAccTile, 1); + + // Define tile types for FA softmax P computation + // UB offsets for softmax tiles + // Define per-tile vector tiles sized to Cube_S1 + using TileDataF_T = Tile; + using TileDataH_T = Tile; + constexpr uint32_t SubblockRows = Cube_S0 / VEC_CORES; + // Reduce tiles cover one vector core's rows (Cube_S0 / VEC_CORES); slices are extracted per row_slice + using ReduceTileF_T = Tile; + + TileDataF_T qkVecTile[srcVecTNBuffers]; + ReduceTileF_T m1_local_max; + TileDataF_T input_reduce_tmp; + TileDataF_T triu; + ReduceTileF_T l1_local_sum; + ReduceTileF_T m2_global_max; + ReduceTileF_T l2_global_sum; + ReduceTileF_T l1_exp_max_ififo[qkp_tile_fifo_size]; + TileDataH_T x_expT[xexpVecTNBuffers]; + + using TileOutGuT = Tile; + TileOutGuT pvVecTile[outOTileNBuffers]; + TileOutGuT runningOTile; + allocate_vec_tile_buffers(qkVecTile, m1_local_max, input_reduce_tmp, l1_local_sum, m2_global_max, + l2_global_sum, l1_exp_max_ififo, x_expT, pvVecTile, runningOTile, triu); + + // block offset for logical S0 +#if defined(__DAV_C220_CUBE__) || defined(__DAV_C220_VEC__) // A5 defined macro, don't need to reassign + const int block_idx = get_block_idx(); +#endif + const int block_offset_rows = block_idx * static_cast(Cube_S0); + + constexpr bool use_cv_comm = (!INTERMEDIATE_CHECK) && (block_rows >= static_cast(pto::kCvMaxCores)); + int comm_slot = block_idx; + + if constexpr (use_cv_comm) { + comm_slot = pto::TSYNC_CVID(block_idx, cv_comm_buf); + } + __gm__ uint64_t *profile_entry = nullptr; + if (profile_buf != nullptr) { + std::size_t profile_block_base = static_cast(block_idx) * kFaProfileBytesPerBlock; + std::size_t profile_offset = profile_block_base; + if constexpr (DAV_VEC) { + profile_offset += + (static_cast(get_subblockid()) + 1U) * 1024U; // vec subblock 0/1 use 2nd/3rd KB + } + profile_entry = reinterpret_cast<__gm__ uint64_t *>(profile_buf + profile_offset); + profile_entry[0] = tStart; + } + const size_t p_fifo_block_stride = + static_cast(qkp_tile_fifo_size) * static_cast(Cube_S0) * static_cast(Tile_S1); + const size_t p_max_fifo_block_stride = static_cast(qkp_tile_fifo_size) * static_cast(Cube_S0); + const size_t qk_fifo_block_stride = p_fifo_block_stride; + const size_t pv_fifo_block_stride = + static_cast(pv_tile_fifo_size) * static_cast(Cube_S0) * static_cast(HEAD_SIZE); + + __gm__ half *q_block = q + block_offset_rows * HEAD_SIZE; + __gm__ half *p_tile_fifo_block = p_tile_fifo + static_cast(comm_slot) * p_fifo_block_stride; + __gm__ float *exp_max_ififo_block = exp_max_ififo + static_cast(comm_slot) * p_max_fifo_block_stride; + __gm__ float *global_sum_block = global_sum_out + block_offset_rows; + __gm__ float *exp_max_block = exp_max_out + block_offset_rows; + __gm__ float *o_out_block = o_out + static_cast(block_offset_rows) * static_cast(HEAD_SIZE); + __gm__ float *o_parts_block = o_parts_out + static_cast(block_offset_rows) * static_cast(HEAD_SIZE); + __gm__ float *qk_tile_fifo_block = qk_tile_fifo + static_cast(comm_slot) * qk_fifo_block_stride; + __gm__ float *pv_tile_fifo_block = pv_tile_fifo + static_cast(comm_slot) * pv_fifo_block_stride; + + int num_tiles_s1 = S1 / Tile_S1; + if constexpr (CAUSAL_MASK) + num_tiles_s1 = (1 + ((block_idx * CUBE_S0) / Tile_S1)); + if constexpr (DAV_CUBE) { + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID0); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID1); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID2); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID3); + set_flag(PIPE_FIX, PIPE_M, EVENT_ID0); + set_flag(PIPE_FIX, PIPE_M, EVENT_ID1); + } + if constexpr (DAV_VEC) { + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID0); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID0); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID1); + } + + int p_gu_src_pingpong_id = 0; // shared ping-pong for softmax vec tiles, pv output tiles, and GU input tiles + int k_src_pingpong_id = 0; // separate ping-pong for K tiles + int pv_src_pingpong_id = 0; // separate ping-pong for P V tiles + + int qkAccTileEvtID = 0; + int pvAccTileEvtID = 0; + + // FIFO definitions + constexpr uint8_t FiFoDepth = CV_FIFO_SIZE; + #if defined(__DAV_C220_CUBE__) || defined(__DAV_C220_VEC__) + using QKPipe = + TPipe; + #elif defined(__DAV_C310_CUBE__) || defined(__DAV_C310_VEC__) + using QKPipe = + TPipe; + #endif + QKPipe qkPipe(qk_tile_fifo_block, (uint32_t)(uint64_t)qkVecTile[0].data(), 0x0); + + // pFiFo, pProd, pCons + #if defined(__DAV_C220_CUBE__) || defined(__DAV_C220_VEC__) + using PPipe = TPipe; + #elif defined(__DAV_C310_CUBE__) || defined(__DAV_C310_VEC__) + using PPipe = TPipe; + #endif + PPipe pPipe(p_tile_fifo_block, 0x0, (uint32_t)(uint64_t)pMatTile[0].data()); + + // pvFiFo, pvProd, pvCons + #if defined(__DAV_C220_CUBE__) || defined(__DAV_C220_VEC__) + using PVPipe = + TPipe; + #elif defined(__DAV_C310_CUBE__) || defined(__DAV_C310_VEC__) + using PVPipe = + TPipe; + #endif + PVPipe pvPipe(pv_tile_fifo_block, (uint32_t)(uint64_t)pvVecTile[0].data(), 0x0); + + using QKSlotGlobal = + GlobalTensor, pto::Stride<1, 1, 1, Tile_S1, 1>>; + using PSlotGlobal = + GlobalTensor, pto::Stride<1, 1, 1, Tile_S1, 1>>; + using PVSlotGlobal = + GlobalTensor, pto::Stride<1, 1, 1, HEAD_SIZE, 1>>; + QKSlotGlobal qkSlotGlobal; + PSlotGlobal pSlotGlobal; + PVSlotGlobal pvSlotGlobal; + + // QK and P pre-computation (tile_id based) + for (int preload_tile = 0; preload_tile < static_cast(qkPreloadNum) && preload_tile < num_tiles_s1; + ++preload_tile) { + if constexpr (DAV_CUBE) { + for (int sub_tile = 0; sub_tile < static_cast(kTileFactor); ++sub_tile) { + qkAccTileEvtID = assign_running_acc_tile(qkAccTile); + compute_qk( + qkPipe, preload_tile, sub_tile, q_block, k, qMatTile[0], + kMatTile[k_src_pingpong_id % kMatTNBuffers], qkAccTile, qkSlotGlobal, + k_src_pingpong_id % kMatTNBuffers, qkAccTileEvtID, block_idx); + k_src_pingpong_id++; + } + } + if constexpr (DAV_VEC) { + for (int row_slice = 0; row_slice < static_cast(kTileFactor); ++row_slice) { + // Init only on the very first S1 tile; row_slice partitions rows within that tile + compute_p( + qkPipe, pPipe, preload_tile, row_slice, exp_max_ififo_block, global_sum_block, exp_max_block, + qkVecTile[p_gu_src_pingpong_id % srcVecTNBuffers], x_expT[p_gu_src_pingpong_id % xexpVecTNBuffers], + input_reduce_tmp, m1_local_max, l1_local_sum, m2_global_max, l2_global_sum, + l1_exp_max_ififo[preload_tile % qkp_tile_fifo_size], triu, qkSlotGlobal, pSlotGlobal, + p_gu_src_pingpong_id % xexpVecTNBuffers, block_idx); + p_gu_src_pingpong_id++; + } + } + } + + for (int tile_id = 0; tile_id < num_tiles_s1; ++tile_id) { + int next_qk_tile = (tile_id + static_cast(qkPreloadNum) >= num_tiles_s1) ? + -1 : + (tile_id + static_cast(qkPreloadNum)); + + if (next_qk_tile != -1) + qkAccTileEvtID = assign_running_acc_tile(qkAccTile); + pvAccTileEvtID = assign_running_acc_tile(pvAccTile); + + for (int sub_tile = 0; sub_tile < static_cast(kTileFactor); ++sub_tile) { + if constexpr (DAV_CUBE) { + if (next_qk_tile != -1) { + compute_qk( + qkPipe, next_qk_tile, sub_tile, q_block, k, qMatTile[0], + kMatTile[k_src_pingpong_id % kMatTNBuffers], qkAccTile, qkSlotGlobal, + k_src_pingpong_id % kMatTNBuffers, qkAccTileEvtID, block_idx); + k_src_pingpong_id++; + } + } + + if constexpr (DAV_VEC) { + if (next_qk_tile != -1) { + compute_p( + qkPipe, pPipe, next_qk_tile, sub_tile, exp_max_ififo_block, global_sum_block, + exp_max_block, qkVecTile[p_gu_src_pingpong_id % srcVecTNBuffers], + x_expT[p_gu_src_pingpong_id % xexpVecTNBuffers], input_reduce_tmp, m1_local_max, + l1_local_sum, m2_global_max, l2_global_sum, + l1_exp_max_ififo[next_qk_tile % qkp_tile_fifo_size], triu, qkSlotGlobal, pSlotGlobal, + p_gu_src_pingpong_id % xexpVecTNBuffers, block_idx); + p_gu_src_pingpong_id++; + } + } + + if constexpr (DAV_CUBE) { + compute_pv( + pPipe, pvPipe, tile_id, sub_tile, v, pMatTile[pv_src_pingpong_id % pMatTNBuffers], + vMatTile[pv_src_pingpong_id % vMatTNBuffers], pvAccTile, + pSlotGlobal, pvSlotGlobal, pv_src_pingpong_id % vMatTNBuffers + PV_EVENT_ID0, pvAccTileEvtID, + block_idx); + pv_src_pingpong_id++; + } + } + + if constexpr (DAV_VEC) { + compute_gu( + pvPipe, tile_id, num_tiles_s1, o_out_block, o_parts_block, runningOTile, + pvVecTile[p_gu_src_pingpong_id % outOTileNBuffers], l1_exp_max_ififo[tile_id % qkp_tile_fifo_size], + l2_global_sum, p_gu_src_pingpong_id % outOTileNBuffers); + p_gu_src_pingpong_id++; + } + } + + if constexpr (DAV_CUBE) { + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID0); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID1); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID2); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID3); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID0); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID1); +#ifdef __DAV_C220_CUBE__ + wait_flag_dev(CV_BLOCK_END); // wait for vector done all reading +#endif + } + + if constexpr (DAV_VEC) { + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID0); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID0); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID1); +#ifdef __DAV_C220_VEC__ + ffts_cross_core_sync(PIPE_MTE2, _getFFTSMsg(CV_CORE_SYNC, CV_BLOCK_END)); // cube can exit CV comm now +#endif + } + + pipe_barrier(PIPE_ALL); + uint64_t tEnd = get_sys_cnt(); + if (profile_entry != nullptr) { + profile_entry[1] = tEnd; + } +#ifdef _DEBUG + if constexpr (DAV_CUBE) { + cce::printf("Core %d Cube Block %d, Start @%d End @%d (%d us)\n", get_coreid(), block_idx, int(tStart), + int(tEnd), int(tEnd - tStart) * 20 / 1000); + } else { + cce::printf("Core %d Vec Block %d, SubBlock %d, Start @%d End @%d (%d us)\n", get_coreid(), block_idx, + int(get_subblockid()), int(tStart), int(tEnd), int(tEnd - tStart) * 20 / 1000); + } +#endif +} + +// Empty kernel to warm up cores +__global__ AICORE __attribute__((aic)) void warmup_kernel() +{} + +// Host wrapper +template +void LaunchTFA(uint16_t *ffts, aclFloat16 *q, aclFloat16 *k, aclFloat16 *v, aclFloat16 *p_tile_fifo, + float *exp_max_ififo, float *global_sum_out, float *exp_max_out, float *o_out, float *o_parts_out, + float *qk_tile_fifo, float *pv_tile_fifo, uint8_t *profile_data, aclrtStream stream, + uint8_t *cv_comm_buf) +{ + static_assert(S0 % CUBE_S0 == 0, "S0 must be divisible by CUBE_S0"); + constexpr uint32_t block_rows = S0 / CUBE_S0; + +#if defined(__DAV_C220_CUBE__) || defined(__DAV_C220_VEC__) + // Warm up all cores first, then prefetch q/k/v into L2 + warmup_kernel<<<24, nullptr, stream>>>(); + + const uint64_t q_bytes = static_cast(S0) * static_cast(HEAD_SIZE) * sizeof(half); + const uint64_t kv_bytes = static_cast(S1) * static_cast(HEAD_SIZE) * sizeof(half); + constexpr bool kPrefetchUseSdma = true; // simulation cannot use sdma + constexpr int kPrefetchAivCores = 40; // only used when kPrefetchUseSdma is false + + if constexpr (kPrefetchUseSdma) { + PTO_PREFETCH((__gm__ void *)q, q_bytes, stream); + PTO_PREFETCH((__gm__ void *)k, kv_bytes, stream); + PTO_PREFETCH((__gm__ void *)v, kv_bytes, stream); + } else { + PTO_PREFETCH((__gm__ void *)q, q_bytes, stream); + PTO_PREFETCH((__gm__ void *)k, kv_bytes, stream); + PTO_PREFETCH((__gm__ void *)v, kv_bytes, stream); + } +#endif + + runTFA<<>>( + (__gm__ uint64_t *)ffts, (half *)q, (half *)k, (half *)v, (half *)p_tile_fifo, exp_max_ififo, global_sum_out, + exp_max_out, o_out, o_parts_out, qk_tile_fifo, pv_tile_fifo, cv_comm_buf, profile_data); +} + +// Backward-compatible overload without profiling buffer +template +void LaunchTFA(uint16_t *ffts, aclFloat16 *q, aclFloat16 *k, aclFloat16 *v, aclFloat16 *p_tile_fifo, + float *exp_max_ififo, float *global_sum_out, float *exp_max_out, float *o_out, float *o_parts_out, + float *qk_tile_fifo, float *pv_tile_fifo, aclrtStream stream, uint8_t *cv_comm_buf) +{ + LaunchTFA(ffts, q, k, v, p_tile_fifo, exp_max_ififo, global_sum_out, exp_max_out, o_out, + o_parts_out, qk_tile_fifo, pv_tile_fifo, nullptr, stream, cv_comm_buf); +} + +#include "generated_cases.h" + +#define INSTANTIATE_TFA(S0, HEAD, S1, CUBE_S0, CUBE_S1, TILE_S1, QK_PRELOAD, CAUSAL_MASK) \ + template void LaunchTFA( \ + uint16_t * ffts, aclFloat16 * q, aclFloat16 * k, aclFloat16 * v, aclFloat16 * p_out, float *p_out_fp32, \ + float *global_sum_out, float *exp_max_out, float *o_out, float *o_parts_out, float *qk_out, float *pv_out, \ + uint8_t *profile_data, aclrtStream stream, uint8_t *cv_comm_buf); \ + template void LaunchTFA( \ + uint16_t * ffts, aclFloat16 * q, aclFloat16 * k, aclFloat16 * v, aclFloat16 * p_out, float *p_out_fp32, \ + float *global_sum_out, float *exp_max_out, float *o_out, float *o_parts_out, float *qk_out, float *pv_out, \ + aclrtStream stream, uint8_t *cv_comm_buf); \ + template void LaunchTFA( \ + uint16_t * ffts, aclFloat16 * q, aclFloat16 * k, aclFloat16 * v, aclFloat16 * p_out, float *p_out_fp32, \ + float *global_sum_out, float *exp_max_out, float *o_out, float *o_parts_out, float *qk_out, float *pv_out, \ + uint8_t *profile_data, aclrtStream stream, uint8_t *cv_comm_buf); \ + template void LaunchTFA( \ + uint16_t * ffts, aclFloat16 * q, aclFloat16 * k, aclFloat16 * v, aclFloat16 * p_out, float *p_out_fp32, \ + float *global_sum_out, float *exp_max_out, float *o_out, float *o_parts_out, float *qk_out, float *pv_out, \ + aclrtStream stream, uint8_t *cv_comm_buf); + +TFA_FOR_EACH_CASE(INSTANTIATE_TFA) + +#undef INSTANTIATE_TFA \ No newline at end of file diff --git a/examples/aot/flash_attention/cpp_ref/split_pipe/kernels/flash_atten/fa_performance_kernel.h b/examples/aot/flash_attention/cpp_ref/split_pipe/kernels/flash_atten/fa_performance_kernel.h new file mode 100644 index 00000000..6a5bf0eb --- /dev/null +++ b/examples/aot/flash_attention/cpp_ref/split_pipe/kernels/flash_atten/fa_performance_kernel.h @@ -0,0 +1,43 @@ +/** +Copyright (c) 2026 Huawei Technologies Co., Ltd. +This program is free software, you can redistribute it and/or modify it under the terms and conditions of +CANN Open Software License Agreement Version 2.0 (the "License"). +Please refer to the License for details. You may not use this file except in compliance with the License. +THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +See LICENSE in the root of the software repository for the full text of the License. +*/ + +#ifndef FA_PERFORMANCE_KERNEL_H +#define FA_PERFORMANCE_KERNEL_H + +#include +#include +#include + +// Shared defaults for FA performance kernels and host driver +constexpr int kFaCvFifoSize = 8; +constexpr int kFaCvFifoConsSyncPeriod = kFaCvFifoSize / 2; +constexpr int kFaCubeS1 = 128; +constexpr int kFaTileS1 = 256; +constexpr int kFaQkPreload = 4; +constexpr std::size_t kFaProfileBytesPerBlock = 1024 * 3; // cube + two vec subblocks +constexpr std::size_t kFaCvCommSlotBytes = 512U; +constexpr int VEC_CORES = 2; // Default to 2 vector cores per cube + +template +void LaunchTFA(uint16_t *ffts, aclFloat16 *q, aclFloat16 *k, aclFloat16 *v, aclFloat16 *p_tile_fifo, + float *exp_max_ififo, float *global_sum_out, float *exp_max_out, float *o_out, float *o_parts_out, + float *qk_tile_fifo, float *pv_tile_fifo, uint8_t *profile_data, aclrtStream stream, + uint8_t *cv_comm_buf = nullptr); + +// Overload without profiling buffer. +template +void LaunchTFA(uint16_t *ffts, aclFloat16 *q, aclFloat16 *k, aclFloat16 *v, aclFloat16 *p_tile_fifo, + float *exp_max_ififo, float *global_sum_out, float *exp_max_out, float *o_out, float *o_parts_out, + float *qk_tile_fifo, float *pv_tile_fifo, aclrtStream stream, uint8_t *cv_comm_buf = nullptr); + +#endif // FA_PERFORMANCE_KERNEL_H \ No newline at end of file diff --git a/examples/aot/flash_attention/cpp_ref/split_pipe/kernels/flash_atten/pto_macro_fa_gu.hpp b/examples/aot/flash_attention/cpp_ref/split_pipe/kernels/flash_atten/pto_macro_fa_gu.hpp new file mode 100644 index 00000000..3e4d0a9a --- /dev/null +++ b/examples/aot/flash_attention/cpp_ref/split_pipe/kernels/flash_atten/pto_macro_fa_gu.hpp @@ -0,0 +1,59 @@ +/* +Copyright (c) 2025 Huawei Technologies Co., Ltd. +This program is free software, you can redistribute it and/or modify it under the terms and conditions of +CANN Open Software License Agreement Version 2.0 (the "License"). +Please refer to the License for details. You may not use this file except in compliance with the License. +THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +See LICENSE in the root of the software repository for the full text of the License. +*/ + +#ifndef PTO_MACRO_FA_GU_HPP +#define PTO_MACRO_FA_GU_HPP + +#include +#include +#include + +namespace pto { + +// ----------------------------------------------------------------------------- +// FlashAttention "GU" (running update) macro +// +// This implements the numerically-stable streaming update: +// O = O * exp(max_prev - max_new) + PV_tile +// and on the last tile: +// O = O / global_sum +// +// Performance notes: +// - Keep O resident in UB across tiles to avoid extra TLOAD/TSTORE. +// - exp_max and global_sum are per-row reduced tiles (shape [S0, 1]) that get broadcast over columns. +// ----------------------------------------------------------------------------- + +template +AICORE inline void pto_macro_fa_gu(svTileData __out__ prev_sv_tile, svTileData __in__ est_sv_tile, + reducedTileData __in__ exp_max) +{ + pto::TROWEXPANDMUL(prev_sv_tile, prev_sv_tile, exp_max); + pto::TADD(prev_sv_tile, prev_sv_tile, est_sv_tile); +} + +template +AICORE inline void pto_macro_fa_gu_last(svTileData __out__ prev_sv_tile, svTileData __in__ est_sv_tile, + reducedTileData __in__ exp_max, reducedTileData __in__ new_global_sum) +{ + pto::TROWEXPANDMUL(prev_sv_tile, prev_sv_tile, exp_max); + pto::TADD(prev_sv_tile, prev_sv_tile, est_sv_tile); + pto::TROWEXPANDDIV(prev_sv_tile, prev_sv_tile, new_global_sum); + // pto::TCVT(prev_sv_nd_tile, prev_sv_tile, RoundMode::CAST_RINT); +} + +template +AICORE inline void pto_macro_fa_gu_single_and_last_tile(svTileData __out__ sv_tile, + reducedTileData __in__ new_global_sum) +{ + pto::TROWEXPANDDIV(sv_tile, sv_tile, new_global_sum); +} + +} // namespace pto +#endif // TGU_PTO_H diff --git a/examples/aot/flash_attention/cpp_ref/split_pipe/kernels/flash_atten/pto_macro_fa_softmax.hpp b/examples/aot/flash_attention/cpp_ref/split_pipe/kernels/flash_atten/pto_macro_fa_softmax.hpp new file mode 100644 index 00000000..685f29b4 --- /dev/null +++ b/examples/aot/flash_attention/cpp_ref/split_pipe/kernels/flash_atten/pto_macro_fa_softmax.hpp @@ -0,0 +1,219 @@ +/* +Copyright (c) 2026 Huawei Technologies Co., Ltd. +This program is free software, you can redistribute it and/or modify it under the terms and conditions of +CANN Open Software License Agreement Version 2.0 (the "License"). +Please refer to the License for details. You may not use this file except in compliance with the License. +THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +See LICENSE in the root of the software repository for the full text of the License. +*/ + +#ifndef PTO_MACRO_FA_SOFTMAX_HPP +#define PTO_MACRO_FA_SOFTMAX_HPP + +#include + +namespace pto { + +// ----------------------------------------------------------------------------- +// FlashAttention streaming softmax (tile-level) +// +// Given one QK tile X (fp32), compute x_exp = exp(scale * (X - new_global_max)). +// This function maintains per-row running state (global_max, global_sum) so that we can +// stream over S1 tiles without materializing the full attention matrix. +// +// Performance notes: +// - Keep intermediate computations in fp32 for numerical stability. +// - The `init` specialization initializes running state for the first S1 tile. +// - The 2D->1D reshape for TCVT is used to avoid layout constraints and keep the cast fast. +// ----------------------------------------------------------------------------- + +constexpr PTO_INTERNAL float constexpr_sqrt(float x) +{ + if (x <= 0.0f) + return 0.0f; + float guess = x; + for (int i = 0; i < 8; ++i) { + guess = 0.5f * (guess + x / guess); + } + return guess; +} + +constexpr AICORE inline float constexpr_inv_sqrt(float x) +{ + return 1.0f / constexpr_sqrt(x); +} + +template +AICORE inline void softmax_opt_fa_init_impl(TileDataD2 __out__ x_exp, TileDataS1 __in__ input_x, + ReduceTileD1 __out__ local_max, ReduceTileD1 __out__ local_sum, + ReduceTileD1 __out__ new_global_max, ReduceTileD1 __out__ new_global_sum, + ReduceTileD1 __out__ exp_max, TileDataS1 __out__ tmp_float, + TileDataS1 __out__ p_tile_f32, TileDataS1 triu, int s0_index, int s1_index) +{ + (void)local_max; + (void)exp_max; + (void)local_sum; + + constexpr float scale = constexpr_inv_sqrt(HEAD_SIZE); + using Tile1D_fp32 = Tile; + using Tile1D_out = Tile; + Tile1D_fp32 p_tile_f32_1d; + Tile1D_out x_exp_1d; + if constexpr (CAUSAL_MASK) { + if (s0_index / TileDataS1::Cols == s1_index / TileDataS1::Cols) { + constexpr float negInf = -3.40282e+38; + TTRI(triu, 1 + (s0_index % TileDataS1::Cols)); +#if defined(__DAV_C220_VEC__) + pipe_barrier(PIPE_V); +#endif + TMULS(triu, triu, negInf); +#if defined(__DAV_C220_VEC__) + pipe_barrier(PIPE_V); +#endif + TADD(input_x, input_x, triu); +#if defined(__DAV_C220_VEC__) + pipe_barrier(PIPE_V); +#endif + } + } + // FA2.0 init mode + TROWMAX(new_global_max, input_x, tmp_float); +#if defined(__DAV_C220_VEC__) + pipe_barrier(PIPE_V); +#endif + TROWEXPANDSUB(p_tile_f32, input_x, new_global_max); + TMULS(p_tile_f32, p_tile_f32, scale); + TEXP(p_tile_f32, p_tile_f32); +#if defined(__DAV_C220_VEC__) + pipe_barrier(PIPE_V); +#endif + TROWSUM(new_global_sum, p_tile_f32, tmp_float); + + TRESHAPE(p_tile_f32_1d, p_tile_f32); + TRESHAPE(x_exp_1d, x_exp); + TCVT(x_exp_1d, p_tile_f32_1d, RoundMode::CAST_ROUND); +} + +template +AICORE inline void softmax_opt_fa_not_init_impl(TileDataD2 __out__ x_exp, TileDataS1 __in__ input_x, + ReduceTileD1 __out__ local_max, ReduceTileD1 __out__ local_sum, + ReduceTileD1 __out__ new_global_max, + ReduceTileD1 __out__ new_global_sum, ReduceTileD1 __out__ exp_max, + TileDataS1 __out__ tmp_float, TileDataS1 __out__ p_tile_f32, + TileDataS1 triu, int s0_index, int s1_index) +{ + constexpr float scale = constexpr_inv_sqrt(HEAD_SIZE); + + using ReduceTileD2 = Tile; + using Tile1D_fp32 = Tile; + using Tile1D_out = Tile; + + ReduceTileD2 tmp_shw_local_max; + ReduceTileD2 tmp_shw_new_global_max; + ReduceTileD2 tmp_shw_exp_max; + ReduceTileD2 tmp_shw_new_global_sum; + ReduceTileD2 tmp_shw_local_sum; + Tile1D_fp32 p_tile_f32_1d; + Tile1D_out x_exp_1d; + + if constexpr (CAUSAL_MASK) { + if (s0_index / TileDataS1::Cols == s1_index / TileDataS1::Cols) { + constexpr float negInf = -3.40282e+38; + TTRI(triu, 1 + (s0_index % TileDataS1::Cols)); +#if defined(__DAV_C220_VEC__) + pipe_barrier(PIPE_V); +#endif + TMULS(triu, triu, negInf); +#if defined(__DAV_C220_VEC__) + pipe_barrier(PIPE_V); +#endif + TADD(input_x, input_x, triu); +#if defined(__DAV_C220_VEC__) + pipe_barrier(PIPE_V); +#endif + } + } + // FA2.0 streaming mode (not first tile): update (global_max, global_sum) and rescale old sums. + TROWMAX(local_max, input_x, tmp_float); +#if defined(__DAV_C220_VEC__) + pipe_barrier(PIPE_V); +#endif + TRESHAPE(tmp_shw_local_max, local_max); + TRESHAPE(tmp_shw_new_global_max, new_global_max); + TMAX(tmp_shw_local_max, tmp_shw_local_max, tmp_shw_new_global_max); +#if defined(__DAV_C220_VEC__) + pipe_barrier(PIPE_V); +#endif + TRESHAPE(tmp_shw_exp_max, exp_max); + TSUB(tmp_shw_exp_max, tmp_shw_new_global_max, tmp_shw_local_max); +#if defined(__DAV_C220_VEC__) + pipe_barrier(PIPE_V); +#endif + + TMULS(tmp_shw_new_global_max, tmp_shw_local_max, 1.0f); // just copy +#if defined(__DAV_C220_VEC__) + pipe_barrier(PIPE_V); +#endif + TROWEXPANDSUB(p_tile_f32, input_x, local_max); + TMULS(tmp_shw_exp_max, tmp_shw_exp_max, scale); + TMULS(p_tile_f32, p_tile_f32, scale); + TEXP(tmp_shw_exp_max, tmp_shw_exp_max); + TRESHAPE(tmp_shw_exp_max, exp_max); + TEXP(p_tile_f32, p_tile_f32); + TRESHAPE(tmp_shw_exp_max, exp_max); + + TRESHAPE(p_tile_f32_1d, p_tile_f32); + TRESHAPE(x_exp_1d, x_exp); + TCVT(x_exp_1d, p_tile_f32_1d, RoundMode::CAST_ROUND); +#if defined(__DAV_C220_VEC__) + pipe_barrier(PIPE_V); +#endif + TRESHAPE(tmp_shw_new_global_sum, new_global_sum); + TMUL(tmp_shw_new_global_sum, tmp_shw_exp_max, tmp_shw_new_global_sum); + TROWSUM(local_sum, p_tile_f32, tmp_float); + TRESHAPE(tmp_shw_local_sum, local_sum); +#if defined(__DAV_C220_VEC__) + pipe_barrier(PIPE_V); +#endif + TADD(tmp_shw_new_global_sum, tmp_shw_new_global_sum, tmp_shw_local_sum); +} + +template +AICORE inline void pto_macro_fa_softmax(TileDataD2 __out__ x_exp, TileDataS1 __in__ input_x, + ReduceTileD1 __out__ local_max, ReduceTileD1 __out__ local_sum, + ReduceTileD1 __in__ new_global_max, ReduceTileD1 __out__ new_global_sum, + ReduceTileD1 __out__ exp_max, TileDataS1 __out__ input_reduce_tmp, + TileDataS1 __out__ p_tile_fp32, TileDataS1 triu, int s0_index, int s1_index) +{ + if (s1_index <= s0_index || !CAUSAL_MASK) { + if constexpr (init) { + softmax_opt_fa_init_impl( + x_exp, input_x, local_max, local_sum, new_global_max, new_global_sum, exp_max, input_reduce_tmp, + p_tile_fp32, triu, s0_index, s1_index); + } else { + softmax_opt_fa_not_init_impl( + x_exp, input_x, local_max, local_sum, new_global_max, new_global_sum, exp_max, input_reduce_tmp, + p_tile_fp32, triu, s0_index, s1_index); + } + } else if constexpr (CAUSAL_MASK) { + TMULS(x_exp, x_exp, 0.0); + TMULS(exp_max, exp_max, 0.0); +#if defined(__DAV_C220_VEC__) + pipe_barrier(PIPE_V); +#endif + TADDS(exp_max, exp_max, 1.0); +#if defined(__DAV_C220_VEC__) + pipe_barrier(PIPE_V); +#endif + } +} + +} // namespace pto + +#endif diff --git a/examples/aot/flash_attention/cpp_ref/split_pipe/kernels/flash_atten/pto_macro_matmul.hpp b/examples/aot/flash_attention/cpp_ref/split_pipe/kernels/flash_atten/pto_macro_matmul.hpp new file mode 100644 index 00000000..69a60b63 --- /dev/null +++ b/examples/aot/flash_attention/cpp_ref/split_pipe/kernels/flash_atten/pto_macro_matmul.hpp @@ -0,0 +1,212 @@ +/* +Copyright (c) 2026 Huawei Technologies Co., Ltd. +This program is free software, you can redistribute it and/or modify it under the terms and conditions of +CANN Open Software License Agreement Version 2.0 (the "License"). +Please refer to the License for details. You may not use this file except in compliance with the License. +THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +See LICENSE in the root of the software repository for the full text of the License. +*/ + +#ifndef PTO_MACRO_MATMUL_HPP +#define PTO_MACRO_MATMUL_HPP + +#include +#include + +#define CUBE_K_256 256 +#define CUBE_K_128 128 +#define CUBE_K_64 64 +#define CUBE_K_SMALLEST 32 + +namespace pto { + +/** + * Layout type for matrix multiplication operations. + * First letter represents the layout of matrix A, second letter represents matrix B. + * N = Normal (Row-major), T = Transposed (Column-major) + */ +enum class layout_t +{ + NN, // Matrix A: Normal, Matrix B: Normal + NT, // Matrix A: Normal, Matrix B: Transposed + TN, // Matrix A: Transposed, Matrix B: Normal + TT, // Matrix A: Transposed, Matrix B: Transposed + NONE +}; + +enum class AccMode +{ + Init, // auto phase, first slice initializes, rest accumulate + Acc, // auto phase, all slices accumulate into existing C + InitPartialSum, // explicitly partial, first slice initializes + InitFinalSum, // explicitly final, first slice initializes + AccPartialSum, // explicitly partial, all slices accumulate + AccFinalSum, // explicitly final, all slices accumulate +}; + +#define L0A_BUF0 ((__ca__ half *)(__ca__ char *)0x0) +#define L0A_BUF1 ((__ca__ half *)(__ca__ char *)0x8000) +#define L0B_BUF0 ((__ca__ half *)(__ca__ char *)0x0) +#define L0B_BUF1 ((__ca__ half *)(__ca__ char *)0x8000) +#define L0C_BUF0 ((__ca__ half *)(__ca__ char *)0x0) +#define L0C_BUF1 ((__ca__ half *)(__ca__ char *)0x20000) + +#define LAST_LOOP(x, n) ((x) == ((n)-1)) +#define UNIT_FLAG_ENABLE(i, n) (LAST_LOOP(i, n) ? 3 : 2) + +AICORE inline uint64_t getPingPong(uint32_t flip) +{ + static uint64_t pingpong = 0; + if (flip) { + pingpong = 1 - pingpong; + } + return pingpong; +} + +// Memory constraints (L0 ping-pong is 32 KiB per buffer in this implementation). +// Tuning knob: if you change L0 layout or buffer addresses, re-check these constraints. +constexpr uint32_t MEM_BUFFER_SIZE_BYTES = 64 * 1024 / 2; // 64KB per buffer with pingpong (32KB) +constexpr uint32_t HALF_SIZE_BYTES = 2; // sizeof(half) = 2 bytes + +/** + * Calculate the largest Cube_K value that fits in the 64KB memory buffer. + * Checks if both Cube_M * Cube_K (left matrix) and Cube_K * Cube_N (right matrix) + * can fit within the 64KB buffer. + * + * @param Cube_M - The tile dimension M + * @param Cube_N - The tile dimension N + * @return - Largest Cube_K value (32, 64, 128, or 256) that fits in memory + */ +// Choose the largest Cube_K that fits both L0A (Cube_M x Cube_K) and L0B (Cube_K x Cube_N) +// so TMATMUL stays compute-dense while respecting L0 ping-pong capacity. +AICORE inline constexpr uint32_t calculateFittingCubeK(uint32_t Cube_M, uint32_t Cube_N) +{ + uint32_t bestCubeK = CUBE_K_SMALLEST; // Default to smallest value + + // Test candidates from largest to smallest to find the largest that fits + if (Cube_M * CUBE_K_256 * HALF_SIZE_BYTES <= MEM_BUFFER_SIZE_BYTES && + CUBE_K_256 * Cube_N * HALF_SIZE_BYTES <= MEM_BUFFER_SIZE_BYTES) { + bestCubeK = CUBE_K_256; + } else if (Cube_M * CUBE_K_128 * HALF_SIZE_BYTES <= MEM_BUFFER_SIZE_BYTES && + CUBE_K_128 * Cube_N * HALF_SIZE_BYTES <= MEM_BUFFER_SIZE_BYTES) { + bestCubeK = CUBE_K_128; + } else if (Cube_M * CUBE_K_64 * HALF_SIZE_BYTES <= MEM_BUFFER_SIZE_BYTES && + CUBE_K_64 * Cube_N * HALF_SIZE_BYTES <= MEM_BUFFER_SIZE_BYTES) { + bestCubeK = CUBE_K_64; + } + + return bestCubeK; +} + +// Deduce layout_t from SLayouts +template +AICORE inline constexpr layout_t deduce_layout() +{ + if constexpr (TileDataA::SFractal == SLayout::RowMajor && TileDataB::SFractal == SLayout::RowMajor) + return layout_t::NN; + if constexpr (TileDataA::SFractal == SLayout::RowMajor && TileDataB::SFractal == SLayout::ColMajor) + return layout_t::NT; + if constexpr (TileDataA::SFractal == SLayout::ColMajor && TileDataB::SFractal == SLayout::RowMajor) + return layout_t::TN; + if constexpr (TileDataA::SFractal == SLayout::ColMajor && TileDataB::SFractal == SLayout::ColMajor) + return layout_t::TT; + return layout_t::NONE; +} + +struct MatmulCallConfig { + bool useAcc; // true -> TMATMUL_UF_ACC, false -> TMATMUL_UF + AccPhase phase; // UF mapping +}; + +AICORE inline MatmulCallConfig resolve_acc_mode(AccMode mode, bool isFirstSlice, bool isLastSlice) +{ + switch (mode) { + case AccMode::Init: + return MatmulCallConfig{!isFirstSlice, AccPhase::Unknown}; + case AccMode::Acc: + return MatmulCallConfig{true, AccPhase::Unknown}; + case AccMode::InitPartialSum: + return MatmulCallConfig{!isFirstSlice, AccPhase::Partial}; + case AccMode::InitFinalSum: + return MatmulCallConfig{!isFirstSlice, AccPhase::Final}; + case AccMode::AccPartialSum: + return MatmulCallConfig{true, AccPhase::Partial}; + case AccMode::AccFinalSum: + return MatmulCallConfig{true, AccPhase::Final}; + } + return MatmulCallConfig{!isFirstSlice, AccPhase::Partial}; +} + +template +AICORE inline void pto_macro_matmul(TileDataA &aMatTile, TileDataB &bMatTile, TileDataC &cAccTile, + AccMode accMode = AccMode::Init) +{ + constexpr layout_t layout = deduce_layout(); + + static_assert(layout != layout_t::NONE, "Deduced layout is NONE, check tile SLayouts"); + // Assert that template LAYOUT matches deduced layout if LAYOUT is not NONE + if constexpr (LAYOUT != layout_t::NONE) { + static_assert(LAYOUT == layout, + "Layout mismatch: template LAYOUT does not match deduced layout from tile SLayouts. " + "Check SLayout of TileDataA and TileDataB."); + } + + // Ping-pong is used to overlap TEXTRACT (L1->L0) with TMATMUL on alternating buffers. + uint64_t pingpong = getPingPong(0); + const uint64_t Cube_K = + calculateFittingCubeK(Cube_M, Cube_N) > Tile_K ? Tile_K : calculateFittingCubeK(Cube_M, Cube_N); + const uint64_t kSegments = (uint64_t)(Tile_K / Cube_K); + for (uint64_t k = 0; k < kSegments; k++) { + using LeftTile = TileLeft; + LeftTile al0Tiles[2] = {LeftTile(), LeftTile()}; + using RightTile = TileRight; + RightTile bl0Tiles[2] = {RightTile(), RightTile()}; + + TASSIGN(al0Tiles[0], (uint64_t)L0A_BUF0); + TASSIGN(al0Tiles[1], (uint64_t)L0A_BUF1); + TASSIGN(bl0Tiles[0], (uint64_t)L0B_BUF0); + TASSIGN(bl0Tiles[1], (uint64_t)L0B_BUF1); + + // Wait until previous TMATMUL finishes using this L0 buffer before overwriting it via TEXTRACT. + wait_flag(PIPE_M, PIPE_MTE1, pingpong); + + if (layout == layout_t::NT) { + TASSIGN(aMatTile, (uint64_t)aMatTile.data() + k * Cube_K * Cube_M * sizeof(typename TileDataA::DType)); + TASSIGN(bMatTile, (uint64_t)bMatTile.data() + k * Cube_K * Cube_N * sizeof(typename TileDataB::DType)); + } + + // TEXTRACT slices the current Cube_K panel into L0A/L0B. + TEXTRACT(al0Tiles[pingpong], aMatTile, 0, 0); + TEXTRACT(bl0Tiles[pingpong], bMatTile, 0, 0); + + set_flag(PIPE_MTE1, PIPE_M, pingpong); + wait_flag(PIPE_MTE1, PIPE_M, pingpong); + + const bool isLast = (k + 1 == kSegments); + MatmulCallConfig cfg = resolve_acc_mode(accMode, k == 0, isLast); + if (cfg.useAcc) { + if (cfg.phase == AccPhase::Final) { + TMATMUL_ACC(cAccTile, al0Tiles[pingpong], bl0Tiles[pingpong]); + } else if (cfg.phase == AccPhase::Partial) { + TMATMUL_ACC(cAccTile, al0Tiles[pingpong], bl0Tiles[pingpong]); + } else { + TMATMUL_ACC(cAccTile, al0Tiles[pingpong], bl0Tiles[pingpong]); + } + } else { + if (cfg.phase == AccPhase::Final) { + TMATMUL(cAccTile, al0Tiles[pingpong], bl0Tiles[pingpong]); + } else if (cfg.phase == AccPhase::Partial) { + TMATMUL(cAccTile, al0Tiles[pingpong], bl0Tiles[pingpong]); + } else { + TMATMUL(cAccTile, al0Tiles[pingpong], bl0Tiles[pingpong]); + } + } + set_flag(PIPE_M, PIPE_MTE1, pingpong); + pingpong = getPingPong(1); + } +} +} // namespace pto + +#endif // PTO_MACRO_MATMUL_H diff --git a/examples/aot/flash_attention/cpp_ref/split_pipe/run.py b/examples/aot/flash_attention/cpp_ref/split_pipe/run.py index f7e61fb8..f406f6f7 100644 --- a/examples/aot/flash_attention/cpp_ref/split_pipe/run.py +++ b/examples/aot/flash_attention/cpp_ref/split_pipe/run.py @@ -12,8 +12,8 @@ # See LICENSE in the root of the software repository for the full text of the License. # -------------------------------------------------------------------------------- -# Split-pipe FA: JIT compiles pto-isa-splitpipe fa_performance_kernel.cpp (TileSplitAxis etc.) -# plus call_kernel_dispatch.cpp. Case list is generated_cases.h (see jit_util_flash / generate_cases.py). +# Split-pipe FA: JIT-compiles bundled kernels/flash_atten/fa_performance_kernel.cpp (TileSplitAxis, etc.) +# plus call_kernel_dispatch.cpp. Template instantiations are listed in generated_cases.h (regenerate via scripts/generate_cases.py). import random import math diff --git a/examples/aot/flash_attention/cpp_ref/split_pipe/scripts/generate_cases.py b/examples/aot/flash_attention/cpp_ref/split_pipe/scripts/generate_cases.py new file mode 100644 index 00000000..591eb207 --- /dev/null +++ b/examples/aot/flash_attention/cpp_ref/split_pipe/scripts/generate_cases.py @@ -0,0 +1,228 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# -------------------------------------------------------------------------------- +# Copyright (c) 2026 Huawei Technologies Co., Ltd. +# This program is free software, you can redistribute it and/or modify it under the terms and conditions of +# CANN Open Software License Agreement Version 2.0 (the "License"). +# Please refer to the License for details. You may not use this file except in compliance with the License. +# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +# See LICENSE in the root of the software repository for the full text of the License. +# -------------------------------------------------------------------------------- + +""" +Generate TFA case configuration and emit a shared header/JSON for host/kernel build. + +Usage examples: + python3 generate_cases.py --cases "128,128,1024,128,256" \ + --cases "128,512,2048,128,256" + + # Override cube-side preload depth (defaults to 4) + python3 generate_cases.py --qk-preload 6 + +Each --cases entry format: HEAD_SIZE,S0,S1,CUBE_S0[,TILE_S1] +CUBE_S1 is fixed at 128; TILE_S1 defaults to 256 if omitted. +Defaults replicate the previous hard-coded set if --cases is omitted. +""" +import argparse +import json +import os +from pathlib import Path +from typing import List, Dict + +TILE_S1_DEFAULT = 256 +QK_PRELOAD_DEFAULT = 4 + +DEFAULT_CASES = [ + (128, 128, 1024, 128, TILE_S1_DEFAULT, False), + (128, 128, 2048, 128, TILE_S1_DEFAULT, False), + (128, 128, 8192, 128, TILE_S1_DEFAULT, False), + (128, 512, 1024, 128, TILE_S1_DEFAULT, False), + (128, 512, 2048, 128, TILE_S1_DEFAULT, False), + (128, 512, 8192, 128, TILE_S1_DEFAULT, False), +] + + +def _parse_case_entry(raw: str, qk_preload: int, causal_mask: bool) -> Dict[str, int]: + parts = [p.strip() for p in raw.split(',') if p.strip()] + if len(parts) not in (4, 5): + raise ValueError(f"Expected 4 or 5 comma-separated values (HEAD_SIZE,S0,S1,CUBE_S0[,TILE_S1]), got '{raw}'") + head, s0, s1, cube_s0 = map(int, parts[:4]) + tile_s1 = int(parts[4]) if len(parts) == 5 else TILE_S1_DEFAULT + return { + "head_size": head, + "s0": s0, + "s1": s1, + "cube_s0": cube_s0, + "cube_s1": 128, + "tile_s1": tile_s1, + "qk_preload": qk_preload, + "causal_mask": int(causal_mask), + } + + +def _default_cases(qk_preload: int) -> List[Dict[str, int]]: + return [ + { + "head_size": head, + "s0": s0, + "s1": s1, + "cube_s0": cube_s0, + "cube_s1": 128, + "tile_s1": tile_s1, + "qk_preload": qk_preload, + "causal_mask": int(causal_mask), + } + for (head, s0, s1, cube_s0, tile_s1, causal_mask) in DEFAULT_CASES + ] + + +def _case_name(case: Dict[str, int]) -> str: + return f"case_float_H_{case['head_size']}_S0_{case['s0']}_S1_{case['s1']}" + + +def _normalize_case(case: Dict[str, int]) -> Dict[str, int]: + if case["qk_preload"] < 1: + raise ValueError("qk_preload must be >= 1") + + # Ensure cube_s0 does not exceed s0 and divides evenly; otherwise set cube_s0 = s0 + if case["cube_s0"] > case["s0"] or case["s0"] % case["cube_s0"] != 0: + case["cube_s0"] = case["s0"] + + # Fix cube_s1 to 128 and ensure divisibility + if case["cube_s1"] != 128: + case["cube_s1"] = 128 + if case["s1"] % case["cube_s1"] != 0: + raise ValueError("S1 must be divisible by CUBE_S1 (128)") + + # Ensure TILE_S1 divides S1 and is a multiple of CUBE_S1 + if case["tile_s1"] % case["cube_s1"] != 0: + raise ValueError("TILE_S1 must be divisible by CUBE_S1 (128)") + if case["s1"] % case["tile_s1"] != 0: + raise ValueError("S1 must be divisible by TILE_S1") + + return case + + +def _render_macro(cases: List[Dict[str, int]]) -> str: + lines = ["#define TFA_FOR_EACH_CASE(MACRO) \\"] + for idx, case in enumerate(cases): + causal_mask = str("true" if bool(case["causal_mask"]) else "false") + suffix = " \\" if idx + 1 != len(cases) else "" + line = f" MACRO({case['s0']}, {case['head_size']}, {case['s1']}, {case['cube_s0']}, {case['cube_s1']}, {case['tile_s1']}, {case['qk_preload']}, {causal_mask}){suffix}" + lines.append(line) + return "\n".join(lines) + + +def _render_header(cases: List[Dict[str, int]]) -> str: + macro_block = _render_macro(cases) + array_entries = [] + for case in cases: + array_entries.append( + " {" + ", ".join( + [ + str(case["s0"]), + str(case["head_size"]), + str(case["s1"]), + str(case["cube_s0"]), + str(case["cube_s1"]), + str(case["tile_s1"]), + str(case["qk_preload"]), + str("true" if bool(case["causal_mask"]) else "false"), + f'"{_case_name(case)}"', + ] + ) + "}" + ) + array_block = ",\n".join(array_entries) + + return f"""#pragma once +// Auto-generated by scripts/generate_cases.py. Do not edit manually. +// clang-format off +#include + +{macro_block} + +struct GeneratedTfaCase {{ + int s0; + int head_size; + int s1; + int cube_s0; + int cube_s1; + int tile_s1; + int qk_preload; + bool causal_mask; + const char *name; +}}; + +static constexpr GeneratedTfaCase kGeneratedTfaCases[] = {{ +{array_block} +}}; +static constexpr std::size_t kGeneratedTfaCasesCount = sizeof(kGeneratedTfaCases) / sizeof(kGeneratedTfaCases[0]); +// clang-format on +""" + + +_SPLIT_PIPE_DIR = Path(__file__).resolve().parent.parent + + +def main() -> None: + parser = argparse.ArgumentParser(description="Generate TFA case header/JSON") + parser.add_argument( + "--cases", + action="append", + default=None, + help="Case entry in the format HEAD_SIZE,S0,S1,CUBE_S0[,TILE_S1] (repeat for multiple entries; CUBE_S1 fixed at 128)", + ) + parser.add_argument( + "--qk-preload", + type=int, + default=QK_PRELOAD_DEFAULT, + help="qkPreloadNum (cube pipeline preload depth) applied to all generated cases", + ) + parser.add_argument( + "--output-header", + default=str(_SPLIT_PIPE_DIR / "generated_cases.h"), + help="Output header path (default: split_pipe/generated_cases.h)", + ) + parser.add_argument( + "--output-json", + default=str(_SPLIT_PIPE_DIR / "build" / "generated_cases.json"), + help="Output JSON path (default: split_pipe/build/generated_cases.json)", + ) + parser.add_argument( + "--causal-mask", + default=False, + help="Enable causal mask", + ) + args = parser.parse_args() + + if args.cases: + cases = [_normalize_case(_parse_case_entry(entry, args.qk_preload, args.causal_mask)) for entry in args.cases] + else: + cases = [_normalize_case(case) for case in _default_cases(args.qk_preload)] + + header_text = _render_header(cases) + header_path = Path(args.output_header) + header_path.parent.mkdir(parents=True, exist_ok=True) + header_path.write_text(header_text) + + json_payload = [ + { + "name": _case_name(case), + **case, + } + for case in cases + ] + json_path = Path(args.output_json) + json_path.parent.mkdir(parents=True, exist_ok=True) + json_path.write_text(json.dumps(json_payload, indent=2)) + + print(f"[INFO] Wrote {header_path}") + print(f"[INFO] Wrote {json_path}") + print("[INFO] Cases generated:") + for case in json_payload: + print(f" - {case['name']} (H={case['head_size']}, S0={case['s0']}, S1={case['s1']}, CUBE_S0={case['cube_s0']}, CUBE_S1={case['cube_s1']}, TILE_S1={case['tile_s1']}, QK_PRELOAD={case['qk_preload']}, CAUSAL_MASK={case['causal_mask']})") + + +if __name__ == "__main__": + main() From 1b532e0a8e8f51ca6de77a11d740ce9c96359f13 Mon Sep 17 00:00:00 2001 From: learning-chip Date: Wed, 29 Apr 2026 19:43:05 +0000 Subject: [PATCH 07/17] move current default to head32 subdir --- examples/aot/flash_attention/{ => head32}/README.md | 0 examples/aot/flash_attention/{ => head32}/caller.cpp | 0 examples/aot/flash_attention/{ => head32}/compile.sh | 0 examples/aot/flash_attention/{ => head32}/fa_builder.py | 0 examples/aot/flash_attention/{ => head32}/run.py | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename examples/aot/flash_attention/{ => head32}/README.md (100%) rename examples/aot/flash_attention/{ => head32}/caller.cpp (100%) rename examples/aot/flash_attention/{ => head32}/compile.sh (100%) rename examples/aot/flash_attention/{ => head32}/fa_builder.py (100%) rename examples/aot/flash_attention/{ => head32}/run.py (100%) diff --git a/examples/aot/flash_attention/README.md b/examples/aot/flash_attention/head32/README.md similarity index 100% rename from examples/aot/flash_attention/README.md rename to examples/aot/flash_attention/head32/README.md diff --git a/examples/aot/flash_attention/caller.cpp b/examples/aot/flash_attention/head32/caller.cpp similarity index 100% rename from examples/aot/flash_attention/caller.cpp rename to examples/aot/flash_attention/head32/caller.cpp diff --git a/examples/aot/flash_attention/compile.sh b/examples/aot/flash_attention/head32/compile.sh similarity index 100% rename from examples/aot/flash_attention/compile.sh rename to examples/aot/flash_attention/head32/compile.sh diff --git a/examples/aot/flash_attention/fa_builder.py b/examples/aot/flash_attention/head32/fa_builder.py similarity index 100% rename from examples/aot/flash_attention/fa_builder.py rename to examples/aot/flash_attention/head32/fa_builder.py diff --git a/examples/aot/flash_attention/run.py b/examples/aot/flash_attention/head32/run.py similarity index 100% rename from examples/aot/flash_attention/run.py rename to examples/aot/flash_attention/head32/run.py From 3e29792dd72676e1895ce544428f6438628c483d Mon Sep 17 00:00:00 2001 From: learning-chip Date: Wed, 29 Apr 2026 19:55:20 +0000 Subject: [PATCH 08/17] adapt InitializeL2G2LPipeOp changes in ptoas 0.34 & 0.35 --- ptodsl/api/pto_general.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ptodsl/api/pto_general.py b/ptodsl/api/pto_general.py index a7f25593..a897f2d1 100644 --- a/ptodsl/api/pto_general.py +++ b/ptodsl/api/pto_general.py @@ -217,9 +217,9 @@ def initialize_l2g2l_pipe( slot_size, slot_num, _unwrap(gm_addr), - _unwrap(local_addr), local_slot_num=local_slot_num, flag_base=flag_base, + local_addr=_unwrap(local_addr), peer_local_addr=( _unwrap(peer_local_addr) if peer_local_addr is not None else None ), From c38ca8d823320e230e38af6223068b8dddfb6dc8 Mon Sep 17 00:00:00 2001 From: learning-chip Date: Wed, 29 Apr 2026 19:59:29 +0000 Subject: [PATCH 09/17] fix caller path --- .../flash_attention/experimental/caller.cpp | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) mode change 120000 => 100644 examples/aot/flash_attention/experimental/caller.cpp diff --git a/examples/aot/flash_attention/experimental/caller.cpp b/examples/aot/flash_attention/experimental/caller.cpp deleted file mode 120000 index 5fe1d184..00000000 --- a/examples/aot/flash_attention/experimental/caller.cpp +++ /dev/null @@ -1 +0,0 @@ -../caller.cpp \ No newline at end of file diff --git a/examples/aot/flash_attention/experimental/caller.cpp b/examples/aot/flash_attention/experimental/caller.cpp new file mode 100644 index 00000000..87546451 --- /dev/null +++ b/examples/aot/flash_attention/experimental/caller.cpp @@ -0,0 +1,32 @@ +#ifndef KERNEL_CPP +#error "KERNEL_CPP must be defined at compile time." +#endif + +#include + +extern "C" int rtGetC2cCtrlAddr(uint64_t *ctrlAddr, uint32_t *ctrlLen); + +#include KERNEL_CPP + +extern "C" void call_kernel( + uint32_t blockDim, + void *stream, + uint8_t *gmSlotBuffer, + uint8_t *q, + uint8_t *k, // K: [S1_TOTAL, HEAD] fp16 + uint8_t *v, + uint8_t *o) // output O: [Q_ROWS, HEAD] fp32 +{ + void *fftsAddr = nullptr; + uint32_t fftsLen = 0; + (void)rtGetC2cCtrlAddr(reinterpret_cast(&fftsAddr), &fftsLen); + (void)fftsLen; + + call_both<<>>( + (__gm__ int64_t *)fftsAddr, + (__gm__ float *)gmSlotBuffer, + (__gm__ half *)q, + (__gm__ half *)k, + (__gm__ half *)v, + (__gm__ float *)o); +} From a1e1193189a2319b9ed4ff8ab23439d5aae2bce5 Mon Sep 17 00:00:00 2001 From: learning-chip Date: Wed, 29 Apr 2026 20:14:01 +0000 Subject: [PATCH 10/17] upload naive tpush perf figure --- .../naive_tpush/naive_tpush_dsl_plot.png | Bin 0 -> 100283 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 examples/aot/flash_attention/cpp_ref/naive_tpush/naive_tpush_dsl_plot.png diff --git a/examples/aot/flash_attention/cpp_ref/naive_tpush/naive_tpush_dsl_plot.png b/examples/aot/flash_attention/cpp_ref/naive_tpush/naive_tpush_dsl_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..de04a5f93872795957a1ed442c01ef7c416cabc4 GIT binary patch literal 100283 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 literal 0 HcmV?d00001 From 98034e562fb3ed7e8bda1a80325423771f0a2c24 Mon Sep 17 00:00:00 2001 From: learning-chip Date: Wed, 29 Apr 2026 21:29:25 +0000 Subject: [PATCH 11/17] first attempt to port split-pipe FA to python --- .../split_pipe/DSL_FIX_TODOS.md | 54 + .../aot/flash_attention/split_pipe/README.md | 88 ++ .../aot/flash_attention/split_pipe/caller.cpp | 32 + .../split_pipe/codegen_results/README.md | 90 ++ .../split_pipe/codegen_results/fa.pto.mlir | 401 +++++++ .../codegen_results/fa.ptoas.generated.cpp | 650 ++++++++++++ .../fa_performance_kernel.reference.cpp | 998 ++++++++++++++++++ .../aot/flash_attention/split_pipe/compile.sh | 84 ++ .../kernels/fa_performance_builder.py | 704 ++++++++++++ .../aot/flash_attention/split_pipe/run.py | 429 ++++++++ 10 files changed, 3530 insertions(+) create mode 100644 examples/aot/flash_attention/split_pipe/DSL_FIX_TODOS.md create mode 100644 examples/aot/flash_attention/split_pipe/README.md create mode 100644 examples/aot/flash_attention/split_pipe/caller.cpp create mode 100644 examples/aot/flash_attention/split_pipe/codegen_results/README.md create mode 100644 examples/aot/flash_attention/split_pipe/codegen_results/fa.pto.mlir create mode 100644 examples/aot/flash_attention/split_pipe/codegen_results/fa.ptoas.generated.cpp create mode 100644 examples/aot/flash_attention/split_pipe/codegen_results/fa_performance_kernel.reference.cpp create mode 100644 examples/aot/flash_attention/split_pipe/compile.sh create mode 100644 examples/aot/flash_attention/split_pipe/kernels/fa_performance_builder.py create mode 100755 examples/aot/flash_attention/split_pipe/run.py diff --git a/examples/aot/flash_attention/split_pipe/DSL_FIX_TODOS.md b/examples/aot/flash_attention/split_pipe/DSL_FIX_TODOS.md new file mode 100644 index 00000000..9baaa4c8 --- /dev/null +++ b/examples/aot/flash_attention/split_pipe/DSL_FIX_TODOS.md @@ -0,0 +1,54 @@ +# DSL split_pipe kernel — fix backlog (vs `cpp_ref/split_pipe`) + +Goal: **`python run.py`** matches **`../cpp_ref/split_pipe/run.py`** for **correctness** (torch fp32 reference) and **performance** (TFLOP/s in the same ballpark as JIT `fa_performance_kernel.cpp`) on NPU. + +--- + +## Resolved (in builder / workflow) + +- [x] **A1 — VEC UB overflow from pipe `tpop` staging** — stacked layout under 192 KiB; `_VEC_UB_TAIL` assert. +- [x] **A2 — Cube RIGHT bank overflow (`HEAD=128`, `S1_TILE=512`)** — share K/V RIGHT at `RIGHT_KV_OFF=0`. +- [x] **A3 — Duplicate UB offset for `p_fp32` / `p_fp16`** — `VEC_P_FP16_OFF = VEC_P_FP32_OFF + _TILE_FP16_BYTES`; distinct `TASSIGN` in generated vec code. +- [x] **B3 — Rebuild `FA_TILES` variants** — `bash compile.sh` produces `fa.so` … `fa_128.so`. +- [x] **A9 — Compile/runtime env documentation** — `FA_Q_ROWS`, `FA_S1_TILE` wired through `compile.sh`; documented in `README.md`. +- [x] **A12 — Host/builder constant drift (NaNs from mismatched `FA_*`)** — `compile.sh` emits **`build_artifacts/fa${TAG}.build_env`** per variant; **`run.py`** applies the sidecar whose **`FA_NUM_TILES * FA_S1_TILE`** equals the first **`FA_BENCH_LENGTHS`** entry (tie-break: **`FA_S1_TILE`** env if set, else **`fa.build_env`**), then **`importlib.reload(fa_performance_builder)`** so GM/tensor sizes match the loaded `.so`. + +--- + +## Open — blocking default port + +- [ ] **A7 — CCU / aicore fault at default `S1_TILE=512`** + **`python run.py`** (default env aligned with `fa.so` + **A12**) still fails at **`torch.npu.synchronize()`** with **ACL 507015**, **CCU instruction address check** on some devices. **`../cpp_ref/split_pipe`** JIT passes on the **same** hardware. Needs bisheng/ptotas or vendor triage against **`build_artifacts/fa.cpp`**. + +- [ ] **A11 — Numerics on alternate tile width** + With **`FA_S1_TILE=256`** and **matching** compile/runtime **`FA_NUM_TILES` / `FA_Q_ROWS`**, the kernel **may run** without the A7 fault but **`torch.testing.assert_close`** can still fail (**NaNs** / large drift). Treat as schedule vs reference macro alignment or toolchain issue separate from A7. + +--- + +## Open — parity / audit (non-blocking for “runs at all”) + +- [ ] **A4 — Bisheng stack / spill** — stack `0x8000`; larger stacks rejected by the toolchain in this environment; not proved root cause of A7. + +- [ ] **A5 — Launch geometry** — reference uses `runTFA<<>>`, DSL uses `min(NUM_Q_BLOCKS, cores)` striping; totals consistent; optional CV audit. + +- [ ] **A6 — Structural parity** — reference: fused **`runTFA`**, **`QK_PRELOAD=4`**, **`CUBE_S0=128`**; DSL: **`pto.call(cube); pto.call(vec)`**, **`QK_PRELOAD=2`**, **`S0=32`**. Reference constructs **`TPipe`** in **QK → P → PV** order (`BUF0_QK_READY` / `BUF1_SM_READY` / `UPDATE_READY`); DSL initializes **QK → PV → P** (two **`l2g2l_pipe`** then V2C **`aic/aiv_initialize_pipe`**). Numerical match is the target once A7/A11 clear. + +- [ ] **A8 — CV tail sync vs `runTFA`** — reference ends cube with **`wait_flag_dev(CV_BLOCK_END)`** and vec with **`ffts_cross_core_sync(..., CV_BLOCK_END)`**; DSL output ends with **`ptoas_auto_sync_tail`**. May require future **`pto`/ptoas** hooks if parity demands explicit FFTS tail patterns. + +--- + +## Verification checklist + +- [ ] **B1 — `python run.py`** passes **`torch.testing.assert_close`** vs **`fa_reference`** for default + full **`FA_BENCH_LENGTHS`**. **Blocked by A7 / possibly A11** until NPU/toolchain issues clear. + +- [ ] **B2 — Benchmark vs `cpp_ref/split_pipe/run.py`** (`jit_compile_flash`), same FLOP model (`attn_flops_matmul_softmax_scale`), `flush_cache=False`. **Blocked by A7** for apples-to-apples default geometry. + +--- + +### Status log + +| Date | Change | +| ---- | ------ | +| (session) | Backlog created; A3; NPU CCU fault | +| 2026-04-29 | A3 verified in `fa.cpp`; `compile.sh`: **FA_Q_ROWS**, **FA_S1_TILE**; README status; default **512** path **A7**; **256** path **A11** | +| 2026-04-29 | **A12**: **`fa*.build_env`** + **`run.py`** **`reload`**; README pipe-order wording corrected (**QK→PV→P** vs ref **QK→P→PV**); removed obsolete “**flag_base**” resolved line | diff --git a/examples/aot/flash_attention/split_pipe/README.md b/examples/aot/flash_attention/split_pipe/README.md new file mode 100644 index 00000000..6ef44f3c --- /dev/null +++ b/examples/aot/flash_attention/split_pipe/README.md @@ -0,0 +1,88 @@ +# Flash Attention — split_pipe (PTO-DSL builder) + +Python builder `kernels/fa_performance_builder.py` emits MLIR → `ptoas` → C++ → `bisheng` `.so`, following the same **software-pipelined** FA schedule as the reference hand-written kernel in `../cpp_ref/split_pipe/kernels/flash_atten/fa_performance_kernel.cpp` (QK preload, softmax/GU overlap, `exp_max` ping-pong). The DSL uses explicit pipe helpers (`initialize_l2g2l_pipe`, `tpush`/`tpop` with `TILE_UP_DOWN`) instead of `TMPipe` + `TileSplitAxis` from the C++ file. + +## Current status (vs bundled C++ reference) + +| Check | Result | +| ----- | ------ | +| **`../cpp_ref/split_pipe/run.py`** (JIT `fa_performance_kernel.cpp`) | Passes correctness + benchmark on NPU in this environment | +| **`python run.py`** here — **default** (`S1_TILE=512`, `Q_ROWS=3072`, default `FA_NUM_TILES` matching `fa.so`) | **Fails** at `torch.npu.synchronize()` with **ACL 507015** / **CCU instruction address check** (aicore fault); numerics not validated | +| **`FA_S1_TILE=256`** + matching compile/runtime env | Kernel often **finishes** without that sync fault but **`torch.testing.assert_close` fails** (NaNs / large errors) — **not yet a validated port** | + +So the Python port does **not** yet **run correctly** nor **fully match** the C++ reference at the default cpp_ref-shaped geometry (`HEAD=128`, `tile_s1=512`, large Q). + +### Likely remaining gaps (see `DSL_FIX_TODOS.md`) + +1. **Compile/runtime env parity:** `FA_NUM_TILES`, `FA_S1_TILE`, and `FA_Q_ROWS` are fixed in the emitted MLIR. **`compile.sh`** writes **`build_artifacts/fa${TAG}.build_env`** per variant; **`run.py`** picks the file whose **`FA_NUM_TILES * FA_S1_TILE`** equals the first **`FA_BENCH_LENGTHS`** entry (tie-break: **`FA_S1_TILE`** env if set, else **`fa.build_env`**), then **`importlib.reload`**s **`fa_performance_builder`** so Python GM/tensor shapes match the loaded `.so`. You can still override via exported **`FA_*`** before launch if needed. +2. **FFTS / CV plumbing:** Hand-written `runTFA` constructs **`TPipe`** objects in **QK → P (V2C) → PV** order (`BUF0_QK_READY`, `BUF1_SM_READY`, `UPDATE_READY`). The DSL builder calls **`initialize_l2g2l_pipe`** for **QK** and **PV** first, then **`aic_initialize_pipe` / `aiv_initialize_pipe`** for **P** (**QK → PV → P**). Generated **`TPipe`** indices may therefore differ from the reference header ordering; **`ptoas --enable-insert-sync`** supplies multipipe synchronization. **Kernel-tail** **`wait_flag_dev` / `ffts_cross_core_sync`** vs **`ptoas_auto_sync_tail`** remains an **A8** structural gap (see **`DSL_FIX_TODOS.md`**). +3. **`S1_TILE=512` vec path:** Errors correlate with the widest softmax tiles (vs `examples/aot/flash_attention/experimental/` at `S1_TILE=256`, which passes). + +### Debug workflow (recommended) + +1. Regenerate and diff **`build_artifacts/fa.cpp`** against **`../cpp_ref/split_pipe/kernels/flash_atten/fa_performance_kernel.cpp`** for pipe IDs (`TPipe`), schedule phases, and sync tails. +2. After any builder change, **`bash compile.sh`** with the **same** `FA_*` env vars you will use for **`python run.py`**. +3. Compare behaviour with **`../cpp_ref/split_pipe`** on the **same** NPU. + +--- + +## Shapes & defaults + +**`HEAD=128`** and default **`S1_TILE=512`** match `../cpp_ref/split_pipe/run.py` (`test_flash(..., head=128)`, typical `tile_s1=512`). Cube rows per block stay **`S0=32`** (vector softmax tiles **`[S0_HALF, S1_TILE]`**); total Q rows default to **`3072` (`128 * 24`)** like the cpp_ref benchmark `s0`. Override with **`FA_Q_ROWS`** (must match at compile and run). + +Optional **`FA_S1_TILE`** (default `512`) is for experiments; changing it changes **`NUM_TILES`** needed for the same sequence length (`seq_len = NUM_TILES * S1_TILE`) and **must** be rebuilt. + +The reference C++ kernel uses larger cube blocks (`CUBE_S0=128`) with narrower logical vec rows; this DSL example keeps the geometry that fits explicit UB layouts (`S0=32`). + +--- + +## Setup + +```bash +cd /workdir/pto-dsl +pip install -e . +``` + +Environment (same as other `examples/aot` demos): + +- `ASCEND_TOOLKIT_HOME` +- `PTO_LIB_PATH` — directory that contains the `include/` tree with `` (repo root or `.../include`) + +--- + +## Build kernels + +From this directory: + +```bash +bash compile.sh +# Optional: FA_TILES=16,64 bash compile.sh +``` + +`compile.sh` passes through: + +- **`FA_NUM_TILES`** — per variant (from `FA_TILES`). +- **`FA_S1_TILE`** — default `512`. +- **`FA_Q_ROWS`** — default `3072`. + +Produces `build_artifacts/fa.so`, `fa_32.so`, … (each variant corresponds to `FA_NUM_TILES` baked into the emitted IR), plus matching **`fa.build_env`**, **`fa_32.build_env`**, … (`FA_NUM_TILES`, `FA_S1_TILE`, `FA_Q_ROWS`) for **`run.py`** auto-sync. + +**Example — 8k sequence with default tile width:** `NUM_TILES=16`, `S1_TILE=512` → `fa.so` + `fa.build_env`. + +--- + +## Correctness + benchmark + +```bash +python run.py +``` + +Override sequence lengths: `FA_BENCH_LENGTHS=8192,32768 python run.py`. + +**Important:** after **`compile.sh`**, **`run.py`** reads **`fa*.build_env`** for the first benchmark length so imported builder constants stay aligned with how that `.so` was built. If you rebuild with different **`FA_S1_TILE`** / **`FA_Q_ROWS`**, re-run **`compile.sh`** (or set matching **`FA_*`** env vars yourself). Ambiguous lengths (e.g. `8192 = 16×512 = 32×256`) require **`FA_S1_TILE`** in the environment or only one matching **`*.build_env`** on disk. + +--- + +## Compare generated C++ to reference + +Diff `build_artifacts/fa.cpp` (or `fa_.cpp`) against `../cpp_ref/split_pipe/kernels/flash_atten/fa_performance_kernel.cpp`: scheduling intent should align on pipeline phases; surface syntax differs (`pto.call` cube/vec vs fused `runTFA`, etc.). diff --git a/examples/aot/flash_attention/split_pipe/caller.cpp b/examples/aot/flash_attention/split_pipe/caller.cpp new file mode 100644 index 00000000..87546451 --- /dev/null +++ b/examples/aot/flash_attention/split_pipe/caller.cpp @@ -0,0 +1,32 @@ +#ifndef KERNEL_CPP +#error "KERNEL_CPP must be defined at compile time." +#endif + +#include + +extern "C" int rtGetC2cCtrlAddr(uint64_t *ctrlAddr, uint32_t *ctrlLen); + +#include KERNEL_CPP + +extern "C" void call_kernel( + uint32_t blockDim, + void *stream, + uint8_t *gmSlotBuffer, + uint8_t *q, + uint8_t *k, // K: [S1_TOTAL, HEAD] fp16 + uint8_t *v, + uint8_t *o) // output O: [Q_ROWS, HEAD] fp32 +{ + void *fftsAddr = nullptr; + uint32_t fftsLen = 0; + (void)rtGetC2cCtrlAddr(reinterpret_cast(&fftsAddr), &fftsLen); + (void)fftsLen; + + call_both<<>>( + (__gm__ int64_t *)fftsAddr, + (__gm__ float *)gmSlotBuffer, + (__gm__ half *)q, + (__gm__ half *)k, + (__gm__ half *)v, + (__gm__ float *)o); +} diff --git a/examples/aot/flash_attention/split_pipe/codegen_results/README.md b/examples/aot/flash_attention/split_pipe/codegen_results/README.md new file mode 100644 index 00000000..d877c7ab --- /dev/null +++ b/examples/aot/flash_attention/split_pipe/codegen_results/README.md @@ -0,0 +1,90 @@ +# split_pipe — archived PTO codegen (best attempt vs reference C++) + +This folder holds a **frozen snapshot** of the closest match produced today between: + +1. **PTO-DSL builder output** (`fa.pto.mlir`) — MLIR emitted by `kernels/fa_performance_builder.py`. +2. **ptoas-generated Ascend C++** (`fa.ptoas.generated.cpp`) — lowered from that MLIR with **`ptoas --pto-arch=a3 --pto-level=level3 --enable-insert-sync`**. +3. **Hand-written reference kernel** (`fa_performance_kernel.reference.cpp`) — copy of `../cpp_ref/split_pipe/kernels/flash_atten/fa_performance_kernel.cpp` for side‑by‑side comparison. + +“Best attempt” here means the **default split_pipe product**: **`FA_NUM_TILES=16`**, **`FA_S1_TILE=512`**, **`FA_Q_ROWS=3072`** — i.e. the **`fa.so`** / **`fa.mlir`** path aligned with the bundled **`compile.sh`** defaults and the cpp_ref benchmark geometry documented in `../README.md` (**HEAD=128**, wide softmax tile). + +--- + +## How these files were generated + +From `split_pipe/`: + +```bash +# Rebuild only the plain fa.so variant (NUM_TILES=16 → plain filenames). +FA_TILES=16 FA_S1_TILE=512 FA_Q_ROWS=3072 bash compile.sh +``` + +Pipeline (same as `compile.sh`): + +| Step | Command | Output | +|------|---------|--------| +| 1 | `FA_NUM_TILES=16 FA_S1_TILE=512 FA_Q_ROWS=3072 python kernels/fa_performance_builder.py` | stdout redirected to `build_artifacts/fa.mlir` | +| 2 | `ptoas --pto-arch=a3 --pto-level=level3 --enable-insert-sync build_artifacts/fa.mlir` | stdout redirected to `build_artifacts/fa.cpp` | +| 3 | `bisheng … caller.cpp -o build_artifacts/fa.so` | linked host shim + embedded kernel C++ (not duplicated here) | + +Files in **this directory** are copies of steps **1–2** plus the reference source (run from **`split_pipe/`**, i.e. the parent of `codegen_results/`): + +```bash +cp build_artifacts/fa.mlir codegen_results/fa.pto.mlir +cp build_artifacts/fa.cpp codegen_results/fa.ptoas.generated.cpp +cp ../cpp_ref/split_pipe/kernels/flash_atten/fa_performance_kernel.cpp \ + codegen_results/fa_performance_kernel.reference.cpp +``` + +Canonical reference path from **`split_pipe/codegen_results/`** alone: + +`../../cpp_ref/split_pipe/kernels/flash_atten/fa_performance_kernel.cpp` + +**Naming:** The DSL emits **MLIR** (`module { … func.func @cube_kernel … }`). There is no separate `.pto` file extension in this repo; **`fa.pto.mlir`** is the **PTO-DSL MLIR IR** artifact users diff against `ptoas`. + +--- + +## Gaps: `fa.ptoas.generated.cpp` vs `fa_performance_kernel.reference.cpp` + +Both ultimately include **`pto/pto-inst.hpp`** and lower to **`TPipe` / `TLOAD` / `TMATMUL` / vec ops**, but structure and intent differ substantially. + +### 1. Kernel shape and entry points + +| Aspect | Reference | DSL → ptoas | +|--------|-----------|-------------| +| Top-level | Template **`runTFA<…>`** fuses QK / softmax (**`compute_p`**) / PV / GU (**`compute_gu`**) in one TU | **`cube_kernel`** (QK + PV matmuls and FIFO I/O) and **`vector_kernel`** (softmax + GU side) as **separate `AICORE` functions**, plus **`call_both`** wrapper | +| Launch API | **`LaunchTFA<…>`** with many GM FIFO / profiling pointers (`fa_performance_kernel.h`) | **`call_both`** (`caller.cpp`) passes **`gm_slot`** scratch + Q/K/V/O tensors | + +The reference is optimized around **macro helpers** (`pto_macro_matmul.hpp`, `pto_macro_fa_softmax.hpp`, `pto_macro_fa_gu.hpp`). The DSL path expresses the same *logical* pipeline via **`pto.*` MLIR ops**, which **ptoas** expands into long SSA-style **`Tile`/`GlobalTensor`** code without those FA macros. + +### 2. Compile-time geometry + +Reference defaults (see `fa_performance_kernel.h`) include **`kFaQkPreload = 4`**, **`kFaTileS1 = 256`**, **`kFaCubeS1 = 128`**, while **`LaunchTFA`** is instantiated from cpp_ref `run.py`/JIT with parameters that may override **`TILE_S1`**. + +This archived DSL build fixes **`S0 = 32`** (vec half-rows **`16`** per sub-block), **`S1_TILE = 512`**, **`HEAD = 128`**, **`NUM_TILES = 16`**, **`QK_PRELOAD = 2`** in `fa_performance_builder.py`. So numerically “closest” is about **matching workload size** (e.g. **8192** sequence length), **not** identical template parameters to every **`kFa*`** constant in the header. + +### 3. FFTS pipes and flag namespaces + +Reference constructs **`TPipe`**, **`TPipe`**, **`TPipe`** using **`FftsBufferFlag`** (`BUF0_QK_READY`, …). + +ptoas emits **`TPipe<0, Direction::DIR_C2V, …>`**, **`TPipe<2, …>`**, **`TPipe<4, Direction::DIR_V2C, …>`** (see generated file near **`cube_kernel`**). The **numeric first template arguments (0 / 2 / 4)** line up with **FFT slot ordering** chosen by the DSL **`initialize_l2g2l_pipe` / `aic_initialize_pipe`** sequence — **not** identical to the reference’s **QK → P → PV** `TPipe` declaration order (DSL initializes **QK → PV → P**). + +### 4. Synchronization and tail behavior + +Reference **`runTFA`** ends with explicit **CV / FFTS** coordination (**`wait_flag_dev(CV_BLOCK_END)`**, **`ffts_cross_core_sync`**, etc., conditioned on **`DAV_CUBE`/`DAV_VEC`**). + +Generated code finishes vector/cube sections with **`ptoas_auto_sync_tail(PTOAutoSyncTailMode::kBarrierAll)`**, which lowers to **`pipe_barrier(PIPE_ALL)`** (see top of `fa.ptoas.generated.cpp`). That is the **`ptoas --enable-insert-sync`** story — simpler and **not** a line‑by‑line match to the reference tail. + +### 5. Dependencies and portability + +Reference pulls **`acl`**, **`Pto_prefetch`**, **`TSyncCVID`**, FA‑specific macro headers. + +Generated kernel code is intentionally minimal (**`pto-inst.hpp` + auto-sync helper**). Host linkage still uses **`caller.cpp`** / **`set_ffts_base_addr`** in the full build. + +--- + +## Using this archive + +- Diff MLIR iterations: `diff -u fa.pto.mlir …` +- Diff lowered C++ vs reference: `diff -u fa.ptoas.generated.cpp fa_performance_kernel.reference.cpp` (expect **large** differences — use the table above to interpret). +- After changing **`fa_performance_builder.py`**, regenerate **both** `build_artifacts/` and **these snapshots** so documentation stays reproducible. diff --git a/examples/aot/flash_attention/split_pipe/codegen_results/fa.pto.mlir b/examples/aot/flash_attention/split_pipe/codegen_results/fa.pto.mlir new file mode 100644 index 00000000..cf00432a --- /dev/null +++ b/examples/aot/flash_attention/split_pipe/codegen_results/fa.pto.mlir @@ -0,0 +1,401 @@ +module { + func.func @cube_kernel(%arg0: !pto.ptr, %arg1: !pto.ptr, %arg2: !pto.ptr, %arg3: !pto.ptr) attributes {pto.kernel_kind = #pto.kernel_kind} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c32 = arith.constant 32 : index + %c128 = arith.constant 128 : index + %c512 = arith.constant 512 : index + %c8192 = arith.constant 8192 : index + %c16 = arith.constant 16 : index + %c96 = arith.constant 96 : index + %0 = pto.get_block_num + %1 = arith.index_cast %0 : i64 to index + %2 = pto.get_block_idx + %3 = arith.index_cast %2 : i64 to index + %4 = arith.divsi %c96, %1 : index + %5 = arith.remsi %c96, %1 : index + %6 = arith.addi %4, %c1 : index + %7 = arith.muli %3, %6 : index + %8 = arith.addi %4, %c1 : index + %9 = arith.muli %5, %8 : index + %10 = arith.subi %3, %5 : index + %11 = arith.muli %10, %4 : index + %12 = arith.addi %9, %11 : index + %13 = arith.cmpi slt, %3, %5 : index + %14 = arith.select %13, %7, %12 : index + %15 = arith.cmpi slt, %3, %5 : index + %16 = arith.addi %4, %c1 : index + %17 = arith.select %15, %16, %4 : index + %18 = arith.addi %14, %17 : index + %c229376 = arith.constant 229376 : index + %19 = arith.muli %3, %c229376 : index + %20 = pto.addptr %arg0, %19 : -> + %c0_0 = arith.constant 0 : index + %21 = pto.addptr %20, %c0_0 : -> + %c131072 = arith.constant 131072 : index + %22 = pto.addptr %20, %c131072 : -> + %c163840 = arith.constant 163840 : index + %23 = pto.addptr %20, %c163840 : -> + %24 = pto.import_reserved_buffer{name = "fa_qk_c2v_fifo", peer_func = @vector_kernel} -> i32 + %25 = pto.initialize_l2g2l_pipe{dir_mask = 1, slot_size = 65536, slot_num = 8, local_slot_num = 1} (%21 : !pto.ptr, %24 : i32) -> !pto.pipe + %26 = pto.import_reserved_buffer{name = "fa_pv_c2v_fifo", peer_func = @vector_kernel} -> i32 + %27 = pto.initialize_l2g2l_pipe{dir_mask = 1, slot_size = 16384, slot_num = 8, local_slot_num = 1} (%22 : !pto.ptr, %26 : i32) -> !pto.pipe + %28 = pto.reserve_buffer{name = "fa_p_v2c_fifo", size = 262144, location = , auto = false, base = 327680} -> i32 + %c0_i32 = arith.constant 0 : i32 + pto.aic_initialize_pipe {id = 30, dir_mask = 2, slot_size = 32768, nosplit = false}(gm_slot_buffer = %23 : !pto.ptr, c2v_consumer_buf = %c0_i32 : i32, v2c_consumer_buf = %28 : i32) + %c0_i64 = arith.constant 0 : i64 + %c0_i64_1 = arith.constant 0 : i64 + %29 = pto.alloc_tile addr = %c0_i64_1 : !pto.tile_buf + %c0_i64_2 = arith.constant 0 : i64 + %30 = pto.alloc_tile addr = %c0_i64_2 : !pto.tile_buf + %c8192_i64 = arith.constant 8192 : i64 + %31 = pto.alloc_tile addr = %c8192_i64 : !pto.tile_buf + %32 = pto.alloc_tile addr = %c0_i64 : !pto.tile_buf + %c0_i64_3 = arith.constant 0 : i64 + %33 = pto.alloc_tile addr = %c0_i64_3 : !pto.tile_buf + %c139264_i64 = arith.constant 139264 : i64 + %34 = pto.alloc_tile addr = %c139264_i64 : !pto.tile_buf + %c8192_i64_4 = arith.constant 8192 : i64 + %35 = pto.alloc_tile addr = %c8192_i64_4 : !pto.tile_buf + %c172032_i64 = arith.constant 172032 : i64 + %36 = pto.alloc_tile addr = %c172032_i64 : !pto.tile_buf + %37 = pto.alloc_tile addr = %c0_i64 : !pto.tile_buf + %c65536_i64 = arith.constant 65536 : i64 + %38 = pto.alloc_tile addr = %c65536_i64 : !pto.tile_buf + %c3072 = arith.constant 3072 : index + %39 = pto.make_tensor_view %arg1, shape = [%c3072, %c128], strides = [%c128, %c1] : !pto.tensor_view + %40 = pto.make_tensor_view %arg2, shape = [%c128, %c8192], strides = [%c1, %c128] : !pto.tensor_view + %41 = pto.make_tensor_view %arg3, shape = [%c8192, %c128], strides = [%c128, %c1] : !pto.tensor_view + scf.for %arg4 = %14 to %18 step %c1 { + %42 = arith.muli %arg4, %c32 : index + %43 = pto.partition_view %39, offsets = [%42, %c0], sizes = [%c32, %c128] : !pto.tensor_view + pto.tload ins(%43 : !pto.partition_tensor_view<32x128xf16>) outs(%29 : !pto.tile_buf) + pto.tmov ins(%29 : !pto.tile_buf) outs(%30 : !pto.tile_buf) + %c0_5 = arith.constant 0 : index + %44 = pto.partition_view %40, offsets = [%c0, %c0_5], sizes = [%c128, %c512] : !pto.tensor_view + pto.tload ins(%44 : !pto.partition_tensor_view<128x512xf16>) outs(%31 : !pto.tile_buf) + pto.tmov ins(%31 : !pto.tile_buf) outs(%32 : !pto.tile_buf) + pto.tmatmul ins(%30, %32 : !pto.tile_buf, !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.tpush(%33, %25 : !pto.tile_buf, !pto.pipe) {split = 1} + %c512_6 = arith.constant 512 : index + %45 = pto.partition_view %40, offsets = [%c0, %c512_6], sizes = [%c128, %c512] : !pto.tensor_view + pto.tload ins(%45 : !pto.partition_tensor_view<128x512xf16>) outs(%31 : !pto.tile_buf) + pto.tmov ins(%31 : !pto.tile_buf) outs(%32 : !pto.tile_buf) + pto.tmatmul ins(%30, %32 : !pto.tile_buf, !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.tpush(%33, %25 : !pto.tile_buf, !pto.pipe) {split = 1} + %46 = pto.partition_view %41, offsets = [%c0, %c0], sizes = [%c512, %c128] : !pto.tensor_view + pto.tload ins(%46 : !pto.partition_tensor_view<512x128xf16>) outs(%36 : !pto.tile_buf) + %c7 = arith.constant 7 : index + scf.for %arg5 = %c0 to %c7 step %c1 { + %50 = arith.muli %arg5, %c2 : index + %c2_7 = arith.constant 2 : index + %51 = arith.addi %50, %c2_7 : index + %52 = arith.muli %51, %c512 : index + %53 = pto.partition_view %40, offsets = [%c0, %52], sizes = [%c128, %c512] : !pto.tensor_view + pto.tload ins(%53 : !pto.partition_tensor_view<128x512xf16>) outs(%31 : !pto.tile_buf) + %54 = pto.tpop_from_aiv {id = 30, split = 1} -> !pto.tile_buf + pto.tmov ins(%54 : !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tfree_from_aiv {id = 30, split = 1} + pto.tmov ins(%36 : !pto.tile_buf) outs(%37 : !pto.tile_buf) + %55 = arith.addi %50, %c1 : index + %56 = arith.muli %55, %c512 : index + %57 = pto.partition_view %41, offsets = [%56, %c0], sizes = [%c512, %c128] : !pto.tensor_view + pto.tload ins(%57 : !pto.partition_tensor_view<512x128xf16>) outs(%36 : !pto.tile_buf) + pto.tmatmul ins(%35, %37 : !pto.tile_buf, !pto.tile_buf) outs(%38 : !pto.tile_buf) + pto.tpush(%38, %27 : !pto.tile_buf, !pto.pipe) {split = 1} + pto.tmov ins(%31 : !pto.tile_buf) outs(%32 : !pto.tile_buf) + pto.tmatmul ins(%30, %32 : !pto.tile_buf, !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.tpush(%33, %25 : !pto.tile_buf, !pto.pipe) {split = 1} + %58 = arith.muli %arg5, %c2 : index + %59 = arith.addi %58, %c1 : index + %c2_8 = arith.constant 2 : index + %60 = arith.addi %59, %c2_8 : index + %61 = arith.muli %60, %c512 : index + %62 = pto.partition_view %40, offsets = [%c0, %61], sizes = [%c128, %c512] : !pto.tensor_view + pto.tload ins(%62 : !pto.partition_tensor_view<128x512xf16>) outs(%31 : !pto.tile_buf) + %63 = pto.tpop_from_aiv {id = 30, split = 1} -> !pto.tile_buf + pto.tmov ins(%63 : !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tfree_from_aiv {id = 30, split = 1} + pto.tmov ins(%36 : !pto.tile_buf) outs(%37 : !pto.tile_buf) + %64 = arith.addi %59, %c1 : index + %65 = arith.muli %64, %c512 : index + %66 = pto.partition_view %41, offsets = [%65, %c0], sizes = [%c512, %c128] : !pto.tensor_view + pto.tload ins(%66 : !pto.partition_tensor_view<512x128xf16>) outs(%36 : !pto.tile_buf) + pto.tmatmul ins(%35, %37 : !pto.tile_buf, !pto.tile_buf) outs(%38 : !pto.tile_buf) + pto.tpush(%38, %27 : !pto.tile_buf, !pto.pipe) {split = 1} + pto.tmov ins(%31 : !pto.tile_buf) outs(%32 : !pto.tile_buf) + pto.tmatmul ins(%30, %32 : !pto.tile_buf, !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.tpush(%33, %25 : !pto.tile_buf, !pto.pipe) {split = 1} + } + %47 = pto.tpop_from_aiv {id = 30, split = 1} -> !pto.tile_buf + pto.tmov ins(%47 : !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tfree_from_aiv {id = 30, split = 1} + pto.tmov ins(%36 : !pto.tile_buf) outs(%37 : !pto.tile_buf) + %c7680 = arith.constant 7680 : index + %48 = pto.partition_view %41, offsets = [%c7680, %c0], sizes = [%c512, %c128] : !pto.tensor_view + pto.tload ins(%48 : !pto.partition_tensor_view<512x128xf16>) outs(%36 : !pto.tile_buf) + pto.tmatmul ins(%35, %37 : !pto.tile_buf, !pto.tile_buf) outs(%38 : !pto.tile_buf) + pto.tpush(%38, %27 : !pto.tile_buf, !pto.pipe) {split = 1} + %49 = pto.tpop_from_aiv {id = 30, split = 1} -> !pto.tile_buf + pto.tmov ins(%49 : !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tfree_from_aiv {id = 30, split = 1} + pto.tmov ins(%36 : !pto.tile_buf) outs(%37 : !pto.tile_buf) + pto.tmatmul ins(%35, %37 : !pto.tile_buf, !pto.tile_buf) outs(%38 : !pto.tile_buf) + pto.tpush(%38, %27 : !pto.tile_buf, !pto.pipe) {split = 1} + } + return + } + func.func @vector_kernel(%arg0: !pto.ptr, %arg1: !pto.ptr) attributes {pto.kernel_kind = #pto.kernel_kind} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c32 = arith.constant 32 : index + %c16 = arith.constant 16 : index + %c128 = arith.constant 128 : index + %c16_0 = arith.constant 16 : index + %c96 = arith.constant 96 : index + %0 = pto.get_block_num + %1 = arith.index_cast %0 : i64 to index + %2 = pto.get_block_idx + %3 = arith.index_cast %2 : i64 to index + %4 = arith.divsi %c96, %1 : index + %5 = arith.remsi %c96, %1 : index + %6 = arith.addi %4, %c1 : index + %7 = arith.muli %3, %6 : index + %8 = arith.addi %4, %c1 : index + %9 = arith.muli %5, %8 : index + %10 = arith.subi %3, %5 : index + %11 = arith.muli %10, %4 : index + %12 = arith.addi %9, %11 : index + %13 = arith.cmpi slt, %3, %5 : index + %14 = arith.select %13, %7, %12 : index + %15 = arith.cmpi slt, %3, %5 : index + %16 = arith.addi %4, %c1 : index + %17 = arith.select %15, %16, %4 : index + %18 = arith.addi %14, %17 : index + %c229376 = arith.constant 229376 : index + %19 = arith.muli %3, %c229376 : index + %20 = pto.addptr %arg0, %19 : -> + %c0_1 = arith.constant 0 : index + %21 = pto.addptr %20, %c0_1 : -> + %c131072 = arith.constant 131072 : index + %22 = pto.addptr %20, %c131072 : -> + %c163840 = arith.constant 163840 : index + %23 = pto.addptr %20, %c163840 : -> + %24 = pto.reserve_buffer{name = "fa_qk_c2v_fifo", size = 65536, location = , auto = false, base = 0} -> i32 + %25 = pto.initialize_l2g2l_pipe{dir_mask = 1, slot_size = 65536, slot_num = 8, local_slot_num = 1} (%21 : !pto.ptr, %24 : i32) -> !pto.pipe + %26 = pto.reserve_buffer{name = "fa_pv_c2v_fifo", size = 16384, location = , auto = false, base = 65536} -> i32 + %27 = pto.initialize_l2g2l_pipe{dir_mask = 1, slot_size = 16384, slot_num = 8, local_slot_num = 1} (%22 : !pto.ptr, %26 : i32) -> !pto.pipe + %28 = pto.import_reserved_buffer{name = "fa_p_v2c_fifo", peer_func = @cube_kernel} -> i32 + %c0_i32 = arith.constant 0 : i32 + pto.aiv_initialize_pipe {id = 30, dir_mask = 2, slot_size = 32768, nosplit = false}(gm_slot_buffer = %23 : !pto.ptr, c2v_consumer_buf = %c0_i32 : i32, v2c_consumer_buf = %28 : i32) + %29 = pto.get_subblock_idx + %30 = arith.index_cast %29 : i64 to index + %31 = arith.muli %30, %c16 : index + %c114688_i64 = arith.constant 114688 : i64 + %32 = pto.alloc_tile addr = %c114688_i64 : !pto.tile_buf + %c147456_i64 = arith.constant 147456 : i64 + %33 = pto.alloc_tile addr = %c147456_i64 : !pto.tile_buf + %c163840_i64 = arith.constant 163840 : i64 + %34 = pto.alloc_tile addr = %c163840_i64 : !pto.tile_buf + %c180224_i64 = arith.constant 180224 : i64 + %35 = pto.alloc_tile addr = %c180224_i64 : !pto.tile_buf + %c188416_i64 = arith.constant 188416 : i64 + %36 = pto.alloc_tile addr = %c188416_i64 : !pto.tile_buf + %c188480_i64 = arith.constant 188480 : i64 + %37 = pto.alloc_tile addr = %c188480_i64 : !pto.tile_buf + %c188544_i64 = arith.constant 188544 : i64 + %38 = pto.alloc_tile addr = %c188544_i64 : !pto.tile_buf + %c188608_i64 = arith.constant 188608 : i64 + %39 = pto.alloc_tile addr = %c188608_i64 : !pto.tile_buf + %c188672_i64 = arith.constant 188672 : i64 + %40 = pto.alloc_tile addr = %c188672_i64 : !pto.tile_buf + %c188736_i64 = arith.constant 188736 : i64 + %41 = pto.alloc_tile addr = %c188736_i64 : !pto.tile_buf + %cst = arith.constant 0.0883883461 : f32 + %cst_2 = arith.constant 1.000000e+00 : f32 + %c3072 = arith.constant 3072 : index + %42 = pto.make_tensor_view %arg1, shape = [%c3072, %c128], strides = [%c128, %c1] : !pto.tensor_view + scf.for %arg2 = %14 to %18 step %c1 { + %43 = arith.muli %arg2, %c32 : index + %c81920_i64 = arith.constant 81920 : i64 + %44 = pto.alloc_tile addr = %c81920_i64 : !pto.tile_buf + pto.tpop(%44, %25 : !pto.tile_buf, !pto.pipe) {split = 1} + pto.tmuls ins(%44, %cst : !pto.tile_buf, f32) outs(%44 : !pto.tile_buf) + pto.trowmax ins(%44, %32 : !pto.tile_buf, !pto.tile_buf) outs(%37 : !pto.tile_buf) + %45 = pto.treshape %37 : !pto.tile_buf -> !pto.tile_buf + %46 = pto.treshape %36 : !pto.tile_buf -> !pto.tile_buf + %47 = pto.treshape %40 : !pto.tile_buf -> !pto.tile_buf + %48 = pto.treshape %38 : !pto.tile_buf -> !pto.tile_buf + %49 = pto.treshape %39 : !pto.tile_buf -> !pto.tile_buf + pto.trowexpandsub ins(%44, %37 : !pto.tile_buf, !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.tmuls ins(%45, %cst_2 : !pto.tile_buf, f32) outs(%46 : !pto.tile_buf) + pto.texp ins(%33 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.trowsum ins(%33, %32 : !pto.tile_buf, !pto.tile_buf) outs(%38 : !pto.tile_buf) + pto.tcvt ins(%33 {rmode = #pto} : !pto.tile_buf) outs(%34 : !pto.tile_buf) + pto.tpush_to_aic(%34 : !pto.tile_buf) {id = 30, split = 1} + pto.tfree(%25 : !pto.pipe) {split = 1} + %c81920_i64_3 = arith.constant 81920 : i64 + %50 = pto.alloc_tile addr = %c81920_i64_3 : !pto.tile_buf + pto.tpop(%50, %25 : !pto.tile_buf, !pto.pipe) {split = 1} + pto.tmuls ins(%50, %cst : !pto.tile_buf, f32) outs(%50 : !pto.tile_buf) + pto.trowmax ins(%50, %32 : !pto.tile_buf, !pto.tile_buf) outs(%37 : !pto.tile_buf) + %51 = pto.treshape %37 : !pto.tile_buf -> !pto.tile_buf + %52 = pto.treshape %36 : !pto.tile_buf -> !pto.tile_buf + %53 = pto.treshape %41 : !pto.tile_buf -> !pto.tile_buf + %54 = pto.treshape %38 : !pto.tile_buf -> !pto.tile_buf + %55 = pto.treshape %39 : !pto.tile_buf -> !pto.tile_buf + pto.tmax ins(%51, %52 : !pto.tile_buf, !pto.tile_buf) outs(%51 : !pto.tile_buf) + pto.tsub ins(%52, %51 : !pto.tile_buf, !pto.tile_buf) outs(%53 : !pto.tile_buf) + pto.tmuls ins(%51, %cst_2 : !pto.tile_buf, f32) outs(%52 : !pto.tile_buf) + pto.trowexpandsub ins(%50, %37 : !pto.tile_buf, !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.texp ins(%53 : !pto.tile_buf) outs(%53 : !pto.tile_buf) + pto.texp ins(%33 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.tmul ins(%54, %53 : !pto.tile_buf, !pto.tile_buf) outs(%54 : !pto.tile_buf) + pto.trowsum ins(%33, %32 : !pto.tile_buf, !pto.tile_buf) outs(%39 : !pto.tile_buf) + pto.tadd ins(%54, %55 : !pto.tile_buf, !pto.tile_buf) outs(%54 : !pto.tile_buf) + pto.tcvt ins(%33 {rmode = #pto} : !pto.tile_buf) outs(%34 : !pto.tile_buf) + pto.tpush_to_aic(%34 : !pto.tile_buf) {id = 30, split = 1} + pto.tfree(%25 : !pto.pipe) {split = 1} + %c114688_i64_4 = arith.constant 114688 : i64 + %56 = pto.alloc_tile addr = %c114688_i64_4 : !pto.tile_buf + pto.tpop(%56, %27 : !pto.tile_buf, !pto.pipe) {split = 1} + pto.tmov ins(%56 : !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tfree(%27 : !pto.pipe) {split = 1} + %c81920_i64_5 = arith.constant 81920 : i64 + %57 = pto.alloc_tile addr = %c81920_i64_5 : !pto.tile_buf + pto.tpop(%57, %25 : !pto.tile_buf, !pto.pipe) {split = 1} + pto.tmuls ins(%57, %cst : !pto.tile_buf, f32) outs(%57 : !pto.tile_buf) + pto.trowmax ins(%57, %32 : !pto.tile_buf, !pto.tile_buf) outs(%37 : !pto.tile_buf) + %58 = pto.treshape %37 : !pto.tile_buf -> !pto.tile_buf + %59 = pto.treshape %36 : !pto.tile_buf -> !pto.tile_buf + %60 = pto.treshape %40 : !pto.tile_buf -> !pto.tile_buf + %61 = pto.treshape %38 : !pto.tile_buf -> !pto.tile_buf + %62 = pto.treshape %39 : !pto.tile_buf -> !pto.tile_buf + pto.tmax ins(%58, %59 : !pto.tile_buf, !pto.tile_buf) outs(%58 : !pto.tile_buf) + pto.tsub ins(%59, %58 : !pto.tile_buf, !pto.tile_buf) outs(%60 : !pto.tile_buf) + pto.tmuls ins(%58, %cst_2 : !pto.tile_buf, f32) outs(%59 : !pto.tile_buf) + pto.trowexpandsub ins(%57, %37 : !pto.tile_buf, !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.texp ins(%60 : !pto.tile_buf) outs(%60 : !pto.tile_buf) + pto.texp ins(%33 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.tmul ins(%61, %60 : !pto.tile_buf, !pto.tile_buf) outs(%61 : !pto.tile_buf) + pto.trowsum ins(%33, %32 : !pto.tile_buf, !pto.tile_buf) outs(%39 : !pto.tile_buf) + pto.tadd ins(%61, %62 : !pto.tile_buf, !pto.tile_buf) outs(%61 : !pto.tile_buf) + pto.tcvt ins(%33 {rmode = #pto} : !pto.tile_buf) outs(%34 : !pto.tile_buf) + pto.tpush_to_aic(%34 : !pto.tile_buf) {id = 30, split = 1} + pto.tfree(%25 : !pto.pipe) {split = 1} + %c114688_i64_6 = arith.constant 114688 : i64 + %63 = pto.alloc_tile addr = %c114688_i64_6 : !pto.tile_buf + pto.tpop(%63, %27 : !pto.tile_buf, !pto.pipe) {split = 1} + pto.trowexpandmul ins(%35, %41 : !pto.tile_buf, !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tadd ins(%35, %63 : !pto.tile_buf, !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tfree(%27 : !pto.pipe) {split = 1} + %c81920_i64_7 = arith.constant 81920 : i64 + %64 = pto.alloc_tile addr = %c81920_i64_7 : !pto.tile_buf + pto.tpop(%64, %25 : !pto.tile_buf, !pto.pipe) {split = 1} + pto.tmuls ins(%64, %cst : !pto.tile_buf, f32) outs(%64 : !pto.tile_buf) + pto.trowmax ins(%64, %32 : !pto.tile_buf, !pto.tile_buf) outs(%37 : !pto.tile_buf) + %65 = pto.treshape %37 : !pto.tile_buf -> !pto.tile_buf + %66 = pto.treshape %36 : !pto.tile_buf -> !pto.tile_buf + %67 = pto.treshape %41 : !pto.tile_buf -> !pto.tile_buf + %68 = pto.treshape %38 : !pto.tile_buf -> !pto.tile_buf + %69 = pto.treshape %39 : !pto.tile_buf -> !pto.tile_buf + pto.tmax ins(%65, %66 : !pto.tile_buf, !pto.tile_buf) outs(%65 : !pto.tile_buf) + pto.tsub ins(%66, %65 : !pto.tile_buf, !pto.tile_buf) outs(%67 : !pto.tile_buf) + pto.tmuls ins(%65, %cst_2 : !pto.tile_buf, f32) outs(%66 : !pto.tile_buf) + pto.trowexpandsub ins(%64, %37 : !pto.tile_buf, !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.texp ins(%67 : !pto.tile_buf) outs(%67 : !pto.tile_buf) + pto.texp ins(%33 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.tmul ins(%68, %67 : !pto.tile_buf, !pto.tile_buf) outs(%68 : !pto.tile_buf) + pto.trowsum ins(%33, %32 : !pto.tile_buf, !pto.tile_buf) outs(%39 : !pto.tile_buf) + pto.tadd ins(%68, %69 : !pto.tile_buf, !pto.tile_buf) outs(%68 : !pto.tile_buf) + pto.tcvt ins(%33 {rmode = #pto} : !pto.tile_buf) outs(%34 : !pto.tile_buf) + pto.tpush_to_aic(%34 : !pto.tile_buf) {id = 30, split = 1} + pto.tfree(%25 : !pto.pipe) {split = 1} + %c7 = arith.constant 7 : index + scf.for %arg3 = %c1 to %c7 step %c1 { + %c114688_i64_10 = arith.constant 114688 : i64 + %74 = pto.alloc_tile addr = %c114688_i64_10 : !pto.tile_buf + pto.tpop(%74, %27 : !pto.tile_buf, !pto.pipe) {split = 1} + pto.trowexpandmul ins(%35, %40 : !pto.tile_buf, !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tadd ins(%35, %74 : !pto.tile_buf, !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tfree(%27 : !pto.pipe) {split = 1} + %c81920_i64_11 = arith.constant 81920 : i64 + %75 = pto.alloc_tile addr = %c81920_i64_11 : !pto.tile_buf + pto.tpop(%75, %25 : !pto.tile_buf, !pto.pipe) {split = 1} + pto.tmuls ins(%75, %cst : !pto.tile_buf, f32) outs(%75 : !pto.tile_buf) + pto.trowmax ins(%75, %32 : !pto.tile_buf, !pto.tile_buf) outs(%37 : !pto.tile_buf) + %76 = pto.treshape %37 : !pto.tile_buf -> !pto.tile_buf + %77 = pto.treshape %36 : !pto.tile_buf -> !pto.tile_buf + %78 = pto.treshape %40 : !pto.tile_buf -> !pto.tile_buf + %79 = pto.treshape %38 : !pto.tile_buf -> !pto.tile_buf + %80 = pto.treshape %39 : !pto.tile_buf -> !pto.tile_buf + pto.tmax ins(%76, %77 : !pto.tile_buf, !pto.tile_buf) outs(%76 : !pto.tile_buf) + pto.tsub ins(%77, %76 : !pto.tile_buf, !pto.tile_buf) outs(%78 : !pto.tile_buf) + pto.tmuls ins(%76, %cst_2 : !pto.tile_buf, f32) outs(%77 : !pto.tile_buf) + pto.trowexpandsub ins(%75, %37 : !pto.tile_buf, !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.texp ins(%78 : !pto.tile_buf) outs(%78 : !pto.tile_buf) + pto.texp ins(%33 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.tmul ins(%79, %78 : !pto.tile_buf, !pto.tile_buf) outs(%79 : !pto.tile_buf) + pto.trowsum ins(%33, %32 : !pto.tile_buf, !pto.tile_buf) outs(%39 : !pto.tile_buf) + pto.tadd ins(%79, %80 : !pto.tile_buf, !pto.tile_buf) outs(%79 : !pto.tile_buf) + pto.tcvt ins(%33 {rmode = #pto} : !pto.tile_buf) outs(%34 : !pto.tile_buf) + pto.tpush_to_aic(%34 : !pto.tile_buf) {id = 30, split = 1} + pto.tfree(%25 : !pto.pipe) {split = 1} + %c114688_i64_12 = arith.constant 114688 : i64 + %81 = pto.alloc_tile addr = %c114688_i64_12 : !pto.tile_buf + pto.tpop(%81, %27 : !pto.tile_buf, !pto.pipe) {split = 1} + pto.trowexpandmul ins(%35, %41 : !pto.tile_buf, !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tadd ins(%35, %81 : !pto.tile_buf, !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tfree(%27 : !pto.pipe) {split = 1} + %c81920_i64_13 = arith.constant 81920 : i64 + %82 = pto.alloc_tile addr = %c81920_i64_13 : !pto.tile_buf + pto.tpop(%82, %25 : !pto.tile_buf, !pto.pipe) {split = 1} + pto.tmuls ins(%82, %cst : !pto.tile_buf, f32) outs(%82 : !pto.tile_buf) + pto.trowmax ins(%82, %32 : !pto.tile_buf, !pto.tile_buf) outs(%37 : !pto.tile_buf) + %83 = pto.treshape %37 : !pto.tile_buf -> !pto.tile_buf + %84 = pto.treshape %36 : !pto.tile_buf -> !pto.tile_buf + %85 = pto.treshape %41 : !pto.tile_buf -> !pto.tile_buf + %86 = pto.treshape %38 : !pto.tile_buf -> !pto.tile_buf + %87 = pto.treshape %39 : !pto.tile_buf -> !pto.tile_buf + pto.tmax ins(%83, %84 : !pto.tile_buf, !pto.tile_buf) outs(%83 : !pto.tile_buf) + pto.tsub ins(%84, %83 : !pto.tile_buf, !pto.tile_buf) outs(%85 : !pto.tile_buf) + pto.tmuls ins(%83, %cst_2 : !pto.tile_buf, f32) outs(%84 : !pto.tile_buf) + pto.trowexpandsub ins(%82, %37 : !pto.tile_buf, !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.texp ins(%85 : !pto.tile_buf) outs(%85 : !pto.tile_buf) + pto.texp ins(%33 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.tmul ins(%86, %85 : !pto.tile_buf, !pto.tile_buf) outs(%86 : !pto.tile_buf) + pto.trowsum ins(%33, %32 : !pto.tile_buf, !pto.tile_buf) outs(%39 : !pto.tile_buf) + pto.tadd ins(%86, %87 : !pto.tile_buf, !pto.tile_buf) outs(%86 : !pto.tile_buf) + pto.tcvt ins(%33 {rmode = #pto} : !pto.tile_buf) outs(%34 : !pto.tile_buf) + pto.tpush_to_aic(%34 : !pto.tile_buf) {id = 30, split = 1} + pto.tfree(%25 : !pto.pipe) {split = 1} + } + %c114688_i64_8 = arith.constant 114688 : i64 + %70 = pto.alloc_tile addr = %c114688_i64_8 : !pto.tile_buf + pto.tpop(%70, %27 : !pto.tile_buf, !pto.pipe) {split = 1} + pto.trowexpandmul ins(%35, %40 : !pto.tile_buf, !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tadd ins(%35, %70 : !pto.tile_buf, !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tfree(%27 : !pto.pipe) {split = 1} + %c114688_i64_9 = arith.constant 114688 : i64 + %71 = pto.alloc_tile addr = %c114688_i64_9 : !pto.tile_buf + pto.tpop(%71, %27 : !pto.tile_buf, !pto.pipe) {split = 1} + pto.trowexpandmul ins(%35, %41 : !pto.tile_buf, !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tadd ins(%35, %71 : !pto.tile_buf, !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tfree(%27 : !pto.pipe) {split = 1} + pto.trowexpanddiv ins(%35, %38 : !pto.tile_buf, !pto.tile_buf) outs(%35 : !pto.tile_buf) + %72 = arith.addi %43, %31 : index + %73 = pto.partition_view %42, offsets = [%72, %c0], sizes = [%c16, %c128] : !pto.tensor_view + pto.tstore ins(%35 : !pto.tile_buf) outs(%73 : !pto.partition_tensor_view<16x128xf32>) + } + return + } + func.func @call_both(%arg0: memref<256xi64>, %arg1: !pto.ptr, %arg2: !pto.ptr, %arg3: !pto.ptr, %arg4: !pto.ptr, %arg5: !pto.ptr) attributes {pto.entry} { + pto.set_ffts %arg0 : memref<256xi64> + call @cube_kernel(%arg1, %arg2, %arg3, %arg4) : (!pto.ptr, !pto.ptr, !pto.ptr, !pto.ptr) -> () + call @vector_kernel(%arg1, %arg5) : (!pto.ptr, !pto.ptr) -> () + return + } +} + diff --git a/examples/aot/flash_attention/split_pipe/codegen_results/fa.ptoas.generated.cpp b/examples/aot/flash_attention/split_pipe/codegen_results/fa.ptoas.generated.cpp new file mode 100644 index 00000000..87bb5aae --- /dev/null +++ b/examples/aot/flash_attention/split_pipe/codegen_results/fa.ptoas.generated.cpp @@ -0,0 +1,650 @@ +#include "pto/pto-inst.hpp" +using namespace pto; + +enum class PTOAutoSyncTailMode : int { + kBarrierAll = 0, + kSetWaitMte3ToSEvent0 = 1, +}; + +static AICORE inline void ptoas_auto_sync_tail( + PTOAutoSyncTailMode mode = PTOAutoSyncTailMode::kBarrierAll) { + switch (mode) { + case PTOAutoSyncTailMode::kSetWaitMte3ToSEvent0: + set_flag(PIPE_MTE3, PIPE_S, EVENT_ID0); + wait_flag(PIPE_MTE3, PIPE_S, EVENT_ID0); + break; + case PTOAutoSyncTailMode::kBarrierAll: + default: + pipe_barrier(PIPE_ALL); + break; + } +} + +AICORE void cube_kernel(__gm__ float* v1, __gm__ half* v2, __gm__ half* v3, __gm__ half* v4) { + unsigned v5 = 7680; + unsigned v6 = 512; + unsigned v7 = 0; + const int32_t v8 = 96; + const int32_t v9 = 512; + const int32_t v10 = 128; + const int32_t v11 = 32; + const int32_t v12 = 2; + const int32_t v13 = 1; + const int32_t v14 = 229376; + const int32_t v15 = 131072; + const int32_t v16 = 163840; + const int64_t v17 = 0; + const int64_t v18 = 8192; + const int64_t v19 = 172032; + const int64_t v20 = 65536; + const int32_t v21 = 7; + const int32_t v22 = 0; + const int32_t v23 = 65536; + const int32_t v24 = 327680; + using T = float; + + #if defined(__DAV_CUBE__) + size_t v25 = (size_t) v13; + int64_t v26 = get_block_num(); + int32_t v27 = (int32_t) ((int64_t) v26); + int64_t v28 = get_block_idx(); + int32_t v29 = (int32_t) ((int64_t) v28); + int32_t v30 = v8 / v27; + int32_t v31 = v8 % v27; + int32_t v32 = (int32_t) ((uint32_t) v30 + (uint32_t) v13); + bool v33 = v29 < v31; + int32_t v34 = v33 ? (int32_t) ((uint32_t) v29 * (uint32_t) v32) : (int32_t) ((uint32_t) ((int32_t) (uint32_t) v31 * (uint32_t) v32) + (uint32_t) ((int32_t) (uint32_t) ((int32_t) (uint32_t) v29 - (uint32_t) v31) * (uint32_t) v30)); + int32_t v35 = (int32_t) ((uint32_t) v29 * (uint32_t) v14); + __gm__ float* v36 = v1 + v35; + + int32_t v37 = (int32_t) ((uint32_t) v35 + (uint32_t) v15); + __gm__ float* v38 = v1 + v37; + + int32_t v39 = (int32_t) ((uint32_t) v35 + (uint32_t) v16); + __gm__ float* v40 = v1 + v39; + + auto v41 = TPipe<0, Direction::DIR_C2V, 65536, 8, 1, false>(v36, v22, v22); + auto v42 = TPipe<2, Direction::DIR_C2V, 16384, 8, 1, false>(v38, v23, v22); + auto v43 = TPipe<4, Direction::DIR_V2C, 32768, 8, 8, false>(v40, v22, v24); + Tile v44; + TASSIGN(v44, v17); + Tile v45; + TASSIGN(v45, v17); + Tile v46; + TASSIGN(v46, v18); + Tile v47; + TASSIGN(v47, v17); + Tile v48; + TASSIGN(v48, v17); + Tile v49; + TASSIGN(v49, v18); + Tile v50; + TASSIGN(v50, v19); + Tile v51; + TASSIGN(v51, v17); + Tile v52; + TASSIGN(v52, v20); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID0); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID2); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID3); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID3); + set_flag(PIPE_FIX, PIPE_M, EVENT_ID2); + set_flag(PIPE_FIX, PIPE_M, EVENT_ID3); + for (size_t v53 = (size_t) v34; v53 < ((size_t) ((int32_t) (uint32_t) v34 + (uint32_t) (v33 ? v32 : v30))); v53 += v25) { + pto::Shape<1, 1, 1, 32, 128> v54 = pto::Shape<1, 1, 1, 32, 128>(); + pto::Stride<4096, 4096, 4096, 128, 1> v55 = pto::Stride<4096, 4096, 4096, 128, 1>(); + GlobalTensor, pto::Stride<4096, 4096, 4096, 128, 1>, pto::Layout::ND> v56 = GlobalTensor, pto::Stride<4096, 4096, 4096, 128, 1>, pto::Layout::ND>(v2 + (v7 + (unsigned) ((int32_t) (uint32_t) ((int32_t) v53) * (uint32_t) v11) * (unsigned) v10 + v7 * (unsigned) v13), v54, v55); + TLOAD(v44, v56); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + TMOV(v45, v44); + pto::Shape<1, 1, 1, 128, 512> v57 = pto::Shape<1, 1, 1, 128, 512>(); + pto::Stride<128, 128, 128, 1, 128> v58 = pto::Stride<128, 128, 128, 1, 128>(); + GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN> v59 = GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN>(v3 + (v7 + v7 * (unsigned) v13 + v7 * (unsigned) v10), v57, v58); + TLOAD(v46, v59); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID1); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID1); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID0); + TMOV(v47, v46); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID0); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID0); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID0); + TMATMUL(v48, v45, v47); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + set_flag(PIPE_M, PIPE_FIX, EVENT_ID0); + wait_flag(PIPE_M, PIPE_FIX, EVENT_ID0); + TPUSH, Tile, TileSplitAxis::TILE_UP_DOWN>(v41, v48); + set_flag(PIPE_FIX, PIPE_M, EVENT_ID0); + pto::Shape<1, 1, 1, 128, 512> v60 = pto::Shape<1, 1, 1, 128, 512>(); + pto::Stride<128, 128, 128, 1, 128> v61 = pto::Stride<128, 128, 128, 1, 128>(); + GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN> v62 = GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN>(v3 + (v7 + v7 * (unsigned) v13 + v6 * (unsigned) v10), v60, v61); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID0); + TLOAD(v46, v62); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID2); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID2); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + TMOV(v47, v46); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID1); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID1); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID1); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID0); + TMATMUL(v48, v45, v47); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID2); + set_flag(PIPE_M, PIPE_FIX, EVENT_ID1); + wait_flag(PIPE_M, PIPE_FIX, EVENT_ID1); + TPUSH, Tile, TileSplitAxis::TILE_UP_DOWN>(v41, v48); + set_flag(PIPE_FIX, PIPE_M, EVENT_ID1); + pto::Shape<1, 1, 1, 512, 128> v63 = pto::Shape<1, 1, 1, 512, 128>(); + pto::Stride<65536, 65536, 65536, 128, 1> v64 = pto::Stride<65536, 65536, 65536, 128, 1>(); + GlobalTensor, pto::Stride<65536, 65536, 65536, 128, 1>, pto::Layout::ND> v65 = GlobalTensor, pto::Stride<65536, 65536, 65536, 128, 1>, pto::Layout::ND>(v4 + (v7 + v7 * (unsigned) v10 + v7 * (unsigned) v13), v63, v64); + TLOAD(v50, v65); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID1); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID2); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID1); + for (size_t v66 = (size_t) v22; v66 < ((size_t) v21); v66 += v25) { + int32_t v67 = (int32_t) ((uint32_t) ((int32_t) v66) * (uint32_t) v12); + pto::Shape<1, 1, 1, 128, 512> v68 = pto::Shape<1, 1, 1, 128, 512>(); + pto::Stride<128, 128, 128, 1, 128> v69 = pto::Stride<128, 128, 128, 1, 128>(); + GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN> v70 = GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN>(v3 + (v7 + v7 * (unsigned) v13 + (unsigned) ((int32_t) (uint32_t) ((int32_t) (uint32_t) v67 + (uint32_t) v12) * (uint32_t) v9) * (unsigned) v10), v68, v69); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID2); + TLOAD(v46, v70); + Tile v71; + TPOP, Tile, TileSplitAxis::TILE_UP_DOWN>(v43, v71); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID3); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID3); + TMOV(v49, v71); + TFREE, TileSplitAxis::TILE_UP_DOWN>(v43); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID3); + TMOV(v51, v50); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID4); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID2); + int32_t v72 = (int32_t) ((uint32_t) v67 + (uint32_t) v13); + pto::Shape<1, 1, 1, 512, 128> v73 = pto::Shape<1, 1, 1, 512, 128>(); + pto::Stride<65536, 65536, 65536, 128, 1> v74 = pto::Stride<65536, 65536, 65536, 128, 1>(); + GlobalTensor, pto::Stride<65536, 65536, 65536, 128, 1>, pto::Layout::ND> v75 = GlobalTensor, pto::Stride<65536, 65536, 65536, 128, 1>, pto::Layout::ND>(v4 + (v7 + (unsigned) ((int32_t) (uint32_t) v72 * (uint32_t) v9) * (unsigned) v10 + v7 * (unsigned) v13), v73, v74); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID4); + TLOAD(v50, v75); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID2); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID2); + TMATMUL(v52, v49, v51); + set_flag(PIPE_M, PIPE_FIX, EVENT_ID2); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID4); + wait_flag(PIPE_M, PIPE_FIX, EVENT_ID2); + TPUSH, Tile, TileSplitAxis::TILE_UP_DOWN>(v42, v52); + set_flag(PIPE_FIX, PIPE_M, EVENT_ID4); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID4); + TMOV(v47, v46); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID3); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID5); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID3); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID3); + TMATMUL(v48, v45, v47); + set_flag(PIPE_M, PIPE_FIX, EVENT_ID3); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID5); + wait_flag(PIPE_M, PIPE_FIX, EVENT_ID3); + TPUSH, Tile, TileSplitAxis::TILE_UP_DOWN>(v41, v48); + set_flag(PIPE_FIX, PIPE_M, EVENT_ID5); + pto::Shape<1, 1, 1, 128, 512> v76 = pto::Shape<1, 1, 1, 128, 512>(); + pto::Stride<128, 128, 128, 1, 128> v77 = pto::Stride<128, 128, 128, 1, 128>(); + GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN> v78 = GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN>(v3 + (v7 + v7 * (unsigned) v13 + (unsigned) ((int32_t) (uint32_t) ((int32_t) (uint32_t) v72 + (uint32_t) v12) * (uint32_t) v9) * (unsigned) v10), v76, v77); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID5); + TLOAD(v46, v78); + Tile v79; + TPOP, Tile, TileSplitAxis::TILE_UP_DOWN>(v43, v79); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID4); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID4); + TMOV(v49, v79); + TFREE, TileSplitAxis::TILE_UP_DOWN>(v43); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID5); + TMOV(v51, v50); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID6); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID4); + pto::Shape<1, 1, 1, 512, 128> v80 = pto::Shape<1, 1, 1, 512, 128>(); + pto::Stride<65536, 65536, 65536, 128, 1> v81 = pto::Stride<65536, 65536, 65536, 128, 1>(); + GlobalTensor, pto::Stride<65536, 65536, 65536, 128, 1>, pto::Layout::ND> v82 = GlobalTensor, pto::Stride<65536, 65536, 65536, 128, 1>, pto::Layout::ND>(v4 + (v7 + (unsigned) ((int32_t) (uint32_t) ((int32_t) (uint32_t) v72 + (uint32_t) v13) * (uint32_t) v9) * (unsigned) v10 + v7 * (unsigned) v13), v80, v81); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID6); + TLOAD(v50, v82); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID4); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID4); + TMATMUL(v52, v49, v51); + set_flag(PIPE_M, PIPE_FIX, EVENT_ID4); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID6); + wait_flag(PIPE_M, PIPE_FIX, EVENT_ID4); + TPUSH, Tile, TileSplitAxis::TILE_UP_DOWN>(v42, v52); + set_flag(PIPE_FIX, PIPE_M, EVENT_ID2); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID6); + TMOV(v47, v46); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID5); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID2); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID5); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID5); + TMATMUL(v48, v45, v47); + set_flag(PIPE_M, PIPE_FIX, EVENT_ID5); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID3); + wait_flag(PIPE_M, PIPE_FIX, EVENT_ID5); + TPUSH, Tile, TileSplitAxis::TILE_UP_DOWN>(v41, v48); + set_flag(PIPE_FIX, PIPE_M, EVENT_ID3); + }; + set_flag(PIPE_FIX, PIPE_M, EVENT_ID6); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID7); + Tile v83; + TPOP, Tile, TileSplitAxis::TILE_UP_DOWN>(v43, v83); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID5); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID5); + TMOV(v49, v83); + TFREE, TileSplitAxis::TILE_UP_DOWN>(v43); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID7); + TMOV(v51, v50); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID6); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID7); + pto::Shape<1, 1, 1, 512, 128> v84 = pto::Shape<1, 1, 1, 512, 128>(); + pto::Stride<65536, 65536, 65536, 128, 1> v85 = pto::Stride<65536, 65536, 65536, 128, 1>(); + GlobalTensor, pto::Stride<65536, 65536, 65536, 128, 1>, pto::Layout::ND> v86 = GlobalTensor, pto::Stride<65536, 65536, 65536, 128, 1>, pto::Layout::ND>(v4 + (v7 + v5 * (unsigned) v10 + v7 * (unsigned) v13), v84, v85); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID7); + TLOAD(v50, v86); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID6); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID6); + TMATMUL(v52, v49, v51); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + set_flag(PIPE_M, PIPE_FIX, EVENT_ID6); + wait_flag(PIPE_M, PIPE_FIX, EVENT_ID6); + TPUSH, Tile, TileSplitAxis::TILE_UP_DOWN>(v42, v52); + set_flag(PIPE_FIX, PIPE_M, EVENT_ID7); + Tile v87; + TPOP, Tile, TileSplitAxis::TILE_UP_DOWN>(v43, v87); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID6); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID6); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + TMOV(v49, v87); + TFREE, TileSplitAxis::TILE_UP_DOWN>(v43); + TMOV(v51, v50); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID7); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID7); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID7); + TMATMUL(v52, v49, v51); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID0); + set_flag(PIPE_M, PIPE_FIX, EVENT_ID7); + wait_flag(PIPE_M, PIPE_FIX, EVENT_ID7); + TPUSH, Tile, TileSplitAxis::TILE_UP_DOWN>(v42, v52); + } + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID2); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID3); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID3); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID2); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID3); + #endif // __DAV_CUBE__ + + ptoas_auto_sync_tail(PTOAutoSyncTailMode::kBarrierAll); + return; +} + +AICORE void vector_kernel(__gm__ float* v1, __gm__ float* v2) { + unsigned v3 = 0; + RoundMode v4 = RoundMode::CAST_RINT; + const int32_t v5 = 96; + const int32_t v6 = 128; + const int32_t v7 = 16; + const int32_t v8 = 32; + const int32_t v9 = 1; + const int32_t v10 = 229376; + const int32_t v11 = 131072; + const int32_t v12 = 163840; + const int64_t v13 = 114688; + const int64_t v14 = 147456; + const int64_t v15 = 163840; + const int64_t v16 = 180224; + const int64_t v17 = 188416; + const int64_t v18 = 188480; + const int64_t v19 = 188544; + const int64_t v20 = 188608; + const int64_t v21 = 188672; + const int64_t v22 = 188736; + const float v23 = 0.0883883461f; + const float v24 = 1.0f; + const int64_t v25 = 81920; + const int32_t v26 = 7; + const int32_t v27 = 0; + const int32_t v28 = 65536; + const int32_t v29 = 327680; + using T = float; + + #if defined(__DAV_VEC__) + set_mask_norm(); + set_vector_mask(-1, -1); + size_t v30 = (size_t) v9; + int64_t v31 = get_block_num(); + int32_t v32 = (int32_t) ((int64_t) v31); + int64_t v33 = get_block_idx(); + int32_t v34 = (int32_t) ((int64_t) v33); + int32_t v35 = v5 / v32; + int32_t v36 = v5 % v32; + int32_t v37 = (int32_t) ((uint32_t) v35 + (uint32_t) v9); + bool v38 = v34 < v36; + int32_t v39 = v38 ? (int32_t) ((uint32_t) v34 * (uint32_t) v37) : (int32_t) ((uint32_t) ((int32_t) (uint32_t) v36 * (uint32_t) v37) + (uint32_t) ((int32_t) (uint32_t) ((int32_t) (uint32_t) v34 - (uint32_t) v36) * (uint32_t) v35)); + int32_t v40 = (int32_t) ((uint32_t) v34 * (uint32_t) v10); + __gm__ float* v41 = v1 + v40; + + int32_t v42 = (int32_t) ((uint32_t) v40 + (uint32_t) v11); + __gm__ float* v43 = v1 + v42; + + int32_t v44 = (int32_t) ((uint32_t) v40 + (uint32_t) v12); + __gm__ float* v45 = v1 + v44; + + auto v46 = TPipe<0, Direction::DIR_C2V, 65536, 8, 1, false>(v41, v27, v27); + auto v47 = TPipe<2, Direction::DIR_C2V, 16384, 8, 1, false>(v43, v28, v27); + auto v48 = TPipe<4, Direction::DIR_V2C, 32768, 8, 8, false>(v45, v27, v29); + int64_t v49 = get_subblockid(); + Tile v50; + TASSIGN(v50, v13); + Tile v51; + TASSIGN(v51, v14); + Tile v52; + TASSIGN(v52, v15); + Tile v53; + TASSIGN(v53, v16); + Tile v54; + TASSIGN(v54, v17); + Tile v55; + TASSIGN(v55, v18); + Tile v56; + TASSIGN(v56, v19); + Tile v57; + TASSIGN(v57, v20); + Tile v58; + TASSIGN(v58, v21); + Tile v59; + TASSIGN(v59, v22); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID0); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID1); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID4); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID5); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID6); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID7); + for (size_t v60 = (size_t) v39; v60 < ((size_t) ((int32_t) (uint32_t) v39 + (uint32_t) (v38 ? v37 : v35))); v60 += v30) { + Tile v61; + TASSIGN(v61, v25); + TPOP, Tile, TileSplitAxis::TILE_UP_DOWN>(v46, v61); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TMULS(v61, v61, v23); + pipe_barrier(PIPE_V); + TROWMAX(v55, v61, v50); + Tile v62; + TRESHAPE(v62, v55); + Tile v63; + TRESHAPE(v63, v54); + pipe_barrier(PIPE_V); + TROWEXPANDSUB(v51, v61, v55); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID0); + TMULS(v63, v62, v24); + pipe_barrier(PIPE_V); + TEXP(v51, v51); + pipe_barrier(PIPE_V); + TROWSUM(v56, v51, v50); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID0); + TCVT(v52, v51, v4); + set_flag(PIPE_V, PIPE_MTE3, EVENT_ID0); + wait_flag(PIPE_V, PIPE_MTE3, EVENT_ID0); + TPUSH, Tile, TileSplitAxis::TILE_UP_DOWN>(v48, v52); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID2); + TFREE, TileSplitAxis::TILE_UP_DOWN>(v46); + Tile v64; + TASSIGN(v64, v25); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID0); + TPOP, Tile, TileSplitAxis::TILE_UP_DOWN>(v46, v64); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID1); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID1); + TMULS(v64, v64, v23); + pipe_barrier(PIPE_V); + TROWMAX(v55, v64, v50); + Tile v65; + TRESHAPE(v65, v59); + Tile v66; + TRESHAPE(v66, v56); + Tile v67; + TRESHAPE(v67, v57); + pipe_barrier(PIPE_V); + TMAX(v62, v62, v63); + pipe_barrier(PIPE_V); + TSUB(v65, v63, v62); + pipe_barrier(PIPE_V); + TMULS(v63, v62, v24); + TROWEXPANDSUB(v51, v64, v55); + TEXP(v65, v65); + pipe_barrier(PIPE_V); + TEXP(v51, v51); + TMUL(v66, v66, v65); + pipe_barrier(PIPE_V); + TROWSUM(v57, v51, v50); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + pipe_barrier(PIPE_V); + TADD(v66, v66, v67); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID2); + TCVT(v52, v51, v4); + set_flag(PIPE_V, PIPE_MTE3, EVENT_ID1); + wait_flag(PIPE_V, PIPE_MTE3, EVENT_ID1); + TPUSH, Tile, TileSplitAxis::TILE_UP_DOWN>(v48, v52); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID3); + TFREE, TileSplitAxis::TILE_UP_DOWN>(v46); + Tile v68; + TASSIGN(v68, v13); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + TPOP, Tile, TileSplitAxis::TILE_UP_DOWN>(v47, v68); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID2); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID2); + TMOV(v53, v68); + TFREE, TileSplitAxis::TILE_UP_DOWN>(v47); + Tile v69; + TASSIGN(v69, v25); + TPOP, Tile, TileSplitAxis::TILE_UP_DOWN>(v46, v69); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID3); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID3); + TMULS(v69, v69, v23); + pipe_barrier(PIPE_V); + TROWMAX(v55, v69, v50); + Tile v70; + TRESHAPE(v70, v58); + pipe_barrier(PIPE_V); + TMAX(v62, v62, v63); + pipe_barrier(PIPE_V); + TSUB(v70, v63, v62); + pipe_barrier(PIPE_V); + TMULS(v63, v62, v24); + TROWEXPANDSUB(v51, v69, v55); + TEXP(v70, v70); + pipe_barrier(PIPE_V); + TEXP(v51, v51); + TMUL(v66, v66, v70); + pipe_barrier(PIPE_V); + TROWSUM(v57, v51, v50); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID2); + pipe_barrier(PIPE_V); + TADD(v66, v66, v67); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID3); + TCVT(v52, v51, v4); + set_flag(PIPE_V, PIPE_MTE3, EVENT_ID2); + wait_flag(PIPE_V, PIPE_MTE3, EVENT_ID2); + TPUSH, Tile, TileSplitAxis::TILE_UP_DOWN>(v48, v52); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID4); + TFREE, TileSplitAxis::TILE_UP_DOWN>(v46); + Tile v71; + TASSIGN(v71, v13); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID2); + TPOP, Tile, TileSplitAxis::TILE_UP_DOWN>(v47, v71); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID4); + TROWEXPANDMUL(v53, v53, v59); + pipe_barrier(PIPE_V); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID4); + TADD(v53, v53, v71); + TFREE, TileSplitAxis::TILE_UP_DOWN>(v47); + Tile v72; + TASSIGN(v72, v25); + TPOP, Tile, TileSplitAxis::TILE_UP_DOWN>(v46, v72); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID5); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID5); + TMULS(v72, v72, v23); + pipe_barrier(PIPE_V); + TROWMAX(v55, v72, v50); + pipe_barrier(PIPE_V); + TMAX(v62, v62, v63); + pipe_barrier(PIPE_V); + TSUB(v65, v63, v62); + pipe_barrier(PIPE_V); + TMULS(v63, v62, v24); + TROWEXPANDSUB(v51, v72, v55); + TEXP(v65, v65); + pipe_barrier(PIPE_V); + TEXP(v51, v51); + TMUL(v66, v66, v65); + pipe_barrier(PIPE_V); + TROWSUM(v57, v51, v50); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID3); + pipe_barrier(PIPE_V); + TADD(v66, v66, v67); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID4); + TCVT(v52, v51, v4); + set_flag(PIPE_V, PIPE_MTE3, EVENT_ID3); + wait_flag(PIPE_V, PIPE_MTE3, EVENT_ID3); + TPUSH, Tile, TileSplitAxis::TILE_UP_DOWN>(v48, v52); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID5); + TFREE, TileSplitAxis::TILE_UP_DOWN>(v46); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID3); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID5); + for (size_t v73 = v30; v73 < ((size_t) v26); v73 += v30) { + Tile v74; + TASSIGN(v74, v13); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID4); + TPOP, Tile, TileSplitAxis::TILE_UP_DOWN>(v47, v74); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID6); + TROWEXPANDMUL(v53, v53, v58); + pipe_barrier(PIPE_V); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID6); + TADD(v53, v53, v74); + TFREE, TileSplitAxis::TILE_UP_DOWN>(v47); + Tile v75; + TASSIGN(v75, v25); + TPOP, Tile, TileSplitAxis::TILE_UP_DOWN>(v46, v75); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TMULS(v75, v75, v23); + pipe_barrier(PIPE_V); + TROWMAX(v55, v75, v50); + pipe_barrier(PIPE_V); + TMAX(v62, v62, v63); + pipe_barrier(PIPE_V); + TSUB(v70, v63, v62); + pipe_barrier(PIPE_V); + TMULS(v63, v62, v24); + TROWEXPANDSUB(v51, v75, v55); + TEXP(v70, v70); + pipe_barrier(PIPE_V); + TEXP(v51, v51); + TMUL(v66, v66, v70); + pipe_barrier(PIPE_V); + TROWSUM(v57, v51, v50); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID6); + pipe_barrier(PIPE_V); + TADD(v66, v66, v67); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID6); + TCVT(v52, v51, v4); + set_flag(PIPE_V, PIPE_MTE3, EVENT_ID4); + wait_flag(PIPE_V, PIPE_MTE3, EVENT_ID4); + TPUSH, Tile, TileSplitAxis::TILE_UP_DOWN>(v48, v52); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID2); + TFREE, TileSplitAxis::TILE_UP_DOWN>(v46); + Tile v76; + TASSIGN(v76, v13); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID6); + TPOP, Tile, TileSplitAxis::TILE_UP_DOWN>(v47, v76); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TROWEXPANDMUL(v53, v53, v59); + pipe_barrier(PIPE_V); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TADD(v53, v53, v76); + TFREE, TileSplitAxis::TILE_UP_DOWN>(v47); + Tile v77; + TASSIGN(v77, v25); + TPOP, Tile, TileSplitAxis::TILE_UP_DOWN>(v46, v77); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TMULS(v77, v77, v23); + pipe_barrier(PIPE_V); + TROWMAX(v55, v77, v50); + pipe_barrier(PIPE_V); + TMAX(v62, v62, v63); + pipe_barrier(PIPE_V); + TSUB(v65, v63, v62); + pipe_barrier(PIPE_V); + TMULS(v63, v62, v24); + TROWEXPANDSUB(v51, v77, v55); + TEXP(v65, v65); + pipe_barrier(PIPE_V); + TEXP(v51, v51); + TMUL(v66, v66, v65); + pipe_barrier(PIPE_V); + TROWSUM(v57, v51, v50); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID4); + pipe_barrier(PIPE_V); + TADD(v66, v66, v67); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID2); + TCVT(v52, v51, v4); + set_flag(PIPE_V, PIPE_MTE3, EVENT_ID5); + wait_flag(PIPE_V, PIPE_MTE3, EVENT_ID5); + TPUSH, Tile, TileSplitAxis::TILE_UP_DOWN>(v48, v52); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID6); + TFREE, TileSplitAxis::TILE_UP_DOWN>(v46); + }; + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID7); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID0); + Tile v78; + TASSIGN(v78, v13); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID7); + TPOP, Tile, TileSplitAxis::TILE_UP_DOWN>(v47, v78); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TROWEXPANDMUL(v53, v53, v58); + pipe_barrier(PIPE_V); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TADD(v53, v53, v78); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID0); + TFREE, TileSplitAxis::TILE_UP_DOWN>(v47); + Tile v79; + TASSIGN(v79, v13); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID0); + TPOP, Tile, TileSplitAxis::TILE_UP_DOWN>(v47, v79); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + pipe_barrier(PIPE_V); + TROWEXPANDMUL(v53, v53, v59); + pipe_barrier(PIPE_V); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TADD(v53, v53, v79); + TFREE, TileSplitAxis::TILE_UP_DOWN>(v47); + pipe_barrier(PIPE_V); + TROWEXPANDDIV(v53, v53, v56); + set_flag(PIPE_V, PIPE_MTE3, EVENT_ID6); + pto::Shape<1, 1, 1, 16, 128> v80 = pto::Shape<1, 1, 1, 16, 128>(); + pto::Stride<2048, 2048, 2048, 128, 1> v81 = pto::Stride<2048, 2048, 2048, 128, 1>(); + GlobalTensor, pto::Stride<2048, 2048, 2048, 128, 1>, pto::Layout::ND> v82 = GlobalTensor, pto::Stride<2048, 2048, 2048, 128, 1>, pto::Layout::ND>(v2 + (v3 + (unsigned) ((int32_t) (uint32_t) ((int32_t) (uint32_t) ((int32_t) v60) * (uint32_t) v8) + (uint32_t) ((int32_t) (uint32_t) ((int32_t) (int64_t) v49) * (uint32_t) v7)) * (unsigned) v6 + v3 * (unsigned) v9), v80, v81); + wait_flag(PIPE_V, PIPE_MTE3, EVENT_ID6); + TSTORE(v82, v53); + } + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID0); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID1); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID4); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID5); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID6); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID7); + #endif // __DAV_VEC__ + + ptoas_auto_sync_tail(PTOAutoSyncTailMode::kBarrierAll); + return; +} + +__global__ AICORE void call_both(__gm__ int64_t* v1, __gm__ float* v2, __gm__ half* v3, __gm__ half* v4, __gm__ half* v5, __gm__ float* v6) { + using T = float; + uint64_t v7 = (uint64_t) v1; + set_ffts_base_addr(v7); + cube_kernel(v2, v3, v4, v5); + vector_kernel(v2, v6); + return; +} diff --git a/examples/aot/flash_attention/split_pipe/codegen_results/fa_performance_kernel.reference.cpp b/examples/aot/flash_attention/split_pipe/codegen_results/fa_performance_kernel.reference.cpp new file mode 100644 index 00000000..ef96b38e --- /dev/null +++ b/examples/aot/flash_attention/split_pipe/codegen_results/fa_performance_kernel.reference.cpp @@ -0,0 +1,998 @@ +/** +Copyright (c) 2026 Huawei Technologies Co., Ltd. +This program is free software, you can redistribute it and/or modify it under the terms and conditions of +CANN Open Software License Agreement Version 2.0 (the "License"). +Please refer to the License for details. You may not use this file except in compliance with the License. +THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. +See LICENSE in the root of the software repository for the full text of the License. +*/ + +#include +#include + +#include "fa_performance_kernel.h" +#include +#if defined(__DAV_C220_CUBE__) || defined(__DAV_C220_VEC__) +#include +#elif defined(__DAV_C310_CUBE__) || defined(__DAV_C310_VEC__) +#include +#endif +#include "pto_macro_matmul.hpp" +#include "pto_macro_fa_softmax.hpp" +#include "pto_macro_fa_gu.hpp" + +#define UF_ENABLE 1 + +using namespace std; +using namespace pto; + +#ifndef FFTS_BUFFER_FLAG_ENUM +#define FFTS_BUFFER_FLAG_ENUM +// Buffer flag values for FFTS pipeline coordination +enum FftsBufferFlag : uint32_t +{ + BUF0_QK_READY = 0, // Buffer 0: QK data ready + BUF0_SM_CONSUMED = 1, // Buffer 0: Softmax consumed + BUF1_SM_READY = 2, // Buffer 1: Softmax output ready + BUF1_SV_CONSUMED = 3, // Buffer 1: SV consumed + UPDATE_READY = 4, // Update stage ready + UPDATE_CONSUMED = 5, // Update stage consumed + CV_BLOCK_END = 7, // CV comm slot block end (CV_COMM_CTRL reserved in TSyncCVID) +}; +#endif + +enum CoreEvtID : uint32_t +{ + QK_EVENT_ID0, + QK_EVENT_ID1, + PV_EVENT_ID0, + PV_EVENT_ID1, +}; + +// ----------------------------------------------------------------------------- +// Performance tuning knobs (high-level) +// +// The kernel is a cross-core pipeline (Cube + Vec) with explicit FIFOs: +// QK (Cube): compute_qk -> qk_tile_fifo (fp32) +// P (Vec): compute_p -> p_tile_fifo (fp16 x_exp) + l1_exp_max_ififo +// PV (Cube): compute_pv -> pv_tile_fifo (fp32) +// GU (Vec): compute_gu -> o_out (fp32) with running rescale/update +// +// Key knobs that impact throughput (see runTFA<> below): +// - CUBE_S0 / CUBE_S1: tile sizes for QK/PV cube matmuls (compute intensity vs. buffer pressure) +// - qkPreloadNum: pipeline warmup depth (more overlap vs. more L1 FIFO footprint) +// - *_TNBuffers: ping/pong depth for Mat tiles (overlap) and Vec tiles (latency hiding) +// - QKV_CV_FIFO / PV_CV_FIFO: FIFO depth between stages (avoid backpressure) +// ----------------------------------------------------------------------------- + +// Inline macro used for small, performance-sensitive functions +#ifndef PTO_INLINE +#define PTO_INLINE __attribute__((always_inline)) inline +#endif + +// Detect build-time macros and expose as constexpr flags for clearer conditionals +#ifdef __DAV_CUBE__ +constexpr bool DAV_CUBE = true; +#else +constexpr bool DAV_CUBE = false; +#endif + +#ifdef __DAV_VEC__ +constexpr bool DAV_VEC = true; +#else +constexpr bool DAV_VEC = false; +#endif + +constexpr std::size_t MAX_TILE_L1_BYTES = 512U * 1024U; +constexpr std::size_t MAX_VEC_UB_BYTES = 192U * 1024U; + +template +constexpr AICORE std::size_t tile_storage_bytes() +{ + using ElementType = typename TileType::DType; + return static_cast(TileType::Rows * TileType::Cols) * sizeof(ElementType); +} + +template +constexpr AICORE std::size_t tile_buffer_total_bytes() +{ + return tile_storage_bytes() * NumBuffers; +} + +template +AICORE inline uint32_t assign_tile_buffers(TileType (&tiles)[NumBuffers], uint32_t base_offset) +{ + if constexpr (NumBuffers == 0) { + return base_offset; + } + + constexpr std::size_t total_storage_bytes = tile_buffer_total_bytes(); + static_assert(total_storage_bytes <= MAX_TILE_L1_BYTES, "Tile buffer L1 allocation exceeds 512KB"); + + for (std::size_t idx = 0; idx < NumBuffers; ++idx) { + const uint32_t tile_offset = base_offset + static_cast(idx * tile_storage_bytes()); + TASSIGN(tiles[idx], tile_offset); + } + + return base_offset + static_cast(total_storage_bytes); +} + +template +AICORE inline uint32_t assign_tile_buffers_union(TileA (&tilesA)[NumA], TileB (&tilesB)[NumB], uint32_t base_offset) +{ + static_assert(NumA == NumB, "Union assignment expects matching buffer counts"); + if constexpr (NumA == 0) { + return base_offset; + } + + constexpr std::size_t stride_bytes = (tile_storage_bytes() > tile_storage_bytes()) ? + tile_storage_bytes() : + tile_storage_bytes(); + constexpr std::size_t total_storage_bytes = stride_bytes * NumA; + static_assert(total_storage_bytes <= MAX_VEC_UB_BYTES, "Union tile UB allocation exceeds 192KB"); + + for (std::size_t idx = 0; idx < NumA; ++idx) { + const uint32_t tile_offset = base_offset + static_cast(idx * stride_bytes); + TASSIGN(tilesA[idx], tile_offset); + TASSIGN(tilesB[idx], tile_offset); + } + + return base_offset + static_cast(total_storage_bytes); +} + +template +AICORE inline void allocate_cube_tile_buffers(TileQType (&qTiles)[NumQ], TileKType (&kTiles)[NumK], + TilePType (&pTiles)[NumP], TileVType (&vTiles)[NumV]) +{ + constexpr std::size_t total_bytes = + tile_buffer_total_bytes() + tile_buffer_total_bytes() + + tile_buffer_total_bytes() + tile_buffer_total_bytes(); + static_assert(total_bytes <= MAX_TILE_L1_BYTES, "Total cube L1 allocation exceeds 512KB"); + + uint32_t l1_offset = 0; + l1_offset = assign_tile_buffers(qTiles, l1_offset); + l1_offset = assign_tile_buffers(kTiles, l1_offset); + l1_offset = assign_tile_buffers(pTiles, l1_offset); + l1_offset = assign_tile_buffers(vTiles, l1_offset); + (void)l1_offset; +} + +template +AICORE inline void allocate_vec_tile_buffers(TileDataF_T (&srcTiles)[SrcBuffers], ReduceTileF_T &m1_local_max, + TileDataF_T &input_reduce_tmp, ReduceTileF_T &l1_local_sum, + ReduceTileF_T &m2_global_max, ReduceTileF_T &l2_global_sum, + ReduceTileF_T (&l1_exp_max)[ExpMaxBuffers], + TileDataH_T (&x_expT)[XexpBuffers], TileOutT (&pvTile)[pvVecBuffers], + TileOutT &runningOTile, TileDataF_T &triu) +{ + constexpr std::size_t float_tile_bytes = tile_storage_bytes(); + constexpr std::size_t reduce_tile_bytes = tile_storage_bytes(); + constexpr std::size_t xexp_bytes = tile_buffer_total_bytes(); + constexpr std::size_t out_tile_bytes = tile_storage_bytes(); + constexpr std::size_t union_stride = (tile_storage_bytes() > tile_storage_bytes()) ? + tile_storage_bytes() : + tile_storage_bytes(); + static_assert(SrcBuffers == pvVecBuffers, "src/pv ping-pong buffer counts must match for union allocation"); + constexpr std::size_t union_bytes = union_stride * SrcBuffers; + constexpr std::size_t total_bytes = union_bytes + xexp_bytes + (reduce_tile_bytes * (3U + ExpMaxBuffers)) + + (float_tile_bytes / 8 * 1U) + (float_tile_bytes * 1U) + out_tile_bytes; + static_assert(total_bytes <= MAX_VEC_UB_BYTES, "Vec tile UB allocation exceeds 192KB"); + + uint32_t offset = 0; + TASSIGN(runningOTile, offset); + offset += out_tile_bytes; + offset = assign_tile_buffers_union(srcTiles, pvTile, offset); + + TASSIGN(m1_local_max, offset); + offset += static_cast(reduce_tile_bytes); + + TASSIGN(m2_global_max, offset); + offset += static_cast(reduce_tile_bytes); + + uint32_t tmp_float_offset = offset; + TASSIGN(input_reduce_tmp, tmp_float_offset); + offset += static_cast(float_tile_bytes) / 8; + + TASSIGN(triu, offset); + offset += static_cast(float_tile_bytes); + + TASSIGN(l1_local_sum, offset); + offset += static_cast(reduce_tile_bytes); + + TASSIGN(l2_global_sum, offset); + offset += static_cast(reduce_tile_bytes); + + offset = assign_tile_buffers(l1_exp_max, offset); + + uint32_t tail_offset = assign_tile_buffers(x_expT, offset); + + (void)tail_offset; +} + +// Helper to assign an accumulator tile to one of two ping-pong UB addresses (0x0 / 0x10000). +// Keeps a per-type static running index that toggles on every call. Caller may pass +// `initial_id` (0 or 1) to set the starting buffer index on the first call for that tile type. +template +AICORE inline int assign_running_acc_tile(AccTileT &accTile, int initial_id = -1) +{ + static int running_tile_buffer_idx = 0; // per-instantiation running buffer index: 0 -> base0, 1 -> base1 + if (initial_id == 0 || initial_id == 1) { + running_tile_buffer_idx = initial_id; + } + const int id = running_tile_buffer_idx; + const uint32_t base_addr = (id == 0) ? 0x0u : 0x10000u; + TASSIGN(accTile, base_addr); + running_tile_buffer_idx ^= 1; // toggle for next call + return id; +} + +template +AICORE inline void compute_qk(QKPipe &qkPipe, int tile_id, int sub_tile_id, __gm__ half *q, __gm__ half *k, + TileMatQData &qMatTile, TileMatKData &kMatTile, TileQKData &qkAccTile, + QKSlotGlobal &qkSlotGlobal, uint64_t qkMatTileEventId, int accTileEvtID, int blk_idx) +{ + if constexpr (DAV_CUBE) { + constexpr uint32_t Cube_S0 = CUBE_S0; + constexpr uint32_t Cube_S1 = CUBE_S1; + constexpr uint32_t Tile_S1 = TILE_S1; + constexpr uint32_t kTileFactor = Tile_S1 / Cube_S1; + constexpr uint32_t Cube_HEAD = HEAD_SIZE; + + constexpr int QKP_CV_FIFO = QKPipe::RingFiFo::SLOT_NUM; + static_assert(QKP_CV_FIFO >= 1, "QKP_CV_FIFO must be >= 1"); + static_assert(Tile_S1 % Cube_S1 == 0, "TILE_S1 must be divisible by CUBE_S1"); + + const int s0_index = blk_idx * CUBE_S0; + const int s1_index = tile_id * static_cast(Tile_S1) + sub_tile_id * static_cast(Cube_S1); + if (sub_tile_id == 0) { + TALLOC(qkPipe, qkSlotGlobal); + } + if constexpr (CAUSAL_MASK) { + if (s1_index > s0_index) { + if (sub_tile_id == static_cast(kTileFactor) - 1) { + TPUSH(qkPipe, qkSlotGlobal); + } + return; + } + } + using GlobalDataQ = + GlobalTensor, pto::Stride<1, 1, 1, HEAD_SIZE, 1>>; + using GlobalDataK = GlobalTensor, + pto::Stride<1, 1, 1, 1, HEAD_SIZE>, Layout::DN>; // BNSD - (N, K) layout + + GlobalDataQ qGlobal(q); + GlobalDataK kGlobal(k + s1_index * HEAD_SIZE); + + wait_flag(PIPE_MTE1, PIPE_MTE2, qkMatTileEventId); + + if (tile_id == 0 && sub_tile_id == 0) { + TLOAD(qMatTile, qGlobal); + } + + TLOAD(kMatTile, kGlobal); + + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + +#if UF_ENABLE + pto_macro_matmul(qMatTile, kMatTile, qkAccTile, AccMode::InitFinalSum); +#else + wait_flag(PIPE_FIX, PIPE_M, accTileEvtID); + pto_macro_matmul(qMatTile, kMatTile, qkAccTile, AccMode::Init); +#endif + + set_flag(PIPE_MTE1, PIPE_MTE2, qkMatTileEventId); +#if !UF_ENABLE + set_flag(PIPE_M, PIPE_FIX, EVENT_ID0); + wait_flag(PIPE_M, PIPE_FIX, EVENT_ID0); +#endif + + using QKStoreGlobal = + GlobalTensor, pto::Stride<1, 1, 1, Tile_S1, 1>>; + QKStoreGlobal qkStoreGlobal(qkSlotGlobal.data() + static_cast(sub_tile_id) * Cube_S1); +#if UF_ENABLE + TSTORE(qkStoreGlobal, qkAccTile); +#else + TSTORE(qkStoreGlobal, qkAccTile); +#endif + + if (sub_tile_id == static_cast(kTileFactor) - 1) { + TPUSH(qkPipe, qkSlotGlobal); + } + +#if !UF_ENABLE + set_flag(PIPE_FIX, PIPE_M, accTileEvtID); +#endif + } +} + +template +AICORE inline void compute_pv(PPipe &pPipe, PVPipe &pvPipe, int tile_id, int sub_tile_id, __gm__ half *v, + TileMatPData &pMatTile, TileMatVData &vMatTile, TilePVData &pvAccTile, + PSlotGlobal &pSlotGlobal, PVSlotGlobal &pvSlotGlobal, uint64_t svMatTileEventId, + int accTileEvtID, int blk_idx) +{ + constexpr uint32_t Cube_S0 = CUBE_S0; + constexpr uint32_t Cube_S1 = CUBE_S1; + constexpr uint32_t Tile_S1 = TILE_S1; + constexpr uint32_t kTileFactor = Tile_S1 / Cube_S1; + constexpr uint32_t Cube_HEAD = HEAD_SIZE; + constexpr uint32_t TileElems = Cube_S0 * Tile_S1; + constexpr int QKP_CV_FIFO = PVPipe::RingFiFo::SLOT_NUM; + static_assert(QKP_CV_FIFO >= 1, "PV_CV_FIFO must be >= 1"); + static_assert(Tile_S1 % Cube_S1 == 0, "TILE_S1 must be divisible by CUBE_S1"); + + const int s0_index = blk_idx * Cube_S0; + const int s1_index = tile_id * static_cast(Tile_S1) + sub_tile_id * static_cast(Cube_S1); + const bool is_last_subtile = (sub_tile_id + 1 == static_cast(kTileFactor)); + const bool next_will_be_skipped = (s1_index + static_cast(Cube_S1)) > s0_index && CAUSAL_MASK; + + if constexpr (DAV_CUBE) { + if (sub_tile_id == 0) { + TPOP(pPipe, pSlotGlobal); + } + if constexpr (CAUSAL_MASK) { + if (s1_index > s0_index) { + if (is_last_subtile) { + TFREE(pPipe, pSlotGlobal); + } + return; + } + } + + using GlobalVT = + GlobalTensor, pto::Stride<1, 1, 1, HEAD_SIZE, 1>>; + + wait_flag(PIPE_MTE1, PIPE_MTE2, svMatTileEventId); + + GlobalVT vLoad((__gm__ half *)(v + s1_index * HEAD_SIZE)); + TLOAD(vMatTile, vLoad); + + using PLoadGlobal = + GlobalTensor, pto::Stride<1, 1, 1, Tile_S1, 1>>; + PLoadGlobal pLoadGlobal(pSlotGlobal.data() + static_cast(sub_tile_id) * Cube_S1); + TLOAD(pMatTile, pLoadGlobal); + if (is_last_subtile) { + TFREE(pPipe, pSlotGlobal); + } + + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + +#if !UF_ENABLE + if (sub_tile_id == 0) { + wait_flag(PIPE_FIX, PIPE_M, accTileEvtID); + } +#endif + +#if UF_ENABLE + const AccMode accMode = + (sub_tile_id == 0) ? + (is_last_subtile || next_will_be_skipped ? AccMode::InitFinalSum : AccMode::InitPartialSum) : + (is_last_subtile || next_will_be_skipped ? AccMode::AccFinalSum : AccMode::AccPartialSum); + pto_macro_matmul(pMatTile, vMatTile, pvAccTile, accMode); +#else + const AccMode accMode = (sub_tile_id == 0) ? AccMode::Init : AccMode::Acc; + pto_macro_matmul(pMatTile, vMatTile, pvAccTile, accMode); +#endif + + set_flag(PIPE_MTE1, PIPE_MTE2, svMatTileEventId); + + if (sub_tile_id == static_cast(kTileFactor) - 1 || next_will_be_skipped) { +#if !UF_ENABLE + set_flag(PIPE_M, PIPE_FIX, EVENT_ID0); + wait_flag(PIPE_M, PIPE_FIX, EVENT_ID0); +#endif + + using PVStoreGlobal = + GlobalTensor, pto::Stride<1, 1, 1, HEAD_SIZE, 1>>; + TALLOC(pvPipe, pvSlotGlobal); + PVStoreGlobal pvStoreGlobal(pvSlotGlobal.data()); +#if UF_ENABLE + TSTORE(pvStoreGlobal, pvAccTile); +#else + TSTORE(pvStoreGlobal, pvAccTile); +#endif + TPUSH(pvPipe, pvSlotGlobal); + +#if !UF_ENABLE + set_flag(PIPE_FIX, PIPE_M, accTileEvtID); +#endif + } // end loop + } // end if DAV_CUBE +} + +template +AICORE inline void compute_p(QKPipe &qkPipe, PPipe &pPipe, int tile_id, int row_slice, __gm__ float *exp_max_ififo, + __gm__ float *global_sum_out, __gm__ float *exp_max_out, TileDataF_T &qkVecTile, + TileDataH_T &x_expT, TileDataF_T &input_reduce_tmp, ReduceTileF_T &m1_local_max, + ReduceTileF_T &l1_local_sum, ReduceTileF_T &m2_global_max, ReduceTileF_T &l2_global_sum, + ReduceTileF_T &l1_exp_max_ififo, TileDataF_T triu, QKSlotGlobal &qkSlotGlobal, + PSlotGlobal &pSlotGlobal, uint64_t pTileEventId, int blk_idx) +{ + constexpr uint32_t Cube_S0 = CUBE_S0; + constexpr uint32_t Cube_S1 = CUBE_S1; + constexpr uint32_t Tile_S1 = TILE_S1; + constexpr uint32_t kTileFactor = Tile_S1 / Cube_S1; + constexpr uint32_t Vec_S0 = Cube_S0 / VEC_CORES / kTileFactor; + constexpr int QKP_CV_FIFO = QKPipe::RingFiFo::SLOT_NUM; + static_assert(QKP_CV_FIFO >= 1, "QKP_CV_FIFO must be >= 1"); + static_assert(Tile_S1 % Cube_S1 == 0, "TILE_S1 must be divisible by CUBE_S1"); + static_assert(Cube_S0 % (VEC_CORES * kTileFactor) == 0, "Vec rows must divide evenly across tile slices"); + const bool initFlag = (tile_id == 0); + if constexpr (DAV_VEC) { + const size_t subblock_base_rows = + static_cast(Cube_S0 / VEC_CORES) * static_cast(get_subblockid()); + const size_t row_offset = subblock_base_rows + static_cast(row_slice * Vec_S0); + const int s0_index = blk_idx * Cube_S0 + row_offset; + const int s1_index = tile_id * static_cast(Tile_S1); + wait_flag(PIPE_V, PIPE_MTE2, pTileEventId); + + if (row_slice == 0) { + TPOP(qkPipe, qkSlotGlobal); + } + + using QKLoadGlobal = + GlobalTensor, pto::Stride<1, 1, 1, Tile_S1, 1>>; + QKLoadGlobal qkLoadGlobal(qkSlotGlobal.data() + row_offset * Tile_S1); + TLOAD(qkVecTile, qkLoadGlobal); + if (row_slice == static_cast(kTileFactor) - 1) { + TFREE(qkPipe, qkSlotGlobal); + } + + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + + // Extract per-slice views into the per-core reduce tiles so each slice writes into its row range + using ReduceSliceTile = Tile; + // reduce tiles live per vector core; offset only by row_slice within the core (no subblock stride) + const size_t reduce_slice_rows = static_cast(row_slice * Vec_S0); + const uint64_t reduce_row_byte_offset = reduce_slice_rows * sizeof(float); + + ReduceSliceTile m1_local_max_slice; + ReduceSliceTile l1_local_sum_slice; + ReduceSliceTile m2_global_max_slice; + ReduceSliceTile l2_global_sum_slice; + ReduceSliceTile l1_exp_max_slice; + + TASSIGN(m1_local_max_slice, (uint64_t)m1_local_max.data() + reduce_row_byte_offset); + TASSIGN(l1_local_sum_slice, (uint64_t)l1_local_sum.data() + reduce_row_byte_offset); + TASSIGN(m2_global_max_slice, (uint64_t)m2_global_max.data() + reduce_row_byte_offset); + TASSIGN(l2_global_sum_slice, (uint64_t)l2_global_sum.data() + reduce_row_byte_offset); + TASSIGN(l1_exp_max_slice, (uint64_t)l1_exp_max_ififo.data() + reduce_row_byte_offset); + + // Extract current slice state from full-length reduce tiles + wait_flag(PIPE_MTE3, PIPE_V, pTileEventId); + if (initFlag) { + pto_macro_fa_softmax( + x_expT, qkVecTile, m1_local_max_slice, l1_local_sum_slice, m2_global_max_slice, l2_global_sum_slice, + l1_exp_max_slice, input_reduce_tmp, qkVecTile, triu, s0_index, s1_index); + } else { + pto_macro_fa_softmax( + x_expT, qkVecTile, m1_local_max_slice, l1_local_sum_slice, m2_global_max_slice, l2_global_sum_slice, + l1_exp_max_slice, input_reduce_tmp, qkVecTile, triu, s0_index, s1_index); + } + + set_flag(PIPE_V, PIPE_MTE2, pTileEventId); + set_flag(PIPE_V, PIPE_MTE3, EVENT_ID0); + wait_flag(PIPE_V, PIPE_MTE3, EVENT_ID0); + + if (row_slice == 0) { + TALLOC(pPipe, pSlotGlobal); + } + using PStoreGlobal = + GlobalTensor, pto::Stride<1, 1, 1, Tile_S1, 1>>; + PStoreGlobal pStoreGlobal(pSlotGlobal.data() + row_offset * Tile_S1); + TSTORE(pStoreGlobal, x_expT); + if (row_slice == static_cast(kTileFactor) - 1) { + TPUSH(pPipe, pSlotGlobal); + } + + set_flag(PIPE_MTE3, PIPE_V, pTileEventId); + if constexpr (INTERMEDIATE_CHECK) { + // On the final row_slice, emit the exp_max for this subblock only (Cube_S0 / VEC_CORES rows) + if (row_slice == static_cast(kTileFactor) - 1) { + constexpr uint32_t SubblockRows = Cube_S0 / VEC_CORES; + using GlobalPMaxFloatSub = + GlobalTensor, pto::Stride<1, 1, 1, Cube_S0, 1>>; + using ExpMaxSub = Tile; + const size_t base_elems_pmax = + static_cast(tile_id % QKP_CV_FIFO) * static_cast(Cube_S0) + subblock_base_rows; + __gm__ float *p_ptr_fp32 = exp_max_ififo + base_elems_pmax; + GlobalPMaxFloatSub pMaxGlobal(p_ptr_fp32); + ExpMaxSub l1_exp_max_rowmajor; + TRESHAPE(l1_exp_max_rowmajor, l1_exp_max_ififo); + TSTORE(pMaxGlobal, l1_exp_max_rowmajor); + } + } + } +} + +template +AICORE inline void compute_gu(PVPipe &pvPipe, int tile_id, int num_tiles, __gm__ float *o_out, + __gm__ float *o_parts_out, TileOutT &runningOTile, TileOutT &pvVecTile, + ReduceTileF_T &l1_exp_max_ififo, ReduceTileF_T &l2_global_sum, uint64_t guEventId) +{ + constexpr uint32_t Cube_S0 = CUBE_S0; + constexpr uint32_t Vec_S0 = Cube_S0 / VEC_CORES; + + if constexpr (DAV_VEC) { + wait_flag(PIPE_V, PIPE_MTE2, guEventId); + const size_t subblock_base_rows = + static_cast(Cube_S0 / VEC_CORES) * static_cast(get_subblockid()); + + using PVVecGlobal = + GlobalTensor, pto::Stride<1, 1, 1, HEAD_SIZE, 1>>; + PVVecGlobal pvGlobal; + TPOP(pvPipe, pvGlobal); + + if (tile_id == 0) { + TLOAD(runningOTile, pvGlobal); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + if constexpr (CAUSAL_MASK) { + if (tile_id == num_tiles - 1) + pto_macro_fa_gu_single_and_last_tile(runningOTile, l2_global_sum); + } + } else { + TLOAD(pvVecTile, pvGlobal); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + + if (tile_id < num_tiles - 1) { + pto_macro_fa_gu(runningOTile, pvVecTile, l1_exp_max_ififo); + } else { + pto_macro_fa_gu_last(runningOTile, pvVecTile, l1_exp_max_ififo, l2_global_sum); + } + } + TFREE(pvPipe, pvGlobal); + + set_flag(PIPE_V, PIPE_MTE2, guEventId); + + if (tile_id == num_tiles - 1) { + set_flag(PIPE_V, PIPE_MTE3, EVENT_ID0); + wait_flag(PIPE_V, PIPE_MTE3, EVENT_ID0); + using GlobalOutT = + GlobalTensor, pto::Stride<1, 1, 1, HEAD_SIZE, 1>>; + GlobalOutT outGlobal((__gm__ float *)(o_out + subblock_base_rows * HEAD_SIZE)); + TSTORE(outGlobal, runningOTile); + } + } +} + +template +__global__ AICORE void runTFA(__gm__ uint64_t *ffts_addr, __gm__ half *q, __gm__ half *k, __gm__ half *v, + __gm__ half *p_tile_fifo, __gm__ float *exp_max_ififo, __gm__ float *global_sum_out, + __gm__ float *exp_max_out, __gm__ float *o_out, __gm__ float *o_parts_out, + __gm__ float *qk_tile_fifo, __gm__ float *pv_tile_fifo, __gm__ uint8_t *cv_comm_buf, + __gm__ uint8_t *profile_buf) +{ + uint64_t tStart = get_sys_cnt(); + + set_ffts_base_addr((uint64_t)ffts_addr); + if constexpr (DAV_CUBE) { + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID0); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + } + + // Rename dimensions for clarity: S0 (rows total), Cube_S0 (per-block rows), S1 (cols), HEAD_SIZE (inner) + constexpr uint32_t Cube_S0 = CUBE_S0; + constexpr uint32_t block_rows = S0 / CUBE_S0; + constexpr uint32_t Cube_S1 = CUBE_S1; // per-tile S1 chunk + constexpr uint32_t Tile_S1 = TILE_S1; // logical tile along S1 + static_assert(Tile_S1 % Cube_S1 == 0, "TILE_S1 must be divisible by CUBE_S1"); + constexpr uint32_t kTileFactor = Tile_S1 / Cube_S1; // sub-tiles per TILE_S1 + constexpr uint32_t Cube_HEAD = HEAD_SIZE; + constexpr uint32_t Vec_S0 = Cube_S0 / VEC_CORES / kTileFactor; + constexpr uint32_t VecGuRows = Cube_S0 / VEC_CORES; + static_assert(Cube_S0 % (VEC_CORES * kTileFactor) == 0, "Vec rows must divide evenly across tile slices"); + + // -------------------------- + // Tuning knobs (pipeline) + // + // qkPreloadNum controls how many (QK -> P) tiles we warm up before entering the steady-state loop. + // - Larger preload improves overlap (Cube/VEC concurrency) for long S1. + // - Larger preload increases FIFO footprint (qkGlobalTensorNBuffers / pvGlobalTensorNBuffers / + // guGlobalTensorNBuffers). + constexpr uint32_t qkPreloadNum = QK_PRELOAD; + + // Buffer counts for optional double-buffering (default 1) + // - srcVecTNBuffers/xexpVecTNBuffers: Vec ping-pong for QK load and x_exp output + // - *MatTNBuffers: L1 ping-pong for Cube stage (K/P/V) + // Keep these small (1-2) unless you have measured stall bubbles that require deeper buffering. + constexpr uint32_t srcVecTNBuffers = 2; + constexpr uint32_t xexpVecTNBuffers = 2; + constexpr uint32_t outOTileNBuffers = 2; + constexpr uint32_t qMatTNBuffers = 1; + constexpr uint32_t kMatTNBuffers = 2; + constexpr uint32_t pMatTNBuffers = 2; + constexpr uint32_t vMatTNBuffers = 2; + constexpr uint32_t qkp_tile_fifo_size = CV_FIFO_SIZE; + constexpr uint32_t pv_tile_fifo_size = CV_FIFO_SIZE; + static_assert(qkPreloadNum >= 1, "qkPreloadNum must be >= 1"); + static_assert(CV_FIFO_CONS_SYNC_PERIOD >= 1, "CV_FIFO_CONS_SYNC_PERIOD must be >= 1"); + static_assert((qkPreloadNum > 1) || (kTileFactor == 1), "qkPreloadNum must be > 1 unless kTileFactor == 1"); + + // Define tile types for first QK matmul + using TileMatQData = + Tile; + using TileMatKData = + Tile; + // Accumulator rows must match Cube_S0 (per-block rows), not logical S0 + using TileQKData = TileAcc; + + TileMatQData qMatTile[qMatTNBuffers]; + TileMatKData kMatTile[kMatTNBuffers]; + TileQKData qkAccTile; + + // Define tile types for second PV matmul + using TileMatPData = + Tile; + using TileMatVData = + Tile; + using TilePVData = TileAcc; + + TileMatPData pMatTile[pMatTNBuffers]; + TileMatVData vMatTile[vMatTNBuffers]; + TilePVData pvAccTile; + + allocate_cube_tile_buffers(qMatTile, kMatTile, pMatTile, vMatTile); + + // Assign accumulator tiles using ping-pong helper. qk starts at 0, pv starts at 1. + assign_running_acc_tile(qkAccTile, 0); + assign_running_acc_tile(pvAccTile, 1); + + // Define tile types for FA softmax P computation + // UB offsets for softmax tiles + // Define per-tile vector tiles sized to Cube_S1 + using TileDataF_T = Tile; + using TileDataH_T = Tile; + constexpr uint32_t SubblockRows = Cube_S0 / VEC_CORES; + // Reduce tiles cover one vector core's rows (Cube_S0 / VEC_CORES); slices are extracted per row_slice + using ReduceTileF_T = Tile; + + TileDataF_T qkVecTile[srcVecTNBuffers]; + ReduceTileF_T m1_local_max; + TileDataF_T input_reduce_tmp; + TileDataF_T triu; + ReduceTileF_T l1_local_sum; + ReduceTileF_T m2_global_max; + ReduceTileF_T l2_global_sum; + ReduceTileF_T l1_exp_max_ififo[qkp_tile_fifo_size]; + TileDataH_T x_expT[xexpVecTNBuffers]; + + using TileOutGuT = Tile; + TileOutGuT pvVecTile[outOTileNBuffers]; + TileOutGuT runningOTile; + allocate_vec_tile_buffers(qkVecTile, m1_local_max, input_reduce_tmp, l1_local_sum, m2_global_max, + l2_global_sum, l1_exp_max_ififo, x_expT, pvVecTile, runningOTile, triu); + + // block offset for logical S0 +#if defined(__DAV_C220_CUBE__) || defined(__DAV_C220_VEC__) // A5 defined macro, don't need to reassign + const int block_idx = get_block_idx(); +#endif + const int block_offset_rows = block_idx * static_cast(Cube_S0); + + constexpr bool use_cv_comm = (!INTERMEDIATE_CHECK) && (block_rows >= static_cast(pto::kCvMaxCores)); + int comm_slot = block_idx; + + if constexpr (use_cv_comm) { + comm_slot = pto::TSYNC_CVID(block_idx, cv_comm_buf); + } + __gm__ uint64_t *profile_entry = nullptr; + if (profile_buf != nullptr) { + std::size_t profile_block_base = static_cast(block_idx) * kFaProfileBytesPerBlock; + std::size_t profile_offset = profile_block_base; + if constexpr (DAV_VEC) { + profile_offset += + (static_cast(get_subblockid()) + 1U) * 1024U; // vec subblock 0/1 use 2nd/3rd KB + } + profile_entry = reinterpret_cast<__gm__ uint64_t *>(profile_buf + profile_offset); + profile_entry[0] = tStart; + } + const size_t p_fifo_block_stride = + static_cast(qkp_tile_fifo_size) * static_cast(Cube_S0) * static_cast(Tile_S1); + const size_t p_max_fifo_block_stride = static_cast(qkp_tile_fifo_size) * static_cast(Cube_S0); + const size_t qk_fifo_block_stride = p_fifo_block_stride; + const size_t pv_fifo_block_stride = + static_cast(pv_tile_fifo_size) * static_cast(Cube_S0) * static_cast(HEAD_SIZE); + + __gm__ half *q_block = q + block_offset_rows * HEAD_SIZE; + __gm__ half *p_tile_fifo_block = p_tile_fifo + static_cast(comm_slot) * p_fifo_block_stride; + __gm__ float *exp_max_ififo_block = exp_max_ififo + static_cast(comm_slot) * p_max_fifo_block_stride; + __gm__ float *global_sum_block = global_sum_out + block_offset_rows; + __gm__ float *exp_max_block = exp_max_out + block_offset_rows; + __gm__ float *o_out_block = o_out + static_cast(block_offset_rows) * static_cast(HEAD_SIZE); + __gm__ float *o_parts_block = o_parts_out + static_cast(block_offset_rows) * static_cast(HEAD_SIZE); + __gm__ float *qk_tile_fifo_block = qk_tile_fifo + static_cast(comm_slot) * qk_fifo_block_stride; + __gm__ float *pv_tile_fifo_block = pv_tile_fifo + static_cast(comm_slot) * pv_fifo_block_stride; + + int num_tiles_s1 = S1 / Tile_S1; + if constexpr (CAUSAL_MASK) + num_tiles_s1 = (1 + ((block_idx * CUBE_S0) / Tile_S1)); + if constexpr (DAV_CUBE) { + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID0); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID1); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID2); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID3); + set_flag(PIPE_FIX, PIPE_M, EVENT_ID0); + set_flag(PIPE_FIX, PIPE_M, EVENT_ID1); + } + if constexpr (DAV_VEC) { + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID0); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID0); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID1); + } + + int p_gu_src_pingpong_id = 0; // shared ping-pong for softmax vec tiles, pv output tiles, and GU input tiles + int k_src_pingpong_id = 0; // separate ping-pong for K tiles + int pv_src_pingpong_id = 0; // separate ping-pong for P V tiles + + int qkAccTileEvtID = 0; + int pvAccTileEvtID = 0; + + // FIFO definitions + constexpr uint8_t FiFoDepth = CV_FIFO_SIZE; + #if defined(__DAV_C220_CUBE__) || defined(__DAV_C220_VEC__) + using QKPipe = + TPipe; + #elif defined(__DAV_C310_CUBE__) || defined(__DAV_C310_VEC__) + using QKPipe = + TPipe; + #endif + QKPipe qkPipe(qk_tile_fifo_block, (uint32_t)(uint64_t)qkVecTile[0].data(), 0x0); + + // pFiFo, pProd, pCons + #if defined(__DAV_C220_CUBE__) || defined(__DAV_C220_VEC__) + using PPipe = TPipe; + #elif defined(__DAV_C310_CUBE__) || defined(__DAV_C310_VEC__) + using PPipe = TPipe; + #endif + PPipe pPipe(p_tile_fifo_block, 0x0, (uint32_t)(uint64_t)pMatTile[0].data()); + + // pvFiFo, pvProd, pvCons + #if defined(__DAV_C220_CUBE__) || defined(__DAV_C220_VEC__) + using PVPipe = + TPipe; + #elif defined(__DAV_C310_CUBE__) || defined(__DAV_C310_VEC__) + using PVPipe = + TPipe; + #endif + PVPipe pvPipe(pv_tile_fifo_block, (uint32_t)(uint64_t)pvVecTile[0].data(), 0x0); + + using QKSlotGlobal = + GlobalTensor, pto::Stride<1, 1, 1, Tile_S1, 1>>; + using PSlotGlobal = + GlobalTensor, pto::Stride<1, 1, 1, Tile_S1, 1>>; + using PVSlotGlobal = + GlobalTensor, pto::Stride<1, 1, 1, HEAD_SIZE, 1>>; + QKSlotGlobal qkSlotGlobal; + PSlotGlobal pSlotGlobal; + PVSlotGlobal pvSlotGlobal; + + // QK and P pre-computation (tile_id based) + for (int preload_tile = 0; preload_tile < static_cast(qkPreloadNum) && preload_tile < num_tiles_s1; + ++preload_tile) { + if constexpr (DAV_CUBE) { + for (int sub_tile = 0; sub_tile < static_cast(kTileFactor); ++sub_tile) { + qkAccTileEvtID = assign_running_acc_tile(qkAccTile); + compute_qk( + qkPipe, preload_tile, sub_tile, q_block, k, qMatTile[0], + kMatTile[k_src_pingpong_id % kMatTNBuffers], qkAccTile, qkSlotGlobal, + k_src_pingpong_id % kMatTNBuffers, qkAccTileEvtID, block_idx); + k_src_pingpong_id++; + } + } + if constexpr (DAV_VEC) { + for (int row_slice = 0; row_slice < static_cast(kTileFactor); ++row_slice) { + // Init only on the very first S1 tile; row_slice partitions rows within that tile + compute_p( + qkPipe, pPipe, preload_tile, row_slice, exp_max_ififo_block, global_sum_block, exp_max_block, + qkVecTile[p_gu_src_pingpong_id % srcVecTNBuffers], x_expT[p_gu_src_pingpong_id % xexpVecTNBuffers], + input_reduce_tmp, m1_local_max, l1_local_sum, m2_global_max, l2_global_sum, + l1_exp_max_ififo[preload_tile % qkp_tile_fifo_size], triu, qkSlotGlobal, pSlotGlobal, + p_gu_src_pingpong_id % xexpVecTNBuffers, block_idx); + p_gu_src_pingpong_id++; + } + } + } + + for (int tile_id = 0; tile_id < num_tiles_s1; ++tile_id) { + int next_qk_tile = (tile_id + static_cast(qkPreloadNum) >= num_tiles_s1) ? + -1 : + (tile_id + static_cast(qkPreloadNum)); + + if (next_qk_tile != -1) + qkAccTileEvtID = assign_running_acc_tile(qkAccTile); + pvAccTileEvtID = assign_running_acc_tile(pvAccTile); + + for (int sub_tile = 0; sub_tile < static_cast(kTileFactor); ++sub_tile) { + if constexpr (DAV_CUBE) { + if (next_qk_tile != -1) { + compute_qk( + qkPipe, next_qk_tile, sub_tile, q_block, k, qMatTile[0], + kMatTile[k_src_pingpong_id % kMatTNBuffers], qkAccTile, qkSlotGlobal, + k_src_pingpong_id % kMatTNBuffers, qkAccTileEvtID, block_idx); + k_src_pingpong_id++; + } + } + + if constexpr (DAV_VEC) { + if (next_qk_tile != -1) { + compute_p( + qkPipe, pPipe, next_qk_tile, sub_tile, exp_max_ififo_block, global_sum_block, + exp_max_block, qkVecTile[p_gu_src_pingpong_id % srcVecTNBuffers], + x_expT[p_gu_src_pingpong_id % xexpVecTNBuffers], input_reduce_tmp, m1_local_max, + l1_local_sum, m2_global_max, l2_global_sum, + l1_exp_max_ififo[next_qk_tile % qkp_tile_fifo_size], triu, qkSlotGlobal, pSlotGlobal, + p_gu_src_pingpong_id % xexpVecTNBuffers, block_idx); + p_gu_src_pingpong_id++; + } + } + + if constexpr (DAV_CUBE) { + compute_pv( + pPipe, pvPipe, tile_id, sub_tile, v, pMatTile[pv_src_pingpong_id % pMatTNBuffers], + vMatTile[pv_src_pingpong_id % vMatTNBuffers], pvAccTile, + pSlotGlobal, pvSlotGlobal, pv_src_pingpong_id % vMatTNBuffers + PV_EVENT_ID0, pvAccTileEvtID, + block_idx); + pv_src_pingpong_id++; + } + } + + if constexpr (DAV_VEC) { + compute_gu( + pvPipe, tile_id, num_tiles_s1, o_out_block, o_parts_block, runningOTile, + pvVecTile[p_gu_src_pingpong_id % outOTileNBuffers], l1_exp_max_ififo[tile_id % qkp_tile_fifo_size], + l2_global_sum, p_gu_src_pingpong_id % outOTileNBuffers); + p_gu_src_pingpong_id++; + } + } + + if constexpr (DAV_CUBE) { + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID0); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID1); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID2); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID3); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID0); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID1); +#ifdef __DAV_C220_CUBE__ + wait_flag_dev(CV_BLOCK_END); // wait for vector done all reading +#endif + } + + if constexpr (DAV_VEC) { + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID0); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID0); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID1); +#ifdef __DAV_C220_VEC__ + ffts_cross_core_sync(PIPE_MTE2, _getFFTSMsg(CV_CORE_SYNC, CV_BLOCK_END)); // cube can exit CV comm now +#endif + } + + pipe_barrier(PIPE_ALL); + uint64_t tEnd = get_sys_cnt(); + if (profile_entry != nullptr) { + profile_entry[1] = tEnd; + } +#ifdef _DEBUG + if constexpr (DAV_CUBE) { + cce::printf("Core %d Cube Block %d, Start @%d End @%d (%d us)\n", get_coreid(), block_idx, int(tStart), + int(tEnd), int(tEnd - tStart) * 20 / 1000); + } else { + cce::printf("Core %d Vec Block %d, SubBlock %d, Start @%d End @%d (%d us)\n", get_coreid(), block_idx, + int(get_subblockid()), int(tStart), int(tEnd), int(tEnd - tStart) * 20 / 1000); + } +#endif +} + +// Empty kernel to warm up cores +__global__ AICORE __attribute__((aic)) void warmup_kernel() +{} + +// Host wrapper +template +void LaunchTFA(uint16_t *ffts, aclFloat16 *q, aclFloat16 *k, aclFloat16 *v, aclFloat16 *p_tile_fifo, + float *exp_max_ififo, float *global_sum_out, float *exp_max_out, float *o_out, float *o_parts_out, + float *qk_tile_fifo, float *pv_tile_fifo, uint8_t *profile_data, aclrtStream stream, + uint8_t *cv_comm_buf) +{ + static_assert(S0 % CUBE_S0 == 0, "S0 must be divisible by CUBE_S0"); + constexpr uint32_t block_rows = S0 / CUBE_S0; + +#if defined(__DAV_C220_CUBE__) || defined(__DAV_C220_VEC__) + // Warm up all cores first, then prefetch q/k/v into L2 + warmup_kernel<<<24, nullptr, stream>>>(); + + const uint64_t q_bytes = static_cast(S0) * static_cast(HEAD_SIZE) * sizeof(half); + const uint64_t kv_bytes = static_cast(S1) * static_cast(HEAD_SIZE) * sizeof(half); + constexpr bool kPrefetchUseSdma = true; // simulation cannot use sdma + constexpr int kPrefetchAivCores = 40; // only used when kPrefetchUseSdma is false + + if constexpr (kPrefetchUseSdma) { + PTO_PREFETCH((__gm__ void *)q, q_bytes, stream); + PTO_PREFETCH((__gm__ void *)k, kv_bytes, stream); + PTO_PREFETCH((__gm__ void *)v, kv_bytes, stream); + } else { + PTO_PREFETCH((__gm__ void *)q, q_bytes, stream); + PTO_PREFETCH((__gm__ void *)k, kv_bytes, stream); + PTO_PREFETCH((__gm__ void *)v, kv_bytes, stream); + } +#endif + + runTFA<<>>( + (__gm__ uint64_t *)ffts, (half *)q, (half *)k, (half *)v, (half *)p_tile_fifo, exp_max_ififo, global_sum_out, + exp_max_out, o_out, o_parts_out, qk_tile_fifo, pv_tile_fifo, cv_comm_buf, profile_data); +} + +// Backward-compatible overload without profiling buffer +template +void LaunchTFA(uint16_t *ffts, aclFloat16 *q, aclFloat16 *k, aclFloat16 *v, aclFloat16 *p_tile_fifo, + float *exp_max_ififo, float *global_sum_out, float *exp_max_out, float *o_out, float *o_parts_out, + float *qk_tile_fifo, float *pv_tile_fifo, aclrtStream stream, uint8_t *cv_comm_buf) +{ + LaunchTFA(ffts, q, k, v, p_tile_fifo, exp_max_ififo, global_sum_out, exp_max_out, o_out, + o_parts_out, qk_tile_fifo, pv_tile_fifo, nullptr, stream, cv_comm_buf); +} + +#include "generated_cases.h" + +#define INSTANTIATE_TFA(S0, HEAD, S1, CUBE_S0, CUBE_S1, TILE_S1, QK_PRELOAD, CAUSAL_MASK) \ + template void LaunchTFA( \ + uint16_t * ffts, aclFloat16 * q, aclFloat16 * k, aclFloat16 * v, aclFloat16 * p_out, float *p_out_fp32, \ + float *global_sum_out, float *exp_max_out, float *o_out, float *o_parts_out, float *qk_out, float *pv_out, \ + uint8_t *profile_data, aclrtStream stream, uint8_t *cv_comm_buf); \ + template void LaunchTFA( \ + uint16_t * ffts, aclFloat16 * q, aclFloat16 * k, aclFloat16 * v, aclFloat16 * p_out, float *p_out_fp32, \ + float *global_sum_out, float *exp_max_out, float *o_out, float *o_parts_out, float *qk_out, float *pv_out, \ + aclrtStream stream, uint8_t *cv_comm_buf); \ + template void LaunchTFA( \ + uint16_t * ffts, aclFloat16 * q, aclFloat16 * k, aclFloat16 * v, aclFloat16 * p_out, float *p_out_fp32, \ + float *global_sum_out, float *exp_max_out, float *o_out, float *o_parts_out, float *qk_out, float *pv_out, \ + uint8_t *profile_data, aclrtStream stream, uint8_t *cv_comm_buf); \ + template void LaunchTFA( \ + uint16_t * ffts, aclFloat16 * q, aclFloat16 * k, aclFloat16 * v, aclFloat16 * p_out, float *p_out_fp32, \ + float *global_sum_out, float *exp_max_out, float *o_out, float *o_parts_out, float *qk_out, float *pv_out, \ + aclrtStream stream, uint8_t *cv_comm_buf); + +TFA_FOR_EACH_CASE(INSTANTIATE_TFA) + +#undef INSTANTIATE_TFA \ No newline at end of file diff --git a/examples/aot/flash_attention/split_pipe/compile.sh b/examples/aot/flash_attention/split_pipe/compile.sh new file mode 100644 index 00000000..e23d4a61 --- /dev/null +++ b/examples/aot/flash_attention/split_pipe/compile.sh @@ -0,0 +1,84 @@ +#!/usr/bin/env bash +# Copyright (c) 2026 Huawei Technologies Co., Ltd. +# CANN Open Software License Agreement Version 2.0 +# +# AOT-compile the flash-attention kernel for one or more sequence lengths. +# +# Usage: +# bash compile.sh # build the default set: NUM_TILES = 16,32,64,128 +# # -> fa.so, fa_32.so, fa_64.so, fa_128.so +# # (NUM_TILES=16 → 8k seqlen → fa.so) +# FA_TILES=16,64 bash compile.sh # build only the listed NUM_TILES variants +# FA_TILES=16 bash compile.sh # single-variant build (legacy behavior) +# +# Each NUM_TILES value N produces fa${TAG}.{mlir,cpp,so} where +# TAG = "" if N == 16 (the builder's default → plain "fa.so") +# TAG = "_N" otherwise. + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +ARTIFACT_DIR="${SCRIPT_DIR}/build_artifacts" +PTO_LIB_PATH="${PTO_LIB_PATH:-/sources/pto-isa}" + +mkdir -p "${ARTIFACT_DIR}" + +build_variant() { + local num_tiles="$1" + local tag + if [[ "${num_tiles}" == "16" ]]; then + tag="" + else + tag="_${num_tiles}" + fi + local mlir_path="${ARTIFACT_DIR}/fa${tag}.mlir" + local generated_cpp="${ARTIFACT_DIR}/fa${tag}.cpp" + local lib_path="${ARTIFACT_DIR}/fa${tag}.so" + + echo "==> Building NUM_TILES=${num_tiles} -> $(basename "${lib_path}")" + rm -f "${mlir_path}" "${generated_cpp}" "${lib_path}" + + FA_NUM_TILES="${num_tiles}" \ + FA_S1_TILE="${FA_S1_TILE:-512}" \ + FA_Q_ROWS="${FA_Q_ROWS:-3072}" \ + python "${SCRIPT_DIR}/kernels/fa_performance_builder.py" > "${mlir_path}" + ptoas --pto-arch=a3 --pto-level=level3 --enable-insert-sync "${mlir_path}" > "${generated_cpp}" + + bisheng \ + -I"${PTO_LIB_PATH}/include" \ + -fPIC -shared -D_FORTIFY_SOURCE=2 -O2 -std=c++17 \ + -Wno-macro-redefined -Wno-ignored-attributes -fstack-protector-strong \ + -xcce -Xhost-start -Xhost-end \ + -mllvm -cce-aicore-stack-size=0x8000 \ + -mllvm -cce-aicore-function-stack-size=0x8000 \ + -mllvm -cce-aicore-record-overflow=true \ + -mllvm -cce-aicore-addr-transform \ + -mllvm -cce-aicore-dcci-insert-for-scalar=false \ + -cce-enable-mix \ + --npu-arch=dav-2201 -DMEMORY_BASE \ + -std=gnu++17 \ + -DKERNEL_CPP="\"${generated_cpp}\"" \ + "${SCRIPT_DIR}/caller.cpp" \ + -o "${lib_path}" + + echo " built ${lib_path}" + { + echo "FA_NUM_TILES=${num_tiles}" + echo "FA_S1_TILE=${FA_S1_TILE:-512}" + echo "FA_Q_ROWS=${FA_Q_ROWS:-3072}" + } >"${ARTIFACT_DIR}/fa${tag}.build_env" +} + +# Default tile set covers seqlen = NUM_TILES * FA_S1_TILE (FA_S1_TILE defaults to 512). +# Examples at FA_S1_TILE=512: 16 -> 8k, 32 -> 16k, 64 -> 32k, 128 -> 64k. +# FA_Q_ROWS defaults to 3072; must match python run env when invoking kernels. +FA_TILES="${FA_TILES:-16,32,64,128}" + +IFS=',' read -r -a tile_list <<< "${FA_TILES}" +for nt in "${tile_list[@]}"; do + nt_trim="$(echo "${nt}" | tr -d '[:space:]')" + [[ -z "${nt_trim}" ]] && continue + build_variant "${nt_trim}" +done + +echo "Done. Built variants: ${FA_TILES}" diff --git a/examples/aot/flash_attention/split_pipe/kernels/fa_performance_builder.py b/examples/aot/flash_attention/split_pipe/kernels/fa_performance_builder.py new file mode 100644 index 00000000..795c2f41 --- /dev/null +++ b/examples/aot/flash_attention/split_pipe/kernels/fa_performance_builder.py @@ -0,0 +1,704 @@ +# Flash-Attention kernel builder. Ports the reference +# `fa_performance_kernel.cpp` (a2a3) software-pipelined schedule onto the +# pto-dsl multi-pipe primitives (ptoas >= 0.29). +# +# This file mirrors the reference C++ scheduler: +# +# constexpr int qkPreloadNum = 2; // warmup depth +# +# /* Prologue: cube emits QK[0..QK_PRELOAD-1]; vec consumes them and +# pushes P[0..QK_PRELOAD-1]. No PV / gu yet. */ +# +# /* Steady state, tile_id 0..N-1: +# cube: if (t+QK_PRELOAD < N) compute_qk(t+QK_PRELOAD); +# compute_pv(tile_id); +# vec: if (t+QK_PRELOAD < N) compute_p(t+QK_PRELOAD); +# compute_gu(tile_id); +# so vec's softmax for the LOOK-AHEAD tile fills the QK consumption +# slot WHILE the cube is computing the current PV[t]. The cube +# stops being blocked on a freshly-pushed P (softmax of t+2 has +# already pushed P[t+2] into the FIFO by the time cube needs it). */ +# +# /* Epilogue: drain the last QK_PRELOAD tiles' PV / gu. */ +# +# The new dependency that the reference solves with `l1_exp_max_ififo`: +# softmax(t+QK_PRELOAD) overwrites the running scratch tile `exp_max` +# (the rescale factor needed by gu(t)). With QK_PRELOAD=2 we therefore +# need a 2-deep ring of `exp_max` tiles (`exp_max_a`, `exp_max_b`). We +# implement the ring by unrolling the steady-state loop in pairs of 2 +# iterations: even iters use `exp_max_a`, odd iters use `exp_max_b`. +# +# Other state in the softmax (`new_global_max`, `new_global_sum`) does +# NOT need a ring: it is monotonic accumulator state across all tiles +# and is only read at the very end (the divide into o_tile). The fact +# that softmax(t+2) advances it ahead of gu(t) is harmless because gu +# never reads it. +# +# Sub-block (TILE_UP_DOWN) parallelism is preserved on every pipe op. +# +# Hardware-flag accounting (§3.5): 3 unidir pipes × 2 = 6 flags ≪ 16. + +from ptodsl import pto, tile, to_ir_module +from ptodsl import scalar as s + +import math +import os + +const = s.const + +# --------------------------------------------------------------------------- +# Static shapes (must match run.py constants) +# --------------------------------------------------------------------------- +S0 = 32 # Q rows per block (vec uses S0_HALF rows; matches cpp_ref cube blocking story) +S0_HALF = S0 // 2 # rows per AIV sub-block +HEAD = 128 # attention head dimension — same as cpp_ref/split_pipe/run.py test_flash(..., head=128) +# cpp_ref benchmarks commonly use tile_s1=512; override with FA_S1_TILE for bring-up/debug (256 fits tighter UB). +S1_TILE = int(os.environ.get("FA_S1_TILE", "512")) +# NUM_TILES is overridable via the FA_NUM_TILES env var so the same builder +# can produce kernels for different sequence lengths +# (S1_TOTAL = S1_TILE * NUM_TILES). +# Constraint: (NUM_TILES - QK_PRELOAD) must be even (steady-state pair unroll). +NUM_TILES = int(os.environ.get("FA_NUM_TILES", "16")) + +S1_TOTAL = S1_TILE * NUM_TILES + +# Total Q rows: default 3072 = 128 * 24 matches cpp_ref benchmark `s0 = 128 * 24`. +Q_ROWS = int(os.environ.get("FA_Q_ROWS", "3072")) +NUM_Q_BLOCKS = Q_ROWS // S0 + +# QK preload depth — must be >= 1; reference uses 2. The vec pre-softmaxes +# tiles 0..QK_PRELOAD-1, then the steady-state loop interleaves softmax(t+QK_PRELOAD) +# with gu(t), and the epilogue drains the last QK_PRELOAD gu's. +# (NUM_TILES - QK_PRELOAD) must be even — steady state is pair-unrolled to +# ping-pong the exp_max ring (see below). +QK_PRELOAD = 2 +assert ( + NUM_TILES - QK_PRELOAD +) % 2 == 0, "Steady-state pair unrolling requires (NUM_TILES - QK_PRELOAD) % 2 == 0" +STEADY_PAIRS = (NUM_TILES - QK_PRELOAD) // 2 + +# Per-pipe slot sizes (bytes). +SLOT_SIZE_QK = S0 * S1_TILE * 4 # fp32 QK accumulator +SLOT_SIZE_PV = S0 * HEAD * 4 # fp32 PV accumulator +SLOT_SIZE_P = S0 * S1_TILE * 2 # fp16 P matrix sent vec → cube + +# `dir_mask = 1/2` always lowers to slot_num = 8 on a3 (design doc §4.4). +SLOT_NUM = 8 +# Kept at 1: bumping to 2 overflows VEC UB at S1_TILE=512. +QK_LOCAL_SLOT_NUM = 1 +# PV uses lower-level l2g2l_pipe with local_slot_num=1; the legacy +# aic/aiv_initialize_pipe path forces local = SLOT_NUM = 8 (32 KB MAT) +# whereas local=1 here is just 4 KB. +PV_LOCAL_SLOT_NUM = 1 + +# GM-staged FIFO bytes / fp32 elements per AIC block. +GM_BYTES_PER_BLOCK = (SLOT_SIZE_QK + SLOT_SIZE_PV + SLOT_SIZE_P) * SLOT_NUM +GM_ELEMS_PER_BLOCK = GM_BYTES_PER_BLOCK // 4 +GM_QK_OFF_F32 = 0 +GM_PV_OFF_F32 = (SLOT_SIZE_QK * SLOT_NUM) // 4 +GM_P_OFF_F32 = GM_PV_OFF_F32 + (SLOT_SIZE_PV * SLOT_NUM) // 4 + +FIFO_BYTES_QK = SLOT_SIZE_QK * QK_LOCAL_SLOT_NUM +FIFO_BYTES_PV = SLOT_SIZE_PV * PV_LOCAL_SLOT_NUM +FIFO_BYTES_P = SLOT_SIZE_P * SLOT_NUM + +# --pto-level=level3 requires explicit byte addresses for every reserve/alloc. +# Vector UB is 192 KiB; recv buffers for `tpop` must fit entirely below that limit. +_TILE_FP32_BYTES = S0_HALF * S1_TILE * 4 +_TILE_FP16_BYTES = S0_HALF * S1_TILE * 2 +_O_TILE_BYTES = S0_HALF * HEAD * 4 +_VEC_RED_STRIDE = 64 + +# Cube MAT / ACC / LEFT — fits in L1 with K/V sharing RIGHT at addr 0 (single tile footprint). +MAT_Q_OFF = 0 +MAT_K_OFF = MAT_Q_OFF + S0 * HEAD * 2 +MAT_P_RECV_OFF = MAT_K_OFF + HEAD * S1_TILE * 2 +MAT_V_OFF = MAT_P_RECV_OFF + S0 * S1_TILE * 2 +_MAT_CUBE_TAIL = MAT_V_OFF + S1_TILE * HEAD * 2 +_MAT_ALIGN = 65536 +MAT_P_FIFO_OFF = (_MAT_CUBE_TAIL + _MAT_ALIGN - 1) // _MAT_ALIGN * _MAT_ALIGN + +LEFT_Q_OFF = 0 +LEFT_P_OFF = LEFT_Q_OFF + S0 * HEAD * 2 + +RIGHT_KV_OFF = 0 + +ACC_QK_OFF = 0 +ACC_PV_OFF = ACC_QK_OFF + S0 * S1_TILE * 4 + +# Vec scratch (FIFOs then softmax stack). PV `tpop` reuses tmp_tile storage — pipeline serializes gu vs softmax per head32 schedule. +VEC_QK_FIFO_OFF = 0 +VEC_PV_FIFO_OFF = VEC_QK_FIFO_OFF + FIFO_BYTES_QK +_VEC_POST_FIFO_OFF = VEC_PV_FIFO_OFF + FIFO_BYTES_PV +VEC_QK_RECV_OFF = _VEC_POST_FIFO_OFF +VEC_TMP_OFF = VEC_QK_RECV_OFF + _TILE_FP32_BYTES +# GU consumes PV before softmax touches tmp again (pairs head32 schedule). +VEC_PV_RECV_OFF = VEC_TMP_OFF +VEC_P_FP32_OFF = VEC_TMP_OFF + _TILE_FP32_BYTES +# fp16 P lives in the **upper half** of the fp32 softmax tile — avoid bisheng assigning +# fp32/fp16 Tiles to the identical UB offset (duplicate TASSIGN breaks TCVT on device). +VEC_P_FP16_OFF = VEC_P_FP32_OFF + _TILE_FP16_BYTES +VEC_O_OFF = VEC_P_FP32_OFF + _TILE_FP32_BYTES +VEC_RED_BASE_OFF = VEC_O_OFF + _O_TILE_BYTES +VEC_NEW_GLOBAL_MAX_OFF = VEC_RED_BASE_OFF + 0 * _VEC_RED_STRIDE +VEC_LOCAL_MAX_OFF = VEC_RED_BASE_OFF + 1 * _VEC_RED_STRIDE +VEC_NEW_GLOBAL_SUM_OFF = VEC_RED_BASE_OFF + 2 * _VEC_RED_STRIDE +VEC_LOCAL_SUM_OFF = VEC_RED_BASE_OFF + 3 * _VEC_RED_STRIDE +VEC_EXP_MAX_A_OFF = VEC_RED_BASE_OFF + 4 * _VEC_RED_STRIDE +VEC_EXP_MAX_B_OFF = VEC_RED_BASE_OFF + 5 * _VEC_RED_STRIDE +_VEC_UB_TAIL = VEC_EXP_MAX_B_OFF + _VEC_RED_STRIDE + 128 +assert _VEC_UB_TAIL <= 192 * 1024, ( + f"VEC UB overflow tail={_VEC_UB_TAIL}; reduce S1_TILE or S0" +) +ID_QK = 10 # Cube → Vec, dir_mask = 1 (uses lower-level l2g2l) +ID_PV = 20 # Cube → Vec, dir_mask = 1 (legacy) +ID_P = 30 # Vec → Cube, dir_mask = 2 (legacy) + +SPLIT_UP_DOWN = 1 + + +# --------------------------------------------------------------------------- +# Type definitions (identical to multipipe builder) +# --------------------------------------------------------------------------- +def meta_data(): + fp16 = pto.float16 + fp32 = pto.float32 + ffts_ty = pto.ffts_type + ptr_fp16 = pto.PtrType(fp16) + ptr_fp32 = pto.PtrType(fp32) + i32 = pto.int32 + + qkv_tensor_ty = pto.TensorType(rank=2, dtype=fp16) + o_tensor_ty = pto.TensorType(rank=2, dtype=fp32) + + q_sub_ty = pto.SubTensorType(shape=[S0, HEAD], dtype=fp16) + kt_sub_ty = pto.SubTensorType(shape=[HEAD, S1_TILE], dtype=fp16) + v_sub_ty = pto.SubTensorType(shape=[S1_TILE, HEAD], dtype=fp16) + o_sub_ty = pto.SubTensorType(shape=[S0, HEAD], dtype=fp32) + o_sub_half_ty = pto.SubTensorType(shape=[S0_HALF, HEAD], dtype=fp32) + + # --- Cube tile types --- + q_mat_ty = pto.TileBufType(shape=[S0, HEAD], dtype=fp16, memory_space="MAT") + q_left_ty = pto.TileBufType(shape=[S0, HEAD], dtype=fp16, memory_space="LEFT") + k_mat_ty = pto.TileBufType( + shape=[HEAD, S1_TILE], + dtype=fp16, + memory_space="MAT", + config=pto.TileBufConfig(blayout="RowMajor", slayout="ColMajor"), + ) + k_right_ty = pto.TileBufType( + shape=[HEAD, S1_TILE], dtype=fp16, memory_space="RIGHT" + ) + qk_acc_ty = pto.TileBufType(shape=[S0, S1_TILE], dtype=fp32, memory_space="ACC") + p_recv_ty = pto.TileBufType( + shape=[S0, S1_TILE], + dtype=fp16, + memory_space="MAT", + ) + p_left_ty = pto.TileBufType(shape=[S0, S1_TILE], dtype=fp16, memory_space="LEFT") + v_mat_ty = pto.TileBufType(shape=[S1_TILE, HEAD], dtype=fp16, memory_space="MAT") + v_right_ty = pto.TileBufType( + shape=[S1_TILE, HEAD], dtype=fp16, memory_space="RIGHT" + ) + pv_acc_ty = pto.TileBufType(shape=[S0, HEAD], dtype=fp32, memory_space="ACC") + + # --- Vector tile types (HALF-size — split=1 on every pipe op) --- + qk_vec_ty = pto.TileBufType( + shape=[S0_HALF, S1_TILE], dtype=fp32, memory_space="VEC" + ) + p_fp32_ty = pto.TileBufType( + shape=[S0_HALF, S1_TILE], dtype=fp32, memory_space="VEC" + ) + p_fp16_ty = pto.TileBufType( + shape=[S0_HALF, S1_TILE], dtype=fp16, memory_space="VEC" + ) + pv_vec_ty = pto.TileBufType(shape=[S0_HALF, HEAD], dtype=fp32, memory_space="VEC") + red_ty = pto.TileBufType( + shape=[S0_HALF, 1], + dtype=fp32, + memory_space="VEC", + config=pto.TileBufConfig(blayout="ColMajor", slayout="NoneBox"), + ) + red_row_ty = pto.TileBufType( + shape=[1, S0_HALF], + dtype=fp32, + memory_space="VEC", + ) + o_vec_ty = pto.TileBufType(shape=[S0_HALF, HEAD], dtype=fp32, memory_space="VEC") + + return locals() + + +# --------------------------------------------------------------------------- +# Module +# --------------------------------------------------------------------------- +@to_ir_module(meta_data=meta_data, module=True) +def module(): + + # =================================================================== + # Cube kernel — PRELOAD=2 software-pipelined. + # =================================================================== + @pto.func(kernel="cube") + def cube_kernel( + gm_slot_buffer: "ptr_fp32", + gm_q: "ptr_fp16", + gm_k: "ptr_fp16", + gm_v: "ptr_fp16", + ) -> None: + c0 = const(0) + c1 = const(1) + c2 = const(2) + cS0 = const(S0) + cHEAD = const(HEAD) + cS1_TILE = const(S1_TILE) + cS1_TOTAL = const(S1_TOTAL) + cNUM_TILES = const(NUM_TILES) + cNUM_Q_BLOCKS = const(NUM_Q_BLOCKS) + + num_blocks = s.index_cast(pto.get_block_num()) + bid = s.index_cast(pto.get_block_idx()) + floor_div = cNUM_Q_BLOCKS // num_blocks + extra = cNUM_Q_BLOCKS % num_blocks + fat_start = bid * (floor_div + c1) + thin_start = extra * (floor_div + c1) + (bid - extra) * floor_div + qb_start = s.select(bid < extra, fat_start, thin_start) + q_blocks_this_core = s.select(bid < extra, floor_div + c1, floor_div) + qb_end = qb_start + q_blocks_this_core + + gm_blk_offset = bid * const(GM_ELEMS_PER_BLOCK) + gm_blk = pto.add_ptr(gm_slot_buffer, gm_blk_offset) + gm_qk = pto.add_ptr(gm_blk, const(GM_QK_OFF_F32)) + gm_pv = pto.add_ptr(gm_blk, const(GM_PV_OFF_F32)) + gm_p = pto.add_ptr(gm_blk, const(GM_P_OFF_F32)) + + # ---- Pipe QK_C2V (lower-level init) ---- + qk_c2v_import = pto.import_reserved_buffer( + name="fa_qk_c2v_fifo", peer_func="@vector_kernel" + ) + qk_pipe = pto.initialize_l2g2l_pipe( + dir_mask=1, + slot_size=SLOT_SIZE_QK, + slot_num=SLOT_NUM, + local_slot_num=QK_LOCAL_SLOT_NUM, + gm_addr=gm_qk, + local_addr=qk_c2v_import, + ) + + # ---- Pipe PV_C2V (lower-level init: PV_LOCAL_SLOT_NUM VEC slots) ---- + pv_c2v_import = pto.import_reserved_buffer( + name="fa_pv_c2v_fifo", peer_func="@vector_kernel" + ) + pv_pipe = pto.initialize_l2g2l_pipe( + dir_mask=1, + slot_size=SLOT_SIZE_PV, + slot_num=SLOT_NUM, + local_slot_num=PV_LOCAL_SLOT_NUM, + gm_addr=gm_pv, + local_addr=pv_c2v_import, + ) + + # ---- Pipe P_V2C (id = ID_P) ---- + p_v2c_local = pto.reserve_buffer( + name="fa_p_v2c_fifo", + size=FIFO_BYTES_P, + location="MAT", + auto_alloc=False, + base=MAT_P_FIFO_OFF, + ) + pto.aic_initialize_pipe( + id=ID_P, + dir_mask=2, + slot_size=SLOT_SIZE_P, + gm_slot_buffer=gm_p, + c2v_consumer_buf=const(0, s.int32), + v2c_consumer_buf=p_v2c_local, + nosplit=False, + ) + + right_base = const(RIGHT_KV_OFF, s.int64) + q_mat = pto.alloc_tile(q_mat_ty, addr=const(MAT_Q_OFF, s.int64)) + q_left = pto.alloc_tile(q_left_ty, addr=const(LEFT_Q_OFF, s.int64)) + k_mat_s = pto.alloc_tile(k_mat_ty, addr=const(MAT_K_OFF, s.int64)) + k_right_s = pto.alloc_tile(k_right_ty, addr=right_base) + qk_acc_s = pto.alloc_tile(qk_acc_ty, addr=const(ACC_QK_OFF, s.int64)) + p_recv_s = pto.alloc_tile(p_recv_ty, addr=const(MAT_P_RECV_OFF, s.int64)) + p_left_s = pto.alloc_tile(p_left_ty, addr=const(LEFT_P_OFF, s.int64)) + v_mat_s = pto.alloc_tile(v_mat_ty, addr=const(MAT_V_OFF, s.int64)) + v_right_s = pto.alloc_tile(v_right_ty, addr=right_base) + pv_acc_s = pto.alloc_tile(pv_acc_ty, addr=const(ACC_PV_OFF, s.int64)) + # Aliasing wrappers: keep the per-iteration `[buf]` indexing pattern + # in the body even though all slots currently point at one alloc. + k_mat = [k_mat_s, k_mat_s] + k_right = [k_right_s, k_right_s] + qk_acc = [qk_acc_s, qk_acc_s] + p_recv = [p_recv_s, p_recv_s] + p_left = [p_left_s, p_left_s] + v_mat = [v_mat_s, v_mat_s] + v_right = [v_right_s, v_right_s] + pv_acc = [pv_acc_s, pv_acc_s] + + cQ_ROWS = const(Q_ROWS) + tv_q = pto.as_tensor( + qkv_tensor_ty, ptr=gm_q, shape=[cQ_ROWS, cHEAD], strides=[cHEAD, c1] + ) + tv_k = pto.as_tensor( + qkv_tensor_ty, + ptr=gm_k, + shape=[cHEAD, cS1_TOTAL], + strides=[c1, cHEAD], + ) + tv_v = pto.as_tensor( + qkv_tensor_ty, + ptr=gm_v, + shape=[cS1_TOTAL, cHEAD], + strides=[cHEAD, c1], + ) + + for qb in pto.range(qb_start, qb_end, c1): + q_row_off = qb * cS0 + + q_view = pto.slice_view( + q_sub_ty, source=tv_q, offsets=[q_row_off, c0], sizes=[cS0, cHEAD] + ) + pto.load(q_view, q_mat) + tile.mov(q_mat, q_left) + + # =================== Cube prologue: emit QK[0..QK_PRELOAD-1] =================== + # Each prologue QK uses its own k_mat / k_right / qk_acc slot + # so MTE2 load of K[1] overlaps the M of QK[0]. + for k in range(QK_PRELOAD): + k_off = const(k * S1_TILE) + kt_view_k = pto.slice_view( + kt_sub_ty, + source=tv_k, + offsets=[c0, k_off], + sizes=[cHEAD, cS1_TILE], + ) + pto.load(kt_view_k, k_mat[k]) + tile.mov(k_mat[k], k_right[k]) + tile.matmul(q_left, k_right[k], qk_acc[k]) + pto.tpush(qk_acc[k], qk_pipe, SPLIT_UP_DOWN) + + # Preload V[0] for the very first PV. + v_view_0 = pto.slice_view( + v_sub_ty, + source=tv_v, + offsets=[c0, c0], + sizes=[cS1_TILE, cHEAD], + ) + pto.load(v_view_0, v_mat[0]) + + # =================== Cube steady state =================== + # Pair-unrolled. Iter t (parity = t%2 → buffer index `b`): + # * load K[next_qk = t+QK_PRELOAD] into k_mat[b] + # (next_qk parity equals t parity since QK_PRELOAD == 2) + # * pop / mov P[t] into p_left[b]; mov V[t] (in v_mat[b]) → v_right[b] + # * preload V[t+1] into v_mat[1-b] + # * matmul PV[t] into pv_acc[b]; push + # * matmul QK[next_qk] into qk_acc[b]; push + # Pair handler: + def emit_cube_step(t_idx, b): + # next_qk = t_idx + QK_PRELOAD (only used when in main range) + next_qk = t_idx + const(QK_PRELOAD) + kt_off = next_qk * cS1_TILE + kt_view = pto.slice_view( + kt_sub_ty, + source=tv_k, + offsets=[c0, kt_off], + sizes=[cHEAD, cS1_TILE], + ) + pto.load(kt_view, k_mat[b]) + + p_raw = pto.tpop_from_aiv(p_recv_ty, SPLIT_UP_DOWN, id=ID_P) + tile.mov(p_raw, p_left[b]) + pto.tfree_from_aiv(SPLIT_UP_DOWN, id=ID_P) + tile.mov(v_mat[b], v_right[b]) + + v_off = (t_idx + c1) * cS1_TILE + v_view = pto.slice_view( + v_sub_ty, + source=tv_v, + offsets=[v_off, c0], + sizes=[cS1_TILE, cHEAD], + ) + pto.load(v_view, v_mat[1 - b]) + + tile.matmul(p_left[b], v_right[b], pv_acc[b]) + pto.tpush(pv_acc[b], pv_pipe, SPLIT_UP_DOWN) + + tile.mov(k_mat[b], k_right[b]) + tile.matmul(q_left, k_right[b], qk_acc[b]) + pto.tpush(qk_acc[b], qk_pipe, SPLIT_UP_DOWN) + + assert (NUM_TILES - QK_PRELOAD) % 2 == 0 + for p in pto.range(c0, const((NUM_TILES - QK_PRELOAD) // 2), c1): + t_a = p * c2 + emit_cube_step(t_a, 0) + t_b = p * c2 + c1 + emit_cube_step(t_b, 1) + + # =================== Cube epilogue: drain last QK_PRELOAD PVs =================== + # Tile_id range: NUM_TILES-QK_PRELOAD .. NUM_TILES-1. + # NUM_TILES is even and QK_PRELOAD is even, so the first epilogue + # tile has parity 0. v_mat[0] holds V[NUM_TILES-QK_PRELOAD] thanks + # to the last steady-state preload (it loaded V[t_b+1] = V[NUM_TILES-QK_PRELOAD] + # into v_mat[1-1]=v_mat[0]). + for k in range(QK_PRELOAD): + b = k % 2 + p_raw = pto.tpop_from_aiv(p_recv_ty, SPLIT_UP_DOWN, id=ID_P) + tile.mov(p_raw, p_left[b]) + pto.tfree_from_aiv(SPLIT_UP_DOWN, id=ID_P) + tile.mov(v_mat[b], v_right[b]) + # Preload V[t+1] into the OPPOSITE slot, only if not the + # very last tile. + if k < QK_PRELOAD - 1: + next_v_idx = NUM_TILES - QK_PRELOAD + k + 1 + v_off_k = const(next_v_idx * S1_TILE) + v_view_k = pto.slice_view( + v_sub_ty, + source=tv_v, + offsets=[v_off_k, c0], + sizes=[cS1_TILE, cHEAD], + ) + pto.load(v_view_k, v_mat[1 - b]) + tile.matmul(p_left[b], v_right[b], pv_acc[b]) + pto.tpush(pv_acc[b], pv_pipe, SPLIT_UP_DOWN) + + # =================================================================== + # Vector kernel — PRELOAD=2 software-pipelined. + # =================================================================== + @pto.func(kernel="vector") + def vector_kernel( + gm_slot_buffer: "ptr_fp32", + gm_o: "ptr_fp32", + ) -> None: + c0 = const(0) + c1 = const(1) + c2 = const(2) + cS0 = const(S0) + cS0_HALF = const(S0_HALF) + cHEAD = const(HEAD) + cNUM_TILES = const(NUM_TILES) + cNUM_Q_BLOCKS = const(NUM_Q_BLOCKS) + + num_blocks = s.index_cast(pto.get_block_num()) + bid = s.index_cast(pto.get_block_idx()) + floor_div = cNUM_Q_BLOCKS // num_blocks + extra = cNUM_Q_BLOCKS % num_blocks + fat_start = bid * (floor_div + c1) + thin_start = extra * (floor_div + c1) + (bid - extra) * floor_div + qb_start = s.select(bid < extra, fat_start, thin_start) + q_blocks_this_core = s.select(bid < extra, floor_div + c1, floor_div) + qb_end = qb_start + q_blocks_this_core + + gm_blk_offset = bid * const(GM_ELEMS_PER_BLOCK) + gm_blk = pto.add_ptr(gm_slot_buffer, gm_blk_offset) + gm_qk = pto.add_ptr(gm_blk, const(GM_QK_OFF_F32)) + gm_pv = pto.add_ptr(gm_blk, const(GM_PV_OFF_F32)) + gm_p = pto.add_ptr(gm_blk, const(GM_P_OFF_F32)) + + # ---- Pipe QK_C2V ---- + qk_c2v_local = pto.reserve_buffer( + name="fa_qk_c2v_fifo", + size=FIFO_BYTES_QK, + location="VEC", + auto_alloc=False, + base=VEC_QK_FIFO_OFF, + ) + qk_pipe = pto.initialize_l2g2l_pipe( + dir_mask=1, + slot_size=SLOT_SIZE_QK, + slot_num=SLOT_NUM, + local_slot_num=QK_LOCAL_SLOT_NUM, + gm_addr=gm_qk, + local_addr=qk_c2v_local, + ) + + # ---- Pipe PV_C2V (lower-level init: PV_LOCAL_SLOT_NUM VEC slots) ---- + pv_c2v_local = pto.reserve_buffer( + name="fa_pv_c2v_fifo", + size=FIFO_BYTES_PV, + location="VEC", + auto_alloc=False, + base=VEC_PV_FIFO_OFF, + ) + pv_pipe = pto.initialize_l2g2l_pipe( + dir_mask=1, + slot_size=SLOT_SIZE_PV, + slot_num=SLOT_NUM, + local_slot_num=PV_LOCAL_SLOT_NUM, + gm_addr=gm_pv, + local_addr=pv_c2v_local, + ) + + # ---- Pipe P_V2C ---- + p_v2c_import = pto.import_reserved_buffer( + name="fa_p_v2c_fifo", peer_func="@cube_kernel" + ) + pto.aiv_initialize_pipe( + id=ID_P, + dir_mask=2, + slot_size=SLOT_SIZE_P, + gm_slot_buffer=gm_p, + c2v_consumer_buf=const(0, s.int32), + v2c_consumer_buf=p_v2c_import, + nosplit=False, + ) + + sb_idx = s.index_cast(pto.get_subblock_idx()) + row_off_sb = sb_idx * cS0_HALF + + tmp_tile = pto.alloc_tile(qk_vec_ty, addr=const(VEC_TMP_OFF, s.int64)) + p_fp32 = pto.alloc_tile(p_fp32_ty, addr=const(VEC_P_FP32_OFF, s.int64)) + p_fp16 = pto.alloc_tile(p_fp16_ty, addr=const(VEC_P_FP16_OFF, s.int64)) + o_tile = pto.alloc_tile(o_vec_ty, addr=const(VEC_O_OFF, s.int64)) + new_global_max = pto.alloc_tile( + red_ty, addr=const(VEC_NEW_GLOBAL_MAX_OFF, s.int64) + ) + local_max = pto.alloc_tile(red_ty, addr=const(VEC_LOCAL_MAX_OFF, s.int64)) + new_global_sum = pto.alloc_tile( + red_ty, addr=const(VEC_NEW_GLOBAL_SUM_OFF, s.int64) + ) + local_sum = pto.alloc_tile(red_ty, addr=const(VEC_LOCAL_SUM_OFF, s.int64)) + # Ring of QK_PRELOAD exp_max tiles. With QK_PRELOAD=2 we use a/b + # ping-pong: even-parity tiles use exp_max_a, odd-parity tiles use + # exp_max_b. softmax(t) writes the exp_max for tile t into the + # corresponding slot; gu(t) reads it from the same slot. Because + # softmax(t+QK_PRELOAD) and gu(t) hit the SAME slot (parity matches), + # the steady-state loop must do gu(t) BEFORE softmax(t+QK_PRELOAD) + # to avoid clobbering. + assert QK_PRELOAD == 2, "exp_max ring is hard-coded to 2 tiles" + exp_max_a = pto.alloc_tile(red_ty, addr=const(VEC_EXP_MAX_A_OFF, s.int64)) + exp_max_b = pto.alloc_tile(red_ty, addr=const(VEC_EXP_MAX_B_OFF, s.int64)) + + scale = const(1.0 / math.sqrt(HEAD), s.float32) + f32_one = const(1.0, s.float32) + + cQ_ROWS = const(Q_ROWS) + tv_o = pto.as_tensor( + o_tensor_ty, ptr=gm_o, shape=[cQ_ROWS, cHEAD], strides=[cHEAD, c1] + ) + + # Helper: emit a softmax step writing into `exp_max_slot`. + # `is_init` is a Python bool: True only for the very first softmax + # of the whole block (tile 0) to take the init branch. + def emit_softmax_step(exp_max_slot, is_init): + qk_recv = pto.tpop( + qk_vec_ty, + qk_pipe, + SPLIT_UP_DOWN, + addr=const(VEC_QK_RECV_OFF, s.int64), + ) + tile.muls(qk_recv, scale, qk_recv) + tile.row_max(qk_recv, tmp_tile, local_max) + + local_max_r = tile.reshape(red_row_ty, local_max) + new_global_max_r = tile.reshape(red_row_ty, new_global_max) + exp_max_r = tile.reshape(red_row_ty, exp_max_slot) + new_global_sum_r = tile.reshape(red_row_ty, new_global_sum) + local_sum_r = tile.reshape(red_row_ty, local_sum) + + if is_init: + tile.row_expand_sub(qk_recv, local_max, p_fp32) + tile.muls(local_max_r, f32_one, new_global_max_r) + tile.exp(p_fp32, p_fp32) + tile.row_sum(p_fp32, tmp_tile, new_global_sum) + else: + tile.max(local_max_r, new_global_max_r, local_max_r) + tile.sub(new_global_max_r, local_max_r, exp_max_r) + tile.muls(local_max_r, f32_one, new_global_max_r) + tile.row_expand_sub(qk_recv, local_max, p_fp32) + tile.exp(exp_max_r, exp_max_r) + tile.exp(p_fp32, p_fp32) + tile.mul(new_global_sum_r, exp_max_r, new_global_sum_r) + tile.row_sum(p_fp32, tmp_tile, local_sum) + tile.add(new_global_sum_r, local_sum_r, new_global_sum_r) + + tile.cvt(p_fp32, p_fp16) + pto.tpush_to_aic(p_fp16, SPLIT_UP_DOWN, id=ID_P) + pto.tfree(qk_pipe, SPLIT_UP_DOWN) + + # Helper: emit a gu step reading from `exp_max_slot`. + # `is_init` is a Python bool: True only for tile 0 (first PV). + def emit_gu_step(exp_max_slot, is_init): + pv_recv = pto.tpop( + pv_vec_ty, + pv_pipe, + SPLIT_UP_DOWN, + addr=const(VEC_PV_RECV_OFF, s.int64), + ) + if is_init: + tile.mov(pv_recv, o_tile) + else: + tile.row_expand_mul(o_tile, exp_max_slot, o_tile) + tile.add(o_tile, pv_recv, o_tile) + pto.tfree(pv_pipe, SPLIT_UP_DOWN) + + for qb in pto.range(qb_start, qb_end, c1): + o_row_off = qb * cS0 + + # =================== Vec prologue: softmax(0..QK_PRELOAD-1) =================== + # softmax(0): is_init=True (writes exp_max_a, but exp_max_a for tile 0 + # is unused by gu(0) — gu(0) takes the init branch and just movs PV. + # Still we must compute it correctly; the init branch doesn't touch exp_max. + emit_softmax_step(exp_max_a, is_init=True) + # softmax(1): is_init=False (writes exp_max_b) + emit_softmax_step(exp_max_b, is_init=False) + + # =================== Vec steady state =================== + # Pair-unrolled: each `p` iteration handles tiles t_a = 2p, t_b = 2p+1. + # gu(t_a) reads exp_max_a (set by softmax(t_a) earlier); + # softmax(t_a+2) writes exp_max_a (matches parity). + # gu(t_b) reads exp_max_b; softmax(t_b+2) writes exp_max_b. + # CRITICAL: gu BEFORE softmax in same step to avoid clobbering. + # + # First pair (p=0, t_a=0, t_b=1) is Python-unrolled so we can + # take the `is_init=True` branch on gu(0) (which initializes + # o_tile via mov rather than rescale+add). + emit_gu_step(exp_max_a, is_init=True) # tile 0 + emit_softmax_step(exp_max_a, is_init=False) # tile 2 → exp_max_a + emit_gu_step(exp_max_b, is_init=False) # tile 1 + emit_softmax_step(exp_max_b, is_init=False) # tile 3 → exp_max_b + + # Remaining pairs (p=1..STEADY_PAIRS-1) inside a runtime loop. + for p in pto.range(c1, const(STEADY_PAIRS), c1): + emit_gu_step(exp_max_a, is_init=False) + emit_softmax_step(exp_max_a, is_init=False) + emit_gu_step(exp_max_b, is_init=False) + emit_softmax_step(exp_max_b, is_init=False) + + # =================== Vec epilogue: gu(NUM_TILES-QK_PRELOAD..NUM_TILES-1) =================== + for k in range(QK_PRELOAD): + slot = exp_max_a if k % 2 == 0 else exp_max_b + emit_gu_step(slot, is_init=False) + + tile.row_expand_div(o_tile, new_global_sum, o_tile) + + o_row_off_sb = o_row_off + row_off_sb + o_view = pto.slice_view( + o_sub_half_ty, + source=tv_o, + offsets=[o_row_off_sb, c0], + sizes=[cS0_HALF, cHEAD], + ) + pto.store(o_tile, o_view) + + # =================================================================== + # Entry point + # =================================================================== + @pto.func + def call_both( + ffts_addr: "ffts_ty", + gm_slot_buffer: "ptr_fp32", + gm_q: "ptr_fp16", + gm_k: "ptr_fp16", + gm_v: "ptr_fp16", + gm_o: "ptr_fp32", + ) -> None: + pto.set_ffts(ffts_addr) + pto.call(cube_kernel, gm_slot_buffer, gm_q, gm_k, gm_v) + pto.call(vector_kernel, gm_slot_buffer, gm_o) + + +if __name__ == "__main__": + print(module) diff --git a/examples/aot/flash_attention/split_pipe/run.py b/examples/aot/flash_attention/split_pipe/run.py new file mode 100755 index 00000000..014ee83c --- /dev/null +++ b/examples/aot/flash_attention/split_pipe/run.py @@ -0,0 +1,429 @@ +#!/usr/bin/env python3 +# Copyright (c) 2026 Huawei Technologies Co., Ltd. +# CANN Open Software License Agreement Version 2.0 +# +# AOT runner for the multi-pipe FA builder. All .so variants must be built +# beforehand by `bash compile.sh`. This script only loads and invokes them. +# +# Compile/run parity: FA_NUM_TILES, FA_S1_TILE, and FA_Q_ROWS are baked into the +# emitted MLIR at compile time. Each compile emits matching fa*.build_env next to +# the .so; run.py applies the sidecar for the first FA_BENCH_LENGTHS entry and +# reloads fa_performance_builder (see README). Override FA_* in the environment +# if you skip compile.sh sidecars or resolve ambiguous seq_len factorizations. +# +# * Correctness check: the first requested benchmark length. +# * Benchmark: 8k / 16k / 32k / 64k variants by default. Override with +# FA_BENCH_LENGTHS=8192,32768 (each length must be a multiple of S1_TILE). + +import ctypes +import importlib +import os +import sys +import math + +import torch +import torch_npu # noqa: F401 + +THIS_DIR = os.path.dirname(os.path.abspath(__file__)) +sys.path.insert(0, os.path.join(THIS_DIR, "kernels")) +import fa_performance_builder as fb # noqa: E402 — reloaded in main() after build_env sync + +from ptodsl import do_bench # noqa: E402 +from ptodsl.utils.npu_info import get_num_cube_cores, get_test_device # noqa: E402 + +ARTIFACT_DIR = os.path.join(THIS_DIR, "build_artifacts") +DEFAULT_PLOT_PATH = os.path.join(ARTIFACT_DIR, "fa_benchmark.png") + +# Sequence lengths benchmarked. Override with +# FA_BENCH_LENGTHS=8192,32768 +# Each must be a multiple of S1_TILE (from reload/synced fa_performance_builder) +# and have a matching prebuilt .so. +DEFAULT_BENCH_LENGTHS = (8192, 16384, 32768, 65536) + + +def _parse_bench_lengths(): + raw = os.environ.get("FA_BENCH_LENGTHS") + if not raw: + return DEFAULT_BENCH_LENGTHS + return tuple(int(x) for x in raw.split(",") if x.strip()) + + +ATOL = 1e-3 +RTOL = 1e-3 + + +def attn_flops_matmul_softmax_scale( + batch_size: int, + s_q: int, + s_k: int, + h: int, + include_scale: bool = True, + count_exp_as_flop: bool = True, + count_max_as_flop: bool = True, +): + """Same FLOP model as `cpp_ref/split_pipe/run.py` for comparable TFLOP/s.""" + flops_matmul = 4 * batch_size * s_q * s_k * h + flops_scale = (batch_size * s_q * s_k) if include_scale else 0 + + rows = batch_size * s_q + softmax_ops = 0 + if count_max_as_flop: + softmax_ops += rows * (s_k - 1) + softmax_ops += rows * s_k + if count_exp_as_flop: + softmax_ops += rows * s_k + softmax_ops += rows * (s_k - 1) + softmax_ops += rows * s_k + + return flops_matmul + flops_scale + softmax_ops + + +def get_block_dim() -> int: + return min(fb.NUM_Q_BLOCKS, get_num_cube_cores()) + + +def get_slot_elems(block_dim: int) -> int: + return fb.GM_ELEMS_PER_BLOCK * block_dim + + +def num_tiles_for(seq_len: int) -> int: + s1_tile = fb.S1_TILE + if seq_len % s1_tile != 0: + raise ValueError(f"seq_len {seq_len} not divisible by S1_TILE={s1_tile}") + return seq_len // s1_tile + + +def _apply_build_env_matching_seq(seq_len: int) -> None: + """Set FA_* env vars from the fa*.build_env written by compile.sh for this seq_len.""" + if not os.path.isdir(ARTIFACT_DIR): + return + matches = [] + for fn in sorted(os.listdir(ARTIFACT_DIR)): + if not fn.endswith(".build_env"): + continue + path = os.path.join(ARTIFACT_DIR, fn) + kv = {} + try: + with open(path, encoding="utf-8") as f: + for line in f: + line = line.strip() + if not line or line.startswith("#"): + continue + k, _, v = line.partition("=") + if k.strip(): + kv[k.strip()] = v.strip() + except OSError: + continue + try: + nt = int(kv["FA_NUM_TILES"]) + s1 = int(kv["FA_S1_TILE"]) + except (KeyError, ValueError): + continue + if nt * s1 != seq_len: + continue + matches.append((fn, kv)) + + if not matches: + return + + # Same seq_len can factor two ways (e.g. 8192 = 16×512 = 32×256): prefer + # FA_S1_TILE from the environment when set; else prefer canonical fa.build_env. + env_s1 = os.environ.get("FA_S1_TILE") + if env_s1 is not None: + for fn, kv in matches: + if kv.get("FA_S1_TILE") == env_s1.strip(): + for k, v in kv.items(): + os.environ[k] = v + return + + matches.sort(key=lambda x: (0 if x[0] == "fa.build_env" else 1, x[0])) + for _, kv in matches: + for k, v in kv.items(): + os.environ[k] = v + return + + +def lib_path_for(num_tiles: int) -> str: + # NUM_TILES=16 is the builder default and produces plain fa.so. + if num_tiles == 16: + return os.path.join(ARTIFACT_DIR, "fa.so") + return os.path.join(ARTIFACT_DIR, f"fa_{num_tiles}.so") + + +def require_lib(num_tiles: int) -> str: + """Return the prebuilt .so path for the variant, or raise.""" + lib_path = lib_path_for(num_tiles) + if not os.path.exists(lib_path): + raise FileNotFoundError( + f"Missing prebuilt kernel: {lib_path}\n" + f"Run `bash compile.sh` (or `FA_TILES={num_tiles} bash compile.sh`) first." + ) + return lib_path + + +def torch_to_ctypes(t: torch.Tensor) -> ctypes.c_void_p: + return ctypes.c_void_p(t.data_ptr()) + + +def load_lib(lib_path: str) -> ctypes.CDLL: + lib = ctypes.CDLL(lib_path) + lib.call_kernel.argtypes = [ + ctypes.c_uint32, + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.c_void_p, + ] + lib.call_kernel.restype = None + return lib + + +def fa_reference(q, k, v): + scale = 1.0 / math.sqrt(q.shape[1]) + scores = q.float() @ k.float().T * scale + attn = torch.softmax(scores, dim=-1) + return (attn @ v.float()).float() + + +def fused_attention(q, k, v, is_causal=False): + scale = 1.0 / math.sqrt(q.shape[1]) + out, _ = torch_npu.npu_fused_infer_attention_score( + q.unsqueeze(0), + k.unsqueeze(0), + v.unsqueeze(0), + num_heads=1, + input_layout="BSH", + scale=scale, + next_tokens=0 if is_causal else 65535, + ) + return out.squeeze(0) + + +def test_flash(lib, device, num_tiles): + torch.manual_seed(0) + Q_ROWS = fb.Q_ROWS + HEAD = fb.HEAD + S1_TOTAL = fb.S1_TILE * num_tiles + GM_ELEMS_PER_BLOCK = fb.GM_ELEMS_PER_BLOCK + + block_dim = get_block_dim() + slot_elems = get_slot_elems(block_dim) + + q = torch.randn((Q_ROWS, HEAD), dtype=torch.float16, device=device) + k = torch.randn((S1_TOTAL, HEAD), dtype=torch.float16, device=device) + v = torch.randn((S1_TOTAL, HEAD), dtype=torch.float16, device=device) + + gm_slot = torch.zeros((slot_elems,), dtype=torch.float32, device=device) + o = torch.zeros((Q_ROWS, HEAD), dtype=torch.float32, device=device) + + stream_ptr = torch.npu.current_stream()._as_parameter_ + + lib.call_kernel( + block_dim, + stream_ptr, + torch_to_ctypes(gm_slot), + torch_to_ctypes(q), + torch_to_ctypes(k), + torch_to_ctypes(v), + torch_to_ctypes(o), + ) + torch.npu.synchronize() + + o_ref = fa_reference(q, k, v) + torch.testing.assert_close(o.cpu().float(), o_ref.cpu(), rtol=RTOL, atol=ATOL) + print( + f"[fa] q_rows={Q_ROWS} s1={S1_TOTAL} head={HEAD} " + f"({num_tiles} tiles, blockDim={block_dim}): PASSED " + f"(atol={ATOL}, rtol={RTOL}) GM/blk={GM_ELEMS_PER_BLOCK} fp32" + ) + + +def benchmark_flash(lib, device, num_tiles, warmup=10, iters=100): + """Benchmark a single (length-tagged) .so. Returns dict of metrics.""" + torch.manual_seed(0) + Q_ROWS = fb.Q_ROWS + HEAD = fb.HEAD + S1_TILE = fb.S1_TILE + s1_total = S1_TILE * num_tiles + + block_dim = get_block_dim() + slot_elems = get_slot_elems(block_dim) + + q = torch.randn((Q_ROWS, HEAD), dtype=torch.float16, device=device) + k = torch.randn((s1_total, HEAD), dtype=torch.float16, device=device) + v = torch.randn((s1_total, HEAD), dtype=torch.float16, device=device) + + gm_slot = torch.zeros((slot_elems,), dtype=torch.float32, device=device) + o = torch.zeros((Q_ROWS, HEAD), dtype=torch.float32, device=device) + stream_ptr = torch.npu.current_stream()._as_parameter_ + + def run_kernel(): + lib.call_kernel( + block_dim, + stream_ptr, + torch_to_ctypes(gm_slot), + torch_to_ctypes(q), + torch_to_ctypes(k), + torch_to_ctypes(v), + torch_to_ctypes(o), + ) + + def run_reference(): + fused_attention(q, k, v) + + kernel_us = do_bench( + run_kernel, + warmup_iters=warmup, + benchmark_iters=iters, + unit="us", + flush_cache=False, + ) + ref_us = do_bench( + run_reference, + warmup_iters=warmup, + benchmark_iters=iters, + unit="us", + flush_cache=False, + ) + + # One untimed correctness check per length: assert against the fp32 + # reference so silent miscompiles fail loudly instead of just showing + # a large max|err| in the summary table. + run_kernel() + torch.npu.synchronize() + o_kernel = o.clone() + o_fused = fused_attention(q, k, v) + torch.npu.synchronize() + o_golden = fa_reference(q, k, v) + + diff_kernel = (o_kernel.cpu().float() - o_golden.cpu()).abs().max().item() + diff_fused = (o_fused.cpu().float() - o_golden.cpu()).abs().max().item() + torch.testing.assert_close( + o_kernel.cpu().float(), o_golden.cpu(), rtol=RTOL, atol=ATOL + ) + + flops = attn_flops_matmul_softmax_scale(1, Q_ROWS, s1_total, HEAD) + return { + "seq_len": s1_total, + "num_tiles": num_tiles, + "block_dim": block_dim, + "kernel_us": kernel_us, + "ref_us": ref_us, + "kernel_tflops": flops / (kernel_us * 1e-6) / 1e12, + "ref_tflops": flops / (ref_us * 1e-6) / 1e12, + "speedup": ref_us / kernel_us, + "kernel_max_err": diff_kernel, + "fused_max_err": diff_fused, + } + + +def print_bench_row(r): + print( + f" s1={r['seq_len']:>6} tiles={r['num_tiles']:>3} " + f"fa={r['kernel_us']:8.2f} us ({r['kernel_tflops']:7.3f} TFLOP/s) " + f"ref={r['ref_us']:8.2f} us ({r['ref_tflops']:7.3f} TFLOP/s) " + f"speedup={r['speedup']:.2f}x " + f"err: ours={r['kernel_max_err']:.2e} ref={r['fused_max_err']:.2e}" + ) + + +def plot_benchmark_results(results, out_png=None): + """Save a throughput plot for PTO FA vs torch_npu reference.""" + if not results: + return + + out_png = out_png or os.environ.get("FA_BENCH_PLOT_PATH", DEFAULT_PLOT_PATH) + + try: + import matplotlib + + matplotlib.use("Agg") + import matplotlib.pyplot as plt + except ImportError: + print("Warning: matplotlib is not installed; skipping plot generation.") + return + + style_candidates = ("seaborn-v0_8-whitegrid", "seaborn-whitegrid") + for style_name in style_candidates: + try: + plt.style.use(style_name) + break + except OSError: + continue + + seq_lens = [r["seq_len"] for r in results] + fa_tflops = [r["kernel_tflops"] for r in results] + ref_tflops = [r["ref_tflops"] for r in results] + + fig, ax_thr = plt.subplots(figsize=(7, 5)) + fig.patch.set_facecolor("white") + + ax_thr.plot(seq_lens, fa_tflops, "o-", label="PTO flash attention") + ax_thr.plot(seq_lens, ref_tflops, "s-", label="torch_npu fused attention") + ax_thr.set_title("Throughput") + ax_thr.set_xlabel("S1 sequence length") + ax_thr.set_ylabel("TFLOP/s") + ax_thr.legend() + ax_thr.set_xscale("log", base=2) + ax_thr.set_xticks(seq_lens) + ax_thr.set_xticklabels([str(x) for x in seq_lens], rotation=30) + + fig.suptitle( + f"Flash Attention Benchmark: Q={fb.Q_ROWS}, H={fb.HEAD}, " + f"S1_TILE={fb.S1_TILE}" + ) + fig.tight_layout() + + out_dir = os.path.dirname(out_png) + if out_dir: + os.makedirs(out_dir, exist_ok=True) + fig.savefig(out_png, dpi=180) + plt.close(fig) + print(f"Saved benchmark plot: {out_png}") + + +def main(): + global fb + device = get_test_device() + torch.npu.set_device(device) + + bench_lengths = _parse_bench_lengths() + _apply_build_env_matching_seq(bench_lengths[0]) + fb = importlib.reload(fb) + + # Verify all required .so artifacts exist before doing anything. + required = [(seq_len, num_tiles_for(seq_len)) for seq_len in bench_lengths] + for seq_len, nt in required: + require_lib(nt) + + # ---- correctness on the first requested benchmark variant ---- + _, first_nt = required[0] + default_lib = load_lib(require_lib(first_nt)) + test_flash(default_lib, device, num_tiles=first_nt) + + # ---- benchmark across requested sequence lengths ---- + print(f"\n{'Benchmark (fa)':=^96}") + print( + f" Q_ROWS={fb.Q_ROWS} HEAD={fb.HEAD} " + f"S1_TILE={fb.S1_TILE} " + f"NUM_Q_BLOCKS={fb.NUM_Q_BLOCKS} cores={get_num_cube_cores()}" + ) + print(f" lengths: {list(bench_lengths)}") + print("-" * 96) + + results = [] + for seq_len, nt in required: + lib = load_lib(require_lib(nt)) + r = benchmark_flash(lib, device, num_tiles=nt) + print_bench_row(r) + results.append(r) + print("=" * 96) + + if os.environ.get("FA_BENCH_NO_PLOT", "").lower() not in ("1", "true", "yes"): + plot_benchmark_results(results) + + +if __name__ == "__main__": + main() From e4f9acf600d1dfaebaf9165998f40b0a1625a4ac Mon Sep 17 00:00:00 2001 From: Jay Zhuang <80731350+learning-chip@users.noreply.github.com> Date: Thu, 30 Apr 2026 10:02:04 +0200 Subject: [PATCH 12/17] update ptoas to 0.36 --- .github/workflows/ci.yml | 4 ++-- docker/Dockerfile | 4 ++-- docker/README.md | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8cdb6791..4edabd8f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -47,8 +47,8 @@ jobs: env: RELEASE_REPO: hw-native-sys/PTOAS - RELEASE_VER: 0.35 - RELEASE_TAG: v0.35 + RELEASE_VER: 0.36 + RELEASE_TAG: v0.36 CLI_DIR: /installers/ptoas-cli PTOISA_COMMIT: 4d466a8e3cfa363281eb5e67449575eade5bf366 diff --git a/docker/Dockerfile b/docker/Dockerfile index 9076a9ce..ed4fea48 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -31,10 +31,10 @@ ARG CACHE_BURST=1 # ARG ARCH=x86_64 ARG ARCH=aarch64 -# https://github.com/hw-native-sys/PTOAS/releases/tag/v0.35 +# https://github.com/hw-native-sys/PTOAS/releases/tag/v0.36 # include the split pipes https://github.com/hw-native-sys/PTOAS/pull/606 ARG RELEASE_REPO=hw-native-sys/PTOAS -ARG RELEASE_VER=0.35 +ARG RELEASE_VER=0.36 ARG RELEASE_TAG=v${RELEASE_VER} ARG WHEEL_NAME=ptoas-${RELEASE_VER}-cp311-none-manylinux_2_34_${ARCH}.whl ARG CLI_TAR_NAME=ptoas-bin-${ARCH}.tar.gz diff --git a/docker/README.md b/docker/README.md index 99fd6dfb..3a0f962f 100644 --- a/docker/README.md +++ b/docker/README.md @@ -3,7 +3,7 @@ Recommend using [Ascend Docker Runtime](https://gitcode.com/Ascend/mind-cluster/ Then, build and run docker image: ```bash -RELEASE_VER=0.35 +RELEASE_VER=0.36 sudo docker build \ --build-arg RELEASE_VER=$RELEASE_VER \ . -t pto_dsl:fa_hack From 840bef80254784057372dc1245b03e1a37505b15 Mon Sep 17 00:00:00 2001 From: Jay Zhuang <80731350+learning-chip@users.noreply.github.com> Date: Thu, 30 Apr 2026 10:03:37 +0200 Subject: [PATCH 13/17] add FA reference IR --- examples/aot/flash_attention/ir_ref/READMD.md | 2 + examples/aot/flash_attention/ir_ref/fa.pto | 501 ++++++++++++ .../aot/flash_attention/ir_ref/fa_perf.pto | 743 ++++++++++++++++++ 3 files changed, 1246 insertions(+) create mode 100644 examples/aot/flash_attention/ir_ref/READMD.md create mode 100644 examples/aot/flash_attention/ir_ref/fa.pto create mode 100644 examples/aot/flash_attention/ir_ref/fa_perf.pto diff --git a/examples/aot/flash_attention/ir_ref/READMD.md b/examples/aot/flash_attention/ir_ref/READMD.md new file mode 100644 index 00000000..d19f5d69 --- /dev/null +++ b/examples/aot/flash_attention/ir_ref/READMD.md @@ -0,0 +1,2 @@ +Copy IR from https://github.com/hw-native-sys/PTOAS/pull/609 +to reverse engineer python frontend diff --git a/examples/aot/flash_attention/ir_ref/fa.pto b/examples/aot/flash_attention/ir_ref/fa.pto new file mode 100644 index 00000000..1fb6b357 --- /dev/null +++ b/examples/aot/flash_attention/ir_ref/fa.pto @@ -0,0 +1,501 @@ +// RUN: ptoas --pto-arch=a3 --pto-level=level3 --enable-insert-sync %s >/dev/null + +module { + func.func @cube_kernel(%arg0: !pto.ptr, %arg1: !pto.ptr, %arg2: !pto.ptr, %arg3: !pto.ptr) attributes {pto.kernel_kind = #pto.kernel_kind} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c128_0 = arith.constant 128 : index + %c256 = arith.constant 256 : index + %c4096 = arith.constant 4096 : index + %c128_1 = arith.constant 128 : index + %c16 = arith.constant 16 : index + %c16_2 = arith.constant 16 : index + %0 = pto.get_block_num + %1 = arith.index_cast %0 : i64 to index + %2 = pto.get_block_idx + %3 = arith.index_cast %2 : i64 to index + %4 = arith.divsi %c16_2, %1 : index + %5 = arith.remsi %c16_2, %1 : index + %6 = arith.addi %4, %c1 : index + %7 = arith.muli %3, %6 : index + %8 = arith.addi %4, %c1 : index + %9 = arith.muli %5, %8 : index + %10 = arith.subi %3, %5 : index + %11 = arith.muli %10, %4 : index + %12 = arith.addi %9, %11 : index + %13 = arith.cmpi slt, %3, %5 : index + %14 = arith.select %13, %7, %12 : index + %15 = arith.cmpi slt, %3, %5 : index + %16 = arith.addi %4, %c1 : index + %17 = arith.select %15, %16, %4 : index + %18 = arith.addi %14, %17 : index + %c524288 = arith.constant 524288 : index + %19 = arith.muli %3, %c524288 : index + %20 = pto.addptr %arg0, %19 : -> + %c0_3 = arith.constant 0 : index + %21 = pto.addptr %20, %c0_3 : -> + %c262144 = arith.constant 262144 : index + %22 = pto.addptr %20, %c262144 : -> + %c393216 = arith.constant 393216 : index + %23 = pto.addptr %20, %c393216 : -> + %qk_slot_desc = pto.make_tensor_view %21, shape = [%c128, %c256], strides = [%c256, %c1] : !pto.tensor_view<128x256xf32> + pto.aic_initialize_pipe{id = 25, dir_mask = 1, slot_size = 131072} (gm_slot_tensor = %qk_slot_desc : !pto.tensor_view<128x256xf32>) + %pv_slot_desc = pto.make_tensor_view %22, shape = [%c128, %c128_0], strides = [%c128_0, %c1] : !pto.tensor_view<128x128xf32> + pto.aic_initialize_pipe{id = 27, dir_mask = 1, slot_size = 65536} (gm_slot_tensor = %pv_slot_desc : !pto.tensor_view<128x128xf32>) + %28 = pto.reserve_buffer{name = "fa_p_v2c_fifo", size = 524288, location = , auto = false, base = 393216} -> i32 + %c0_i32 = arith.constant 0 : i32 + pto.aic_initialize_pipe{id = 30, dir_mask = 2, slot_size = 65536, nosplit = false} (gm_slot_buffer = %23 : !pto.ptr, c2v_consumer_buf = %c0_i32 : i32, v2c_consumer_buf = %28 : i32) + %c0_i64 = arith.constant 0 : i64 + %c0_i64_4 = arith.constant 0 : i64 + %29 = pto.alloc_tile addr = %c0_i64_4 : !pto.tile_buf + %c0_i64_5 = arith.constant 0 : i64 + %30 = pto.alloc_tile addr = %c0_i64_5 : !pto.tile_buf + %c32768_i64 = arith.constant 32768 : i64 + %31 = pto.alloc_tile addr = %c32768_i64 : !pto.tile_buf + %c65536_i64 = arith.constant 65536 : i64 + %32 = pto.alloc_tile addr = %c65536_i64 : !pto.tile_buf + %33 = pto.alloc_tile addr = %c0_i64 : !pto.tile_buf + %c0_i64_6 = arith.constant 0 : i64 + %34 = pto.alloc_tile addr = %c0_i64_6 : !pto.tile_buf + %c98304_i64 = arith.constant 98304 : i64 + %35 = pto.alloc_tile addr = %c98304_i64 : !pto.tile_buf + %c32768_i64_7 = arith.constant 32768 : i64 + %36 = pto.alloc_tile addr = %c32768_i64_7 : !pto.tile_buf + %c163840_i64 = arith.constant 163840 : i64 + %37 = pto.alloc_tile addr = %c163840_i64 : !pto.tile_buf + %38 = pto.alloc_tile addr = %c0_i64 : !pto.tile_buf + %c131072_i64 = arith.constant 131072 : i64 + %39 = pto.alloc_tile addr = %c131072_i64 : !pto.tile_buf + %c2048 = arith.constant 2048 : index + %40 = pto.make_tensor_view %arg1, shape = [%c2048, %c128_0], strides = [%c128_0, %c1] : !pto.tensor_view + %41 = pto.make_tensor_view %arg2, shape = [%c128_0, %c4096], strides = [%c1, %c128_0] : !pto.tensor_view + %42 = pto.make_tensor_view %arg3, shape = [%c4096, %c128_0], strides = [%c128_0, %c1] : !pto.tensor_view + scf.for %arg4 = %14 to %18 step %c1 { + %43 = arith.muli %arg4, %c128 : index + %44 = pto.partition_view %40, offsets = [%43, %c0], sizes = [%c128, %c128_0] : !pto.tensor_view -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%44 : !pto.partition_tensor_view<128x128xf16>) outs(%29 : !pto.tile_buf) + pto.tmov ins(%29 : !pto.tile_buf) outs(%30 : !pto.tile_buf) + %c0_8 = arith.constant 0 : index + %c0_9 = arith.constant 0 : index + %45 = arith.addi %c0_8, %c0_9 : index + %46 = pto.partition_view %41, offsets = [%c0, %45], sizes = [%c128_0, %c128_1] : !pto.tensor_view -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%46 : !pto.partition_tensor_view<128x128xf16>) outs(%31 : !pto.tile_buf) + pto.tmov ins(%31 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + %c0_10 = arith.constant 0 : index + %47 = pto.subview %34[%c0, %c0_10] sizes [128, 128] : !pto.tile_buf -> !pto.tile_buf + pto.tmatmul ins(%30, %33 : !pto.tile_buf, !pto.tile_buf) outs(%47 : !pto.tile_buf) + %c128_11 = arith.constant 128 : index + %48 = arith.addi %c0_8, %c128_11 : index + %49 = pto.partition_view %41, offsets = [%c0, %48], sizes = [%c128_0, %c128_1] : !pto.tensor_view -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%49 : !pto.partition_tensor_view<128x128xf16>) outs(%31 : !pto.tile_buf) + pto.tmov ins(%31 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + %c128_12 = arith.constant 128 : index + %50 = pto.subview %34[%c0, %c128_12] sizes [128, 128] : !pto.tile_buf -> !pto.tile_buf + pto.tmatmul ins(%30, %33 : !pto.tile_buf, !pto.tile_buf) outs(%50 : !pto.tile_buf) + %qk_push_0 = pto.talloc_to_aiv {id = 25, split = 0} -> !pto.tensor_view<128x256xf32> + %qk_push_part_0 = pto.partition_view %qk_push_0, offsets = [%c0, %c0], sizes = [%c128, %c256] : !pto.tensor_view<128x256xf32> -> !pto.partition_tensor_view<128x256xf32> + pto.tstore ins(%34 : !pto.tile_buf) outs(%qk_push_part_0 : !pto.partition_tensor_view<128x256xf32>) + pto.tpush_to_aiv(%qk_push_0 : !pto.tensor_view<128x256xf32>) {id = 25, split = 0} + %c256_13 = arith.constant 256 : index + %c0_14 = arith.constant 0 : index + %51 = arith.addi %c256_13, %c0_14 : index + %52 = pto.partition_view %41, offsets = [%c0, %51], sizes = [%c128_0, %c128_1] : !pto.tensor_view -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%52 : !pto.partition_tensor_view<128x128xf16>) outs(%32 : !pto.tile_buf) + pto.tmov ins(%32 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + %c0_15 = arith.constant 0 : index + %53 = pto.subview %34[%c0, %c0_15] sizes [128, 128] : !pto.tile_buf -> !pto.tile_buf + pto.tmatmul ins(%30, %33 : !pto.tile_buf, !pto.tile_buf) outs(%53 : !pto.tile_buf) + %c128_16 = arith.constant 128 : index + %54 = arith.addi %c256_13, %c128_16 : index + %55 = pto.partition_view %41, offsets = [%c0, %54], sizes = [%c128_0, %c128_1] : !pto.tensor_view -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%55 : !pto.partition_tensor_view<128x128xf16>) outs(%32 : !pto.tile_buf) + pto.tmov ins(%32 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + %c128_17 = arith.constant 128 : index + %56 = pto.subview %34[%c0, %c128_17] sizes [128, 128] : !pto.tile_buf -> !pto.tile_buf + pto.tmatmul ins(%30, %33 : !pto.tile_buf, !pto.tile_buf) outs(%56 : !pto.tile_buf) + %qk_push_1 = pto.talloc_to_aiv {id = 25, split = 0} -> !pto.tensor_view<128x256xf32> + %qk_push_part_1 = pto.partition_view %qk_push_1, offsets = [%c0, %c0], sizes = [%c128, %c256] : !pto.tensor_view<128x256xf32> -> !pto.partition_tensor_view<128x256xf32> + pto.tstore ins(%34 : !pto.tile_buf) outs(%qk_push_part_1 : !pto.partition_tensor_view<128x256xf32>) + pto.tpush_to_aiv(%qk_push_1 : !pto.tensor_view<128x256xf32>) {id = 25, split = 0} + %57 = pto.partition_view %42, offsets = [%c0, %c0], sizes = [%c256, %c128_0] : !pto.tensor_view -> !pto.partition_tensor_view<256x128xf16> + pto.tload ins(%57 : !pto.partition_tensor_view<256x128xf16>) outs(%37 : !pto.tile_buf) + %c2 = arith.constant 2 : index + %c7 = arith.constant 7 : index + scf.for %arg5 = %c0 to %c7 step %c1 { + %61 = arith.muli %arg5, %c2 : index + %c2_18 = arith.constant 2 : index + %62 = arith.addi %61, %c2_18 : index + %63 = arith.muli %62, %c256 : index + %64 = pto.tpop_from_aiv {id = 30, split = 1} -> !pto.tile_buf + pto.tmov ins(%64 : !pto.tile_buf) outs(%36 : !pto.tile_buf) + pto.tfree_from_aiv{id = 30, split = 1} + pto.tmov ins(%37 : !pto.tile_buf) outs(%38 : !pto.tile_buf) + %65 = arith.addi %61, %c1 : index + %66 = arith.muli %65, %c256 : index + %67 = pto.partition_view %42, offsets = [%66, %c0], sizes = [%c256, %c128_0] : !pto.tensor_view -> !pto.partition_tensor_view<256x128xf16> + pto.tload ins(%67 : !pto.partition_tensor_view<256x128xf16>) outs(%37 : !pto.tile_buf) + pto.tmatmul ins(%36, %38 : !pto.tile_buf, !pto.tile_buf) outs(%39 : !pto.tile_buf) + %pv_push_0 = pto.talloc_to_aiv {id = 27, split = 0} -> !pto.tensor_view<128x128xf32> + %pv_push_part_0 = pto.partition_view %pv_push_0, offsets = [%c0, %c0], sizes = [%c128, %c128_0] : !pto.tensor_view<128x128xf32> -> !pto.partition_tensor_view<128x128xf32> + pto.tstore ins(%39 : !pto.tile_buf) outs(%pv_push_part_0 : !pto.partition_tensor_view<128x128xf32>) + pto.tpush_to_aiv(%pv_push_0 : !pto.tensor_view<128x128xf32>) {id = 27, split = 0} + %c0_19 = arith.constant 0 : index + %68 = arith.addi %63, %c0_19 : index + %69 = pto.partition_view %41, offsets = [%c0, %68], sizes = [%c128_0, %c128_1] : !pto.tensor_view -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%69 : !pto.partition_tensor_view<128x128xf16>) outs(%31 : !pto.tile_buf) + pto.tmov ins(%31 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + %c0_20 = arith.constant 0 : index + %70 = pto.subview %34[%c0, %c0_20] sizes [128, 128] : !pto.tile_buf -> !pto.tile_buf + pto.tmatmul ins(%30, %33 : !pto.tile_buf, !pto.tile_buf) outs(%70 : !pto.tile_buf) + %c128_21 = arith.constant 128 : index + %71 = arith.addi %63, %c128_21 : index + %72 = pto.partition_view %41, offsets = [%c0, %71], sizes = [%c128_0, %c128_1] : !pto.tensor_view -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%72 : !pto.partition_tensor_view<128x128xf16>) outs(%31 : !pto.tile_buf) + pto.tmov ins(%31 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + %c128_22 = arith.constant 128 : index + %73 = pto.subview %34[%c0, %c128_22] sizes [128, 128] : !pto.tile_buf -> !pto.tile_buf + pto.tmatmul ins(%30, %33 : !pto.tile_buf, !pto.tile_buf) outs(%73 : !pto.tile_buf) + %qk_push_2 = pto.talloc_to_aiv {id = 25, split = 0} -> !pto.tensor_view<128x256xf32> + %qk_push_part_2 = pto.partition_view %qk_push_2, offsets = [%c0, %c0], sizes = [%c128, %c256] : !pto.tensor_view<128x256xf32> -> !pto.partition_tensor_view<128x256xf32> + pto.tstore ins(%34 : !pto.tile_buf) outs(%qk_push_part_2 : !pto.partition_tensor_view<128x256xf32>) + pto.tpush_to_aiv(%qk_push_2 : !pto.tensor_view<128x256xf32>) {id = 25, split = 0} + %74 = arith.muli %arg5, %c2 : index + %75 = arith.addi %74, %c1 : index + %c2_23 = arith.constant 2 : index + %76 = arith.addi %75, %c2_23 : index + %77 = arith.muli %76, %c256 : index + %78 = pto.tpop_from_aiv {id = 30, split = 1} -> !pto.tile_buf + pto.tmov ins(%78 : !pto.tile_buf) outs(%36 : !pto.tile_buf) + pto.tfree_from_aiv{id = 30, split = 1} + pto.tmov ins(%37 : !pto.tile_buf) outs(%38 : !pto.tile_buf) + %79 = arith.addi %75, %c1 : index + %80 = arith.muli %79, %c256 : index + %81 = pto.partition_view %42, offsets = [%80, %c0], sizes = [%c256, %c128_0] : !pto.tensor_view -> !pto.partition_tensor_view<256x128xf16> + pto.tload ins(%81 : !pto.partition_tensor_view<256x128xf16>) outs(%37 : !pto.tile_buf) + pto.tmatmul ins(%36, %38 : !pto.tile_buf, !pto.tile_buf) outs(%39 : !pto.tile_buf) + %pv_push_1 = pto.talloc_to_aiv {id = 27, split = 0} -> !pto.tensor_view<128x128xf32> + %pv_push_part_1 = pto.partition_view %pv_push_1, offsets = [%c0, %c0], sizes = [%c128, %c128_0] : !pto.tensor_view<128x128xf32> -> !pto.partition_tensor_view<128x128xf32> + pto.tstore ins(%39 : !pto.tile_buf) outs(%pv_push_part_1 : !pto.partition_tensor_view<128x128xf32>) + pto.tpush_to_aiv(%pv_push_1 : !pto.tensor_view<128x128xf32>) {id = 27, split = 0} + %c0_24 = arith.constant 0 : index + %82 = arith.addi %77, %c0_24 : index + %83 = pto.partition_view %41, offsets = [%c0, %82], sizes = [%c128_0, %c128_1] : !pto.tensor_view -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%83 : !pto.partition_tensor_view<128x128xf16>) outs(%32 : !pto.tile_buf) + pto.tmov ins(%32 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + %c0_25 = arith.constant 0 : index + %84 = pto.subview %34[%c0, %c0_25] sizes [128, 128] : !pto.tile_buf -> !pto.tile_buf + pto.tmatmul ins(%30, %33 : !pto.tile_buf, !pto.tile_buf) outs(%84 : !pto.tile_buf) + %c128_26 = arith.constant 128 : index + %85 = arith.addi %77, %c128_26 : index + %86 = pto.partition_view %41, offsets = [%c0, %85], sizes = [%c128_0, %c128_1] : !pto.tensor_view -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%86 : !pto.partition_tensor_view<128x128xf16>) outs(%32 : !pto.tile_buf) + pto.tmov ins(%32 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + %c128_27 = arith.constant 128 : index + %87 = pto.subview %34[%c0, %c128_27] sizes [128, 128] : !pto.tile_buf -> !pto.tile_buf + pto.tmatmul ins(%30, %33 : !pto.tile_buf, !pto.tile_buf) outs(%87 : !pto.tile_buf) + %qk_push_3 = pto.talloc_to_aiv {id = 25, split = 0} -> !pto.tensor_view<128x256xf32> + %qk_push_part_3 = pto.partition_view %qk_push_3, offsets = [%c0, %c0], sizes = [%c128, %c256] : !pto.tensor_view<128x256xf32> -> !pto.partition_tensor_view<128x256xf32> + pto.tstore ins(%34 : !pto.tile_buf) outs(%qk_push_part_3 : !pto.partition_tensor_view<128x256xf32>) + pto.tpush_to_aiv(%qk_push_3 : !pto.tensor_view<128x256xf32>) {id = 25, split = 0} + } + %58 = pto.tpop_from_aiv {id = 30, split = 1} -> !pto.tile_buf + pto.tmov ins(%58 : !pto.tile_buf) outs(%36 : !pto.tile_buf) + pto.tfree_from_aiv{id = 30, split = 1} + pto.tmov ins(%37 : !pto.tile_buf) outs(%38 : !pto.tile_buf) + %c3840 = arith.constant 3840 : index + %59 = pto.partition_view %42, offsets = [%c3840, %c0], sizes = [%c256, %c128_0] : !pto.tensor_view -> !pto.partition_tensor_view<256x128xf16> + pto.tload ins(%59 : !pto.partition_tensor_view<256x128xf16>) outs(%37 : !pto.tile_buf) + pto.tmatmul ins(%36, %38 : !pto.tile_buf, !pto.tile_buf) outs(%39 : !pto.tile_buf) + %pv_push_2 = pto.talloc_to_aiv {id = 27, split = 0} -> !pto.tensor_view<128x128xf32> + %pv_push_part_2 = pto.partition_view %pv_push_2, offsets = [%c0, %c0], sizes = [%c128, %c128_0] : !pto.tensor_view<128x128xf32> -> !pto.partition_tensor_view<128x128xf32> + pto.tstore ins(%39 : !pto.tile_buf) outs(%pv_push_part_2 : !pto.partition_tensor_view<128x128xf32>) + pto.tpush_to_aiv(%pv_push_2 : !pto.tensor_view<128x128xf32>) {id = 27, split = 0} + %60 = pto.tpop_from_aiv {id = 30, split = 1} -> !pto.tile_buf + pto.tmov ins(%60 : !pto.tile_buf) outs(%36 : !pto.tile_buf) + pto.tfree_from_aiv{id = 30, split = 1} + pto.tmov ins(%37 : !pto.tile_buf) outs(%38 : !pto.tile_buf) + pto.tmatmul ins(%36, %38 : !pto.tile_buf, !pto.tile_buf) outs(%39 : !pto.tile_buf) + %pv_push_3 = pto.talloc_to_aiv {id = 27, split = 0} -> !pto.tensor_view<128x128xf32> + %pv_push_part_3 = pto.partition_view %pv_push_3, offsets = [%c0, %c0], sizes = [%c128, %c128_0] : !pto.tensor_view<128x128xf32> -> !pto.partition_tensor_view<128x128xf32> + pto.tstore ins(%39 : !pto.tile_buf) outs(%pv_push_part_3 : !pto.partition_tensor_view<128x128xf32>) + pto.tpush_to_aiv(%pv_push_3 : !pto.tensor_view<128x128xf32>) {id = 27, split = 0} + } + return + } + func.func @vector_kernel(%arg0: !pto.ptr, %arg1: !pto.ptr) attributes {pto.kernel_kind = #pto.kernel_kind} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %c256 = arith.constant 256 : index + %c128_0 = arith.constant 128 : index + %c16 = arith.constant 16 : index + %c16_1 = arith.constant 16 : index + %0 = pto.get_block_num + %1 = arith.index_cast %0 : i64 to index + %2 = pto.get_block_idx + %3 = arith.index_cast %2 : i64 to index + %4 = arith.divsi %c16_1, %1 : index + %5 = arith.remsi %c16_1, %1 : index + %6 = arith.addi %4, %c1 : index + %7 = arith.muli %3, %6 : index + %8 = arith.addi %4, %c1 : index + %9 = arith.muli %5, %8 : index + %10 = arith.subi %3, %5 : index + %11 = arith.muli %10, %4 : index + %12 = arith.addi %9, %11 : index + %13 = arith.cmpi slt, %3, %5 : index + %14 = arith.select %13, %7, %12 : index + %15 = arith.cmpi slt, %3, %5 : index + %16 = arith.addi %4, %c1 : index + %17 = arith.select %15, %16, %4 : index + %18 = arith.addi %14, %17 : index + %c524288 = arith.constant 524288 : index + %19 = arith.muli %3, %c524288 : index + %20 = pto.addptr %arg0, %19 : -> + %c0_2 = arith.constant 0 : index + %21 = pto.addptr %20, %c0_2 : -> + %c262144 = arith.constant 262144 : index + %22 = pto.addptr %20, %c262144 : -> + %c393216 = arith.constant 393216 : index + %23 = pto.addptr %20, %c393216 : -> + %qk_slot_desc = pto.make_tensor_view %21, shape = [%c128, %c256], strides = [%c256, %c1] : !pto.tensor_view<128x256xf32> + pto.aiv_initialize_pipe{id = 25, dir_mask = 1, slot_size = 131072} (gm_slot_tensor = %qk_slot_desc : !pto.tensor_view<128x256xf32>) + %pv_slot_desc = pto.make_tensor_view %22, shape = [%c128, %c128_0], strides = [%c128_0, %c1] : !pto.tensor_view<128x128xf32> + pto.aiv_initialize_pipe{id = 27, dir_mask = 1, slot_size = 65536} (gm_slot_tensor = %pv_slot_desc : !pto.tensor_view<128x128xf32>) + %28 = pto.import_reserved_buffer{name = "fa_p_v2c_fifo", peer_func = @cube_kernel} -> i32 + %c0_i32 = arith.constant 0 : i32 + pto.aiv_initialize_pipe{id = 30, dir_mask = 2, slot_size = 65536, nosplit = false} (gm_slot_buffer = %23 : !pto.ptr, c2v_consumer_buf = %c0_i32 : i32, v2c_consumer_buf = %28 : i32) + %29 = pto.get_subblock_idx + %30 = arith.index_cast %29 : i64 to index + %31 = arith.muli %30, %c64 : index + %c196608_i64 = arith.constant 196608 : i64 + %32 = pto.alloc_tile addr = %c196608_i64 : !pto.tile_buf + %c262144_i64 = arith.constant 262144 : i64 + %33 = pto.alloc_tile addr = %c262144_i64 : !pto.tile_buf + %c327680_i64 = arith.constant 327680 : i64 + %34 = pto.alloc_tile addr = %c327680_i64 : !pto.tile_buf + %c360448_i64 = arith.constant 360448 : i64 + %35 = pto.alloc_tile addr = %c360448_i64 : !pto.tile_buf + %c393216_i64 = arith.constant 393216 : i64 + %36 = pto.alloc_tile addr = %c393216_i64 : !pto.tile_buf + %c393472_i64 = arith.constant 393472 : i64 + %37 = pto.alloc_tile addr = %c393472_i64 : !pto.tile_buf + %c393728_i64 = arith.constant 393728 : i64 + %38 = pto.alloc_tile addr = %c393728_i64 : !pto.tile_buf + %c393984_i64 = arith.constant 393984 : i64 + %39 = pto.alloc_tile addr = %c393984_i64 : !pto.tile_buf + %c394240_i64 = arith.constant 394240 : i64 + %40 = pto.alloc_tile addr = %c394240_i64 : !pto.tile_buf + %c394496_i64 = arith.constant 394496 : i64 + %41 = pto.alloc_tile addr = %c394496_i64 : !pto.tile_buf + %cst = arith.constant 0.0883883461 : f32 + %cst_3 = arith.constant 1.000000e+00 : f32 + %c2048 = arith.constant 2048 : index + %42 = pto.make_tensor_view %arg1, shape = [%c2048, %c128_0], strides = [%c128_0, %c1] : !pto.tensor_view + scf.for %arg2 = %14 to %18 step %c1 { + %43 = arith.muli %arg2, %c128 : index + %c394752_i64 = arith.constant 394752 : i64 + %44 = pto.alloc_tile addr = %c394752_i64 : !pto.tile_buf + %qk_pop_0 = pto.tpop_from_aic {id = 25, split = 0} -> !pto.tensor_view<128x256xf32> + %qk_pop_part_0 = pto.partition_view %qk_pop_0, offsets = [%31, %c0], sizes = [%c64, %c256] : !pto.tensor_view<128x256xf32> -> !pto.partition_tensor_view<64x256xf32> + pto.tload ins(%qk_pop_part_0 : !pto.partition_tensor_view<64x256xf32>) outs(%44 : !pto.tile_buf) + pto.tmuls ins(%44, %cst : !pto.tile_buf, f32) outs(%44 : !pto.tile_buf) + pto.trowmax ins(%44, %33 : !pto.tile_buf, !pto.tile_buf) outs(%37 : !pto.tile_buf) + %45 = pto.treshape %37 : !pto.tile_buf -> !pto.tile_buf + %46 = pto.treshape %36 : !pto.tile_buf -> !pto.tile_buf + %47 = pto.treshape %40 : !pto.tile_buf -> !pto.tile_buf + %48 = pto.treshape %38 : !pto.tile_buf -> !pto.tile_buf + %49 = pto.treshape %39 : !pto.tile_buf -> !pto.tile_buf + pto.trowexpandsub ins(%44, %37 : !pto.tile_buf, !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.tmuls ins(%45, %cst_3 : !pto.tile_buf, f32) outs(%46 : !pto.tile_buf) + pto.texp ins(%33 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.trowsum ins(%33, %32 : !pto.tile_buf, !pto.tile_buf) outs(%38 : !pto.tile_buf) + pto.tcvt ins(%33 {rmode = #pto} : !pto.tile_buf) outs(%34 : !pto.tile_buf) + pto.tpush_to_aic(%34 : !pto.tile_buf) {id = 30, split = 1} + pto.tfree_from_aic(%qk_pop_0 : !pto.tensor_view<128x256xf32>) {id = 25, split = 0} + %c394752_i64_4 = arith.constant 394752 : i64 + %50 = pto.alloc_tile addr = %c394752_i64_4 : !pto.tile_buf + %qk_pop_1 = pto.tpop_from_aic {id = 25, split = 0} -> !pto.tensor_view<128x256xf32> + %qk_pop_part_1 = pto.partition_view %qk_pop_1, offsets = [%31, %c0], sizes = [%c64, %c256] : !pto.tensor_view<128x256xf32> -> !pto.partition_tensor_view<64x256xf32> + pto.tload ins(%qk_pop_part_1 : !pto.partition_tensor_view<64x256xf32>) outs(%50 : !pto.tile_buf) + pto.tmuls ins(%50, %cst : !pto.tile_buf, f32) outs(%50 : !pto.tile_buf) + pto.trowmax ins(%50, %33 : !pto.tile_buf, !pto.tile_buf) outs(%37 : !pto.tile_buf) + %51 = pto.treshape %37 : !pto.tile_buf -> !pto.tile_buf + %52 = pto.treshape %36 : !pto.tile_buf -> !pto.tile_buf + %53 = pto.treshape %41 : !pto.tile_buf -> !pto.tile_buf + %54 = pto.treshape %38 : !pto.tile_buf -> !pto.tile_buf + %55 = pto.treshape %39 : !pto.tile_buf -> !pto.tile_buf + pto.tmax ins(%51, %52 : !pto.tile_buf, !pto.tile_buf) outs(%51 : !pto.tile_buf) + pto.tsub ins(%52, %51 : !pto.tile_buf, !pto.tile_buf) outs(%53 : !pto.tile_buf) + pto.tmuls ins(%51, %cst_3 : !pto.tile_buf, f32) outs(%52 : !pto.tile_buf) + pto.trowexpandsub ins(%50, %37 : !pto.tile_buf, !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.texp ins(%53 : !pto.tile_buf) outs(%53 : !pto.tile_buf) + pto.texp ins(%33 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.tmul ins(%54, %53 : !pto.tile_buf, !pto.tile_buf) outs(%54 : !pto.tile_buf) + pto.trowsum ins(%33, %32 : !pto.tile_buf, !pto.tile_buf) outs(%39 : !pto.tile_buf) + pto.tadd ins(%54, %55 : !pto.tile_buf, !pto.tile_buf) outs(%54 : !pto.tile_buf) + pto.tcvt ins(%33 {rmode = #pto} : !pto.tile_buf) outs(%34 : !pto.tile_buf) + pto.tpush_to_aic(%34 : !pto.tile_buf) {id = 30, split = 1} + pto.tfree_from_aic(%qk_pop_1 : !pto.tensor_view<128x256xf32>) {id = 25, split = 0} + %c394752_i64_5 = arith.constant 394752 : i64 + %56 = pto.alloc_tile addr = %c394752_i64_5 : !pto.tile_buf + %pv_pop_0 = pto.tpop_from_aic {id = 27, split = 0} -> !pto.tensor_view<128x128xf32> + %pv_pop_part_0 = pto.partition_view %pv_pop_0, offsets = [%31, %c0], sizes = [%c64, %c128_0] : !pto.tensor_view<128x128xf32> -> !pto.partition_tensor_view<64x128xf32> + pto.tload ins(%pv_pop_part_0 : !pto.partition_tensor_view<64x128xf32>) outs(%56 : !pto.tile_buf) + pto.tmov ins(%56 : !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tfree_from_aic(%pv_pop_0 : !pto.tensor_view<128x128xf32>) {id = 27, split = 0} + %c394752_i64_6 = arith.constant 394752 : i64 + %57 = pto.alloc_tile addr = %c394752_i64_6 : !pto.tile_buf + %qk_pop_2 = pto.tpop_from_aic {id = 25, split = 0} -> !pto.tensor_view<128x256xf32> + %qk_pop_part_2 = pto.partition_view %qk_pop_2, offsets = [%31, %c0], sizes = [%c64, %c256] : !pto.tensor_view<128x256xf32> -> !pto.partition_tensor_view<64x256xf32> + pto.tload ins(%qk_pop_part_2 : !pto.partition_tensor_view<64x256xf32>) outs(%57 : !pto.tile_buf) + pto.tmuls ins(%57, %cst : !pto.tile_buf, f32) outs(%57 : !pto.tile_buf) + pto.trowmax ins(%57, %33 : !pto.tile_buf, !pto.tile_buf) outs(%37 : !pto.tile_buf) + %58 = pto.treshape %37 : !pto.tile_buf -> !pto.tile_buf + %59 = pto.treshape %36 : !pto.tile_buf -> !pto.tile_buf + %60 = pto.treshape %40 : !pto.tile_buf -> !pto.tile_buf + %61 = pto.treshape %38 : !pto.tile_buf -> !pto.tile_buf + %62 = pto.treshape %39 : !pto.tile_buf -> !pto.tile_buf + pto.tmax ins(%58, %59 : !pto.tile_buf, !pto.tile_buf) outs(%58 : !pto.tile_buf) + pto.tsub ins(%59, %58 : !pto.tile_buf, !pto.tile_buf) outs(%60 : !pto.tile_buf) + pto.tmuls ins(%58, %cst_3 : !pto.tile_buf, f32) outs(%59 : !pto.tile_buf) + pto.trowexpandsub ins(%57, %37 : !pto.tile_buf, !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.texp ins(%60 : !pto.tile_buf) outs(%60 : !pto.tile_buf) + pto.texp ins(%33 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.tmul ins(%61, %60 : !pto.tile_buf, !pto.tile_buf) outs(%61 : !pto.tile_buf) + pto.trowsum ins(%33, %32 : !pto.tile_buf, !pto.tile_buf) outs(%39 : !pto.tile_buf) + pto.tadd ins(%61, %62 : !pto.tile_buf, !pto.tile_buf) outs(%61 : !pto.tile_buf) + pto.tcvt ins(%33 {rmode = #pto} : !pto.tile_buf) outs(%34 : !pto.tile_buf) + pto.tpush_to_aic(%34 : !pto.tile_buf) {id = 30, split = 1} + pto.tfree_from_aic(%qk_pop_2 : !pto.tensor_view<128x256xf32>) {id = 25, split = 0} + %c394752_i64_7 = arith.constant 394752 : i64 + %63 = pto.alloc_tile addr = %c394752_i64_7 : !pto.tile_buf + %pv_pop_1 = pto.tpop_from_aic {id = 27, split = 0} -> !pto.tensor_view<128x128xf32> + %pv_pop_part_1 = pto.partition_view %pv_pop_1, offsets = [%31, %c0], sizes = [%c64, %c128_0] : !pto.tensor_view<128x128xf32> -> !pto.partition_tensor_view<64x128xf32> + pto.tload ins(%pv_pop_part_1 : !pto.partition_tensor_view<64x128xf32>) outs(%63 : !pto.tile_buf) + pto.trowexpandmul ins(%35, %41 : !pto.tile_buf, !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tadd ins(%35, %63 : !pto.tile_buf, !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tfree_from_aic(%pv_pop_1 : !pto.tensor_view<128x128xf32>) {id = 27, split = 0} + %c394752_i64_8 = arith.constant 394752 : i64 + %64 = pto.alloc_tile addr = %c394752_i64_8 : !pto.tile_buf + %qk_pop_3 = pto.tpop_from_aic {id = 25, split = 0} -> !pto.tensor_view<128x256xf32> + %qk_pop_part_3 = pto.partition_view %qk_pop_3, offsets = [%31, %c0], sizes = [%c64, %c256] : !pto.tensor_view<128x256xf32> -> !pto.partition_tensor_view<64x256xf32> + pto.tload ins(%qk_pop_part_3 : !pto.partition_tensor_view<64x256xf32>) outs(%64 : !pto.tile_buf) + pto.tmuls ins(%64, %cst : !pto.tile_buf, f32) outs(%64 : !pto.tile_buf) + pto.trowmax ins(%64, %33 : !pto.tile_buf, !pto.tile_buf) outs(%37 : !pto.tile_buf) + %65 = pto.treshape %37 : !pto.tile_buf -> !pto.tile_buf + %66 = pto.treshape %36 : !pto.tile_buf -> !pto.tile_buf + %67 = pto.treshape %41 : !pto.tile_buf -> !pto.tile_buf + %68 = pto.treshape %38 : !pto.tile_buf -> !pto.tile_buf + %69 = pto.treshape %39 : !pto.tile_buf -> !pto.tile_buf + pto.tmax ins(%65, %66 : !pto.tile_buf, !pto.tile_buf) outs(%65 : !pto.tile_buf) + pto.tsub ins(%66, %65 : !pto.tile_buf, !pto.tile_buf) outs(%67 : !pto.tile_buf) + pto.tmuls ins(%65, %cst_3 : !pto.tile_buf, f32) outs(%66 : !pto.tile_buf) + pto.trowexpandsub ins(%64, %37 : !pto.tile_buf, !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.texp ins(%67 : !pto.tile_buf) outs(%67 : !pto.tile_buf) + pto.texp ins(%33 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.tmul ins(%68, %67 : !pto.tile_buf, !pto.tile_buf) outs(%68 : !pto.tile_buf) + pto.trowsum ins(%33, %32 : !pto.tile_buf, !pto.tile_buf) outs(%39 : !pto.tile_buf) + pto.tadd ins(%68, %69 : !pto.tile_buf, !pto.tile_buf) outs(%68 : !pto.tile_buf) + pto.tcvt ins(%33 {rmode = #pto} : !pto.tile_buf) outs(%34 : !pto.tile_buf) + pto.tpush_to_aic(%34 : !pto.tile_buf) {id = 30, split = 1} + pto.tfree_from_aic(%qk_pop_3 : !pto.tensor_view<128x256xf32>) {id = 25, split = 0} + %c7 = arith.constant 7 : index + scf.for %arg3 = %c1 to %c7 step %c1 { + %c394752_i64_11 = arith.constant 394752 : i64 + %74 = pto.alloc_tile addr = %c394752_i64_11 : !pto.tile_buf + %pv_pop_2 = pto.tpop_from_aic {id = 27, split = 0} -> !pto.tensor_view<128x128xf32> + %pv_pop_part_2 = pto.partition_view %pv_pop_2, offsets = [%31, %c0], sizes = [%c64, %c128_0] : !pto.tensor_view<128x128xf32> -> !pto.partition_tensor_view<64x128xf32> + pto.tload ins(%pv_pop_part_2 : !pto.partition_tensor_view<64x128xf32>) outs(%74 : !pto.tile_buf) + pto.trowexpandmul ins(%35, %40 : !pto.tile_buf, !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tadd ins(%35, %74 : !pto.tile_buf, !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tfree_from_aic(%pv_pop_2 : !pto.tensor_view<128x128xf32>) {id = 27, split = 0} + %c394752_i64_12 = arith.constant 394752 : i64 + %75 = pto.alloc_tile addr = %c394752_i64_12 : !pto.tile_buf + %qk_pop_4 = pto.tpop_from_aic {id = 25, split = 0} -> !pto.tensor_view<128x256xf32> + %qk_pop_part_4 = pto.partition_view %qk_pop_4, offsets = [%31, %c0], sizes = [%c64, %c256] : !pto.tensor_view<128x256xf32> -> !pto.partition_tensor_view<64x256xf32> + pto.tload ins(%qk_pop_part_4 : !pto.partition_tensor_view<64x256xf32>) outs(%75 : !pto.tile_buf) + pto.tmuls ins(%75, %cst : !pto.tile_buf, f32) outs(%75 : !pto.tile_buf) + pto.trowmax ins(%75, %33 : !pto.tile_buf, !pto.tile_buf) outs(%37 : !pto.tile_buf) + %76 = pto.treshape %37 : !pto.tile_buf -> !pto.tile_buf + %77 = pto.treshape %36 : !pto.tile_buf -> !pto.tile_buf + %78 = pto.treshape %40 : !pto.tile_buf -> !pto.tile_buf + %79 = pto.treshape %38 : !pto.tile_buf -> !pto.tile_buf + %80 = pto.treshape %39 : !pto.tile_buf -> !pto.tile_buf + pto.tmax ins(%76, %77 : !pto.tile_buf, !pto.tile_buf) outs(%76 : !pto.tile_buf) + pto.tsub ins(%77, %76 : !pto.tile_buf, !pto.tile_buf) outs(%78 : !pto.tile_buf) + pto.tmuls ins(%76, %cst_3 : !pto.tile_buf, f32) outs(%77 : !pto.tile_buf) + pto.trowexpandsub ins(%75, %37 : !pto.tile_buf, !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.texp ins(%78 : !pto.tile_buf) outs(%78 : !pto.tile_buf) + pto.texp ins(%33 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.tmul ins(%79, %78 : !pto.tile_buf, !pto.tile_buf) outs(%79 : !pto.tile_buf) + pto.trowsum ins(%33, %32 : !pto.tile_buf, !pto.tile_buf) outs(%39 : !pto.tile_buf) + pto.tadd ins(%79, %80 : !pto.tile_buf, !pto.tile_buf) outs(%79 : !pto.tile_buf) + pto.tcvt ins(%33 {rmode = #pto} : !pto.tile_buf) outs(%34 : !pto.tile_buf) + pto.tpush_to_aic(%34 : !pto.tile_buf) {id = 30, split = 1} + pto.tfree_from_aic(%qk_pop_4 : !pto.tensor_view<128x256xf32>) {id = 25, split = 0} + %c394752_i64_13 = arith.constant 394752 : i64 + %81 = pto.alloc_tile addr = %c394752_i64_13 : !pto.tile_buf + %pv_pop_3 = pto.tpop_from_aic {id = 27, split = 0} -> !pto.tensor_view<128x128xf32> + %pv_pop_part_3 = pto.partition_view %pv_pop_3, offsets = [%31, %c0], sizes = [%c64, %c128_0] : !pto.tensor_view<128x128xf32> -> !pto.partition_tensor_view<64x128xf32> + pto.tload ins(%pv_pop_part_3 : !pto.partition_tensor_view<64x128xf32>) outs(%81 : !pto.tile_buf) + pto.trowexpandmul ins(%35, %41 : !pto.tile_buf, !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tadd ins(%35, %81 : !pto.tile_buf, !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tfree_from_aic(%pv_pop_3 : !pto.tensor_view<128x128xf32>) {id = 27, split = 0} + %c394752_i64_14 = arith.constant 394752 : i64 + %82 = pto.alloc_tile addr = %c394752_i64_14 : !pto.tile_buf + %qk_pop_5 = pto.tpop_from_aic {id = 25, split = 0} -> !pto.tensor_view<128x256xf32> + %qk_pop_part_5 = pto.partition_view %qk_pop_5, offsets = [%31, %c0], sizes = [%c64, %c256] : !pto.tensor_view<128x256xf32> -> !pto.partition_tensor_view<64x256xf32> + pto.tload ins(%qk_pop_part_5 : !pto.partition_tensor_view<64x256xf32>) outs(%82 : !pto.tile_buf) + pto.tmuls ins(%82, %cst : !pto.tile_buf, f32) outs(%82 : !pto.tile_buf) + pto.trowmax ins(%82, %33 : !pto.tile_buf, !pto.tile_buf) outs(%37 : !pto.tile_buf) + %83 = pto.treshape %37 : !pto.tile_buf -> !pto.tile_buf + %84 = pto.treshape %36 : !pto.tile_buf -> !pto.tile_buf + %85 = pto.treshape %41 : !pto.tile_buf -> !pto.tile_buf + %86 = pto.treshape %38 : !pto.tile_buf -> !pto.tile_buf + %87 = pto.treshape %39 : !pto.tile_buf -> !pto.tile_buf + pto.tmax ins(%83, %84 : !pto.tile_buf, !pto.tile_buf) outs(%83 : !pto.tile_buf) + pto.tsub ins(%84, %83 : !pto.tile_buf, !pto.tile_buf) outs(%85 : !pto.tile_buf) + pto.tmuls ins(%83, %cst_3 : !pto.tile_buf, f32) outs(%84 : !pto.tile_buf) + pto.trowexpandsub ins(%82, %37 : !pto.tile_buf, !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.texp ins(%85 : !pto.tile_buf) outs(%85 : !pto.tile_buf) + pto.texp ins(%33 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.tmul ins(%86, %85 : !pto.tile_buf, !pto.tile_buf) outs(%86 : !pto.tile_buf) + pto.trowsum ins(%33, %32 : !pto.tile_buf, !pto.tile_buf) outs(%39 : !pto.tile_buf) + pto.tadd ins(%86, %87 : !pto.tile_buf, !pto.tile_buf) outs(%86 : !pto.tile_buf) + pto.tcvt ins(%33 {rmode = #pto} : !pto.tile_buf) outs(%34 : !pto.tile_buf) + pto.tpush_to_aic(%34 : !pto.tile_buf) {id = 30, split = 1} + pto.tfree_from_aic(%qk_pop_5 : !pto.tensor_view<128x256xf32>) {id = 25, split = 0} + } + %c394752_i64_9 = arith.constant 394752 : i64 + %70 = pto.alloc_tile addr = %c394752_i64_9 : !pto.tile_buf + %pv_pop_4 = pto.tpop_from_aic {id = 27, split = 0} -> !pto.tensor_view<128x128xf32> + %pv_pop_part_4 = pto.partition_view %pv_pop_4, offsets = [%31, %c0], sizes = [%c64, %c128_0] : !pto.tensor_view<128x128xf32> -> !pto.partition_tensor_view<64x128xf32> + pto.tload ins(%pv_pop_part_4 : !pto.partition_tensor_view<64x128xf32>) outs(%70 : !pto.tile_buf) + pto.trowexpandmul ins(%35, %40 : !pto.tile_buf, !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tadd ins(%35, %70 : !pto.tile_buf, !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tfree_from_aic(%pv_pop_4 : !pto.tensor_view<128x128xf32>) {id = 27, split = 0} + %c394752_i64_10 = arith.constant 394752 : i64 + %71 = pto.alloc_tile addr = %c394752_i64_10 : !pto.tile_buf + %pv_pop_5 = pto.tpop_from_aic {id = 27, split = 0} -> !pto.tensor_view<128x128xf32> + %pv_pop_part_5 = pto.partition_view %pv_pop_5, offsets = [%31, %c0], sizes = [%c64, %c128_0] : !pto.tensor_view<128x128xf32> -> !pto.partition_tensor_view<64x128xf32> + pto.tload ins(%pv_pop_part_5 : !pto.partition_tensor_view<64x128xf32>) outs(%71 : !pto.tile_buf) + pto.trowexpandmul ins(%35, %41 : !pto.tile_buf, !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tadd ins(%35, %71 : !pto.tile_buf, !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tfree_from_aic(%pv_pop_5 : !pto.tensor_view<128x128xf32>) {id = 27, split = 0} + pto.trowexpanddiv ins(%35, %38 : !pto.tile_buf, !pto.tile_buf) outs(%35 : !pto.tile_buf) + %72 = arith.addi %43, %31 : index + %73 = pto.partition_view %42, offsets = [%72, %c0], sizes = [%c64, %c128_0] : !pto.tensor_view -> !pto.partition_tensor_view<64x128xf32> + pto.tstore ins(%35 : !pto.tile_buf) outs(%73 : !pto.partition_tensor_view<64x128xf32>) + } + return + } + func.func @call_both(%arg0: memref<256xi64>, %arg1: !pto.ptr, %arg2: !pto.ptr, %arg3: !pto.ptr, %arg4: !pto.ptr, %arg5: !pto.ptr) attributes {pto.entry} { + pto.set_ffts %arg0 : memref<256xi64> + call @cube_kernel(%arg1, %arg2, %arg3, %arg4) : (!pto.ptr, !pto.ptr, !pto.ptr, !pto.ptr) -> () + call @vector_kernel(%arg1, %arg5) : (!pto.ptr, !pto.ptr) -> () + return + } +} \ No newline at end of file diff --git a/examples/aot/flash_attention/ir_ref/fa_perf.pto b/examples/aot/flash_attention/ir_ref/fa_perf.pto new file mode 100644 index 00000000..1184907f --- /dev/null +++ b/examples/aot/flash_attention/ir_ref/fa_perf.pto @@ -0,0 +1,743 @@ +// RUN: ptoas --pto-arch=a3 --pto-level=level3 --enable-insert-sync %s >/dev/null + +module { + func.func @cube_kernel(%qk_fifo: !pto.ptr, %arg1: !pto.ptr, %arg2: !pto.ptr, %arg3: !pto.ptr, %p_fifo: !pto.ptr, %pv_fifo: !pto.ptr) attributes {pto.kernel_kind = #pto.kernel_kind} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c128_0 = arith.constant 128 : index + %c256 = arith.constant 256 : index + %c4096 = arith.constant 4096 : index + %c128_1 = arith.constant 128 : index + %c16 = arith.constant 16 : index + %c16_2 = arith.constant 16 : index + %0 = pto.get_block_num + %1 = arith.index_cast %0 : i64 to index + %2 = pto.get_block_idx + %3 = arith.index_cast %2 : i64 to index + %4 = arith.divsi %c16_2, %1 : index + %5 = arith.remsi %c16_2, %1 : index + %6 = arith.addi %4, %c1 : index + %7 = arith.muli %3, %6 : index + %8 = arith.addi %4, %c1 : index + %9 = arith.muli %5, %8 : index + %10 = arith.subi %3, %5 : index + %11 = arith.muli %10, %4 : index + %12 = arith.addi %9, %11 : index + %13 = arith.cmpi slt, %3, %5 : index + %14 = arith.select %13, %7, %12 : index + %15 = arith.cmpi slt, %3, %5 : index + %16 = arith.addi %4, %c1 : index + %17 = arith.select %15, %16, %4 : index + %18 = arith.addi %14, %17 : index + %c262144 = arith.constant 262144 : index + %19 = arith.muli %3, %c262144 : index + %21 = pto.addptr %qk_fifo, %19 : -> + %p_block = pto.addptr %p_fifo, %19 : -> + %c131072 = arith.constant 131072 : index + %pv_block_off = arith.muli %3, %c131072 : index + %22 = pto.addptr %pv_fifo, %pv_block_off : -> + %qk_slot_desc = pto.make_tensor_view %21, shape = [%c128, %c256], strides = [%c256, %c1] : !pto.tensor_view<128x256xf32> + pto.aic_initialize_pipe{id = 25, dir_mask = 1, slot_size = 131072} (gm_slot_tensor = %qk_slot_desc : !pto.tensor_view<128x256xf32>) + %p_slot_desc = pto.make_tensor_view %p_block, shape = [%c128, %c256], strides = [%c256, %c1] : !pto.tensor_view<128x256xf16> + pto.aic_initialize_pipe{id = 30, dir_mask = 2, slot_size = 65536} (gm_slot_tensor = %p_slot_desc : !pto.tensor_view<128x256xf16>) + %pv_slot_desc = pto.make_tensor_view %22, shape = [%c128, %c128_0], strides = [%c128_0, %c1] : !pto.tensor_view<128x128xf32> + pto.aic_initialize_pipe{id = 27, dir_mask = 1, slot_size = 65536} (gm_slot_tensor = %pv_slot_desc : !pto.tensor_view<128x128xf32>) + %c0_i64 = arith.constant 0 : i64 + %c0_i64_4 = arith.constant 0 : i64 + %29 = pto.alloc_tile addr = %c0_i64_4 : !pto.tile_buf + %c0_i64_5 = arith.constant 0 : i64 + %30 = pto.alloc_tile addr = %c0_i64_5 : !pto.tile_buf + %c32768_i64 = arith.constant 32768 : i64 + %31 = pto.alloc_tile addr = %c32768_i64 : !pto.tile_buf + %c65536_i64 = arith.constant 65536 : i64 + %32 = pto.alloc_tile addr = %c65536_i64 : !pto.tile_buf + %33 = pto.alloc_tile addr = %c0_i64 : !pto.tile_buf + %c0_i64_6 = arith.constant 0 : i64 + %34 = pto.alloc_tile addr = %c0_i64_6 : !pto.tile_buf + %c98304_i64 = arith.constant 98304 : i64 + %35 = pto.alloc_tile addr = %c98304_i64 : !pto.tile_buf + %c32768_i64_7 = arith.constant 32768 : i64 + %36 = pto.alloc_tile addr = %c32768_i64_7 : !pto.tile_buf + %c229376_i64 = arith.constant 229376 : i64 + %37 = pto.alloc_tile addr = %c229376_i64 : !pto.tile_buf + %38 = pto.alloc_tile addr = %c0_i64 : !pto.tile_buf + %c131072_i64 = arith.constant 131072 : i64 + %39 = pto.alloc_tile addr = %c65536_i64 : !pto.tile_buf + %c2048 = arith.constant 2048 : index + %40 = pto.make_tensor_view %arg1, shape = [%c2048, %c128_0], strides = [%c128_0, %c1] : !pto.tensor_view + %41 = pto.make_tensor_view %arg2, shape = [%c128_0, %c4096], strides = [%c1, %c128_0] : !pto.tensor_view + %42 = pto.make_tensor_view %arg3, shape = [%c4096, %c128_0], strides = [%c128_0, %c1] : !pto.tensor_view + scf.for %arg4 = %14 to %18 step %c1 { + %43 = arith.muli %arg4, %c128 : index + %44 = pto.partition_view %40, offsets = [%43, %c0], sizes = [%c128, %c128_0] : !pto.tensor_view -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%44 : !pto.partition_tensor_view<128x128xf16>) outs(%29 : !pto.tile_buf) + pto.tmov ins(%29 : !pto.tile_buf) outs(%30 : !pto.tile_buf) + %c0_8 = arith.constant 0 : index + %c0_9 = arith.constant 0 : index + %45 = arith.addi %c0_8, %c0_9 : index + %46 = pto.partition_view %41, offsets = [%c0, %45], sizes = [%c128_0, %c128_1] : !pto.tensor_view -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%46 : !pto.partition_tensor_view<128x128xf16>) outs(%31 : !pto.tile_buf) + pto.tmov ins(%31 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + %c0_10 = arith.constant 0 : index + %47 = pto.subview %34[%c0, %c0_10] sizes [128, 128] : !pto.tile_buf -> !pto.tile_buf + pto.tmatmul ins(%30, %33 : !pto.tile_buf, !pto.tile_buf) outs(%47 : !pto.tile_buf) + %c128_11 = arith.constant 128 : index + %48 = arith.addi %c0_8, %c128_11 : index + %49 = pto.partition_view %41, offsets = [%c0, %48], sizes = [%c128_0, %c128_1] : !pto.tensor_view -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%49 : !pto.partition_tensor_view<128x128xf16>) outs(%31 : !pto.tile_buf) + pto.tmov ins(%31 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + %c128_12 = arith.constant 128 : index + %50 = pto.subview %34[%c0, %c128_12] sizes [128, 128] : !pto.tile_buf -> !pto.tile_buf + pto.tmatmul ins(%30, %33 : !pto.tile_buf, !pto.tile_buf) outs(%50 : !pto.tile_buf) + %qk_push_0 = pto.talloc_to_aiv {id = 25, split = 0} -> !pto.tensor_view<128x256xf32> + %qk_push_part_0 = pto.partition_view %qk_push_0, offsets = [%c0, %c0], sizes = [%c128, %c256] : !pto.tensor_view<128x256xf32> -> !pto.partition_tensor_view<128x256xf32> + pto.tstore ins(%34 : !pto.tile_buf) outs(%qk_push_part_0 : !pto.partition_tensor_view<128x256xf32>) + pto.tpush_to_aiv(%qk_push_0 : !pto.tensor_view<128x256xf32>) {id = 25, split = 0} + %c256_13 = arith.constant 256 : index + %c0_14 = arith.constant 0 : index + %51 = arith.addi %c256_13, %c0_14 : index + %52 = pto.partition_view %41, offsets = [%c0, %51], sizes = [%c128_0, %c128_1] : !pto.tensor_view -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%52 : !pto.partition_tensor_view<128x128xf16>) outs(%32 : !pto.tile_buf) + pto.tmov ins(%32 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + %c0_15 = arith.constant 0 : index + %53 = pto.subview %34[%c0, %c0_15] sizes [128, 128] : !pto.tile_buf -> !pto.tile_buf + pto.tmatmul ins(%30, %33 : !pto.tile_buf, !pto.tile_buf) outs(%53 : !pto.tile_buf) + %c128_16 = arith.constant 128 : index + %54 = arith.addi %c256_13, %c128_16 : index + %55 = pto.partition_view %41, offsets = [%c0, %54], sizes = [%c128_0, %c128_1] : !pto.tensor_view -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%55 : !pto.partition_tensor_view<128x128xf16>) outs(%32 : !pto.tile_buf) + pto.tmov ins(%32 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + %c128_17 = arith.constant 128 : index + %56 = pto.subview %34[%c0, %c128_17] sizes [128, 128] : !pto.tile_buf -> !pto.tile_buf + pto.tmatmul ins(%30, %33 : !pto.tile_buf, !pto.tile_buf) outs(%56 : !pto.tile_buf) + %qk_push_1 = pto.talloc_to_aiv {id = 25, split = 0} -> !pto.tensor_view<128x256xf32> + %qk_push_part_1 = pto.partition_view %qk_push_1, offsets = [%c0, %c0], sizes = [%c128, %c256] : !pto.tensor_view<128x256xf32> -> !pto.partition_tensor_view<128x256xf32> + pto.tstore ins(%34 : !pto.tile_buf) outs(%qk_push_part_1 : !pto.partition_tensor_view<128x256xf32>) + pto.tpush_to_aiv(%qk_push_1 : !pto.tensor_view<128x256xf32>) {id = 25, split = 0} + %57 = pto.partition_view %42, offsets = [%c0, %c0], sizes = [%c128, %c128_0] : !pto.tensor_view -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%57 : !pto.partition_tensor_view<128x128xf16>) outs(%37 : !pto.tile_buf) + %c2 = arith.constant 2 : index + %c7 = arith.constant 7 : index + scf.for %arg5 = %c0 to %c7 step %c1 { + %61 = arith.muli %arg5, %c2 : index + %c2_18 = arith.constant 2 : index + %62 = arith.addi %61, %c2_18 : index + %63 = arith.muli %62, %c256 : index + %p_pop_0 = pto.tpop_from_aiv {id = 30, split = 0} -> !pto.tensor_view<128x256xf16> + %p_pop_part_0 = pto.partition_view %p_pop_0, offsets = [%c0, %c0], sizes = [%c128, %c128_0] : !pto.tensor_view<128x256xf16> -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%p_pop_part_0 : !pto.partition_tensor_view<128x128xf16>) outs(%35 : !pto.tile_buf) + pto.tmov ins(%35 : !pto.tile_buf) outs(%36 : !pto.tile_buf) + %pv0_v_base = arith.muli %61, %c256 : index + %pv0_v_part_0 = pto.partition_view %42, offsets = [%pv0_v_base, %c0], sizes = [%c128, %c128_0] : !pto.tensor_view -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%pv0_v_part_0 : !pto.partition_tensor_view<128x128xf16>) outs(%37 : !pto.tile_buf) + pto.tmov ins(%37 : !pto.tile_buf) outs(%38 : !pto.tile_buf) + pto.tmatmul ins(%36, %38 : !pto.tile_buf, !pto.tile_buf) outs(%39 : !pto.tile_buf) + %p_pop_part_0_hi = pto.partition_view %p_pop_0, offsets = [%c0, %c128], sizes = [%c128, %c128_0] : !pto.tensor_view<128x256xf16> -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%p_pop_part_0_hi : !pto.partition_tensor_view<128x128xf16>) outs(%35 : !pto.tile_buf) + pto.tmov ins(%35 : !pto.tile_buf) outs(%36 : !pto.tile_buf) + pto.tfree_from_aiv(%p_pop_0 : !pto.tensor_view<128x256xf16>) {id = 30, split = 0} + %pv0_v_hi = arith.addi %pv0_v_base, %c128 : index + %pv0_v_part_1 = pto.partition_view %42, offsets = [%pv0_v_hi, %c0], sizes = [%c128, %c128_0] : !pto.tensor_view -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%pv0_v_part_1 : !pto.partition_tensor_view<128x128xf16>) outs(%37 : !pto.tile_buf) + pto.tmov ins(%37 : !pto.tile_buf) outs(%38 : !pto.tile_buf) + pto.tmatmul.acc ins(%39, %36, %38 : !pto.tile_buf, !pto.tile_buf, !pto.tile_buf) outs(%39 : !pto.tile_buf) + %pv_push_0 = pto.talloc_to_aiv {id = 27, split = 0} -> !pto.tensor_view<128x128xf32> + %pv_push_part_0 = pto.partition_view %pv_push_0, offsets = [%c0, %c0], sizes = [%c128, %c128_0] : !pto.tensor_view<128x128xf32> -> !pto.partition_tensor_view<128x128xf32> + pto.tstore ins(%39 : !pto.tile_buf) outs(%pv_push_part_0 : !pto.partition_tensor_view<128x128xf32>) + pto.tpush_to_aiv(%pv_push_0 : !pto.tensor_view<128x128xf32>) {id = 27, split = 0} + %c0_19 = arith.constant 0 : index + %68 = arith.addi %63, %c0_19 : index + %69 = pto.partition_view %41, offsets = [%c0, %68], sizes = [%c128_0, %c128_1] : !pto.tensor_view -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%69 : !pto.partition_tensor_view<128x128xf16>) outs(%31 : !pto.tile_buf) + pto.tmov ins(%31 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + %c0_20 = arith.constant 0 : index + %70 = pto.subview %34[%c0, %c0_20] sizes [128, 128] : !pto.tile_buf -> !pto.tile_buf + pto.tmatmul ins(%30, %33 : !pto.tile_buf, !pto.tile_buf) outs(%70 : !pto.tile_buf) + %c128_21 = arith.constant 128 : index + %71 = arith.addi %63, %c128_21 : index + %72 = pto.partition_view %41, offsets = [%c0, %71], sizes = [%c128_0, %c128_1] : !pto.tensor_view -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%72 : !pto.partition_tensor_view<128x128xf16>) outs(%31 : !pto.tile_buf) + pto.tmov ins(%31 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + %c128_22 = arith.constant 128 : index + %73 = pto.subview %34[%c0, %c128_22] sizes [128, 128] : !pto.tile_buf -> !pto.tile_buf + pto.tmatmul ins(%30, %33 : !pto.tile_buf, !pto.tile_buf) outs(%73 : !pto.tile_buf) + %qk_push_2 = pto.talloc_to_aiv {id = 25, split = 0} -> !pto.tensor_view<128x256xf32> + %qk_push_part_2 = pto.partition_view %qk_push_2, offsets = [%c0, %c0], sizes = [%c128, %c256] : !pto.tensor_view<128x256xf32> -> !pto.partition_tensor_view<128x256xf32> + pto.tstore ins(%34 : !pto.tile_buf) outs(%qk_push_part_2 : !pto.partition_tensor_view<128x256xf32>) + pto.tpush_to_aiv(%qk_push_2 : !pto.tensor_view<128x256xf32>) {id = 25, split = 0} + %74 = arith.muli %arg5, %c2 : index + %75 = arith.addi %74, %c1 : index + %c2_23 = arith.constant 2 : index + %76 = arith.addi %75, %c2_23 : index + %77 = arith.muli %76, %c256 : index + %p_pop_1 = pto.tpop_from_aiv {id = 30, split = 0} -> !pto.tensor_view<128x256xf16> + %p_pop_part_1 = pto.partition_view %p_pop_1, offsets = [%c0, %c0], sizes = [%c128, %c128_0] : !pto.tensor_view<128x256xf16> -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%p_pop_part_1 : !pto.partition_tensor_view<128x128xf16>) outs(%35 : !pto.tile_buf) + pto.tmov ins(%35 : !pto.tile_buf) outs(%36 : !pto.tile_buf) + %pv1_v_base = arith.muli %75, %c256 : index + %pv1_v_part_0 = pto.partition_view %42, offsets = [%pv1_v_base, %c0], sizes = [%c128, %c128_0] : !pto.tensor_view -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%pv1_v_part_0 : !pto.partition_tensor_view<128x128xf16>) outs(%37 : !pto.tile_buf) + pto.tmov ins(%37 : !pto.tile_buf) outs(%38 : !pto.tile_buf) + pto.tmatmul ins(%36, %38 : !pto.tile_buf, !pto.tile_buf) outs(%39 : !pto.tile_buf) + %p_pop_part_1_hi = pto.partition_view %p_pop_1, offsets = [%c0, %c128], sizes = [%c128, %c128_0] : !pto.tensor_view<128x256xf16> -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%p_pop_part_1_hi : !pto.partition_tensor_view<128x128xf16>) outs(%35 : !pto.tile_buf) + pto.tmov ins(%35 : !pto.tile_buf) outs(%36 : !pto.tile_buf) + pto.tfree_from_aiv(%p_pop_1 : !pto.tensor_view<128x256xf16>) {id = 30, split = 0} + %pv1_v_hi = arith.addi %pv1_v_base, %c128 : index + %pv1_v_part_1 = pto.partition_view %42, offsets = [%pv1_v_hi, %c0], sizes = [%c128, %c128_0] : !pto.tensor_view -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%pv1_v_part_1 : !pto.partition_tensor_view<128x128xf16>) outs(%37 : !pto.tile_buf) + pto.tmov ins(%37 : !pto.tile_buf) outs(%38 : !pto.tile_buf) + pto.tmatmul.acc ins(%39, %36, %38 : !pto.tile_buf, !pto.tile_buf, !pto.tile_buf) outs(%39 : !pto.tile_buf) + %pv_push_1 = pto.talloc_to_aiv {id = 27, split = 0} -> !pto.tensor_view<128x128xf32> + %pv_push_part_1 = pto.partition_view %pv_push_1, offsets = [%c0, %c0], sizes = [%c128, %c128_0] : !pto.tensor_view<128x128xf32> -> !pto.partition_tensor_view<128x128xf32> + pto.tstore ins(%39 : !pto.tile_buf) outs(%pv_push_part_1 : !pto.partition_tensor_view<128x128xf32>) + pto.tpush_to_aiv(%pv_push_1 : !pto.tensor_view<128x128xf32>) {id = 27, split = 0} + %c0_24 = arith.constant 0 : index + %82 = arith.addi %77, %c0_24 : index + %83 = pto.partition_view %41, offsets = [%c0, %82], sizes = [%c128_0, %c128_1] : !pto.tensor_view -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%83 : !pto.partition_tensor_view<128x128xf16>) outs(%32 : !pto.tile_buf) + pto.tmov ins(%32 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + %c0_25 = arith.constant 0 : index + %84 = pto.subview %34[%c0, %c0_25] sizes [128, 128] : !pto.tile_buf -> !pto.tile_buf + pto.tmatmul ins(%30, %33 : !pto.tile_buf, !pto.tile_buf) outs(%84 : !pto.tile_buf) + %c128_26 = arith.constant 128 : index + %85 = arith.addi %77, %c128_26 : index + %86 = pto.partition_view %41, offsets = [%c0, %85], sizes = [%c128_0, %c128_1] : !pto.tensor_view -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%86 : !pto.partition_tensor_view<128x128xf16>) outs(%32 : !pto.tile_buf) + pto.tmov ins(%32 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + %c128_27 = arith.constant 128 : index + %87 = pto.subview %34[%c0, %c128_27] sizes [128, 128] : !pto.tile_buf -> !pto.tile_buf + pto.tmatmul ins(%30, %33 : !pto.tile_buf, !pto.tile_buf) outs(%87 : !pto.tile_buf) + %qk_push_3 = pto.talloc_to_aiv {id = 25, split = 0} -> !pto.tensor_view<128x256xf32> + %qk_push_part_3 = pto.partition_view %qk_push_3, offsets = [%c0, %c0], sizes = [%c128, %c256] : !pto.tensor_view<128x256xf32> -> !pto.partition_tensor_view<128x256xf32> + pto.tstore ins(%34 : !pto.tile_buf) outs(%qk_push_part_3 : !pto.partition_tensor_view<128x256xf32>) + pto.tpush_to_aiv(%qk_push_3 : !pto.tensor_view<128x256xf32>) {id = 25, split = 0} + } + %p_pop_2 = pto.tpop_from_aiv {id = 30, split = 0} -> !pto.tensor_view<128x256xf16> + %p_pop_part_2 = pto.partition_view %p_pop_2, offsets = [%c0, %c0], sizes = [%c128, %c128_0] : !pto.tensor_view<128x256xf16> -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%p_pop_part_2 : !pto.partition_tensor_view<128x128xf16>) outs(%35 : !pto.tile_buf) + pto.tmov ins(%35 : !pto.tile_buf) outs(%36 : !pto.tile_buf) + %c3584 = arith.constant 3584 : index + %pv2_v_part_0 = pto.partition_view %42, offsets = [%c3584, %c0], sizes = [%c128, %c128_0] : !pto.tensor_view -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%pv2_v_part_0 : !pto.partition_tensor_view<128x128xf16>) outs(%37 : !pto.tile_buf) + pto.tmov ins(%37 : !pto.tile_buf) outs(%38 : !pto.tile_buf) + pto.tmatmul ins(%36, %38 : !pto.tile_buf, !pto.tile_buf) outs(%39 : !pto.tile_buf) + %p_pop_part_2_hi = pto.partition_view %p_pop_2, offsets = [%c0, %c128], sizes = [%c128, %c128_0] : !pto.tensor_view<128x256xf16> -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%p_pop_part_2_hi : !pto.partition_tensor_view<128x128xf16>) outs(%35 : !pto.tile_buf) + pto.tmov ins(%35 : !pto.tile_buf) outs(%36 : !pto.tile_buf) + pto.tfree_from_aiv(%p_pop_2 : !pto.tensor_view<128x256xf16>) {id = 30, split = 0} + %c3712 = arith.constant 3712 : index + %pv2_v_part_1 = pto.partition_view %42, offsets = [%c3712, %c0], sizes = [%c128, %c128_0] : !pto.tensor_view -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%pv2_v_part_1 : !pto.partition_tensor_view<128x128xf16>) outs(%37 : !pto.tile_buf) + pto.tmov ins(%37 : !pto.tile_buf) outs(%38 : !pto.tile_buf) + pto.tmatmul.acc ins(%39, %36, %38 : !pto.tile_buf, !pto.tile_buf, !pto.tile_buf) outs(%39 : !pto.tile_buf) + %pv_push_2 = pto.talloc_to_aiv {id = 27, split = 0} -> !pto.tensor_view<128x128xf32> + %pv_push_part_2 = pto.partition_view %pv_push_2, offsets = [%c0, %c0], sizes = [%c128, %c128_0] : !pto.tensor_view<128x128xf32> -> !pto.partition_tensor_view<128x128xf32> + pto.tstore ins(%39 : !pto.tile_buf) outs(%pv_push_part_2 : !pto.partition_tensor_view<128x128xf32>) + pto.tpush_to_aiv(%pv_push_2 : !pto.tensor_view<128x128xf32>) {id = 27, split = 0} + %p_pop_3 = pto.tpop_from_aiv {id = 30, split = 0} -> !pto.tensor_view<128x256xf16> + %p_pop_part_3 = pto.partition_view %p_pop_3, offsets = [%c0, %c0], sizes = [%c128, %c128_0] : !pto.tensor_view<128x256xf16> -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%p_pop_part_3 : !pto.partition_tensor_view<128x128xf16>) outs(%35 : !pto.tile_buf) + pto.tmov ins(%35 : !pto.tile_buf) outs(%36 : !pto.tile_buf) + %c3840 = arith.constant 3840 : index + %pv3_v_part_0 = pto.partition_view %42, offsets = [%c3840, %c0], sizes = [%c128, %c128_0] : !pto.tensor_view -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%pv3_v_part_0 : !pto.partition_tensor_view<128x128xf16>) outs(%37 : !pto.tile_buf) + pto.tmov ins(%37 : !pto.tile_buf) outs(%38 : !pto.tile_buf) + pto.tmatmul ins(%36, %38 : !pto.tile_buf, !pto.tile_buf) outs(%39 : !pto.tile_buf) + %p_pop_part_3_hi = pto.partition_view %p_pop_3, offsets = [%c0, %c128], sizes = [%c128, %c128_0] : !pto.tensor_view<128x256xf16> -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%p_pop_part_3_hi : !pto.partition_tensor_view<128x128xf16>) outs(%35 : !pto.tile_buf) + pto.tmov ins(%35 : !pto.tile_buf) outs(%36 : !pto.tile_buf) + pto.tfree_from_aiv(%p_pop_3 : !pto.tensor_view<128x256xf16>) {id = 30, split = 0} + %c3968 = arith.constant 3968 : index + %pv3_v_part_1 = pto.partition_view %42, offsets = [%c3968, %c0], sizes = [%c128, %c128_0] : !pto.tensor_view -> !pto.partition_tensor_view<128x128xf16> + pto.tload ins(%pv3_v_part_1 : !pto.partition_tensor_view<128x128xf16>) outs(%37 : !pto.tile_buf) + pto.tmov ins(%37 : !pto.tile_buf) outs(%38 : !pto.tile_buf) + pto.tmatmul.acc ins(%39, %36, %38 : !pto.tile_buf, !pto.tile_buf, !pto.tile_buf) outs(%39 : !pto.tile_buf) + %pv_push_3 = pto.talloc_to_aiv {id = 27, split = 0} -> !pto.tensor_view<128x128xf32> + %pv_push_part_3 = pto.partition_view %pv_push_3, offsets = [%c0, %c0], sizes = [%c128, %c128_0] : !pto.tensor_view<128x128xf32> -> !pto.partition_tensor_view<128x128xf32> + pto.tstore ins(%39 : !pto.tile_buf) outs(%pv_push_part_3 : !pto.partition_tensor_view<128x128xf32>) + pto.tpush_to_aiv(%pv_push_3 : !pto.tensor_view<128x128xf32>) {id = 27, split = 0} + } + return + } + func.func @vector_kernel(%qk_fifo: !pto.ptr, %arg1: !pto.ptr, %p_fifo: !pto.ptr, %pv_fifo: !pto.ptr) attributes {pto.kernel_kind = #pto.kernel_kind} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %c32 = arith.constant 32 : index + %c256 = arith.constant 256 : index + %c128_0 = arith.constant 128 : index + %c16 = arith.constant 16 : index + %c16_1 = arith.constant 16 : index + %0 = pto.get_block_num + %1 = arith.index_cast %0 : i64 to index + %2 = pto.get_block_idx + %3 = arith.index_cast %2 : i64 to index + %4 = arith.divsi %c16_1, %1 : index + %5 = arith.remsi %c16_1, %1 : index + %6 = arith.addi %4, %c1 : index + %7 = arith.muli %3, %6 : index + %8 = arith.addi %4, %c1 : index + %9 = arith.muli %5, %8 : index + %10 = arith.subi %3, %5 : index + %11 = arith.muli %10, %4 : index + %12 = arith.addi %9, %11 : index + %13 = arith.cmpi slt, %3, %5 : index + %14 = arith.select %13, %7, %12 : index + %15 = arith.cmpi slt, %3, %5 : index + %16 = arith.addi %4, %c1 : index + %17 = arith.select %15, %16, %4 : index + %18 = arith.addi %14, %17 : index + %c262144 = arith.constant 262144 : index + %19 = arith.muli %3, %c262144 : index + %21 = pto.addptr %qk_fifo, %19 : -> + %p_block = pto.addptr %p_fifo, %19 : -> + %c131072 = arith.constant 131072 : index + %pv_block_off = arith.muli %3, %c131072 : index + %22 = pto.addptr %pv_fifo, %pv_block_off : -> + %qk_slot_desc = pto.make_tensor_view %21, shape = [%c128, %c256], strides = [%c256, %c1] : !pto.tensor_view<128x256xf32> + pto.aiv_initialize_pipe{id = 25, dir_mask = 1, slot_size = 131072} (gm_slot_tensor = %qk_slot_desc : !pto.tensor_view<128x256xf32>) + %p_slot_desc = pto.make_tensor_view %p_block, shape = [%c128, %c256], strides = [%c256, %c1] : !pto.tensor_view<128x256xf16> + pto.aiv_initialize_pipe{id = 30, dir_mask = 2, slot_size = 65536} (gm_slot_tensor = %p_slot_desc : !pto.tensor_view<128x256xf16>) + %pv_slot_desc = pto.make_tensor_view %22, shape = [%c64, %c128_0], strides = [%c128_0, %c1] : !pto.tensor_view<64x128xf32> + pto.aiv_initialize_pipe{id = 27, dir_mask = 1, slot_size = 65536} (gm_slot_tensor = %pv_slot_desc : !pto.tensor_view<64x128xf32>) + %29 = pto.get_subblock_idx + %30 = arith.index_cast %29 : i64 to index + %31 = arith.muli %30, %c64 : index + %row_slice_1 = arith.addi %31, %c32 : index + %c196608_i64 = arith.constant 196608 : i64 + %32 = pto.alloc_tile addr = %c196608_i64 : !pto.tile_buf + %c262144_i64 = arith.constant 262144 : i64 + %33 = pto.alloc_tile addr = %c262144_i64 : !pto.tile_buf + %c327680_i64 = arith.constant 327680 : i64 + %34 = pto.alloc_tile addr = %c327680_i64 : !pto.tile_buf + %c360448_i64 = arith.constant 360448 : i64 + %35 = pto.alloc_tile addr = %c360448_i64 : !pto.tile_buf + %c393216_i64 = arith.constant 393216 : i64 + %c393344_i64 = arith.constant 393344 : i64 + %36 = pto.alloc_tile addr = %c393216_i64 : !pto.tile_buf + %c393472_i64 = arith.constant 393472 : i64 + %c393600_i64 = arith.constant 393600 : i64 + %37 = pto.alloc_tile addr = %c393472_i64 : !pto.tile_buf + %c393728_i64 = arith.constant 393728 : i64 + %c393856_i64 = arith.constant 393856 : i64 + %38 = pto.alloc_tile addr = %c393728_i64 : !pto.tile_buf + %c393984_i64 = arith.constant 393984 : i64 + %c394112_i64 = arith.constant 394112 : i64 + %39 = pto.alloc_tile addr = %c393984_i64 : !pto.tile_buf + %c394240_i64 = arith.constant 394240 : i64 + %c394368_i64 = arith.constant 394368 : i64 + %40 = pto.alloc_tile addr = %c394240_i64 : !pto.tile_buf + %c394496_i64 = arith.constant 394496 : i64 + %c394624_i64 = arith.constant 394624 : i64 + %41 = pto.alloc_tile addr = %c394496_i64 : !pto.tile_buf + %cst = arith.constant 0.0883883461 : f32 + %cst_3 = arith.constant 1.000000e+00 : f32 + %c2048 = arith.constant 2048 : index + %42 = pto.make_tensor_view %arg1, shape = [%c2048, %c128_0], strides = [%c128_0, %c1] : !pto.tensor_view + scf.for %arg2 = %14 to %18 step %c1 { + %43 = arith.muli %arg2, %c128 : index + %c394752_i64 = arith.constant 394752 : i64 + %44 = pto.alloc_tile addr = %c394752_i64 : !pto.tile_buf + %qk_pop_0 = pto.tpop_from_aic {id = 25, split = 0} -> !pto.tensor_view<128x256xf32> + %qk_pop_part_0 = pto.partition_view %qk_pop_0, offsets = [%31, %c0], sizes = [%c32, %c256] : !pto.tensor_view<128x256xf32> -> !pto.partition_tensor_view<32x256xf32> + pto.tload ins(%qk_pop_part_0 : !pto.partition_tensor_view<32x256xf32>) outs(%44 : !pto.tile_buf) + pto.tmuls ins(%44, %cst : !pto.tile_buf, f32) outs(%44 : !pto.tile_buf) + %r36_0 = pto.alloc_tile addr = %c393216_i64 : !pto.tile_buf + %r37_0 = pto.alloc_tile addr = %c393472_i64 : !pto.tile_buf + %r38_0 = pto.alloc_tile addr = %c393728_i64 : !pto.tile_buf + %r39_0 = pto.alloc_tile addr = %c393984_i64 : !pto.tile_buf + %r40_0 = pto.alloc_tile addr = %c394240_i64 : !pto.tile_buf + pto.trowmax ins(%44, %33 : !pto.tile_buf, !pto.tile_buf) outs(%r37_0 : !pto.tile_buf) + %45 = pto.treshape %r37_0 : !pto.tile_buf -> !pto.tile_buf + %46 = pto.treshape %r36_0 : !pto.tile_buf -> !pto.tile_buf + %47 = pto.treshape %r40_0 : !pto.tile_buf -> !pto.tile_buf + %48 = pto.treshape %r38_0 : !pto.tile_buf -> !pto.tile_buf + %49 = pto.treshape %r39_0 : !pto.tile_buf -> !pto.tile_buf + pto.trowexpandsub ins(%44, %r37_0 : !pto.tile_buf, !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.tmuls ins(%45, %cst_3 : !pto.tile_buf, f32) outs(%46 : !pto.tile_buf) + pto.texp ins(%33 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.trowsum ins(%33, %32 : !pto.tile_buf, !pto.tile_buf) outs(%r38_0 : !pto.tile_buf) + pto.tcvt ins(%33 {rmode = #pto} : !pto.tile_buf) outs(%34 : !pto.tile_buf) + %p_push_0 = pto.talloc_to_aic {id = 30, split = 0} -> !pto.tensor_view<128x256xf16> + %p_push_part_0 = pto.partition_view %p_push_0, offsets = [%31, %c0], sizes = [%c32, %c256] : !pto.tensor_view<128x256xf16> -> !pto.partition_tensor_view<32x256xf16> + pto.tstore ins(%34 : !pto.tile_buf) outs(%p_push_part_0 : !pto.partition_tensor_view<32x256xf16>) + %qk_pop_part_0_r1 = pto.partition_view %qk_pop_0, offsets = [%row_slice_1, %c0], sizes = [%c32, %c256] : !pto.tensor_view<128x256xf32> -> !pto.partition_tensor_view<32x256xf32> + pto.tload ins(%qk_pop_part_0_r1 : !pto.partition_tensor_view<32x256xf32>) outs(%44 : !pto.tile_buf) + pto.tfree_from_aic(%qk_pop_0 : !pto.tensor_view<128x256xf32>) {id = 25, split = 0} + pto.tmuls ins(%44, %cst : !pto.tile_buf, f32) outs(%44 : !pto.tile_buf) + %r36_0_r1 = pto.alloc_tile addr = %c393344_i64 : !pto.tile_buf + %r37_0_r1 = pto.alloc_tile addr = %c393600_i64 : !pto.tile_buf + %r38_0_r1 = pto.alloc_tile addr = %c393856_i64 : !pto.tile_buf + %r39_0_r1 = pto.alloc_tile addr = %c394112_i64 : !pto.tile_buf + %r40_0_r1 = pto.alloc_tile addr = %c394368_i64 : !pto.tile_buf + pto.trowmax ins(%44, %33 : !pto.tile_buf, !pto.tile_buf) outs(%r37_0_r1 : !pto.tile_buf) + %qk0_r1_max = pto.treshape %r37_0_r1 : !pto.tile_buf -> !pto.tile_buf + %qk0_r1_gmax = pto.treshape %r36_0_r1 : !pto.tile_buf -> !pto.tile_buf + %qk0_r1_tmp = pto.treshape %r40_0_r1 : !pto.tile_buf -> !pto.tile_buf + %qk0_r1_lsum = pto.treshape %r38_0_r1 : !pto.tile_buf -> !pto.tile_buf + %qk0_r1_gsum = pto.treshape %r39_0_r1 : !pto.tile_buf -> !pto.tile_buf + pto.trowexpandsub ins(%44, %r37_0_r1 : !pto.tile_buf, !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.tmuls ins(%qk0_r1_max, %cst_3 : !pto.tile_buf, f32) outs(%qk0_r1_gmax : !pto.tile_buf) + pto.texp ins(%33 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.trowsum ins(%33, %32 : !pto.tile_buf, !pto.tile_buf) outs(%r38_0_r1 : !pto.tile_buf) + pto.tcvt ins(%33 {rmode = #pto} : !pto.tile_buf) outs(%34 : !pto.tile_buf) + %p_push_part_0_r1 = pto.partition_view %p_push_0, offsets = [%row_slice_1, %c0], sizes = [%c32, %c256] : !pto.tensor_view<128x256xf16> -> !pto.partition_tensor_view<32x256xf16> + pto.tstore ins(%34 : !pto.tile_buf) outs(%p_push_part_0_r1 : !pto.partition_tensor_view<32x256xf16>) + pto.tpush_to_aic(%p_push_0 : !pto.tensor_view<128x256xf16>) {id = 30, split = 0} + %c394752_i64_4 = arith.constant 394752 : i64 + %50 = pto.alloc_tile addr = %c394752_i64_4 : !pto.tile_buf + %qk_pop_1 = pto.tpop_from_aic {id = 25, split = 0} -> !pto.tensor_view<128x256xf32> + %qk_pop_part_1 = pto.partition_view %qk_pop_1, offsets = [%31, %c0], sizes = [%c32, %c256] : !pto.tensor_view<128x256xf32> -> !pto.partition_tensor_view<32x256xf32> + pto.tload ins(%qk_pop_part_1 : !pto.partition_tensor_view<32x256xf32>) outs(%50 : !pto.tile_buf) + pto.tmuls ins(%50, %cst : !pto.tile_buf, f32) outs(%50 : !pto.tile_buf) + %r36_1 = pto.alloc_tile addr = %c393216_i64 : !pto.tile_buf + %r37_1 = pto.alloc_tile addr = %c393472_i64 : !pto.tile_buf + %r38_1 = pto.alloc_tile addr = %c393728_i64 : !pto.tile_buf + %r39_1 = pto.alloc_tile addr = %c393984_i64 : !pto.tile_buf + %r41_1 = pto.alloc_tile addr = %c394496_i64 : !pto.tile_buf + pto.trowmax ins(%50, %33 : !pto.tile_buf, !pto.tile_buf) outs(%r37_1 : !pto.tile_buf) + %51 = pto.treshape %r37_1 : !pto.tile_buf -> !pto.tile_buf + %52 = pto.treshape %r36_1 : !pto.tile_buf -> !pto.tile_buf + %53 = pto.treshape %r41_1 : !pto.tile_buf -> !pto.tile_buf + %54 = pto.treshape %r38_1 : !pto.tile_buf -> !pto.tile_buf + %55 = pto.treshape %r39_1 : !pto.tile_buf -> !pto.tile_buf + pto.tmax ins(%51, %52 : !pto.tile_buf, !pto.tile_buf) outs(%51 : !pto.tile_buf) + pto.tsub ins(%52, %51 : !pto.tile_buf, !pto.tile_buf) outs(%53 : !pto.tile_buf) + pto.tmuls ins(%51, %cst_3 : !pto.tile_buf, f32) outs(%52 : !pto.tile_buf) + pto.trowexpandsub ins(%50, %r37_1 : !pto.tile_buf, !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.texp ins(%53 : !pto.tile_buf) outs(%53 : !pto.tile_buf) + pto.texp ins(%33 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.tmul ins(%54, %53 : !pto.tile_buf, !pto.tile_buf) outs(%54 : !pto.tile_buf) + pto.trowsum ins(%33, %32 : !pto.tile_buf, !pto.tile_buf) outs(%r39_1 : !pto.tile_buf) + pto.tadd ins(%54, %55 : !pto.tile_buf, !pto.tile_buf) outs(%54 : !pto.tile_buf) + pto.tcvt ins(%33 {rmode = #pto} : !pto.tile_buf) outs(%34 : !pto.tile_buf) + %p_push_1 = pto.talloc_to_aic {id = 30, split = 0} -> !pto.tensor_view<128x256xf16> + %p_push_part_1 = pto.partition_view %p_push_1, offsets = [%31, %c0], sizes = [%c32, %c256] : !pto.tensor_view<128x256xf16> -> !pto.partition_tensor_view<32x256xf16> + pto.tstore ins(%34 : !pto.tile_buf) outs(%p_push_part_1 : !pto.partition_tensor_view<32x256xf16>) + %qk_pop_part_1_r1 = pto.partition_view %qk_pop_1, offsets = [%row_slice_1, %c0], sizes = [%c32, %c256] : !pto.tensor_view<128x256xf32> -> !pto.partition_tensor_view<32x256xf32> + pto.tload ins(%qk_pop_part_1_r1 : !pto.partition_tensor_view<32x256xf32>) outs(%50 : !pto.tile_buf) + pto.tfree_from_aic(%qk_pop_1 : !pto.tensor_view<128x256xf32>) {id = 25, split = 0} + pto.tmuls ins(%50, %cst : !pto.tile_buf, f32) outs(%50 : !pto.tile_buf) + %r36_1_r1 = pto.alloc_tile addr = %c393344_i64 : !pto.tile_buf + %r37_1_r1 = pto.alloc_tile addr = %c393600_i64 : !pto.tile_buf + %r38_1_r1 = pto.alloc_tile addr = %c393856_i64 : !pto.tile_buf + %r39_1_r1 = pto.alloc_tile addr = %c394112_i64 : !pto.tile_buf + %r41_1_r1 = pto.alloc_tile addr = %c394624_i64 : !pto.tile_buf + pto.trowmax ins(%50, %33 : !pto.tile_buf, !pto.tile_buf) outs(%r37_1_r1 : !pto.tile_buf) + %qk1_r1_max = pto.treshape %r37_1_r1 : !pto.tile_buf -> !pto.tile_buf + %qk1_r1_gmax = pto.treshape %r36_1_r1 : !pto.tile_buf -> !pto.tile_buf + %qk1_r1_diff = pto.treshape %r41_1_r1 : !pto.tile_buf -> !pto.tile_buf + %qk1_r1_lsum = pto.treshape %r38_1_r1 : !pto.tile_buf -> !pto.tile_buf + %qk1_r1_gsum = pto.treshape %r39_1_r1 : !pto.tile_buf -> !pto.tile_buf + pto.tmax ins(%qk1_r1_max, %qk1_r1_gmax : !pto.tile_buf, !pto.tile_buf) outs(%qk1_r1_max : !pto.tile_buf) + pto.tsub ins(%qk1_r1_gmax, %qk1_r1_max : !pto.tile_buf, !pto.tile_buf) outs(%qk1_r1_diff : !pto.tile_buf) + pto.tmuls ins(%qk1_r1_max, %cst_3 : !pto.tile_buf, f32) outs(%qk1_r1_gmax : !pto.tile_buf) + pto.trowexpandsub ins(%50, %r37_1_r1 : !pto.tile_buf, !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.texp ins(%qk1_r1_diff : !pto.tile_buf) outs(%qk1_r1_diff : !pto.tile_buf) + pto.texp ins(%33 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.tmul ins(%qk1_r1_lsum, %qk1_r1_diff : !pto.tile_buf, !pto.tile_buf) outs(%qk1_r1_lsum : !pto.tile_buf) + pto.trowsum ins(%33, %32 : !pto.tile_buf, !pto.tile_buf) outs(%r39_1_r1 : !pto.tile_buf) + pto.tadd ins(%qk1_r1_lsum, %qk1_r1_gsum : !pto.tile_buf, !pto.tile_buf) outs(%qk1_r1_lsum : !pto.tile_buf) + pto.tcvt ins(%33 {rmode = #pto} : !pto.tile_buf) outs(%34 : !pto.tile_buf) + %p_push_part_1_r1 = pto.partition_view %p_push_1, offsets = [%row_slice_1, %c0], sizes = [%c32, %c256] : !pto.tensor_view<128x256xf16> -> !pto.partition_tensor_view<32x256xf16> + pto.tstore ins(%34 : !pto.tile_buf) outs(%p_push_part_1_r1 : !pto.partition_tensor_view<32x256xf16>) + pto.tpush_to_aic(%p_push_1 : !pto.tensor_view<128x256xf16>) {id = 30, split = 0} + %c394752_i64_5 = arith.constant 394752 : i64 + %56 = pto.alloc_tile addr = %c394752_i64_5 : !pto.tile_buf + %pv_pop_0 = pto.tpop_from_aic {id = 27, split = 1} -> !pto.tensor_view<64x128xf32> + %pv_pop_part_0 = pto.partition_view %pv_pop_0, offsets = [%c0, %c0], sizes = [%c64, %c128_0] : !pto.tensor_view<64x128xf32> -> !pto.partition_tensor_view<64x128xf32> + pto.tload ins(%pv_pop_part_0 : !pto.partition_tensor_view<64x128xf32>) outs(%56 : !pto.tile_buf) + pto.tmov ins(%56 : !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tfree_from_aic(%pv_pop_0 : !pto.tensor_view<64x128xf32>) {id = 27, split = 1} + %c394752_i64_6 = arith.constant 394752 : i64 + %57 = pto.alloc_tile addr = %c394752_i64_6 : !pto.tile_buf + %qk_pop_2 = pto.tpop_from_aic {id = 25, split = 0} -> !pto.tensor_view<128x256xf32> + %qk_pop_part_2 = pto.partition_view %qk_pop_2, offsets = [%31, %c0], sizes = [%c32, %c256] : !pto.tensor_view<128x256xf32> -> !pto.partition_tensor_view<32x256xf32> + pto.tload ins(%qk_pop_part_2 : !pto.partition_tensor_view<32x256xf32>) outs(%57 : !pto.tile_buf) + pto.tmuls ins(%57, %cst : !pto.tile_buf, f32) outs(%57 : !pto.tile_buf) + %r36_2 = pto.alloc_tile addr = %c393216_i64 : !pto.tile_buf + %r37_2 = pto.alloc_tile addr = %c393472_i64 : !pto.tile_buf + %r38_2 = pto.alloc_tile addr = %c393728_i64 : !pto.tile_buf + %r39_2 = pto.alloc_tile addr = %c393984_i64 : !pto.tile_buf + %r40_2 = pto.alloc_tile addr = %c394240_i64 : !pto.tile_buf + pto.trowmax ins(%57, %33 : !pto.tile_buf, !pto.tile_buf) outs(%r37_2 : !pto.tile_buf) + %58 = pto.treshape %r37_2 : !pto.tile_buf -> !pto.tile_buf + %59 = pto.treshape %r36_2 : !pto.tile_buf -> !pto.tile_buf + %60 = pto.treshape %r40_2 : !pto.tile_buf -> !pto.tile_buf + %61 = pto.treshape %r38_2 : !pto.tile_buf -> !pto.tile_buf + %62 = pto.treshape %r39_2 : !pto.tile_buf -> !pto.tile_buf + pto.tmax ins(%58, %59 : !pto.tile_buf, !pto.tile_buf) outs(%58 : !pto.tile_buf) + pto.tsub ins(%59, %58 : !pto.tile_buf, !pto.tile_buf) outs(%60 : !pto.tile_buf) + pto.tmuls ins(%58, %cst_3 : !pto.tile_buf, f32) outs(%59 : !pto.tile_buf) + pto.trowexpandsub ins(%57, %r37_2 : !pto.tile_buf, !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.texp ins(%60 : !pto.tile_buf) outs(%60 : !pto.tile_buf) + pto.texp ins(%33 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.tmul ins(%61, %60 : !pto.tile_buf, !pto.tile_buf) outs(%61 : !pto.tile_buf) + pto.trowsum ins(%33, %32 : !pto.tile_buf, !pto.tile_buf) outs(%r39_2 : !pto.tile_buf) + pto.tadd ins(%61, %62 : !pto.tile_buf, !pto.tile_buf) outs(%61 : !pto.tile_buf) + pto.tcvt ins(%33 {rmode = #pto} : !pto.tile_buf) outs(%34 : !pto.tile_buf) + %p_push_2 = pto.talloc_to_aic {id = 30, split = 0} -> !pto.tensor_view<128x256xf16> + %p_push_part_2 = pto.partition_view %p_push_2, offsets = [%31, %c0], sizes = [%c32, %c256] : !pto.tensor_view<128x256xf16> -> !pto.partition_tensor_view<32x256xf16> + pto.tstore ins(%34 : !pto.tile_buf) outs(%p_push_part_2 : !pto.partition_tensor_view<32x256xf16>) + %qk_pop_part_2_r1 = pto.partition_view %qk_pop_2, offsets = [%row_slice_1, %c0], sizes = [%c32, %c256] : !pto.tensor_view<128x256xf32> -> !pto.partition_tensor_view<32x256xf32> + pto.tload ins(%qk_pop_part_2_r1 : !pto.partition_tensor_view<32x256xf32>) outs(%57 : !pto.tile_buf) + pto.tfree_from_aic(%qk_pop_2 : !pto.tensor_view<128x256xf32>) {id = 25, split = 0} + pto.tmuls ins(%57, %cst : !pto.tile_buf, f32) outs(%57 : !pto.tile_buf) + %r36_2_r1 = pto.alloc_tile addr = %c393344_i64 : !pto.tile_buf + %r37_2_r1 = pto.alloc_tile addr = %c393600_i64 : !pto.tile_buf + %r38_2_r1 = pto.alloc_tile addr = %c393856_i64 : !pto.tile_buf + %r39_2_r1 = pto.alloc_tile addr = %c394112_i64 : !pto.tile_buf + %r40_2_r1 = pto.alloc_tile addr = %c394368_i64 : !pto.tile_buf + pto.trowmax ins(%57, %33 : !pto.tile_buf, !pto.tile_buf) outs(%r37_2_r1 : !pto.tile_buf) + %qk2_r1_max = pto.treshape %r37_2_r1 : !pto.tile_buf -> !pto.tile_buf + %qk2_r1_gmax = pto.treshape %r36_2_r1 : !pto.tile_buf -> !pto.tile_buf + %qk2_r1_diff = pto.treshape %r40_2_r1 : !pto.tile_buf -> !pto.tile_buf + %qk2_r1_lsum = pto.treshape %r38_2_r1 : !pto.tile_buf -> !pto.tile_buf + %qk2_r1_gsum = pto.treshape %r39_2_r1 : !pto.tile_buf -> !pto.tile_buf + pto.tmax ins(%qk2_r1_max, %qk2_r1_gmax : !pto.tile_buf, !pto.tile_buf) outs(%qk2_r1_max : !pto.tile_buf) + pto.tsub ins(%qk2_r1_gmax, %qk2_r1_max : !pto.tile_buf, !pto.tile_buf) outs(%qk2_r1_diff : !pto.tile_buf) + pto.tmuls ins(%qk2_r1_max, %cst_3 : !pto.tile_buf, f32) outs(%qk2_r1_gmax : !pto.tile_buf) + pto.trowexpandsub ins(%57, %r37_2_r1 : !pto.tile_buf, !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.texp ins(%qk2_r1_diff : !pto.tile_buf) outs(%qk2_r1_diff : !pto.tile_buf) + pto.texp ins(%33 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.tmul ins(%qk2_r1_lsum, %qk2_r1_diff : !pto.tile_buf, !pto.tile_buf) outs(%qk2_r1_lsum : !pto.tile_buf) + pto.trowsum ins(%33, %32 : !pto.tile_buf, !pto.tile_buf) outs(%r39_2_r1 : !pto.tile_buf) + pto.tadd ins(%qk2_r1_lsum, %qk2_r1_gsum : !pto.tile_buf, !pto.tile_buf) outs(%qk2_r1_lsum : !pto.tile_buf) + pto.tcvt ins(%33 {rmode = #pto} : !pto.tile_buf) outs(%34 : !pto.tile_buf) + %p_push_part_2_r1 = pto.partition_view %p_push_2, offsets = [%row_slice_1, %c0], sizes = [%c32, %c256] : !pto.tensor_view<128x256xf16> -> !pto.partition_tensor_view<32x256xf16> + pto.tstore ins(%34 : !pto.tile_buf) outs(%p_push_part_2_r1 : !pto.partition_tensor_view<32x256xf16>) + pto.tpush_to_aic(%p_push_2 : !pto.tensor_view<128x256xf16>) {id = 30, split = 0} + %c394752_i64_7 = arith.constant 394752 : i64 + %63 = pto.alloc_tile addr = %c394752_i64_7 : !pto.tile_buf + %pv_pop_1 = pto.tpop_from_aic {id = 27, split = 1} -> !pto.tensor_view<64x128xf32> + %pv_pop_part_1 = pto.partition_view %pv_pop_1, offsets = [%c0, %c0], sizes = [%c64, %c128_0] : !pto.tensor_view<64x128xf32> -> !pto.partition_tensor_view<64x128xf32> + pto.tload ins(%pv_pop_part_1 : !pto.partition_tensor_view<64x128xf32>) outs(%63 : !pto.tile_buf) + pto.trowexpandmul ins(%35, %41 : !pto.tile_buf, !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tadd ins(%35, %63 : !pto.tile_buf, !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tfree_from_aic(%pv_pop_1 : !pto.tensor_view<64x128xf32>) {id = 27, split = 1} + %c394752_i64_8 = arith.constant 394752 : i64 + %64 = pto.alloc_tile addr = %c394752_i64_8 : !pto.tile_buf + %qk_pop_3 = pto.tpop_from_aic {id = 25, split = 0} -> !pto.tensor_view<128x256xf32> + %qk_pop_part_3 = pto.partition_view %qk_pop_3, offsets = [%31, %c0], sizes = [%c32, %c256] : !pto.tensor_view<128x256xf32> -> !pto.partition_tensor_view<32x256xf32> + pto.tload ins(%qk_pop_part_3 : !pto.partition_tensor_view<32x256xf32>) outs(%64 : !pto.tile_buf) + pto.tmuls ins(%64, %cst : !pto.tile_buf, f32) outs(%64 : !pto.tile_buf) + %r36_3 = pto.alloc_tile addr = %c393216_i64 : !pto.tile_buf + %r37_3 = pto.alloc_tile addr = %c393472_i64 : !pto.tile_buf + %r38_3 = pto.alloc_tile addr = %c393728_i64 : !pto.tile_buf + %r39_3 = pto.alloc_tile addr = %c393984_i64 : !pto.tile_buf + %r41_3 = pto.alloc_tile addr = %c394496_i64 : !pto.tile_buf + pto.trowmax ins(%64, %33 : !pto.tile_buf, !pto.tile_buf) outs(%r37_3 : !pto.tile_buf) + %65 = pto.treshape %r37_3 : !pto.tile_buf -> !pto.tile_buf + %66 = pto.treshape %r36_3 : !pto.tile_buf -> !pto.tile_buf + %67 = pto.treshape %r41_3 : !pto.tile_buf -> !pto.tile_buf + %68 = pto.treshape %r38_3 : !pto.tile_buf -> !pto.tile_buf + %69 = pto.treshape %r39_3 : !pto.tile_buf -> !pto.tile_buf + pto.tmax ins(%65, %66 : !pto.tile_buf, !pto.tile_buf) outs(%65 : !pto.tile_buf) + pto.tsub ins(%66, %65 : !pto.tile_buf, !pto.tile_buf) outs(%67 : !pto.tile_buf) + pto.tmuls ins(%65, %cst_3 : !pto.tile_buf, f32) outs(%66 : !pto.tile_buf) + pto.trowexpandsub ins(%64, %r37_3 : !pto.tile_buf, !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.texp ins(%67 : !pto.tile_buf) outs(%67 : !pto.tile_buf) + pto.texp ins(%33 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.tmul ins(%68, %67 : !pto.tile_buf, !pto.tile_buf) outs(%68 : !pto.tile_buf) + pto.trowsum ins(%33, %32 : !pto.tile_buf, !pto.tile_buf) outs(%r39_3 : !pto.tile_buf) + pto.tadd ins(%68, %69 : !pto.tile_buf, !pto.tile_buf) outs(%68 : !pto.tile_buf) + pto.tcvt ins(%33 {rmode = #pto} : !pto.tile_buf) outs(%34 : !pto.tile_buf) + %p_push_3 = pto.talloc_to_aic {id = 30, split = 0} -> !pto.tensor_view<128x256xf16> + %p_push_part_3 = pto.partition_view %p_push_3, offsets = [%31, %c0], sizes = [%c32, %c256] : !pto.tensor_view<128x256xf16> -> !pto.partition_tensor_view<32x256xf16> + pto.tstore ins(%34 : !pto.tile_buf) outs(%p_push_part_3 : !pto.partition_tensor_view<32x256xf16>) + %qk_pop_part_3_r1 = pto.partition_view %qk_pop_3, offsets = [%row_slice_1, %c0], sizes = [%c32, %c256] : !pto.tensor_view<128x256xf32> -> !pto.partition_tensor_view<32x256xf32> + pto.tload ins(%qk_pop_part_3_r1 : !pto.partition_tensor_view<32x256xf32>) outs(%64 : !pto.tile_buf) + pto.tfree_from_aic(%qk_pop_3 : !pto.tensor_view<128x256xf32>) {id = 25, split = 0} + pto.tmuls ins(%64, %cst : !pto.tile_buf, f32) outs(%64 : !pto.tile_buf) + %r36_3_r1 = pto.alloc_tile addr = %c393344_i64 : !pto.tile_buf + %r37_3_r1 = pto.alloc_tile addr = %c393600_i64 : !pto.tile_buf + %r38_3_r1 = pto.alloc_tile addr = %c393856_i64 : !pto.tile_buf + %r39_3_r1 = pto.alloc_tile addr = %c394112_i64 : !pto.tile_buf + %r41_3_r1 = pto.alloc_tile addr = %c394624_i64 : !pto.tile_buf + pto.trowmax ins(%64, %33 : !pto.tile_buf, !pto.tile_buf) outs(%r37_3_r1 : !pto.tile_buf) + %qk3_r1_max = pto.treshape %r37_3_r1 : !pto.tile_buf -> !pto.tile_buf + %qk3_r1_gmax = pto.treshape %r36_3_r1 : !pto.tile_buf -> !pto.tile_buf + %qk3_r1_diff = pto.treshape %r41_3_r1 : !pto.tile_buf -> !pto.tile_buf + %qk3_r1_lsum = pto.treshape %r38_3_r1 : !pto.tile_buf -> !pto.tile_buf + %qk3_r1_gsum = pto.treshape %r39_3_r1 : !pto.tile_buf -> !pto.tile_buf + pto.tmax ins(%qk3_r1_max, %qk3_r1_gmax : !pto.tile_buf, !pto.tile_buf) outs(%qk3_r1_max : !pto.tile_buf) + pto.tsub ins(%qk3_r1_gmax, %qk3_r1_max : !pto.tile_buf, !pto.tile_buf) outs(%qk3_r1_diff : !pto.tile_buf) + pto.tmuls ins(%qk3_r1_max, %cst_3 : !pto.tile_buf, f32) outs(%qk3_r1_gmax : !pto.tile_buf) + pto.trowexpandsub ins(%64, %r37_3_r1 : !pto.tile_buf, !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.texp ins(%qk3_r1_diff : !pto.tile_buf) outs(%qk3_r1_diff : !pto.tile_buf) + pto.texp ins(%33 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.tmul ins(%qk3_r1_lsum, %qk3_r1_diff : !pto.tile_buf, !pto.tile_buf) outs(%qk3_r1_lsum : !pto.tile_buf) + pto.trowsum ins(%33, %32 : !pto.tile_buf, !pto.tile_buf) outs(%r39_3_r1 : !pto.tile_buf) + pto.tadd ins(%qk3_r1_lsum, %qk3_r1_gsum : !pto.tile_buf, !pto.tile_buf) outs(%qk3_r1_lsum : !pto.tile_buf) + pto.tcvt ins(%33 {rmode = #pto} : !pto.tile_buf) outs(%34 : !pto.tile_buf) + %p_push_part_3_r1 = pto.partition_view %p_push_3, offsets = [%row_slice_1, %c0], sizes = [%c32, %c256] : !pto.tensor_view<128x256xf16> -> !pto.partition_tensor_view<32x256xf16> + pto.tstore ins(%34 : !pto.tile_buf) outs(%p_push_part_3_r1 : !pto.partition_tensor_view<32x256xf16>) + pto.tpush_to_aic(%p_push_3 : !pto.tensor_view<128x256xf16>) {id = 30, split = 0} + %c7 = arith.constant 7 : index + scf.for %arg3 = %c1 to %c7 step %c1 { + %c394752_i64_11 = arith.constant 394752 : i64 + %74 = pto.alloc_tile addr = %c394752_i64_11 : !pto.tile_buf + %pv_pop_2 = pto.tpop_from_aic {id = 27, split = 1} -> !pto.tensor_view<64x128xf32> + %pv_pop_part_2 = pto.partition_view %pv_pop_2, offsets = [%c0, %c0], sizes = [%c64, %c128_0] : !pto.tensor_view<64x128xf32> -> !pto.partition_tensor_view<64x128xf32> + pto.tload ins(%pv_pop_part_2 : !pto.partition_tensor_view<64x128xf32>) outs(%74 : !pto.tile_buf) + pto.trowexpandmul ins(%35, %40 : !pto.tile_buf, !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tadd ins(%35, %74 : !pto.tile_buf, !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tfree_from_aic(%pv_pop_2 : !pto.tensor_view<64x128xf32>) {id = 27, split = 1} + %c394752_i64_12 = arith.constant 394752 : i64 + %75 = pto.alloc_tile addr = %c394752_i64_12 : !pto.tile_buf + %qk_pop_4 = pto.tpop_from_aic {id = 25, split = 0} -> !pto.tensor_view<128x256xf32> + %qk_pop_part_4 = pto.partition_view %qk_pop_4, offsets = [%31, %c0], sizes = [%c32, %c256] : !pto.tensor_view<128x256xf32> -> !pto.partition_tensor_view<32x256xf32> + pto.tload ins(%qk_pop_part_4 : !pto.partition_tensor_view<32x256xf32>) outs(%75 : !pto.tile_buf) + pto.tmuls ins(%75, %cst : !pto.tile_buf, f32) outs(%75 : !pto.tile_buf) + %r36_4 = pto.alloc_tile addr = %c393216_i64 : !pto.tile_buf + %r37_4 = pto.alloc_tile addr = %c393472_i64 : !pto.tile_buf + %r38_4 = pto.alloc_tile addr = %c393728_i64 : !pto.tile_buf + %r39_4 = pto.alloc_tile addr = %c393984_i64 : !pto.tile_buf + %r40_4 = pto.alloc_tile addr = %c394240_i64 : !pto.tile_buf + pto.trowmax ins(%75, %33 : !pto.tile_buf, !pto.tile_buf) outs(%r37_4 : !pto.tile_buf) + %76 = pto.treshape %r37_4 : !pto.tile_buf -> !pto.tile_buf + %77 = pto.treshape %r36_4 : !pto.tile_buf -> !pto.tile_buf + %78 = pto.treshape %r40_4 : !pto.tile_buf -> !pto.tile_buf + %79 = pto.treshape %r38_4 : !pto.tile_buf -> !pto.tile_buf + %80 = pto.treshape %r39_4 : !pto.tile_buf -> !pto.tile_buf + pto.tmax ins(%76, %77 : !pto.tile_buf, !pto.tile_buf) outs(%76 : !pto.tile_buf) + pto.tsub ins(%77, %76 : !pto.tile_buf, !pto.tile_buf) outs(%78 : !pto.tile_buf) + pto.tmuls ins(%76, %cst_3 : !pto.tile_buf, f32) outs(%77 : !pto.tile_buf) + pto.trowexpandsub ins(%75, %r37_4 : !pto.tile_buf, !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.texp ins(%78 : !pto.tile_buf) outs(%78 : !pto.tile_buf) + pto.texp ins(%33 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.tmul ins(%79, %78 : !pto.tile_buf, !pto.tile_buf) outs(%79 : !pto.tile_buf) + pto.trowsum ins(%33, %32 : !pto.tile_buf, !pto.tile_buf) outs(%r39_4 : !pto.tile_buf) + pto.tadd ins(%79, %80 : !pto.tile_buf, !pto.tile_buf) outs(%79 : !pto.tile_buf) + pto.tcvt ins(%33 {rmode = #pto} : !pto.tile_buf) outs(%34 : !pto.tile_buf) + %p_push_4 = pto.talloc_to_aic {id = 30, split = 0} -> !pto.tensor_view<128x256xf16> + %p_push_part_4 = pto.partition_view %p_push_4, offsets = [%31, %c0], sizes = [%c32, %c256] : !pto.tensor_view<128x256xf16> -> !pto.partition_tensor_view<32x256xf16> + pto.tstore ins(%34 : !pto.tile_buf) outs(%p_push_part_4 : !pto.partition_tensor_view<32x256xf16>) + %qk_pop_part_4_r1 = pto.partition_view %qk_pop_4, offsets = [%row_slice_1, %c0], sizes = [%c32, %c256] : !pto.tensor_view<128x256xf32> -> !pto.partition_tensor_view<32x256xf32> + pto.tload ins(%qk_pop_part_4_r1 : !pto.partition_tensor_view<32x256xf32>) outs(%75 : !pto.tile_buf) + pto.tfree_from_aic(%qk_pop_4 : !pto.tensor_view<128x256xf32>) {id = 25, split = 0} + pto.tmuls ins(%75, %cst : !pto.tile_buf, f32) outs(%75 : !pto.tile_buf) + %r36_4_r1 = pto.alloc_tile addr = %c393344_i64 : !pto.tile_buf + %r37_4_r1 = pto.alloc_tile addr = %c393600_i64 : !pto.tile_buf + %r38_4_r1 = pto.alloc_tile addr = %c393856_i64 : !pto.tile_buf + %r39_4_r1 = pto.alloc_tile addr = %c394112_i64 : !pto.tile_buf + %r40_4_r1 = pto.alloc_tile addr = %c394368_i64 : !pto.tile_buf + pto.trowmax ins(%75, %33 : !pto.tile_buf, !pto.tile_buf) outs(%r37_4_r1 : !pto.tile_buf) + %qk4_r1_max = pto.treshape %r37_4_r1 : !pto.tile_buf -> !pto.tile_buf + %qk4_r1_gmax = pto.treshape %r36_4_r1 : !pto.tile_buf -> !pto.tile_buf + %qk4_r1_diff = pto.treshape %r40_4_r1 : !pto.tile_buf -> !pto.tile_buf + %qk4_r1_lsum = pto.treshape %r38_4_r1 : !pto.tile_buf -> !pto.tile_buf + %qk4_r1_gsum = pto.treshape %r39_4_r1 : !pto.tile_buf -> !pto.tile_buf + pto.tmax ins(%qk4_r1_max, %qk4_r1_gmax : !pto.tile_buf, !pto.tile_buf) outs(%qk4_r1_max : !pto.tile_buf) + pto.tsub ins(%qk4_r1_gmax, %qk4_r1_max : !pto.tile_buf, !pto.tile_buf) outs(%qk4_r1_diff : !pto.tile_buf) + pto.tmuls ins(%qk4_r1_max, %cst_3 : !pto.tile_buf, f32) outs(%qk4_r1_gmax : !pto.tile_buf) + pto.trowexpandsub ins(%75, %r37_4_r1 : !pto.tile_buf, !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.texp ins(%qk4_r1_diff : !pto.tile_buf) outs(%qk4_r1_diff : !pto.tile_buf) + pto.texp ins(%33 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.tmul ins(%qk4_r1_lsum, %qk4_r1_diff : !pto.tile_buf, !pto.tile_buf) outs(%qk4_r1_lsum : !pto.tile_buf) + pto.trowsum ins(%33, %32 : !pto.tile_buf, !pto.tile_buf) outs(%r39_4_r1 : !pto.tile_buf) + pto.tadd ins(%qk4_r1_lsum, %qk4_r1_gsum : !pto.tile_buf, !pto.tile_buf) outs(%qk4_r1_lsum : !pto.tile_buf) + pto.tcvt ins(%33 {rmode = #pto} : !pto.tile_buf) outs(%34 : !pto.tile_buf) + %p_push_part_4_r1 = pto.partition_view %p_push_4, offsets = [%row_slice_1, %c0], sizes = [%c32, %c256] : !pto.tensor_view<128x256xf16> -> !pto.partition_tensor_view<32x256xf16> + pto.tstore ins(%34 : !pto.tile_buf) outs(%p_push_part_4_r1 : !pto.partition_tensor_view<32x256xf16>) + pto.tpush_to_aic(%p_push_4 : !pto.tensor_view<128x256xf16>) {id = 30, split = 0} + %c394752_i64_13 = arith.constant 394752 : i64 + %81 = pto.alloc_tile addr = %c394752_i64_13 : !pto.tile_buf + %pv_pop_3 = pto.tpop_from_aic {id = 27, split = 1} -> !pto.tensor_view<64x128xf32> + %pv_pop_part_3 = pto.partition_view %pv_pop_3, offsets = [%c0, %c0], sizes = [%c64, %c128_0] : !pto.tensor_view<64x128xf32> -> !pto.partition_tensor_view<64x128xf32> + pto.tload ins(%pv_pop_part_3 : !pto.partition_tensor_view<64x128xf32>) outs(%81 : !pto.tile_buf) + pto.trowexpandmul ins(%35, %41 : !pto.tile_buf, !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tadd ins(%35, %81 : !pto.tile_buf, !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tfree_from_aic(%pv_pop_3 : !pto.tensor_view<64x128xf32>) {id = 27, split = 1} + %c394752_i64_14 = arith.constant 394752 : i64 + %82 = pto.alloc_tile addr = %c394752_i64_14 : !pto.tile_buf + %qk_pop_5 = pto.tpop_from_aic {id = 25, split = 0} -> !pto.tensor_view<128x256xf32> + %qk_pop_part_5 = pto.partition_view %qk_pop_5, offsets = [%31, %c0], sizes = [%c32, %c256] : !pto.tensor_view<128x256xf32> -> !pto.partition_tensor_view<32x256xf32> + pto.tload ins(%qk_pop_part_5 : !pto.partition_tensor_view<32x256xf32>) outs(%82 : !pto.tile_buf) + pto.tmuls ins(%82, %cst : !pto.tile_buf, f32) outs(%82 : !pto.tile_buf) + %r36_5 = pto.alloc_tile addr = %c393216_i64 : !pto.tile_buf + %r37_5 = pto.alloc_tile addr = %c393472_i64 : !pto.tile_buf + %r38_5 = pto.alloc_tile addr = %c393728_i64 : !pto.tile_buf + %r39_5 = pto.alloc_tile addr = %c393984_i64 : !pto.tile_buf + %r41_5 = pto.alloc_tile addr = %c394496_i64 : !pto.tile_buf + pto.trowmax ins(%82, %33 : !pto.tile_buf, !pto.tile_buf) outs(%r37_5 : !pto.tile_buf) + %83 = pto.treshape %r37_5 : !pto.tile_buf -> !pto.tile_buf + %84 = pto.treshape %r36_5 : !pto.tile_buf -> !pto.tile_buf + %85 = pto.treshape %r41_5 : !pto.tile_buf -> !pto.tile_buf + %86 = pto.treshape %r38_5 : !pto.tile_buf -> !pto.tile_buf + %87 = pto.treshape %r39_5 : !pto.tile_buf -> !pto.tile_buf + pto.tmax ins(%83, %84 : !pto.tile_buf, !pto.tile_buf) outs(%83 : !pto.tile_buf) + pto.tsub ins(%84, %83 : !pto.tile_buf, !pto.tile_buf) outs(%85 : !pto.tile_buf) + pto.tmuls ins(%83, %cst_3 : !pto.tile_buf, f32) outs(%84 : !pto.tile_buf) + pto.trowexpandsub ins(%82, %r37_5 : !pto.tile_buf, !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.texp ins(%85 : !pto.tile_buf) outs(%85 : !pto.tile_buf) + pto.texp ins(%33 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.tmul ins(%86, %85 : !pto.tile_buf, !pto.tile_buf) outs(%86 : !pto.tile_buf) + pto.trowsum ins(%33, %32 : !pto.tile_buf, !pto.tile_buf) outs(%r39_5 : !pto.tile_buf) + pto.tadd ins(%86, %87 : !pto.tile_buf, !pto.tile_buf) outs(%86 : !pto.tile_buf) + pto.tcvt ins(%33 {rmode = #pto} : !pto.tile_buf) outs(%34 : !pto.tile_buf) + %p_push_5 = pto.talloc_to_aic {id = 30, split = 0} -> !pto.tensor_view<128x256xf16> + %p_push_part_5 = pto.partition_view %p_push_5, offsets = [%31, %c0], sizes = [%c32, %c256] : !pto.tensor_view<128x256xf16> -> !pto.partition_tensor_view<32x256xf16> + pto.tstore ins(%34 : !pto.tile_buf) outs(%p_push_part_5 : !pto.partition_tensor_view<32x256xf16>) + %qk_pop_part_5_r1 = pto.partition_view %qk_pop_5, offsets = [%row_slice_1, %c0], sizes = [%c32, %c256] : !pto.tensor_view<128x256xf32> -> !pto.partition_tensor_view<32x256xf32> + pto.tload ins(%qk_pop_part_5_r1 : !pto.partition_tensor_view<32x256xf32>) outs(%82 : !pto.tile_buf) + pto.tfree_from_aic(%qk_pop_5 : !pto.tensor_view<128x256xf32>) {id = 25, split = 0} + pto.tmuls ins(%82, %cst : !pto.tile_buf, f32) outs(%82 : !pto.tile_buf) + %r36_5_r1 = pto.alloc_tile addr = %c393344_i64 : !pto.tile_buf + %r37_5_r1 = pto.alloc_tile addr = %c393600_i64 : !pto.tile_buf + %r38_5_r1 = pto.alloc_tile addr = %c393856_i64 : !pto.tile_buf + %r39_5_r1 = pto.alloc_tile addr = %c394112_i64 : !pto.tile_buf + %r41_5_r1 = pto.alloc_tile addr = %c394624_i64 : !pto.tile_buf + pto.trowmax ins(%82, %33 : !pto.tile_buf, !pto.tile_buf) outs(%r37_5_r1 : !pto.tile_buf) + %qk5_r1_max = pto.treshape %r37_5_r1 : !pto.tile_buf -> !pto.tile_buf + %qk5_r1_gmax = pto.treshape %r36_5_r1 : !pto.tile_buf -> !pto.tile_buf + %qk5_r1_diff = pto.treshape %r41_5_r1 : !pto.tile_buf -> !pto.tile_buf + %qk5_r1_lsum = pto.treshape %r38_5_r1 : !pto.tile_buf -> !pto.tile_buf + %qk5_r1_gsum = pto.treshape %r39_5_r1 : !pto.tile_buf -> !pto.tile_buf + pto.tmax ins(%qk5_r1_max, %qk5_r1_gmax : !pto.tile_buf, !pto.tile_buf) outs(%qk5_r1_max : !pto.tile_buf) + pto.tsub ins(%qk5_r1_gmax, %qk5_r1_max : !pto.tile_buf, !pto.tile_buf) outs(%qk5_r1_diff : !pto.tile_buf) + pto.tmuls ins(%qk5_r1_max, %cst_3 : !pto.tile_buf, f32) outs(%qk5_r1_gmax : !pto.tile_buf) + pto.trowexpandsub ins(%82, %r37_5_r1 : !pto.tile_buf, !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.texp ins(%qk5_r1_diff : !pto.tile_buf) outs(%qk5_r1_diff : !pto.tile_buf) + pto.texp ins(%33 : !pto.tile_buf) outs(%33 : !pto.tile_buf) + pto.tmul ins(%qk5_r1_lsum, %qk5_r1_diff : !pto.tile_buf, !pto.tile_buf) outs(%qk5_r1_lsum : !pto.tile_buf) + pto.trowsum ins(%33, %32 : !pto.tile_buf, !pto.tile_buf) outs(%r39_5_r1 : !pto.tile_buf) + pto.tadd ins(%qk5_r1_lsum, %qk5_r1_gsum : !pto.tile_buf, !pto.tile_buf) outs(%qk5_r1_lsum : !pto.tile_buf) + pto.tcvt ins(%33 {rmode = #pto} : !pto.tile_buf) outs(%34 : !pto.tile_buf) + %p_push_part_5_r1 = pto.partition_view %p_push_5, offsets = [%row_slice_1, %c0], sizes = [%c32, %c256] : !pto.tensor_view<128x256xf16> -> !pto.partition_tensor_view<32x256xf16> + pto.tstore ins(%34 : !pto.tile_buf) outs(%p_push_part_5_r1 : !pto.partition_tensor_view<32x256xf16>) + pto.tpush_to_aic(%p_push_5 : !pto.tensor_view<128x256xf16>) {id = 30, split = 0} + } + %c394752_i64_9 = arith.constant 394752 : i64 + %70 = pto.alloc_tile addr = %c394752_i64_9 : !pto.tile_buf + %pv_pop_4 = pto.tpop_from_aic {id = 27, split = 1} -> !pto.tensor_view<64x128xf32> + %pv_pop_part_4 = pto.partition_view %pv_pop_4, offsets = [%c0, %c0], sizes = [%c64, %c128_0] : !pto.tensor_view<64x128xf32> -> !pto.partition_tensor_view<64x128xf32> + pto.tload ins(%pv_pop_part_4 : !pto.partition_tensor_view<64x128xf32>) outs(%70 : !pto.tile_buf) + pto.trowexpandmul ins(%35, %40 : !pto.tile_buf, !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tadd ins(%35, %70 : !pto.tile_buf, !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tfree_from_aic(%pv_pop_4 : !pto.tensor_view<64x128xf32>) {id = 27, split = 1} + %c394752_i64_10 = arith.constant 394752 : i64 + %71 = pto.alloc_tile addr = %c394752_i64_10 : !pto.tile_buf + %pv_pop_5 = pto.tpop_from_aic {id = 27, split = 1} -> !pto.tensor_view<64x128xf32> + %pv_pop_part_5 = pto.partition_view %pv_pop_5, offsets = [%c0, %c0], sizes = [%c64, %c128_0] : !pto.tensor_view<64x128xf32> -> !pto.partition_tensor_view<64x128xf32> + pto.tload ins(%pv_pop_part_5 : !pto.partition_tensor_view<64x128xf32>) outs(%71 : !pto.tile_buf) + pto.trowexpandmul ins(%35, %41 : !pto.tile_buf, !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tadd ins(%35, %71 : !pto.tile_buf, !pto.tile_buf) outs(%35 : !pto.tile_buf) + pto.tfree_from_aic(%pv_pop_5 : !pto.tensor_view<64x128xf32>) {id = 27, split = 1} + pto.trowexpanddiv ins(%35, %38 : !pto.tile_buf, !pto.tile_buf) outs(%35 : !pto.tile_buf) + %72 = arith.addi %43, %31 : index + %73 = pto.partition_view %42, offsets = [%72, %c0], sizes = [%c64, %c128_0] : !pto.tensor_view -> !pto.partition_tensor_view<64x128xf32> + pto.tstore ins(%35 : !pto.tile_buf) outs(%73 : !pto.partition_tensor_view<64x128xf32>) + } + return + } + func.func @call_both(%arg0: memref<256xi64>, %q: !pto.ptr, %k: !pto.ptr, %v: !pto.ptr, %p_fifo: !pto.ptr, %o_out: !pto.ptr, %qk_fifo: !pto.ptr, %pv_fifo: !pto.ptr) attributes {pto.entry} { + pto.set_ffts %arg0 : memref<256xi64> + call @cube_kernel(%qk_fifo, %q, %k, %v, %p_fifo, %pv_fifo) : (!pto.ptr, !pto.ptr, !pto.ptr, !pto.ptr, !pto.ptr, !pto.ptr) -> () + call @vector_kernel(%qk_fifo, %o_out, %p_fifo, %pv_fifo) : (!pto.ptr, !pto.ptr, !pto.ptr, !pto.ptr) -> () + return + } +} \ No newline at end of file From a20c7d8ad7a2911969a7991436b31b41a176890d Mon Sep 17 00:00:00 2001 From: learning-chip Date: Thu, 30 Apr 2026 08:09:45 +0000 Subject: [PATCH 14/17] generate cpp from IR --- .../ir_ref/{READMD.md => README.md} | 4 + examples/aot/flash_attention/ir_ref/fa.cpp | 856 ++++++++++ .../aot/flash_attention/ir_ref/fa_perf.cpp | 1452 +++++++++++++++++ .../aot/flash_attention/ir_ref/gen_cpp.sh | 2 + 4 files changed, 2314 insertions(+) rename examples/aot/flash_attention/ir_ref/{READMD.md => README.md} (74%) create mode 100644 examples/aot/flash_attention/ir_ref/fa.cpp create mode 100644 examples/aot/flash_attention/ir_ref/fa_perf.cpp create mode 100644 examples/aot/flash_attention/ir_ref/gen_cpp.sh diff --git a/examples/aot/flash_attention/ir_ref/READMD.md b/examples/aot/flash_attention/ir_ref/README.md similarity index 74% rename from examples/aot/flash_attention/ir_ref/READMD.md rename to examples/aot/flash_attention/ir_ref/README.md index d19f5d69..d677ab7c 100644 --- a/examples/aot/flash_attention/ir_ref/READMD.md +++ b/examples/aot/flash_attention/ir_ref/README.md @@ -1,2 +1,6 @@ Copy IR from https://github.com/hw-native-sys/PTOAS/pull/609 to reverse engineer python frontend + +```bash +bash ./gen_cpp.sh +``` diff --git a/examples/aot/flash_attention/ir_ref/fa.cpp b/examples/aot/flash_attention/ir_ref/fa.cpp new file mode 100644 index 00000000..5210838c --- /dev/null +++ b/examples/aot/flash_attention/ir_ref/fa.cpp @@ -0,0 +1,856 @@ +#include "pto/pto-inst.hpp" +using namespace pto; + +template +static AICORE inline auto PTOAS__GLOBAL_TENSOR_DATA(Tensor &tensor) + -> decltype(tensor.data()) { + return tensor.data(); +} + + +enum class PTOAutoSyncTailMode : int { + kBarrierAll = 0, + kSetWaitMte3ToSEvent0 = 1, +}; + +static AICORE inline void ptoas_auto_sync_tail( + PTOAutoSyncTailMode mode = PTOAutoSyncTailMode::kBarrierAll) { + switch (mode) { + case PTOAutoSyncTailMode::kSetWaitMte3ToSEvent0: + set_flag(PIPE_MTE3, PIPE_S, EVENT_ID0); + wait_flag(PIPE_MTE3, PIPE_S, EVENT_ID0); + break; + case PTOAutoSyncTailMode::kBarrierAll: + default: + pipe_barrier(PIPE_ALL); + break; + } +} + +AICORE void cube_kernel(__gm__ float* v1, __gm__ half* v2, __gm__ half* v3, __gm__ half* v4) { + unsigned v5 = 3840; + unsigned v6 = 384; + unsigned v7 = 256; + unsigned v8 = 128; + unsigned v9 = 16; + unsigned v10 = 0; + const int32_t v11 = 16; + const int32_t v12 = 256; + const int32_t v13 = 128; + const int32_t v14 = 1; + const int32_t v15 = 0; + const int32_t v16 = 524288; + const int32_t v17 = 262144; + const int64_t v18 = 0; + const int64_t v19 = 32768; + const int64_t v20 = 65536; + const int64_t v21 = 163840; + const int64_t v22 = 131072; + const int32_t v23 = 2; + const int32_t v24 = 7; + const int32_t v25 = 393216; + using T = float; + + #if defined(__DAV_CUBE__) + size_t v26 = (size_t) v14; + int64_t v27 = get_block_num(); + int32_t v28 = (int32_t) ((int64_t) v27); + int64_t v29 = get_block_idx(); + int32_t v30 = (int32_t) ((int64_t) v29); + int32_t v31 = v11 / v28; + int32_t v32 = v11 % v28; + int32_t v33 = (int32_t) ((uint32_t) v31 + (uint32_t) v14); + bool v34 = v30 < v32; + int32_t v35 = v34 ? (int32_t) ((uint32_t) v30 * (uint32_t) v33) : (int32_t) ((uint32_t) ((int32_t) (uint32_t) v32 * (uint32_t) v33) + (uint32_t) ((int32_t) (uint32_t) ((int32_t) (uint32_t) v30 - (uint32_t) v32) * (uint32_t) v31)); + int32_t v36 = (int32_t) ((uint32_t) v30 * (uint32_t) v16); + int32_t v37 = (int32_t) ((uint32_t) v36 + (uint32_t) v25); + __gm__ float* v38 = v1 + v37; + + __gm__ float* v39 = v1 + v36; + + auto v40 = TPipe<0, Direction::DIR_C2V, 131072, 8, 8, true>(v39, v15, v15); + int32_t v41 = (int32_t) ((uint32_t) v36 + (uint32_t) v17); + __gm__ float* v42 = v1 + v41; + + auto v43 = TPipe<2, Direction::DIR_C2V, 65536, 8, 8, true>(v42, v15, v15); + auto v44 = TPipe<4, Direction::DIR_V2C, 65536, 8, 8, false>(v38, v15, v25); + Tile v45; + TASSIGN(v45, v18); + Tile v46; + TASSIGN(v46, v18); + Tile v47; + TASSIGN(v47, v19); + Tile v48; + TASSIGN(v48, v20); + Tile v49; + TASSIGN(v49, v18); + Tile v50; + TASSIGN(v50, v18); + Tile v51; + TASSIGN(v51, v19); + Tile v52; + TASSIGN(v52, v21); + Tile v53; + TASSIGN(v53, v18); + Tile v54; + TASSIGN(v54, v22); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID0); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID5); + set_flag(PIPE_FIX, PIPE_M, EVENT_ID2); + set_flag(PIPE_FIX, PIPE_M, EVENT_ID3); + for (size_t v55 = (size_t) v35; v55 < ((size_t) ((int32_t) (uint32_t) v35 + (uint32_t) (v34 ? v33 : v31))); v55 += v26) { + pto::Shape<1, 1, 1, 128, 128> v56 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<16384, 16384, 16384, 128, 1> v57 = pto::Stride<16384, 16384, 16384, 128, 1>(); + GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND> v58 = GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>(v2 + (v10 + (unsigned) ((int32_t) (uint32_t) ((int32_t) v55) * (uint32_t) v13) * (unsigned) v13 + v10 * (unsigned) v14), v56, v57); + TLOAD(v45, v58); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + TMOV(v46, v45); + pto::Shape<1, 1, 1, 128, 128> v59 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<128, 128, 128, 1, 128> v60 = pto::Stride<128, 128, 128, 1, 128>(); + GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN> v61 = GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN>(v3 + (v10 + v10 * (unsigned) v14 + v10 * (unsigned) v13), v59, v60); + TLOAD(v47, v61); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID1); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID1); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID0); + TMOV(v49, v47); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID0); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID0); + __cc__ float* v62 = v50.data(); + __cc__ float* v63 = v62 + (v10 + v10 * v9 + v10 * v8); + __cc__ float* v64 = (__cc__ float*) v63; + Tile v65; + uint64_t v66 = reinterpret_cast(v63); + TASSIGN(v65, v66); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID0); + TMATMUL(v65, v46, v49); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + pto::Shape<1, 1, 1, 128, 128> v67 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<128, 128, 128, 1, 128> v68 = pto::Stride<128, 128, 128, 1, 128>(); + GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN> v69 = GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN>(v3 + (v10 + v10 * (unsigned) v14 + v8 * (unsigned) v13), v67, v68); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID0); + TLOAD(v47, v69); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID2); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID2); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + TMOV(v49, v47); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID1); + __cc__ float* v70 = v50.data(); + __cc__ float* v71 = v70 + (v10 + v10 * v9 + v8 * v8); + __cc__ float* v72 = (__cc__ float*) v71; + Tile v73; + uint64_t v74 = reinterpret_cast(v71); + TASSIGN(v73, v74); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID1); + TMATMUL(v73, v46, v49); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID2); + set_flag(PIPE_M, PIPE_FIX, EVENT_ID0); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v75(nullptr); + TALLOC, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v40, v75); + __gm__ float* v76 = PTOAS__GLOBAL_TENSOR_DATA(v75); + pto::Shape<1, 1, 1, 128, 256> v77 = pto::Shape<1, 1, 1, 128, 256>(); + pto::Stride<32768, 32768, 32768, 256, 1> v78 = pto::Stride<32768, 32768, 32768, 256, 1>(); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v79 = GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>(v76, v77, v78); + wait_flag(PIPE_M, PIPE_FIX, EVENT_ID0); + TSTORE(v79, v50); + set_flag(PIPE_FIX, PIPE_M, EVENT_ID0); + TPUSH, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v40, v75); + pto::Shape<1, 1, 1, 128, 128> v80 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<128, 128, 128, 1, 128> v81 = pto::Stride<128, 128, 128, 1, 128>(); + GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN> v82 = GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN>(v3 + (v10 + v10 * (unsigned) v14 + v7 * (unsigned) v13), v80, v81); + TLOAD(v48, v82); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID3); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID3); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID2); + TMOV(v49, v48); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID1); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID2); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID2); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID0); + TMATMUL(v65, v46, v49); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID3); + pto::Shape<1, 1, 1, 128, 128> v83 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<128, 128, 128, 1, 128> v84 = pto::Stride<128, 128, 128, 1, 128>(); + GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN> v85 = GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN>(v3 + (v10 + v10 * (unsigned) v14 + v6 * (unsigned) v13), v83, v84); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID1); + TLOAD(v48, v85); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID4); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID4); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID3); + TMOV(v49, v48); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID3); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID3); + TMATMUL(v73, v46, v49); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID4); + set_flag(PIPE_M, PIPE_FIX, EVENT_ID1); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v86(nullptr); + TALLOC, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v40, v86); + __gm__ float* v87 = PTOAS__GLOBAL_TENSOR_DATA(v86); + pto::Shape<1, 1, 1, 128, 256> v88 = pto::Shape<1, 1, 1, 128, 256>(); + pto::Stride<32768, 32768, 32768, 256, 1> v89 = pto::Stride<32768, 32768, 32768, 256, 1>(); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v90 = GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>(v87, v88, v89); + wait_flag(PIPE_M, PIPE_FIX, EVENT_ID1); + TSTORE(v90, v50); + set_flag(PIPE_FIX, PIPE_M, EVENT_ID1); + TPUSH, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v40, v86); + pto::Shape<1, 1, 1, 256, 128> v91 = pto::Shape<1, 1, 1, 256, 128>(); + pto::Stride<32768, 32768, 32768, 128, 1> v92 = pto::Stride<32768, 32768, 32768, 128, 1>(); + GlobalTensor, pto::Stride<32768, 32768, 32768, 128, 1>, pto::Layout::ND> v93 = GlobalTensor, pto::Stride<32768, 32768, 32768, 128, 1>, pto::Layout::ND>(v4 + (v10 + v10 * (unsigned) v13 + v10 * (unsigned) v14), v91, v92); + TLOAD(v52, v93); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID4); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID1); + for (size_t v94 = (size_t) v15; v94 < ((size_t) v24); v94 += v26) { + int32_t v95 = (int32_t) ((uint32_t) ((int32_t) v94) * (uint32_t) v23); + int32_t v96 = (int32_t) ((uint32_t) ((int32_t) (uint32_t) v95 + (uint32_t) v23) * (uint32_t) v12); + Tile v97; + TPOP, Tile, TileSplitAxis::TILE_UP_DOWN>(v44, v97); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID5); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID5); + TMOV(v51, v97); + TFREE, TileSplitAxis::TILE_UP_DOWN>(v44); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID5); + TMOV(v53, v52); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID2); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID4); + int32_t v98 = (int32_t) ((uint32_t) v95 + (uint32_t) v14); + pto::Shape<1, 1, 1, 256, 128> v99 = pto::Shape<1, 1, 1, 256, 128>(); + pto::Stride<32768, 32768, 32768, 128, 1> v100 = pto::Stride<32768, 32768, 32768, 128, 1>(); + GlobalTensor, pto::Stride<32768, 32768, 32768, 128, 1>, pto::Layout::ND> v101 = GlobalTensor, pto::Stride<32768, 32768, 32768, 128, 1>, pto::Layout::ND>(v4 + (v10 + (unsigned) ((int32_t) (uint32_t) v98 * (uint32_t) v12) * (unsigned) v13 + v10 * (unsigned) v14), v99, v100); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID2); + TLOAD(v52, v101); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID4); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID2); + TMATMUL(v54, v51, v53); + set_flag(PIPE_M, PIPE_FIX, EVENT_ID2); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID6); + GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND> v102(nullptr); + TALLOC, GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v43, v102); + __gm__ float* v103 = PTOAS__GLOBAL_TENSOR_DATA(v102); + pto::Shape<1, 1, 1, 128, 128> v104 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<16384, 16384, 16384, 128, 1> v105 = pto::Stride<16384, 16384, 16384, 128, 1>(); + GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND> v106 = GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>(v103, v104, v105); + wait_flag(PIPE_M, PIPE_FIX, EVENT_ID2); + TSTORE(v106, v54); + set_flag(PIPE_FIX, PIPE_M, EVENT_ID4); + TPUSH, GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v43, v102); + pto::Shape<1, 1, 1, 128, 128> v107 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<128, 128, 128, 1, 128> v108 = pto::Stride<128, 128, 128, 1, 128>(); + GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN> v109 = GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN>(v3 + (v10 + v10 * (unsigned) v14 + (unsigned) v96 * (unsigned) v13), v107, v108); + TLOAD(v47, v109); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID6); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID6); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID6); + TMOV(v49, v47); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID5); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID3); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID5); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID3); + TMATMUL(v65, v46, v49); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID7); + pto::Shape<1, 1, 1, 128, 128> v110 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<128, 128, 128, 1, 128> v111 = pto::Stride<128, 128, 128, 1, 128>(); + GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN> v112 = GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN>(v3 + (v10 + v10 * (unsigned) v14 + (unsigned) ((int32_t) (uint32_t) v96 + (uint32_t) v13) * (unsigned) v13), v110, v111); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID3); + TLOAD(v47, v112); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID7); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID7); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID7); + TMOV(v49, v47); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID6); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID6); + TMATMUL(v73, v46, v49); + set_flag(PIPE_M, PIPE_FIX, EVENT_ID3); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v113(nullptr); + TALLOC, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v40, v113); + __gm__ float* v114 = PTOAS__GLOBAL_TENSOR_DATA(v113); + pto::Shape<1, 1, 1, 128, 256> v115 = pto::Shape<1, 1, 1, 128, 256>(); + pto::Stride<32768, 32768, 32768, 256, 1> v116 = pto::Stride<32768, 32768, 32768, 256, 1>(); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v117 = GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>(v114, v115, v116); + wait_flag(PIPE_M, PIPE_FIX, EVENT_ID3); + TSTORE(v117, v50); + set_flag(PIPE_FIX, PIPE_M, EVENT_ID5); + TPUSH, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v40, v113); + int32_t v118 = (int32_t) ((uint32_t) ((int32_t) (uint32_t) v98 + (uint32_t) v23) * (uint32_t) v12); + Tile v119; + TPOP, Tile, TileSplitAxis::TILE_UP_DOWN>(v44, v119); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + TMOV(v51, v119); + TFREE, TileSplitAxis::TILE_UP_DOWN>(v44); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + TMOV(v53, v52); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID4); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID7); + pto::Shape<1, 1, 1, 256, 128> v120 = pto::Shape<1, 1, 1, 256, 128>(); + pto::Stride<32768, 32768, 32768, 128, 1> v121 = pto::Stride<32768, 32768, 32768, 128, 1>(); + GlobalTensor, pto::Stride<32768, 32768, 32768, 128, 1>, pto::Layout::ND> v122 = GlobalTensor, pto::Stride<32768, 32768, 32768, 128, 1>, pto::Layout::ND>(v4 + (v10 + (unsigned) ((int32_t) (uint32_t) ((int32_t) (uint32_t) v98 + (uint32_t) v14) * (uint32_t) v12) * (unsigned) v13 + v10 * (unsigned) v14), v120, v121); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID4); + TLOAD(v52, v122); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID7); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID4); + TMATMUL(v54, v51, v53); + set_flag(PIPE_M, PIPE_FIX, EVENT_ID4); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND> v123(nullptr); + TALLOC, GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v43, v123); + __gm__ float* v124 = PTOAS__GLOBAL_TENSOR_DATA(v123); + pto::Shape<1, 1, 1, 128, 128> v125 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<16384, 16384, 16384, 128, 1> v126 = pto::Stride<16384, 16384, 16384, 128, 1>(); + GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND> v127 = GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>(v124, v125, v126); + wait_flag(PIPE_M, PIPE_FIX, EVENT_ID4); + TSTORE(v127, v54); + set_flag(PIPE_FIX, PIPE_M, EVENT_ID2); + TPUSH, GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v43, v123); + pto::Shape<1, 1, 1, 128, 128> v128 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<128, 128, 128, 1, 128> v129 = pto::Stride<128, 128, 128, 1, 128>(); + GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN> v130 = GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN>(v3 + (v10 + v10 * (unsigned) v14 + (unsigned) v118 * (unsigned) v13), v128, v129); + TLOAD(v48, v130); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + TMOV(v49, v48); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID0); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID5); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID0); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID5); + TMATMUL(v65, v46, v49); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + pto::Shape<1, 1, 1, 128, 128> v131 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<128, 128, 128, 1, 128> v132 = pto::Stride<128, 128, 128, 1, 128>(); + GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN> v133 = GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN>(v3 + (v10 + v10 * (unsigned) v14 + (unsigned) ((int32_t) (uint32_t) v118 + (uint32_t) v13) * (unsigned) v13), v131, v132); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID5); + TLOAD(v48, v133); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + TMOV(v49, v48); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID0); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID0); + TMATMUL(v73, v46, v49); + set_flag(PIPE_M, PIPE_FIX, EVENT_ID5); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID5); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v134(nullptr); + TALLOC, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v40, v134); + __gm__ float* v135 = PTOAS__GLOBAL_TENSOR_DATA(v134); + pto::Shape<1, 1, 1, 128, 256> v136 = pto::Shape<1, 1, 1, 128, 256>(); + pto::Stride<32768, 32768, 32768, 256, 1> v137 = pto::Stride<32768, 32768, 32768, 256, 1>(); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v138 = GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>(v135, v136, v137); + wait_flag(PIPE_M, PIPE_FIX, EVENT_ID5); + TSTORE(v138, v50); + set_flag(PIPE_FIX, PIPE_M, EVENT_ID3); + TPUSH, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v40, v134); + }; + set_flag(PIPE_FIX, PIPE_M, EVENT_ID6); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + Tile v139; + TPOP, Tile, TileSplitAxis::TILE_UP_DOWN>(v44, v139); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + TMOV(v51, v139); + TFREE, TileSplitAxis::TILE_UP_DOWN>(v44); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + TMOV(v53, v52); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID0); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID6); + pto::Shape<1, 1, 1, 256, 128> v140 = pto::Shape<1, 1, 1, 256, 128>(); + pto::Stride<32768, 32768, 32768, 128, 1> v141 = pto::Stride<32768, 32768, 32768, 128, 1>(); + GlobalTensor, pto::Stride<32768, 32768, 32768, 128, 1>, pto::Layout::ND> v142 = GlobalTensor, pto::Stride<32768, 32768, 32768, 128, 1>, pto::Layout::ND>(v4 + (v10 + v5 * (unsigned) v13 + v10 * (unsigned) v14), v140, v141); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID6); + TLOAD(v52, v142); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID0); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID6); + TMATMUL(v54, v51, v53); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + set_flag(PIPE_M, PIPE_FIX, EVENT_ID6); + GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND> v143(nullptr); + TALLOC, GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v43, v143); + __gm__ float* v144 = PTOAS__GLOBAL_TENSOR_DATA(v143); + pto::Shape<1, 1, 1, 128, 128> v145 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<16384, 16384, 16384, 128, 1> v146 = pto::Stride<16384, 16384, 16384, 128, 1>(); + GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND> v147 = GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>(v144, v145, v146); + wait_flag(PIPE_M, PIPE_FIX, EVENT_ID6); + TSTORE(v147, v54); + set_flag(PIPE_FIX, PIPE_M, EVENT_ID7); + TPUSH, GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v43, v143); + Tile v148; + TPOP, Tile, TileSplitAxis::TILE_UP_DOWN>(v44, v148); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + TMOV(v51, v148); + TFREE, TileSplitAxis::TILE_UP_DOWN>(v44); + TMOV(v53, v52); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID0); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID0); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID7); + TMATMUL(v54, v51, v53); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID0); + set_flag(PIPE_M, PIPE_FIX, EVENT_ID7); + GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND> v149(nullptr); + TALLOC, GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v43, v149); + __gm__ float* v150 = PTOAS__GLOBAL_TENSOR_DATA(v149); + pto::Shape<1, 1, 1, 128, 128> v151 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<16384, 16384, 16384, 128, 1> v152 = pto::Stride<16384, 16384, 16384, 128, 1>(); + GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND> v153 = GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>(v150, v151, v152); + wait_flag(PIPE_M, PIPE_FIX, EVENT_ID7); + TSTORE(v153, v54); + TPUSH, GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v43, v149); + } + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID5); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID2); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID3); + #endif // __DAV_CUBE__ + + ptoas_auto_sync_tail(PTOAutoSyncTailMode::kBarrierAll); + return; +} + +AICORE void vector_kernel(__gm__ float* v1, __gm__ float* v2) { + unsigned v3 = 128; + RoundMode v4 = RoundMode::CAST_RINT; + unsigned v5 = 256; + unsigned v6 = 0; + const int32_t v7 = 0; + const int32_t v8 = 16; + const int32_t v9 = 64; + const int32_t v10 = 128; + const int32_t v11 = 1; + const int32_t v12 = 524288; + const int32_t v13 = 262144; + const int64_t v14 = 196608; + const int64_t v15 = 262144; + const int64_t v16 = 327680; + const int64_t v17 = 360448; + const int64_t v18 = 393216; + const int64_t v19 = 393472; + const int64_t v20 = 393728; + const int64_t v21 = 393984; + const int64_t v22 = 394240; + const int64_t v23 = 394496; + const float v24 = 0.0883883461f; + const float v25 = 1.0f; + const int64_t v26 = 394752; + const int32_t v27 = 7; + const int32_t v28 = 393216; + using T = float; + + #if defined(__DAV_VEC__) + set_mask_norm(); + set_vector_mask(-1, -1); + size_t v29 = (size_t) v11; + int64_t v30 = get_block_num(); + int32_t v31 = (int32_t) ((int64_t) v30); + int64_t v32 = get_block_idx(); + int32_t v33 = (int32_t) ((int64_t) v32); + int32_t v34 = v8 / v31; + int32_t v35 = v8 % v31; + int32_t v36 = (int32_t) ((uint32_t) v34 + (uint32_t) v11); + bool v37 = v33 < v35; + int32_t v38 = v37 ? (int32_t) ((uint32_t) v33 * (uint32_t) v36) : (int32_t) ((uint32_t) ((int32_t) (uint32_t) v35 * (uint32_t) v36) + (uint32_t) ((int32_t) (uint32_t) ((int32_t) (uint32_t) v33 - (uint32_t) v35) * (uint32_t) v34)); + int32_t v39 = (int32_t) ((uint32_t) v33 * (uint32_t) v12); + int32_t v40 = (int32_t) ((uint32_t) v39 + (uint32_t) v28); + __gm__ float* v41 = v1 + v40; + + __gm__ float* v42 = v1 + v39; + + auto v43 = TPipe<0, Direction::DIR_C2V, 131072, 8, 8, true>(v42, v7, v7); + int32_t v44 = (int32_t) ((uint32_t) v39 + (uint32_t) v13); + __gm__ float* v45 = v1 + v44; + + auto v46 = TPipe<2, Direction::DIR_C2V, 65536, 8, 8, true>(v45, v7, v7); + auto v47 = TPipe<4, Direction::DIR_V2C, 65536, 8, 8, false>(v41, v7, v28); + int64_t v48 = get_subblockid(); + int32_t v49 = (int32_t) ((uint32_t) ((int32_t) (int64_t) v48) * (uint32_t) v9); + Tile v50; + TASSIGN(v50, v14); + Tile v51; + TASSIGN(v51, v15); + Tile v52; + TASSIGN(v52, v16); + Tile v53; + TASSIGN(v53, v17); + Tile v54; + TASSIGN(v54, v18); + Tile v55; + TASSIGN(v55, v19); + Tile v56; + TASSIGN(v56, v20); + Tile v57; + TASSIGN(v57, v21); + Tile v58; + TASSIGN(v58, v22); + Tile v59; + TASSIGN(v59, v23); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID0); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID0); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID7); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID5); + for (size_t v60 = (size_t) v38; v60 < ((size_t) ((int32_t) (uint32_t) v38 + (uint32_t) (v37 ? v36 : v34))); v60 += v29) { + Tile v61; + TASSIGN(v61, v26); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v62(nullptr); + TPOP, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v43, v62); + __gm__ float* v63 = PTOAS__GLOBAL_TENSOR_DATA(v62); + pto::Shape<1, 1, 1, 64, 256> v64 = pto::Shape<1, 1, 1, 64, 256>(); + pto::Stride<16384, 16384, 16384, 256, 1> v65 = pto::Stride<16384, 16384, 16384, 256, 1>(); + GlobalTensor, pto::Stride<16384, 16384, 16384, 256, 1>, pto::Layout::ND> v66 = GlobalTensor, pto::Stride<16384, 16384, 16384, 256, 1>, pto::Layout::ND>(v63 + (v6 + (unsigned) v49 * v5), v64, v65); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID0); + TLOAD(v61, v66); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TMULS(v61, v61, v24); + pipe_barrier(PIPE_V); + TROWMAX(v55, v61, v51); + Tile v67; + TRESHAPE(v67, v55); + Tile v68; + TRESHAPE(v68, v54); + pipe_barrier(PIPE_V); + TROWEXPANDSUB(v51, v61, v55); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + TMULS(v68, v67, v25); + pipe_barrier(PIPE_V); + TEXP(v51, v51); + pipe_barrier(PIPE_V); + TROWSUM(v56, v51, v50); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID0); + TCVT(v52, v51, v4); + set_flag(PIPE_V, PIPE_MTE3, EVENT_ID0); + wait_flag(PIPE_V, PIPE_MTE3, EVENT_ID0); + TPUSH, Tile, TileSplitAxis::TILE_UP_DOWN>(v47, v52); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID1); + TFREE, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v43, v62); + Tile v69; + TASSIGN(v69, v26); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v70(nullptr); + TPOP, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v43, v70); + __gm__ float* v71 = PTOAS__GLOBAL_TENSOR_DATA(v70); + pto::Shape<1, 1, 1, 64, 256> v72 = pto::Shape<1, 1, 1, 64, 256>(); + pto::Stride<16384, 16384, 16384, 256, 1> v73 = pto::Stride<16384, 16384, 16384, 256, 1>(); + GlobalTensor, pto::Stride<16384, 16384, 16384, 256, 1>, pto::Layout::ND> v74 = GlobalTensor, pto::Stride<16384, 16384, 16384, 256, 1>, pto::Layout::ND>(v71 + (v6 + (unsigned) v49 * v5), v72, v73); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + TLOAD(v69, v74); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID1); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID1); + TMULS(v69, v69, v24); + pipe_barrier(PIPE_V); + TROWMAX(v55, v69, v51); + Tile v75; + TRESHAPE(v75, v59); + Tile v76; + TRESHAPE(v76, v56); + Tile v77; + TRESHAPE(v77, v57); + pipe_barrier(PIPE_V); + TMAX(v67, v67, v68); + pipe_barrier(PIPE_V); + TSUB(v75, v68, v67); + pipe_barrier(PIPE_V); + TMULS(v68, v67, v25); + TROWEXPANDSUB(v51, v69, v55); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID2); + TEXP(v75, v75); + pipe_barrier(PIPE_V); + TEXP(v51, v51); + TMUL(v76, v76, v75); + pipe_barrier(PIPE_V); + TROWSUM(v57, v51, v50); + pipe_barrier(PIPE_V); + TADD(v76, v76, v77); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID1); + TCVT(v52, v51, v4); + set_flag(PIPE_V, PIPE_MTE3, EVENT_ID1); + wait_flag(PIPE_V, PIPE_MTE3, EVENT_ID1); + TPUSH, Tile, TileSplitAxis::TILE_UP_DOWN>(v47, v52); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID2); + TFREE, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v43, v70); + Tile v78; + TASSIGN(v78, v26); + GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND> v79(nullptr); + TPOP, GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v46, v79); + __gm__ float* v80 = PTOAS__GLOBAL_TENSOR_DATA(v79); + pto::Shape<1, 1, 1, 64, 128> v81 = pto::Shape<1, 1, 1, 64, 128>(); + pto::Stride<8192, 8192, 8192, 128, 1> v82 = pto::Stride<8192, 8192, 8192, 128, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND> v83 = GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND>(v80 + (v6 + (unsigned) v49 * v3), v81, v82); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID2); + TLOAD(v78, v83); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID2); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID2); + TMOV(v53, v78); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID3); + TFREE, GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v46, v79); + Tile v84; + TASSIGN(v84, v26); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v85(nullptr); + TPOP, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v43, v85); + __gm__ float* v86 = PTOAS__GLOBAL_TENSOR_DATA(v85); + pto::Shape<1, 1, 1, 64, 256> v87 = pto::Shape<1, 1, 1, 64, 256>(); + pto::Stride<16384, 16384, 16384, 256, 1> v88 = pto::Stride<16384, 16384, 16384, 256, 1>(); + GlobalTensor, pto::Stride<16384, 16384, 16384, 256, 1>, pto::Layout::ND> v89 = GlobalTensor, pto::Stride<16384, 16384, 16384, 256, 1>, pto::Layout::ND>(v86 + (v6 + (unsigned) v49 * v5), v87, v88); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID3); + TLOAD(v84, v89); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID3); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID3); + TMULS(v84, v84, v24); + pipe_barrier(PIPE_V); + TROWMAX(v55, v84, v51); + Tile v90; + TRESHAPE(v90, v58); + pipe_barrier(PIPE_V); + TMAX(v67, v67, v68); + pipe_barrier(PIPE_V); + TSUB(v90, v68, v67); + pipe_barrier(PIPE_V); + TMULS(v68, v67, v25); + TROWEXPANDSUB(v51, v84, v55); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID4); + TEXP(v90, v90); + pipe_barrier(PIPE_V); + TEXP(v51, v51); + TMUL(v76, v76, v90); + pipe_barrier(PIPE_V); + TROWSUM(v57, v51, v50); + pipe_barrier(PIPE_V); + TADD(v76, v76, v77); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID2); + TCVT(v52, v51, v4); + set_flag(PIPE_V, PIPE_MTE3, EVENT_ID2); + wait_flag(PIPE_V, PIPE_MTE3, EVENT_ID2); + TPUSH, Tile, TileSplitAxis::TILE_UP_DOWN>(v47, v52); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID3); + TFREE, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v43, v85); + Tile v91; + TASSIGN(v91, v26); + GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND> v92(nullptr); + TPOP, GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v46, v92); + __gm__ float* v93 = PTOAS__GLOBAL_TENSOR_DATA(v92); + pto::Shape<1, 1, 1, 64, 128> v94 = pto::Shape<1, 1, 1, 64, 128>(); + pto::Stride<8192, 8192, 8192, 128, 1> v95 = pto::Stride<8192, 8192, 8192, 128, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND> v96 = GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND>(v93 + (v6 + (unsigned) v49 * v3), v94, v95); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID4); + TLOAD(v91, v96); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID4); + TROWEXPANDMUL(v53, v53, v59); + pipe_barrier(PIPE_V); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID4); + TADD(v53, v53, v91); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID5); + TFREE, GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v46, v92); + Tile v97; + TASSIGN(v97, v26); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v98(nullptr); + TPOP, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v43, v98); + __gm__ float* v99 = PTOAS__GLOBAL_TENSOR_DATA(v98); + pto::Shape<1, 1, 1, 64, 256> v100 = pto::Shape<1, 1, 1, 64, 256>(); + pto::Stride<16384, 16384, 16384, 256, 1> v101 = pto::Stride<16384, 16384, 16384, 256, 1>(); + GlobalTensor, pto::Stride<16384, 16384, 16384, 256, 1>, pto::Layout::ND> v102 = GlobalTensor, pto::Stride<16384, 16384, 16384, 256, 1>, pto::Layout::ND>(v99 + (v6 + (unsigned) v49 * v5), v100, v101); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID5); + TLOAD(v97, v102); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID5); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID5); + TMULS(v97, v97, v24); + pipe_barrier(PIPE_V); + TROWMAX(v55, v97, v51); + pipe_barrier(PIPE_V); + TMAX(v67, v67, v68); + pipe_barrier(PIPE_V); + TSUB(v75, v68, v67); + pipe_barrier(PIPE_V); + TMULS(v68, v67, v25); + TROWEXPANDSUB(v51, v97, v55); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID6); + TEXP(v75, v75); + pipe_barrier(PIPE_V); + TEXP(v51, v51); + TMUL(v76, v76, v75); + pipe_barrier(PIPE_V); + TROWSUM(v57, v51, v50); + pipe_barrier(PIPE_V); + TADD(v76, v76, v77); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID3); + TCVT(v52, v51, v4); + set_flag(PIPE_V, PIPE_MTE3, EVENT_ID3); + wait_flag(PIPE_V, PIPE_MTE3, EVENT_ID3); + TPUSH, Tile, TileSplitAxis::TILE_UP_DOWN>(v47, v52); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID4); + TFREE, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v43, v98); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID6); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID4); + for (size_t v103 = v29; v103 < ((size_t) v27); v103 += v29) { + Tile v104; + TASSIGN(v104, v26); + GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND> v105(nullptr); + TPOP, GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v46, v105); + __gm__ float* v106 = PTOAS__GLOBAL_TENSOR_DATA(v105); + pto::Shape<1, 1, 1, 64, 128> v107 = pto::Shape<1, 1, 1, 64, 128>(); + pto::Stride<8192, 8192, 8192, 128, 1> v108 = pto::Stride<8192, 8192, 8192, 128, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND> v109 = GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND>(v106 + (v6 + (unsigned) v49 * v3), v107, v108); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID7); + TLOAD(v104, v109); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID6); + TROWEXPANDMUL(v53, v53, v58); + pipe_barrier(PIPE_V); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID6); + TADD(v53, v53, v104); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + TFREE, GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v46, v105); + Tile v110; + TASSIGN(v110, v26); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v111(nullptr); + TPOP, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v43, v111); + __gm__ float* v112 = PTOAS__GLOBAL_TENSOR_DATA(v111); + pto::Shape<1, 1, 1, 64, 256> v113 = pto::Shape<1, 1, 1, 64, 256>(); + pto::Stride<16384, 16384, 16384, 256, 1> v114 = pto::Stride<16384, 16384, 16384, 256, 1>(); + GlobalTensor, pto::Stride<16384, 16384, 16384, 256, 1>, pto::Layout::ND> v115 = GlobalTensor, pto::Stride<16384, 16384, 16384, 256, 1>, pto::Layout::ND>(v112 + (v6 + (unsigned) v49 * v5), v113, v114); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + TLOAD(v110, v115); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TMULS(v110, v110, v24); + pipe_barrier(PIPE_V); + TROWMAX(v55, v110, v51); + pipe_barrier(PIPE_V); + TMAX(v67, v67, v68); + pipe_barrier(PIPE_V); + TSUB(v90, v68, v67); + pipe_barrier(PIPE_V); + TMULS(v68, v67, v25); + TROWEXPANDSUB(v51, v110, v55); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + TEXP(v90, v90); + pipe_barrier(PIPE_V); + TEXP(v51, v51); + TMUL(v76, v76, v90); + pipe_barrier(PIPE_V); + TROWSUM(v57, v51, v50); + pipe_barrier(PIPE_V); + TADD(v76, v76, v77); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID5); + TCVT(v52, v51, v4); + set_flag(PIPE_V, PIPE_MTE3, EVENT_ID4); + wait_flag(PIPE_V, PIPE_MTE3, EVENT_ID4); + TPUSH, Tile, TileSplitAxis::TILE_UP_DOWN>(v47, v52); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID6); + TFREE, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v43, v111); + Tile v116; + TASSIGN(v116, v26); + GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND> v117(nullptr); + TPOP, GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v46, v117); + __gm__ float* v118 = PTOAS__GLOBAL_TENSOR_DATA(v117); + pto::Shape<1, 1, 1, 64, 128> v119 = pto::Shape<1, 1, 1, 64, 128>(); + pto::Stride<8192, 8192, 8192, 128, 1> v120 = pto::Stride<8192, 8192, 8192, 128, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND> v121 = GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND>(v118 + (v6 + (unsigned) v49 * v3), v119, v120); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + TLOAD(v116, v121); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TROWEXPANDMUL(v53, v53, v59); + pipe_barrier(PIPE_V); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TADD(v53, v53, v116); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + TFREE, GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v46, v117); + Tile v122; + TASSIGN(v122, v26); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v123(nullptr); + TPOP, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v43, v123); + __gm__ float* v124 = PTOAS__GLOBAL_TENSOR_DATA(v123); + pto::Shape<1, 1, 1, 64, 256> v125 = pto::Shape<1, 1, 1, 64, 256>(); + pto::Stride<16384, 16384, 16384, 256, 1> v126 = pto::Stride<16384, 16384, 16384, 256, 1>(); + GlobalTensor, pto::Stride<16384, 16384, 16384, 256, 1>, pto::Layout::ND> v127 = GlobalTensor, pto::Stride<16384, 16384, 16384, 256, 1>, pto::Layout::ND>(v124 + (v6 + (unsigned) v49 * v5), v125, v126); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + TLOAD(v122, v127); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TMULS(v122, v122, v24); + pipe_barrier(PIPE_V); + TROWMAX(v55, v122, v51); + pipe_barrier(PIPE_V); + TMAX(v67, v67, v68); + pipe_barrier(PIPE_V); + TSUB(v75, v68, v67); + pipe_barrier(PIPE_V); + TMULS(v68, v67, v25); + TROWEXPANDSUB(v51, v122, v55); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID7); + TEXP(v75, v75); + pipe_barrier(PIPE_V); + TEXP(v51, v51); + TMUL(v76, v76, v75); + pipe_barrier(PIPE_V); + TROWSUM(v57, v51, v50); + pipe_barrier(PIPE_V); + TADD(v76, v76, v77); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID6); + TCVT(v52, v51, v4); + set_flag(PIPE_V, PIPE_MTE3, EVENT_ID5); + wait_flag(PIPE_V, PIPE_MTE3, EVENT_ID5); + TPUSH, Tile, TileSplitAxis::TILE_UP_DOWN>(v47, v52); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID5); + TFREE, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v43, v123); + }; + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID0); + Tile v128; + TASSIGN(v128, v26); + GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND> v129(nullptr); + TPOP, GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v46, v129); + __gm__ float* v130 = PTOAS__GLOBAL_TENSOR_DATA(v129); + pto::Shape<1, 1, 1, 64, 128> v131 = pto::Shape<1, 1, 1, 64, 128>(); + pto::Stride<8192, 8192, 8192, 128, 1> v132 = pto::Stride<8192, 8192, 8192, 128, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND> v133 = GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND>(v130 + (v6 + (unsigned) v49 * v3), v131, v132); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + TLOAD(v128, v133); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TROWEXPANDMUL(v53, v53, v58); + pipe_barrier(PIPE_V); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TADD(v53, v53, v128); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + TFREE, GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v46, v129); + Tile v134; + TASSIGN(v134, v26); + GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND> v135(nullptr); + TPOP, GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v46, v135); + __gm__ float* v136 = PTOAS__GLOBAL_TENSOR_DATA(v135); + pto::Shape<1, 1, 1, 64, 128> v137 = pto::Shape<1, 1, 1, 64, 128>(); + pto::Stride<8192, 8192, 8192, 128, 1> v138 = pto::Stride<8192, 8192, 8192, 128, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND> v139 = GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND>(v136 + (v6 + (unsigned) v49 * v3), v137, v138); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + TLOAD(v134, v139); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + pipe_barrier(PIPE_V); + TROWEXPANDMUL(v53, v53, v59); + pipe_barrier(PIPE_V); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TADD(v53, v53, v134); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID0); + TFREE, GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v46, v135); + pipe_barrier(PIPE_V); + TROWEXPANDDIV(v53, v53, v56); + set_flag(PIPE_V, PIPE_MTE3, EVENT_ID6); + pto::Shape<1, 1, 1, 64, 128> v140 = pto::Shape<1, 1, 1, 64, 128>(); + pto::Stride<8192, 8192, 8192, 128, 1> v141 = pto::Stride<8192, 8192, 8192, 128, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND> v142 = GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND>(v2 + (v6 + (unsigned) ((int32_t) (uint32_t) ((int32_t) (uint32_t) ((int32_t) v60) * (uint32_t) v10) + (uint32_t) v49) * (unsigned) v10 + v6 * (unsigned) v11), v140, v141); + wait_flag(PIPE_V, PIPE_MTE3, EVENT_ID6); + TSTORE(v142, v53); + } + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID0); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID0); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID7); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID5); + #endif // __DAV_VEC__ + + ptoas_auto_sync_tail(PTOAutoSyncTailMode::kBarrierAll); + return; +} + +__global__ AICORE void call_both(__gm__ int64_t* v1, __gm__ float* v2, __gm__ half* v3, __gm__ half* v4, __gm__ half* v5, __gm__ float* v6) { + using T = float; + uint64_t v7 = (uint64_t) v1; + set_ffts_base_addr(v7); + cube_kernel(v2, v3, v4, v5); + vector_kernel(v2, v6); + return; +} diff --git a/examples/aot/flash_attention/ir_ref/fa_perf.cpp b/examples/aot/flash_attention/ir_ref/fa_perf.cpp new file mode 100644 index 00000000..b67d8ac7 --- /dev/null +++ b/examples/aot/flash_attention/ir_ref/fa_perf.cpp @@ -0,0 +1,1452 @@ +#include "pto/pto-inst.hpp" +using namespace pto; + +template +static AICORE inline auto PTOAS__GLOBAL_TENSOR_DATA(Tensor &tensor) + -> decltype(tensor.data()) { + return tensor.data(); +} + + +enum class PTOAutoSyncTailMode : int { + kBarrierAll = 0, + kSetWaitMte3ToSEvent0 = 1, +}; + +static AICORE inline void ptoas_auto_sync_tail( + PTOAutoSyncTailMode mode = PTOAutoSyncTailMode::kBarrierAll) { + switch (mode) { + case PTOAutoSyncTailMode::kSetWaitMte3ToSEvent0: + set_flag(PIPE_MTE3, PIPE_S, EVENT_ID0); + wait_flag(PIPE_MTE3, PIPE_S, EVENT_ID0); + break; + case PTOAutoSyncTailMode::kBarrierAll: + default: + pipe_barrier(PIPE_ALL); + break; + } +} + +AICORE void cube_kernel(__gm__ float* v1, __gm__ half* v2, __gm__ half* v3, __gm__ half* v4, __gm__ half* v5, __gm__ float* v6) { + unsigned v7 = 3968; + unsigned v8 = 3840; + unsigned v9 = 3712; + unsigned v10 = 3584; + unsigned v11 = 384; + unsigned v12 = 256; + unsigned v13 = 128; + unsigned v14 = 16; + unsigned v15 = 0; + const int32_t v16 = 16; + const int32_t v17 = 256; + const int32_t v18 = 128; + const int32_t v19 = 1; + const int32_t v20 = 0; + const int32_t v21 = 262144; + const int32_t v22 = 131072; + const int64_t v23 = 0; + const int64_t v24 = 32768; + const int64_t v25 = 65536; + const int64_t v26 = 98304; + const int64_t v27 = 229376; + const int32_t v28 = 2; + const int32_t v29 = 7; + using T = float; + + #if defined(__DAV_CUBE__) + size_t v30 = (size_t) v19; + int64_t v31 = get_block_num(); + int32_t v32 = (int32_t) ((int64_t) v31); + int64_t v33 = get_block_idx(); + int32_t v34 = (int32_t) ((int64_t) v33); + int32_t v35 = v16 / v32; + int32_t v36 = v16 % v32; + int32_t v37 = (int32_t) ((uint32_t) v35 + (uint32_t) v19); + bool v38 = v34 < v36; + int32_t v39 = v38 ? (int32_t) ((uint32_t) v34 * (uint32_t) v37) : (int32_t) ((uint32_t) ((int32_t) (uint32_t) v36 * (uint32_t) v37) + (uint32_t) ((int32_t) (uint32_t) ((int32_t) (uint32_t) v34 - (uint32_t) v36) * (uint32_t) v35)); + int32_t v40 = (int32_t) ((uint32_t) v34 * (uint32_t) v21); + int32_t v41 = (int32_t) ((uint32_t) v34 * (uint32_t) v22); + __gm__ float* v42 = v1 + v40; + + auto v43 = TPipe<0, Direction::DIR_C2V, 131072, 8, 8, true>(v42, v20, v20); + __gm__ half* v44 = v5 + v40; + + auto v45 = TPipe<2, Direction::DIR_V2C, 65536, 8, 8, true>(v44, v20, v20); + __gm__ float* v46 = v6 + v41; + + auto v47 = TPipe<4, Direction::DIR_C2V, 65536, 8, 8, true>(v46, v20, v20); + Tile v48; + TASSIGN(v48, v23); + Tile v49; + TASSIGN(v49, v23); + Tile v50; + TASSIGN(v50, v24); + Tile v51; + TASSIGN(v51, v25); + Tile v52; + TASSIGN(v52, v23); + Tile v53; + TASSIGN(v53, v23); + Tile v54; + TASSIGN(v54, v26); + Tile v55; + TASSIGN(v55, v24); + Tile v56; + TASSIGN(v56, v27); + Tile v57; + TASSIGN(v57, v23); + Tile v58; + TASSIGN(v58, v25); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID0); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID5); + set_flag(PIPE_FIX, PIPE_M, EVENT_ID2); + set_flag(PIPE_FIX, PIPE_M, EVENT_ID3); + for (size_t v59 = (size_t) v39; v59 < ((size_t) ((int32_t) (uint32_t) v39 + (uint32_t) (v38 ? v37 : v35))); v59 += v30) { + pto::Shape<1, 1, 1, 128, 128> v60 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<16384, 16384, 16384, 128, 1> v61 = pto::Stride<16384, 16384, 16384, 128, 1>(); + GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND> v62 = GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>(v2 + (v15 + (unsigned) ((int32_t) (uint32_t) ((int32_t) v59) * (uint32_t) v18) * (unsigned) v18 + v15 * (unsigned) v19), v60, v61); + TLOAD(v48, v62); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + TMOV(v49, v48); + pto::Shape<1, 1, 1, 128, 128> v63 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<128, 128, 128, 1, 128> v64 = pto::Stride<128, 128, 128, 1, 128>(); + GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN> v65 = GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN>(v3 + (v15 + v15 * (unsigned) v19 + v15 * (unsigned) v18), v63, v64); + TLOAD(v50, v65); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID1); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID1); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID0); + TMOV(v52, v50); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID0); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID0); + __cc__ float* v66 = v53.data(); + __cc__ float* v67 = v66 + (v15 + v15 * v14 + v15 * v13); + __cc__ float* v68 = (__cc__ float*) v67; + Tile v69; + uint64_t v70 = reinterpret_cast(v67); + TASSIGN(v69, v70); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID0); + TMATMUL(v69, v49, v52); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + pto::Shape<1, 1, 1, 128, 128> v71 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<128, 128, 128, 1, 128> v72 = pto::Stride<128, 128, 128, 1, 128>(); + GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN> v73 = GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN>(v3 + (v15 + v15 * (unsigned) v19 + v13 * (unsigned) v18), v71, v72); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID0); + TLOAD(v50, v73); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID2); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID2); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + TMOV(v52, v50); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID1); + __cc__ float* v74 = v53.data(); + __cc__ float* v75 = v74 + (v15 + v15 * v14 + v13 * v13); + __cc__ float* v76 = (__cc__ float*) v75; + Tile v77; + uint64_t v78 = reinterpret_cast(v75); + TASSIGN(v77, v78); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID1); + TMATMUL(v77, v49, v52); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID2); + set_flag(PIPE_M, PIPE_FIX, EVENT_ID0); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v79(nullptr); + TALLOC, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v43, v79); + __gm__ float* v80 = PTOAS__GLOBAL_TENSOR_DATA(v79); + pto::Shape<1, 1, 1, 128, 256> v81 = pto::Shape<1, 1, 1, 128, 256>(); + pto::Stride<32768, 32768, 32768, 256, 1> v82 = pto::Stride<32768, 32768, 32768, 256, 1>(); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v83 = GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>(v80, v81, v82); + wait_flag(PIPE_M, PIPE_FIX, EVENT_ID0); + TSTORE(v83, v53); + set_flag(PIPE_FIX, PIPE_M, EVENT_ID0); + TPUSH, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v43, v79); + pto::Shape<1, 1, 1, 128, 128> v84 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<128, 128, 128, 1, 128> v85 = pto::Stride<128, 128, 128, 1, 128>(); + GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN> v86 = GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN>(v3 + (v15 + v15 * (unsigned) v19 + v12 * (unsigned) v18), v84, v85); + TLOAD(v51, v86); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID3); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID3); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID2); + TMOV(v52, v51); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID1); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID2); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID2); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID0); + TMATMUL(v69, v49, v52); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID3); + pto::Shape<1, 1, 1, 128, 128> v87 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<128, 128, 128, 1, 128> v88 = pto::Stride<128, 128, 128, 1, 128>(); + GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN> v89 = GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN>(v3 + (v15 + v15 * (unsigned) v19 + v11 * (unsigned) v18), v87, v88); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID1); + TLOAD(v51, v89); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID4); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID4); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID3); + TMOV(v52, v51); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID3); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID3); + TMATMUL(v77, v49, v52); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID4); + set_flag(PIPE_M, PIPE_FIX, EVENT_ID1); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v90(nullptr); + TALLOC, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v43, v90); + __gm__ float* v91 = PTOAS__GLOBAL_TENSOR_DATA(v90); + pto::Shape<1, 1, 1, 128, 256> v92 = pto::Shape<1, 1, 1, 128, 256>(); + pto::Stride<32768, 32768, 32768, 256, 1> v93 = pto::Stride<32768, 32768, 32768, 256, 1>(); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v94 = GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>(v91, v92, v93); + wait_flag(PIPE_M, PIPE_FIX, EVENT_ID1); + TSTORE(v94, v53); + set_flag(PIPE_FIX, PIPE_M, EVENT_ID1); + TPUSH, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v43, v90); + pto::Shape<1, 1, 1, 128, 128> v95 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<16384, 16384, 16384, 128, 1> v96 = pto::Stride<16384, 16384, 16384, 128, 1>(); + GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND> v97 = GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>(v4 + (v15 + v15 * (unsigned) v18 + v15 * (unsigned) v19), v95, v96); + TLOAD(v56, v97); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID4); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID1); + for (size_t v98 = (size_t) v20; v98 < ((size_t) v29); v98 += v30) { + int32_t v99 = (int32_t) ((uint32_t) ((int32_t) v98) * (uint32_t) v28); + int32_t v100 = (int32_t) ((uint32_t) ((int32_t) (uint32_t) v99 + (uint32_t) v28) * (uint32_t) v17); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v101(nullptr); + TPOP, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v45, v101); + __gm__ half* v102 = PTOAS__GLOBAL_TENSOR_DATA(v101); + pto::Shape<1, 1, 1, 128, 128> v103 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<32768, 32768, 32768, 256, 1> v104 = pto::Stride<32768, 32768, 32768, 256, 1>(); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v105 = GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>(v102, v103, v104); + TLOAD(v54, v105); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID5); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID5); + TMOV(v55, v54); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID2); + int32_t v106 = (int32_t) ((uint32_t) v99 * (uint32_t) v17); + pto::Shape<1, 1, 1, 128, 128> v107 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<16384, 16384, 16384, 128, 1> v108 = pto::Stride<16384, 16384, 16384, 128, 1>(); + GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND> v109 = GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>(v4 + (v15 + (unsigned) v106 * (unsigned) v18 + v15 * (unsigned) v19), v107, v108); + pipe_barrier(PIPE_MTE2); + TLOAD(v56, v109); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID6); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID6); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID5); + TMOV(v57, v56); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID4); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID3); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID4); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID2); + TMATMUL(v58, v55, v57); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID6); + __gm__ half* v110 = PTOAS__GLOBAL_TENSOR_DATA(v101); + pto::Shape<1, 1, 1, 128, 128> v111 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<32768, 32768, 32768, 256, 1> v112 = pto::Stride<32768, 32768, 32768, 256, 1>(); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v113 = GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>(v110 + v13, v111, v112); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID2); + TLOAD(v54, v113); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID7); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID7); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID6); + TMOV(v55, v54); + TFREE, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v45, v101); + pto::Shape<1, 1, 1, 128, 128> v114 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<16384, 16384, 16384, 128, 1> v115 = pto::Stride<16384, 16384, 16384, 128, 1>(); + GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND> v116 = GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>(v4 + (v15 + (unsigned) ((int32_t) (uint32_t) v106 + (uint32_t) v18) * (unsigned) v18 + v15 * (unsigned) v19), v114, v115); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID3); + TLOAD(v56, v116); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + TMOV(v57, v56); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID5); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID5); + TMATMUL_ACC(v58, v58, v55, v57); + set_flag(PIPE_M, PIPE_FIX, EVENT_ID2); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID7); + GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND> v117(nullptr); + TALLOC, GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v47, v117); + __gm__ float* v118 = PTOAS__GLOBAL_TENSOR_DATA(v117); + pto::Shape<1, 1, 1, 128, 128> v119 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<16384, 16384, 16384, 128, 1> v120 = pto::Stride<16384, 16384, 16384, 128, 1>(); + GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND> v121 = GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>(v118, v119, v120); + wait_flag(PIPE_M, PIPE_FIX, EVENT_ID2); + TSTORE(v121, v58); + set_flag(PIPE_FIX, PIPE_M, EVENT_ID4); + TPUSH, GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v47, v117); + pto::Shape<1, 1, 1, 128, 128> v122 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<128, 128, 128, 1, 128> v123 = pto::Stride<128, 128, 128, 1, 128>(); + GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN> v124 = GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN>(v3 + (v15 + v15 * (unsigned) v19 + (unsigned) v100 * (unsigned) v18), v122, v123); + TLOAD(v50, v124); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID7); + TMOV(v52, v50); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID6); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID4); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID6); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID3); + TMATMUL(v69, v49, v52); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + pto::Shape<1, 1, 1, 128, 128> v125 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<128, 128, 128, 1, 128> v126 = pto::Stride<128, 128, 128, 1, 128>(); + GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN> v127 = GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN>(v3 + (v15 + v15 * (unsigned) v19 + (unsigned) ((int32_t) (uint32_t) v100 + (uint32_t) v18) * (unsigned) v18), v125, v126); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID4); + TLOAD(v50, v127); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + TMOV(v52, v50); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID7); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID7); + TMATMUL(v77, v49, v52); + set_flag(PIPE_M, PIPE_FIX, EVENT_ID3); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v128(nullptr); + TALLOC, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v43, v128); + __gm__ float* v129 = PTOAS__GLOBAL_TENSOR_DATA(v128); + pto::Shape<1, 1, 1, 128, 256> v130 = pto::Shape<1, 1, 1, 128, 256>(); + pto::Stride<32768, 32768, 32768, 256, 1> v131 = pto::Stride<32768, 32768, 32768, 256, 1>(); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v132 = GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>(v129, v130, v131); + wait_flag(PIPE_M, PIPE_FIX, EVENT_ID3); + TSTORE(v132, v53); + set_flag(PIPE_FIX, PIPE_M, EVENT_ID5); + TPUSH, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v43, v128); + int32_t v133 = (int32_t) ((uint32_t) v99 + (uint32_t) v19); + int32_t v134 = (int32_t) ((uint32_t) ((int32_t) (uint32_t) v133 + (uint32_t) v28) * (uint32_t) v17); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v135(nullptr); + TPOP, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v45, v135); + __gm__ half* v136 = PTOAS__GLOBAL_TENSOR_DATA(v135); + pto::Shape<1, 1, 1, 128, 128> v137 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<32768, 32768, 32768, 256, 1> v138 = pto::Stride<32768, 32768, 32768, 256, 1>(); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v139 = GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>(v136, v137, v138); + TLOAD(v54, v139); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + TMOV(v55, v54); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID5); + int32_t v140 = (int32_t) ((uint32_t) v133 * (uint32_t) v17); + pto::Shape<1, 1, 1, 128, 128> v141 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<16384, 16384, 16384, 128, 1> v142 = pto::Stride<16384, 16384, 16384, 128, 1>(); + GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND> v143 = GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>(v4 + (v15 + (unsigned) v140 * (unsigned) v18 + v15 * (unsigned) v19), v141, v142); + TLOAD(v56, v143); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + TMOV(v57, v56); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID0); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID6); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID0); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID4); + TMATMUL(v58, v55, v57); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + __gm__ half* v144 = PTOAS__GLOBAL_TENSOR_DATA(v135); + pto::Shape<1, 1, 1, 128, 128> v145 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<32768, 32768, 32768, 256, 1> v146 = pto::Stride<32768, 32768, 32768, 256, 1>(); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v147 = GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>(v144 + v13, v145, v146); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID5); + TLOAD(v54, v147); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + TMOV(v55, v54); + TFREE, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v45, v135); + pto::Shape<1, 1, 1, 128, 128> v148 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<16384, 16384, 16384, 128, 1> v149 = pto::Stride<16384, 16384, 16384, 128, 1>(); + GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND> v150 = GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>(v4 + (v15 + (unsigned) ((int32_t) (uint32_t) v140 + (uint32_t) v18) * (unsigned) v18 + v15 * (unsigned) v19), v148, v149); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID6); + TLOAD(v56, v150); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + TMOV(v57, v56); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID0); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID0); + TMATMUL_ACC(v58, v58, v55, v57); + set_flag(PIPE_M, PIPE_FIX, EVENT_ID4); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND> v151(nullptr); + TALLOC, GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v47, v151); + __gm__ float* v152 = PTOAS__GLOBAL_TENSOR_DATA(v151); + pto::Shape<1, 1, 1, 128, 128> v153 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<16384, 16384, 16384, 128, 1> v154 = pto::Stride<16384, 16384, 16384, 128, 1>(); + GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND> v155 = GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>(v152, v153, v154); + wait_flag(PIPE_M, PIPE_FIX, EVENT_ID4); + TSTORE(v155, v58); + set_flag(PIPE_FIX, PIPE_M, EVENT_ID2); + TPUSH, GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v47, v151); + pto::Shape<1, 1, 1, 128, 128> v156 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<128, 128, 128, 1, 128> v157 = pto::Stride<128, 128, 128, 1, 128>(); + GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN> v158 = GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN>(v3 + (v15 + v15 * (unsigned) v19 + (unsigned) v134 * (unsigned) v18), v156, v157); + TLOAD(v51, v158); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + TMOV(v52, v51); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID0); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID7); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID0); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID5); + TMATMUL(v69, v49, v52); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + pto::Shape<1, 1, 1, 128, 128> v159 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<128, 128, 128, 1, 128> v160 = pto::Stride<128, 128, 128, 1, 128>(); + GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN> v161 = GlobalTensor, pto::Stride<128, 128, 128, 1, 128>, pto::Layout::DN>(v3 + (v15 + v15 * (unsigned) v19 + (unsigned) ((int32_t) (uint32_t) v134 + (uint32_t) v18) * (unsigned) v18), v159, v160); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID7); + TLOAD(v51, v161); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + TMOV(v52, v51); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID0); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID0); + TMATMUL(v77, v49, v52); + set_flag(PIPE_M, PIPE_FIX, EVENT_ID5); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID5); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v162(nullptr); + TALLOC, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v43, v162); + __gm__ float* v163 = PTOAS__GLOBAL_TENSOR_DATA(v162); + pto::Shape<1, 1, 1, 128, 256> v164 = pto::Shape<1, 1, 1, 128, 256>(); + pto::Stride<32768, 32768, 32768, 256, 1> v165 = pto::Stride<32768, 32768, 32768, 256, 1>(); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v166 = GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>(v163, v164, v165); + wait_flag(PIPE_M, PIPE_FIX, EVENT_ID5); + TSTORE(v166, v53); + set_flag(PIPE_FIX, PIPE_M, EVENT_ID3); + TPUSH, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v43, v162); + }; + set_flag(PIPE_FIX, PIPE_M, EVENT_ID6); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v167(nullptr); + TPOP, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v45, v167); + __gm__ half* v168 = PTOAS__GLOBAL_TENSOR_DATA(v167); + pto::Shape<1, 1, 1, 128, 128> v169 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<32768, 32768, 32768, 256, 1> v170 = pto::Stride<32768, 32768, 32768, 256, 1>(); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v171 = GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>(v168, v169, v170); + TLOAD(v54, v171); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + TMOV(v55, v54); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID0); + pto::Shape<1, 1, 1, 128, 128> v172 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<16384, 16384, 16384, 128, 1> v173 = pto::Stride<16384, 16384, 16384, 128, 1>(); + GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND> v174 = GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>(v4 + (v15 + v10 * (unsigned) v18 + v15 * (unsigned) v19), v172, v173); + pipe_barrier(PIPE_MTE2); + TLOAD(v56, v174); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + TMOV(v57, v56); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID1); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID0); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID0); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID6); + TMATMUL(v58, v55, v57); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + __gm__ half* v175 = PTOAS__GLOBAL_TENSOR_DATA(v167); + pto::Shape<1, 1, 1, 128, 128> v176 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<32768, 32768, 32768, 256, 1> v177 = pto::Stride<32768, 32768, 32768, 256, 1>(); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v178 = GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>(v175 + v13, v176, v177); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID0); + TLOAD(v54, v178); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + TMOV(v55, v54); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID0); + TFREE, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v45, v167); + pto::Shape<1, 1, 1, 128, 128> v179 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<16384, 16384, 16384, 128, 1> v180 = pto::Stride<16384, 16384, 16384, 128, 1>(); + GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND> v181 = GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>(v4 + (v15 + v9 * (unsigned) v18 + v15 * (unsigned) v19), v179, v180); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID1); + TLOAD(v56, v181); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + TMOV(v57, v56); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID1); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID0); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID0); + TMATMUL_ACC(v58, v58, v55, v57); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + set_flag(PIPE_M, PIPE_FIX, EVENT_ID6); + GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND> v182(nullptr); + TALLOC, GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v47, v182); + __gm__ float* v183 = PTOAS__GLOBAL_TENSOR_DATA(v182); + pto::Shape<1, 1, 1, 128, 128> v184 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<16384, 16384, 16384, 128, 1> v185 = pto::Stride<16384, 16384, 16384, 128, 1>(); + GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND> v186 = GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>(v183, v184, v185); + wait_flag(PIPE_M, PIPE_FIX, EVENT_ID6); + TSTORE(v186, v58); + set_flag(PIPE_FIX, PIPE_M, EVENT_ID7); + TPUSH, GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v47, v182); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v187(nullptr); + TPOP, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v45, v187); + __gm__ half* v188 = PTOAS__GLOBAL_TENSOR_DATA(v187); + pto::Shape<1, 1, 1, 128, 128> v189 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<32768, 32768, 32768, 256, 1> v190 = pto::Stride<32768, 32768, 32768, 256, 1>(); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v191 = GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>(v188, v189, v190); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID0); + TLOAD(v54, v191); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + TMOV(v55, v54); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID0); + pto::Shape<1, 1, 1, 128, 128> v192 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<16384, 16384, 16384, 128, 1> v193 = pto::Stride<16384, 16384, 16384, 128, 1>(); + GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND> v194 = GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>(v4 + (v15 + v8 * (unsigned) v18 + v15 * (unsigned) v19), v192, v193); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID1); + TLOAD(v56, v194); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + TMOV(v57, v56); + set_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID1); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID0); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID0); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID7); + TMATMUL(v58, v55, v57); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + __gm__ half* v195 = PTOAS__GLOBAL_TENSOR_DATA(v187); + pto::Shape<1, 1, 1, 128, 128> v196 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<32768, 32768, 32768, 256, 1> v197 = pto::Stride<32768, 32768, 32768, 256, 1>(); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v198 = GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>(v195 + v13, v196, v197); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID0); + TLOAD(v54, v198); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID1); + TMOV(v55, v54); + TFREE, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v45, v187); + pto::Shape<1, 1, 1, 128, 128> v199 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<16384, 16384, 16384, 128, 1> v200 = pto::Stride<16384, 16384, 16384, 128, 1>(); + GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND> v201 = GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>(v4 + (v15 + v7 * (unsigned) v18 + v15 * (unsigned) v19), v199, v200); + wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID1); + TLOAD(v56, v201); + set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); + TMOV(v57, v56); + set_flag(PIPE_MTE1, PIPE_M, EVENT_ID0); + wait_flag(PIPE_MTE1, PIPE_M, EVENT_ID0); + TMATMUL_ACC(v58, v58, v55, v57); + set_flag(PIPE_M, PIPE_MTE1, EVENT_ID0); + set_flag(PIPE_M, PIPE_FIX, EVENT_ID7); + GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND> v202(nullptr); + TALLOC, GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v47, v202); + __gm__ float* v203 = PTOAS__GLOBAL_TENSOR_DATA(v202); + pto::Shape<1, 1, 1, 128, 128> v204 = pto::Shape<1, 1, 1, 128, 128>(); + pto::Stride<16384, 16384, 16384, 128, 1> v205 = pto::Stride<16384, 16384, 16384, 128, 1>(); + GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND> v206 = GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>(v203, v204, v205); + wait_flag(PIPE_M, PIPE_FIX, EVENT_ID7); + TSTORE(v206, v58); + TPUSH, GlobalTensor, pto::Stride<16384, 16384, 16384, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v47, v202); + } + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID0); + wait_flag(PIPE_M, PIPE_MTE1, EVENT_ID5); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID2); + wait_flag(PIPE_FIX, PIPE_M, EVENT_ID3); + #endif // __DAV_CUBE__ + + ptoas_auto_sync_tail(PTOAutoSyncTailMode::kBarrierAll); + return; +} + +AICORE void vector_kernel(__gm__ float* v1, __gm__ float* v2, __gm__ half* v3, __gm__ float* v4) { + RoundMode v5 = RoundMode::CAST_RINT; + unsigned v6 = 256; + unsigned v7 = 0; + const int32_t v8 = 0; + const int32_t v9 = 16; + const int32_t v10 = 32; + const int32_t v11 = 64; + const int32_t v12 = 128; + const int32_t v13 = 1; + const int32_t v14 = 262144; + const int32_t v15 = 131072; + const int64_t v16 = 196608; + const int64_t v17 = 262144; + const int64_t v18 = 327680; + const int64_t v19 = 360448; + const int64_t v20 = 393216; + const int64_t v21 = 393344; + const int64_t v22 = 393472; + const int64_t v23 = 393600; + const int64_t v24 = 393728; + const int64_t v25 = 393856; + const int64_t v26 = 393984; + const int64_t v27 = 394112; + const int64_t v28 = 394240; + const int64_t v29 = 394368; + const int64_t v30 = 394496; + const int64_t v31 = 394624; + const float v32 = 0.0883883461f; + const float v33 = 1.0f; + const int64_t v34 = 394752; + const int32_t v35 = 7; + using T = float; + + #if defined(__DAV_VEC__) + set_mask_norm(); + set_vector_mask(-1, -1); + size_t v36 = (size_t) v13; + int64_t v37 = get_block_num(); + int32_t v38 = (int32_t) ((int64_t) v37); + int64_t v39 = get_block_idx(); + int32_t v40 = (int32_t) ((int64_t) v39); + int32_t v41 = v9 / v38; + int32_t v42 = v9 % v38; + int32_t v43 = (int32_t) ((uint32_t) v41 + (uint32_t) v13); + bool v44 = v40 < v42; + int32_t v45 = v44 ? (int32_t) ((uint32_t) v40 * (uint32_t) v43) : (int32_t) ((uint32_t) ((int32_t) (uint32_t) v42 * (uint32_t) v43) + (uint32_t) ((int32_t) (uint32_t) ((int32_t) (uint32_t) v40 - (uint32_t) v42) * (uint32_t) v41)); + int32_t v46 = (int32_t) ((uint32_t) v40 * (uint32_t) v14); + int32_t v47 = (int32_t) ((uint32_t) v40 * (uint32_t) v15); + __gm__ float* v48 = v1 + v46; + + auto v49 = TPipe<0, Direction::DIR_C2V, 131072, 8, 8, true>(v48, v8, v8); + __gm__ half* v50 = v3 + v46; + + auto v51 = TPipe<2, Direction::DIR_V2C, 65536, 8, 8, true>(v50, v8, v8); + __gm__ float* v52 = v4 + v47; + + auto v53 = TPipe<4, Direction::DIR_C2V, 65536, 8, 8, false>(v52, v8, v8); + int64_t v54 = get_subblockid(); + int32_t v55 = (int32_t) ((uint32_t) ((int32_t) (int64_t) v54) * (uint32_t) v11); + int32_t v56 = (int32_t) ((uint32_t) v55 + (uint32_t) v10); + Tile v57; + TASSIGN(v57, v16); + Tile v58; + TASSIGN(v58, v17); + Tile v59; + TASSIGN(v59, v18); + Tile v60; + TASSIGN(v60, v19); + Tile v61; + TASSIGN(v61, v24); + Tile v62; + TASSIGN(v62, v28); + Tile v63; + TASSIGN(v63, v30); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID0); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID0); + for (size_t v64 = (size_t) v45; v64 < ((size_t) ((int32_t) (uint32_t) v45 + (uint32_t) (v44 ? v43 : v41))); v64 += v36) { + Tile v65; + TASSIGN(v65, v34); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v66(nullptr); + TPOP, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v49, v66); + __gm__ float* v67 = PTOAS__GLOBAL_TENSOR_DATA(v66); + pto::Shape<1, 1, 1, 32, 256> v68 = pto::Shape<1, 1, 1, 32, 256>(); + pto::Stride<8192, 8192, 8192, 256, 1> v69 = pto::Stride<8192, 8192, 8192, 256, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND> v70 = GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND>(v67 + (v7 + (unsigned) v55 * v6), v68, v69); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID0); + TLOAD(v65, v70); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TMULS(v65, v65, v32); + Tile v71; + TASSIGN(v71, v20); + Tile v72; + TASSIGN(v72, v22); + Tile v73; + TASSIGN(v73, v24); + pipe_barrier(PIPE_V); + TROWMAX(v72, v65, v58); + Tile v74; + TRESHAPE(v74, v72); + Tile v75; + TRESHAPE(v75, v71); + pipe_barrier(PIPE_V); + TROWEXPANDSUB(v58, v65, v72); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + TMULS(v75, v74, v33); + pipe_barrier(PIPE_V); + TEXP(v58, v58); + pipe_barrier(PIPE_V); + TROWSUM(v73, v58, v57); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID0); + TCVT(v59, v58, v5); + set_flag(PIPE_V, PIPE_MTE3, EVENT_ID0); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v76(nullptr); + TALLOC, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v51, v76); + __gm__ half* v77 = PTOAS__GLOBAL_TENSOR_DATA(v76); + pto::Shape<1, 1, 1, 32, 256> v78 = pto::Shape<1, 1, 1, 32, 256>(); + pto::Stride<8192, 8192, 8192, 256, 1> v79 = pto::Stride<8192, 8192, 8192, 256, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND> v80 = GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND>(v77 + (v7 + (unsigned) v55 * v6), v78, v79); + wait_flag(PIPE_V, PIPE_MTE3, EVENT_ID0); + TSTORE(v80, v59); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID1); + __gm__ float* v81 = PTOAS__GLOBAL_TENSOR_DATA(v66); + pto::Shape<1, 1, 1, 32, 256> v82 = pto::Shape<1, 1, 1, 32, 256>(); + pto::Stride<8192, 8192, 8192, 256, 1> v83 = pto::Stride<8192, 8192, 8192, 256, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND> v84 = GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND>(v81 + (v7 + (unsigned) v56 * v6), v82, v83); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + TLOAD(v65, v84); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID1); + TFREE, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v49, v66); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID1); + TMULS(v65, v65, v32); + Tile v85; + TASSIGN(v85, v21); + Tile v86; + TASSIGN(v86, v23); + Tile v87; + TASSIGN(v87, v25); + pipe_barrier(PIPE_V); + TROWMAX(v86, v65, v58); + Tile v88; + TRESHAPE(v88, v86); + Tile v89; + TRESHAPE(v89, v85); + pipe_barrier(PIPE_V); + TROWEXPANDSUB(v58, v65, v86); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID2); + TMULS(v89, v88, v33); + pipe_barrier(PIPE_V); + TEXP(v58, v58); + pipe_barrier(PIPE_V); + TROWSUM(v87, v58, v57); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID1); + TCVT(v59, v58, v5); + set_flag(PIPE_V, PIPE_MTE3, EVENT_ID1); + __gm__ half* v90 = PTOAS__GLOBAL_TENSOR_DATA(v76); + pto::Shape<1, 1, 1, 32, 256> v91 = pto::Shape<1, 1, 1, 32, 256>(); + pto::Stride<8192, 8192, 8192, 256, 1> v92 = pto::Stride<8192, 8192, 8192, 256, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND> v93 = GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND>(v90 + (v7 + (unsigned) v56 * v6), v91, v92); + wait_flag(PIPE_V, PIPE_MTE3, EVENT_ID1); + TSTORE(v93, v59); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID2); + TPUSH, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v51, v76); + Tile v94; + TASSIGN(v94, v34); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v95(nullptr); + TPOP, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v49, v95); + __gm__ float* v96 = PTOAS__GLOBAL_TENSOR_DATA(v95); + pto::Shape<1, 1, 1, 32, 256> v97 = pto::Shape<1, 1, 1, 32, 256>(); + pto::Stride<8192, 8192, 8192, 256, 1> v98 = pto::Stride<8192, 8192, 8192, 256, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND> v99 = GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND>(v96 + (v7 + (unsigned) v55 * v6), v97, v98); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID2); + TLOAD(v94, v99); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID2); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID2); + TMULS(v94, v94, v32); + Tile v100; + TASSIGN(v100, v20); + Tile v101; + TASSIGN(v101, v22); + Tile v102; + TASSIGN(v102, v24); + Tile v103; + TASSIGN(v103, v26); + Tile v104; + TASSIGN(v104, v30); + pipe_barrier(PIPE_V); + TROWMAX(v101, v94, v58); + Tile v105; + TRESHAPE(v105, v101); + Tile v106; + TRESHAPE(v106, v100); + Tile v107; + TRESHAPE(v107, v104); + Tile v108; + TRESHAPE(v108, v102); + Tile v109; + TRESHAPE(v109, v103); + pipe_barrier(PIPE_V); + TMAX(v105, v105, v106); + pipe_barrier(PIPE_V); + TSUB(v107, v106, v105); + pipe_barrier(PIPE_V); + TMULS(v106, v105, v33); + TROWEXPANDSUB(v58, v94, v101); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID3); + TEXP(v107, v107); + pipe_barrier(PIPE_V); + TEXP(v58, v58); + TMUL(v108, v108, v107); + pipe_barrier(PIPE_V); + TROWSUM(v103, v58, v57); + pipe_barrier(PIPE_V); + TADD(v108, v108, v109); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID2); + TCVT(v59, v58, v5); + set_flag(PIPE_V, PIPE_MTE3, EVENT_ID2); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v110(nullptr); + TALLOC, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v51, v110); + __gm__ half* v111 = PTOAS__GLOBAL_TENSOR_DATA(v110); + pto::Shape<1, 1, 1, 32, 256> v112 = pto::Shape<1, 1, 1, 32, 256>(); + pto::Stride<8192, 8192, 8192, 256, 1> v113 = pto::Stride<8192, 8192, 8192, 256, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND> v114 = GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND>(v111 + (v7 + (unsigned) v55 * v6), v112, v113); + wait_flag(PIPE_V, PIPE_MTE3, EVENT_ID2); + TSTORE(v114, v59); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID3); + __gm__ float* v115 = PTOAS__GLOBAL_TENSOR_DATA(v95); + pto::Shape<1, 1, 1, 32, 256> v116 = pto::Shape<1, 1, 1, 32, 256>(); + pto::Stride<8192, 8192, 8192, 256, 1> v117 = pto::Stride<8192, 8192, 8192, 256, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND> v118 = GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND>(v115 + (v7 + (unsigned) v56 * v6), v116, v117); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID3); + TLOAD(v94, v118); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID3); + TFREE, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v49, v95); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID3); + TMULS(v94, v94, v32); + Tile v119; + TASSIGN(v119, v21); + Tile v120; + TASSIGN(v120, v23); + Tile v121; + TASSIGN(v121, v25); + Tile v122; + TASSIGN(v122, v27); + Tile v123; + TASSIGN(v123, v31); + pipe_barrier(PIPE_V); + TROWMAX(v120, v94, v58); + Tile v124; + TRESHAPE(v124, v120); + Tile v125; + TRESHAPE(v125, v119); + Tile v126; + TRESHAPE(v126, v123); + Tile v127; + TRESHAPE(v127, v121); + Tile v128; + TRESHAPE(v128, v122); + pipe_barrier(PIPE_V); + TMAX(v124, v124, v125); + pipe_barrier(PIPE_V); + TSUB(v126, v125, v124); + pipe_barrier(PIPE_V); + TMULS(v125, v124, v33); + TROWEXPANDSUB(v58, v94, v120); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID4); + TEXP(v126, v126); + pipe_barrier(PIPE_V); + TEXP(v58, v58); + TMUL(v127, v127, v126); + pipe_barrier(PIPE_V); + TROWSUM(v122, v58, v57); + pipe_barrier(PIPE_V); + TADD(v127, v127, v128); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID3); + TCVT(v59, v58, v5); + set_flag(PIPE_V, PIPE_MTE3, EVENT_ID3); + __gm__ half* v129 = PTOAS__GLOBAL_TENSOR_DATA(v110); + pto::Shape<1, 1, 1, 32, 256> v130 = pto::Shape<1, 1, 1, 32, 256>(); + pto::Stride<8192, 8192, 8192, 256, 1> v131 = pto::Stride<8192, 8192, 8192, 256, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND> v132 = GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND>(v129 + (v7 + (unsigned) v56 * v6), v130, v131); + wait_flag(PIPE_V, PIPE_MTE3, EVENT_ID3); + TSTORE(v132, v59); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID4); + TPUSH, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v51, v110); + Tile v133; + TASSIGN(v133, v34); + GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND> v134(nullptr); + TPOP, GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_UP_DOWN>(v53, v134); + __gm__ float* v135 = PTOAS__GLOBAL_TENSOR_DATA(v134); + pto::Shape<1, 1, 1, 64, 128> v136 = pto::Shape<1, 1, 1, 64, 128>(); + pto::Stride<8192, 8192, 8192, 128, 1> v137 = pto::Stride<8192, 8192, 8192, 128, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND> v138 = GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND>(v135, v136, v137); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID4); + TLOAD(v133, v138); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID4); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID4); + TMOV(v60, v133); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID5); + TFREE, GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_UP_DOWN>(v53, v134); + Tile v139; + TASSIGN(v139, v34); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v140(nullptr); + TPOP, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v49, v140); + __gm__ float* v141 = PTOAS__GLOBAL_TENSOR_DATA(v140); + pto::Shape<1, 1, 1, 32, 256> v142 = pto::Shape<1, 1, 1, 32, 256>(); + pto::Stride<8192, 8192, 8192, 256, 1> v143 = pto::Stride<8192, 8192, 8192, 256, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND> v144 = GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND>(v141 + (v7 + (unsigned) v55 * v6), v142, v143); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID5); + TLOAD(v139, v144); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID5); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID5); + TMULS(v139, v139, v32); + Tile v145; + TASSIGN(v145, v20); + Tile v146; + TASSIGN(v146, v22); + Tile v147; + TASSIGN(v147, v24); + Tile v148; + TASSIGN(v148, v26); + Tile v149; + TASSIGN(v149, v28); + pipe_barrier(PIPE_V); + TROWMAX(v146, v139, v58); + Tile v150; + TRESHAPE(v150, v146); + Tile v151; + TRESHAPE(v151, v145); + Tile v152; + TRESHAPE(v152, v149); + Tile v153; + TRESHAPE(v153, v147); + Tile v154; + TRESHAPE(v154, v148); + pipe_barrier(PIPE_V); + TMAX(v150, v150, v151); + pipe_barrier(PIPE_V); + TSUB(v152, v151, v150); + pipe_barrier(PIPE_V); + TMULS(v151, v150, v33); + TROWEXPANDSUB(v58, v139, v146); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID6); + TEXP(v152, v152); + pipe_barrier(PIPE_V); + TEXP(v58, v58); + TMUL(v153, v153, v152); + pipe_barrier(PIPE_V); + TROWSUM(v148, v58, v57); + pipe_barrier(PIPE_V); + TADD(v153, v153, v154); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID4); + TCVT(v59, v58, v5); + set_flag(PIPE_V, PIPE_MTE3, EVENT_ID4); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v155(nullptr); + TALLOC, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v51, v155); + __gm__ half* v156 = PTOAS__GLOBAL_TENSOR_DATA(v155); + pto::Shape<1, 1, 1, 32, 256> v157 = pto::Shape<1, 1, 1, 32, 256>(); + pto::Stride<8192, 8192, 8192, 256, 1> v158 = pto::Stride<8192, 8192, 8192, 256, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND> v159 = GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND>(v156 + (v7 + (unsigned) v55 * v6), v157, v158); + wait_flag(PIPE_V, PIPE_MTE3, EVENT_ID4); + TSTORE(v159, v59); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID5); + __gm__ float* v160 = PTOAS__GLOBAL_TENSOR_DATA(v140); + pto::Shape<1, 1, 1, 32, 256> v161 = pto::Shape<1, 1, 1, 32, 256>(); + pto::Stride<8192, 8192, 8192, 256, 1> v162 = pto::Stride<8192, 8192, 8192, 256, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND> v163 = GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND>(v160 + (v7 + (unsigned) v56 * v6), v161, v162); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID6); + TLOAD(v139, v163); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID6); + TFREE, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v49, v140); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID6); + TMULS(v139, v139, v32); + Tile v164; + TASSIGN(v164, v21); + Tile v165; + TASSIGN(v165, v23); + Tile v166; + TASSIGN(v166, v25); + Tile v167; + TASSIGN(v167, v27); + Tile v168; + TASSIGN(v168, v29); + pipe_barrier(PIPE_V); + TROWMAX(v165, v139, v58); + Tile v169; + TRESHAPE(v169, v165); + Tile v170; + TRESHAPE(v170, v164); + Tile v171; + TRESHAPE(v171, v168); + Tile v172; + TRESHAPE(v172, v166); + Tile v173; + TRESHAPE(v173, v167); + pipe_barrier(PIPE_V); + TMAX(v169, v169, v170); + pipe_barrier(PIPE_V); + TSUB(v171, v170, v169); + pipe_barrier(PIPE_V); + TMULS(v170, v169, v33); + TROWEXPANDSUB(v58, v139, v165); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID7); + TEXP(v171, v171); + pipe_barrier(PIPE_V); + TEXP(v58, v58); + TMUL(v172, v172, v171); + pipe_barrier(PIPE_V); + TROWSUM(v167, v58, v57); + pipe_barrier(PIPE_V); + TADD(v172, v172, v173); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID5); + TCVT(v59, v58, v5); + set_flag(PIPE_V, PIPE_MTE3, EVENT_ID5); + __gm__ half* v174 = PTOAS__GLOBAL_TENSOR_DATA(v155); + pto::Shape<1, 1, 1, 32, 256> v175 = pto::Shape<1, 1, 1, 32, 256>(); + pto::Stride<8192, 8192, 8192, 256, 1> v176 = pto::Stride<8192, 8192, 8192, 256, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND> v177 = GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND>(v174 + (v7 + (unsigned) v56 * v6), v175, v176); + wait_flag(PIPE_V, PIPE_MTE3, EVENT_ID5); + TSTORE(v177, v59); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID6); + TPUSH, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v51, v155); + Tile v178; + TASSIGN(v178, v34); + GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND> v179(nullptr); + TPOP, GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_UP_DOWN>(v53, v179); + __gm__ float* v180 = PTOAS__GLOBAL_TENSOR_DATA(v179); + pto::Shape<1, 1, 1, 64, 128> v181 = pto::Shape<1, 1, 1, 64, 128>(); + pto::Stride<8192, 8192, 8192, 128, 1> v182 = pto::Stride<8192, 8192, 8192, 128, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND> v183 = GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND>(v180, v181, v182); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID7); + TLOAD(v178, v183); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TROWEXPANDMUL(v60, v60, v63); + pipe_barrier(PIPE_V); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TADD(v60, v60, v178); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + TFREE, GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_UP_DOWN>(v53, v179); + Tile v184; + TASSIGN(v184, v34); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v185(nullptr); + TPOP, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v49, v185); + __gm__ float* v186 = PTOAS__GLOBAL_TENSOR_DATA(v185); + pto::Shape<1, 1, 1, 32, 256> v187 = pto::Shape<1, 1, 1, 32, 256>(); + pto::Stride<8192, 8192, 8192, 256, 1> v188 = pto::Stride<8192, 8192, 8192, 256, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND> v189 = GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND>(v186 + (v7 + (unsigned) v55 * v6), v187, v188); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + TLOAD(v184, v189); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TMULS(v184, v184, v32); + Tile v190; + TASSIGN(v190, v20); + Tile v191; + TASSIGN(v191, v22); + Tile v192; + TASSIGN(v192, v24); + Tile v193; + TASSIGN(v193, v26); + Tile v194; + TASSIGN(v194, v30); + pipe_barrier(PIPE_V); + TROWMAX(v191, v184, v58); + Tile v195; + TRESHAPE(v195, v191); + Tile v196; + TRESHAPE(v196, v190); + Tile v197; + TRESHAPE(v197, v194); + Tile v198; + TRESHAPE(v198, v192); + Tile v199; + TRESHAPE(v199, v193); + pipe_barrier(PIPE_V); + TMAX(v195, v195, v196); + pipe_barrier(PIPE_V); + TSUB(v197, v196, v195); + pipe_barrier(PIPE_V); + TMULS(v196, v195, v33); + TROWEXPANDSUB(v58, v184, v191); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + TEXP(v197, v197); + pipe_barrier(PIPE_V); + TEXP(v58, v58); + TMUL(v198, v198, v197); + pipe_barrier(PIPE_V); + TROWSUM(v193, v58, v57); + pipe_barrier(PIPE_V); + TADD(v198, v198, v199); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID6); + TCVT(v59, v58, v5); + set_flag(PIPE_V, PIPE_MTE3, EVENT_ID6); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v200(nullptr); + TALLOC, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v51, v200); + __gm__ half* v201 = PTOAS__GLOBAL_TENSOR_DATA(v200); + pto::Shape<1, 1, 1, 32, 256> v202 = pto::Shape<1, 1, 1, 32, 256>(); + pto::Stride<8192, 8192, 8192, 256, 1> v203 = pto::Stride<8192, 8192, 8192, 256, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND> v204 = GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND>(v201 + (v7 + (unsigned) v55 * v6), v202, v203); + wait_flag(PIPE_V, PIPE_MTE3, EVENT_ID6); + TSTORE(v204, v59); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID7); + __gm__ float* v205 = PTOAS__GLOBAL_TENSOR_DATA(v185); + pto::Shape<1, 1, 1, 32, 256> v206 = pto::Shape<1, 1, 1, 32, 256>(); + pto::Stride<8192, 8192, 8192, 256, 1> v207 = pto::Stride<8192, 8192, 8192, 256, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND> v208 = GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND>(v205 + (v7 + (unsigned) v56 * v6), v206, v207); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + TLOAD(v184, v208); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TFREE, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v49, v185); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TMULS(v184, v184, v32); + Tile v209; + TASSIGN(v209, v21); + Tile v210; + TASSIGN(v210, v23); + Tile v211; + TASSIGN(v211, v25); + Tile v212; + TASSIGN(v212, v27); + Tile v213; + TASSIGN(v213, v31); + pipe_barrier(PIPE_V); + TROWMAX(v210, v184, v58); + Tile v214; + TRESHAPE(v214, v210); + Tile v215; + TRESHAPE(v215, v209); + Tile v216; + TRESHAPE(v216, v213); + Tile v217; + TRESHAPE(v217, v211); + Tile v218; + TRESHAPE(v218, v212); + pipe_barrier(PIPE_V); + TMAX(v214, v214, v215); + pipe_barrier(PIPE_V); + TSUB(v216, v215, v214); + pipe_barrier(PIPE_V); + TMULS(v215, v214, v33); + TROWEXPANDSUB(v58, v184, v210); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + TEXP(v216, v216); + pipe_barrier(PIPE_V); + TEXP(v58, v58); + TMUL(v217, v217, v216); + pipe_barrier(PIPE_V); + TROWSUM(v212, v58, v57); + pipe_barrier(PIPE_V); + TADD(v217, v217, v218); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID7); + TCVT(v59, v58, v5); + set_flag(PIPE_V, PIPE_MTE3, EVENT_ID7); + __gm__ half* v219 = PTOAS__GLOBAL_TENSOR_DATA(v200); + pto::Shape<1, 1, 1, 32, 256> v220 = pto::Shape<1, 1, 1, 32, 256>(); + pto::Stride<8192, 8192, 8192, 256, 1> v221 = pto::Stride<8192, 8192, 8192, 256, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND> v222 = GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND>(v219 + (v7 + (unsigned) v56 * v6), v220, v221); + wait_flag(PIPE_V, PIPE_MTE3, EVENT_ID7); + TSTORE(v222, v59); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID1); + TPUSH, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v51, v200); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID1); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID1); + for (size_t v223 = v36; v223 < ((size_t) v35); v223 += v36) { + Tile v224; + TASSIGN(v224, v34); + GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND> v225(nullptr); + TPOP, GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_UP_DOWN>(v53, v225); + __gm__ float* v226 = PTOAS__GLOBAL_TENSOR_DATA(v225); + pto::Shape<1, 1, 1, 64, 128> v227 = pto::Shape<1, 1, 1, 64, 128>(); + pto::Stride<8192, 8192, 8192, 128, 1> v228 = pto::Stride<8192, 8192, 8192, 128, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND> v229 = GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND>(v226, v227, v228); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + TLOAD(v224, v229); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TROWEXPANDMUL(v60, v60, v62); + pipe_barrier(PIPE_V); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TADD(v60, v60, v224); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID2); + TFREE, GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_UP_DOWN>(v53, v225); + Tile v230; + TASSIGN(v230, v34); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v231(nullptr); + TPOP, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v49, v231); + __gm__ float* v232 = PTOAS__GLOBAL_TENSOR_DATA(v231); + pto::Shape<1, 1, 1, 32, 256> v233 = pto::Shape<1, 1, 1, 32, 256>(); + pto::Stride<8192, 8192, 8192, 256, 1> v234 = pto::Stride<8192, 8192, 8192, 256, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND> v235 = GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND>(v232 + (v7 + (unsigned) v55 * v6), v233, v234); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID2); + TLOAD(v230, v235); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TMULS(v230, v230, v32); + Tile v236; + TASSIGN(v236, v20); + Tile v237; + TASSIGN(v237, v22); + Tile v238; + TASSIGN(v238, v24); + Tile v239; + TASSIGN(v239, v26); + Tile v240; + TASSIGN(v240, v28); + pipe_barrier(PIPE_V); + TROWMAX(v237, v230, v58); + Tile v241; + TRESHAPE(v241, v237); + Tile v242; + TRESHAPE(v242, v236); + Tile v243; + TRESHAPE(v243, v240); + Tile v244; + TRESHAPE(v244, v238); + Tile v245; + TRESHAPE(v245, v239); + pipe_barrier(PIPE_V); + TMAX(v241, v241, v242); + pipe_barrier(PIPE_V); + TSUB(v243, v242, v241); + pipe_barrier(PIPE_V); + TMULS(v242, v241, v33); + TROWEXPANDSUB(v58, v230, v237); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID2); + TEXP(v243, v243); + pipe_barrier(PIPE_V); + TEXP(v58, v58); + TMUL(v244, v244, v243); + pipe_barrier(PIPE_V); + TROWSUM(v239, v58, v57); + pipe_barrier(PIPE_V); + TADD(v244, v244, v245); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID1); + TCVT(v59, v58, v5); + set_flag(PIPE_V, PIPE_MTE3, EVENT_ID0); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v246(nullptr); + TALLOC, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v51, v246); + __gm__ half* v247 = PTOAS__GLOBAL_TENSOR_DATA(v246); + pto::Shape<1, 1, 1, 32, 256> v248 = pto::Shape<1, 1, 1, 32, 256>(); + pto::Stride<8192, 8192, 8192, 256, 1> v249 = pto::Stride<8192, 8192, 8192, 256, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND> v250 = GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND>(v247 + (v7 + (unsigned) v55 * v6), v248, v249); + wait_flag(PIPE_V, PIPE_MTE3, EVENT_ID0); + TSTORE(v250, v59); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID2); + __gm__ float* v251 = PTOAS__GLOBAL_TENSOR_DATA(v231); + pto::Shape<1, 1, 1, 32, 256> v252 = pto::Shape<1, 1, 1, 32, 256>(); + pto::Stride<8192, 8192, 8192, 256, 1> v253 = pto::Stride<8192, 8192, 8192, 256, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND> v254 = GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND>(v251 + (v7 + (unsigned) v56 * v6), v252, v253); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID2); + TLOAD(v230, v254); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TFREE, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v49, v231); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TMULS(v230, v230, v32); + Tile v255; + TASSIGN(v255, v21); + Tile v256; + TASSIGN(v256, v23); + Tile v257; + TASSIGN(v257, v25); + Tile v258; + TASSIGN(v258, v27); + Tile v259; + TASSIGN(v259, v29); + pipe_barrier(PIPE_V); + TROWMAX(v256, v230, v58); + Tile v260; + TRESHAPE(v260, v256); + Tile v261; + TRESHAPE(v261, v255); + Tile v262; + TRESHAPE(v262, v259); + Tile v263; + TRESHAPE(v263, v257); + Tile v264; + TRESHAPE(v264, v258); + pipe_barrier(PIPE_V); + TMAX(v260, v260, v261); + pipe_barrier(PIPE_V); + TSUB(v262, v261, v260); + pipe_barrier(PIPE_V); + TMULS(v261, v260, v33); + TROWEXPANDSUB(v58, v230, v256); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID2); + TEXP(v262, v262); + pipe_barrier(PIPE_V); + TEXP(v58, v58); + TMUL(v263, v263, v262); + pipe_barrier(PIPE_V); + TROWSUM(v258, v58, v57); + pipe_barrier(PIPE_V); + TADD(v263, v263, v264); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID2); + TCVT(v59, v58, v5); + set_flag(PIPE_V, PIPE_MTE3, EVENT_ID0); + __gm__ half* v265 = PTOAS__GLOBAL_TENSOR_DATA(v246); + pto::Shape<1, 1, 1, 32, 256> v266 = pto::Shape<1, 1, 1, 32, 256>(); + pto::Stride<8192, 8192, 8192, 256, 1> v267 = pto::Stride<8192, 8192, 8192, 256, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND> v268 = GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND>(v265 + (v7 + (unsigned) v56 * v6), v266, v267); + wait_flag(PIPE_V, PIPE_MTE3, EVENT_ID0); + TSTORE(v268, v59); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID2); + TPUSH, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v51, v246); + Tile v269; + TASSIGN(v269, v34); + GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND> v270(nullptr); + TPOP, GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_UP_DOWN>(v53, v270); + __gm__ float* v271 = PTOAS__GLOBAL_TENSOR_DATA(v270); + pto::Shape<1, 1, 1, 64, 128> v272 = pto::Shape<1, 1, 1, 64, 128>(); + pto::Stride<8192, 8192, 8192, 128, 1> v273 = pto::Stride<8192, 8192, 8192, 128, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND> v274 = GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND>(v271, v272, v273); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID2); + TLOAD(v269, v274); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TROWEXPANDMUL(v60, v60, v63); + pipe_barrier(PIPE_V); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TADD(v60, v60, v269); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID2); + TFREE, GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_UP_DOWN>(v53, v270); + Tile v275; + TASSIGN(v275, v34); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v276(nullptr); + TPOP, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v49, v276); + __gm__ float* v277 = PTOAS__GLOBAL_TENSOR_DATA(v276); + pto::Shape<1, 1, 1, 32, 256> v278 = pto::Shape<1, 1, 1, 32, 256>(); + pto::Stride<8192, 8192, 8192, 256, 1> v279 = pto::Stride<8192, 8192, 8192, 256, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND> v280 = GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND>(v277 + (v7 + (unsigned) v55 * v6), v278, v279); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID2); + TLOAD(v275, v280); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TMULS(v275, v275, v32); + Tile v281; + TASSIGN(v281, v20); + Tile v282; + TASSIGN(v282, v22); + Tile v283; + TASSIGN(v283, v24); + Tile v284; + TASSIGN(v284, v26); + Tile v285; + TASSIGN(v285, v30); + pipe_barrier(PIPE_V); + TROWMAX(v282, v275, v58); + Tile v286; + TRESHAPE(v286, v282); + Tile v287; + TRESHAPE(v287, v281); + Tile v288; + TRESHAPE(v288, v285); + Tile v289; + TRESHAPE(v289, v283); + Tile v290; + TRESHAPE(v290, v284); + pipe_barrier(PIPE_V); + TMAX(v286, v286, v287); + pipe_barrier(PIPE_V); + TSUB(v288, v287, v286); + pipe_barrier(PIPE_V); + TMULS(v287, v286, v33); + TROWEXPANDSUB(v58, v275, v282); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID2); + TEXP(v288, v288); + pipe_barrier(PIPE_V); + TEXP(v58, v58); + TMUL(v289, v289, v288); + pipe_barrier(PIPE_V); + TROWSUM(v284, v58, v57); + pipe_barrier(PIPE_V); + TADD(v289, v289, v290); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID2); + TCVT(v59, v58, v5); + set_flag(PIPE_V, PIPE_MTE3, EVENT_ID0); + GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND> v291(nullptr); + TALLOC, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v51, v291); + __gm__ half* v292 = PTOAS__GLOBAL_TENSOR_DATA(v291); + pto::Shape<1, 1, 1, 32, 256> v293 = pto::Shape<1, 1, 1, 32, 256>(); + pto::Stride<8192, 8192, 8192, 256, 1> v294 = pto::Stride<8192, 8192, 8192, 256, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND> v295 = GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND>(v292 + (v7 + (unsigned) v55 * v6), v293, v294); + wait_flag(PIPE_V, PIPE_MTE3, EVENT_ID0); + TSTORE(v295, v59); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID2); + __gm__ float* v296 = PTOAS__GLOBAL_TENSOR_DATA(v276); + pto::Shape<1, 1, 1, 32, 256> v297 = pto::Shape<1, 1, 1, 32, 256>(); + pto::Stride<8192, 8192, 8192, 256, 1> v298 = pto::Stride<8192, 8192, 8192, 256, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND> v299 = GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND>(v296 + (v7 + (unsigned) v56 * v6), v297, v298); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID2); + TLOAD(v275, v299); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TFREE, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v49, v276); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TMULS(v275, v275, v32); + Tile v300; + TASSIGN(v300, v21); + Tile v301; + TASSIGN(v301, v23); + Tile v302; + TASSIGN(v302, v25); + Tile v303; + TASSIGN(v303, v27); + Tile v304; + TASSIGN(v304, v31); + pipe_barrier(PIPE_V); + TROWMAX(v301, v275, v58); + Tile v305; + TRESHAPE(v305, v301); + Tile v306; + TRESHAPE(v306, v300); + Tile v307; + TRESHAPE(v307, v304); + Tile v308; + TRESHAPE(v308, v302); + Tile v309; + TRESHAPE(v309, v303); + pipe_barrier(PIPE_V); + TMAX(v305, v305, v306); + pipe_barrier(PIPE_V); + TSUB(v307, v306, v305); + pipe_barrier(PIPE_V); + TMULS(v306, v305, v33); + TROWEXPANDSUB(v58, v275, v301); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + TEXP(v307, v307); + pipe_barrier(PIPE_V); + TEXP(v58, v58); + TMUL(v308, v308, v307); + pipe_barrier(PIPE_V); + TROWSUM(v303, v58, v57); + pipe_barrier(PIPE_V); + TADD(v308, v308, v309); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID2); + TCVT(v59, v58, v5); + set_flag(PIPE_V, PIPE_MTE3, EVENT_ID0); + __gm__ half* v310 = PTOAS__GLOBAL_TENSOR_DATA(v291); + pto::Shape<1, 1, 1, 32, 256> v311 = pto::Shape<1, 1, 1, 32, 256>(); + pto::Stride<8192, 8192, 8192, 256, 1> v312 = pto::Stride<8192, 8192, 8192, 256, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND> v313 = GlobalTensor, pto::Stride<8192, 8192, 8192, 256, 1>, pto::Layout::ND>(v310 + (v7 + (unsigned) v56 * v6), v311, v312); + wait_flag(PIPE_V, PIPE_MTE3, EVENT_ID0); + TSTORE(v313, v59); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID1); + TPUSH, GlobalTensor, pto::Stride<32768, 32768, 32768, 256, 1>, pto::Layout::ND>, TileSplitAxis::TILE_NO_SPLIT>(v51, v291); + }; + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + set_flag(PIPE_MTE3, PIPE_V, EVENT_ID0); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID1); + Tile v314; + TASSIGN(v314, v34); + GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND> v315(nullptr); + TPOP, GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_UP_DOWN>(v53, v315); + __gm__ float* v316 = PTOAS__GLOBAL_TENSOR_DATA(v315); + pto::Shape<1, 1, 1, 64, 128> v317 = pto::Shape<1, 1, 1, 64, 128>(); + pto::Stride<8192, 8192, 8192, 128, 1> v318 = pto::Stride<8192, 8192, 8192, 128, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND> v319 = GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND>(v316, v317, v318); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + TLOAD(v314, v319); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TROWEXPANDMUL(v60, v60, v62); + pipe_barrier(PIPE_V); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TADD(v60, v60, v314); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + TFREE, GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_UP_DOWN>(v53, v315); + Tile v320; + TASSIGN(v320, v34); + GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND> v321(nullptr); + TPOP, GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_UP_DOWN>(v53, v321); + __gm__ float* v322 = PTOAS__GLOBAL_TENSOR_DATA(v321); + pto::Shape<1, 1, 1, 64, 128> v323 = pto::Shape<1, 1, 1, 64, 128>(); + pto::Stride<8192, 8192, 8192, 128, 1> v324 = pto::Stride<8192, 8192, 8192, 128, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND> v325 = GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND>(v322, v323, v324); + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); + TLOAD(v320, v325); + set_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + pipe_barrier(PIPE_V); + TROWEXPANDMUL(v60, v60, v63); + pipe_barrier(PIPE_V); + wait_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); + TADD(v60, v60, v320); + set_flag(PIPE_V, PIPE_MTE2, EVENT_ID0); + TFREE, GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND>, TileSplitAxis::TILE_UP_DOWN>(v53, v321); + pipe_barrier(PIPE_V); + TROWEXPANDDIV(v60, v60, v61); + set_flag(PIPE_V, PIPE_MTE3, EVENT_ID0); + pto::Shape<1, 1, 1, 64, 128> v326 = pto::Shape<1, 1, 1, 64, 128>(); + pto::Stride<8192, 8192, 8192, 128, 1> v327 = pto::Stride<8192, 8192, 8192, 128, 1>(); + GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND> v328 = GlobalTensor, pto::Stride<8192, 8192, 8192, 128, 1>, pto::Layout::ND>(v2 + (v7 + (unsigned) ((int32_t) (uint32_t) ((int32_t) (uint32_t) ((int32_t) v64) * (uint32_t) v12) + (uint32_t) v55) * (unsigned) v12 + v7 * (unsigned) v13), v326, v327); + wait_flag(PIPE_V, PIPE_MTE3, EVENT_ID0); + TSTORE(v328, v60); + } + wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID0); + wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID0); + #endif // __DAV_VEC__ + + ptoas_auto_sync_tail(PTOAutoSyncTailMode::kBarrierAll); + return; +} + +__global__ AICORE void call_both(__gm__ int64_t* v1, __gm__ half* v2, __gm__ half* v3, __gm__ half* v4, __gm__ half* v5, __gm__ float* v6, __gm__ float* v7, __gm__ float* v8) { + using T = float; + uint64_t v9 = (uint64_t) v1; + set_ffts_base_addr(v9); + cube_kernel(v7, v2, v3, v4, v5, v8); + vector_kernel(v7, v6, v5, v8); + return; +} diff --git a/examples/aot/flash_attention/ir_ref/gen_cpp.sh b/examples/aot/flash_attention/ir_ref/gen_cpp.sh new file mode 100644 index 00000000..fbc172be --- /dev/null +++ b/examples/aot/flash_attention/ir_ref/gen_cpp.sh @@ -0,0 +1,2 @@ +ptoas --pto-arch=a3 --pto-level=level3 --enable-insert-sync fa.pto > fa.cpp +ptoas --pto-arch=a3 --pto-level=level3 --enable-insert-sync fa_perf.pto > fa_perf.cpp From 619924c0f58200f2d83ef74d3c070b8f00ea1cf5 Mon Sep 17 00:00:00 2001 From: learning-chip Date: Thu, 30 Apr 2026 08:33:44 +0000 Subject: [PATCH 15/17] attempt to run IR-generated fa, got fftsplus aivector error --- .../ir_ref/launch_kernel/README.md | 92 ++++ .../ir_ref/launch_kernel/caller.cpp | 32 ++ .../ir_ref/launch_kernel/compile.sh | 46 ++ .../ir_ref/launch_kernel/run.py | 408 ++++++++++++++++++ 4 files changed, 578 insertions(+) create mode 100644 examples/aot/flash_attention/ir_ref/launch_kernel/README.md create mode 100644 examples/aot/flash_attention/ir_ref/launch_kernel/caller.cpp create mode 100755 examples/aot/flash_attention/ir_ref/launch_kernel/compile.sh create mode 100755 examples/aot/flash_attention/ir_ref/launch_kernel/run.py diff --git a/examples/aot/flash_attention/ir_ref/launch_kernel/README.md b/examples/aot/flash_attention/ir_ref/launch_kernel/README.md new file mode 100644 index 00000000..4811068b --- /dev/null +++ b/examples/aot/flash_attention/ir_ref/launch_kernel/README.md @@ -0,0 +1,92 @@ +# `ir_ref/fa.cpp` — compile, launch, correctness / perf + +This folder mirrors the **`split_pipe`** flow (`caller.cpp` + `bisheng` shared library + `torch_npu` Python runner), but compiles the **checked-in IR reference** [`../fa.cpp`](../fa.cpp) produced from [`../fa.pto`](../fa.pto) (`ptoas --pto-arch=a3 --pto-level=level3 --enable-insert-sync`). + +## Baked-in geometry + +| Symbol | Value | +| ----- | ----- | +| `Q_ROWS` | 2048 | +| `HEAD` | 128 | +| `S1_TOTAL` | 4096 | +| `S1_TILE` | 256 (`NUM_TILES` = 16) | + +Host tensors and GM scratch sizes come from `split_pipe/kernels/fa_performance_builder.py` with **`FA_Q_ROWS=2048`**, **`FA_S1_TILE=256`**, **`FA_NUM_TILES=16`** (reload via `fa.build_env` after compile). + +**Launch grid:** this kernel divides **`NUM_TILES` (16)** across `get_block_num()`, not `NUM_Q_BLOCKS`. The runner therefore uses **`blockDim = min(NUM_TILES, num_cube_cores)`** (same idea as mapping tile loops to the grid). Using `NUM_Q_BLOCKS` here triggers device faults. + +## Setup + +From the `pto-dsl` repo root (Python imports `ptodsl`, `torch_npu`): + +```bash +cd /workdir/pto-dsl +pip install -e . +``` + +Environment (same as other `examples/aot` demos): + +- `ASCEND_TOOLKIT_HOME` +- `PTO_LIB_PATH` — directory containing `include/pto/` (default in many images: `/sources/pto-isa`) + +## Build `fa.so` + +```bash +cd /workdir/pto-dsl/examples/aot/flash_attention/ir_ref/launch_kernel +bash compile.sh +``` + +Produces `build_artifacts/fa.so` and `build_artifacts/fa.build_env`. + +Regenerate `../fa.cpp` from PTO when needed: + +```bash +cd /workdir/pto-dsl/examples/aot/flash_attention/ir_ref +bash gen_cpp.sh # or: ptoas --pto-arch=a3 --pto-level=level3 --enable-insert-sync fa.pto > fa.cpp +``` + +## Run correctness + benchmark + +```bash +cd /workdir/pto-dsl/examples/aot/flash_attention/ir_ref/launch_kernel +FA_BENCH_NO_PLOT=1 python3 run.py +``` + +Optional: `FA_BENCH_LENGTHS=4096` (default is already `4096`). + +## Results on reference hardware (reproduced here) + +**Environment:** CANN 8.5.0 toolkits, `bisheng --npu-arch=dav-2201`, `ptoas` from `/installers/ptoas-cli/bin/ptoas`, **dav‑2201** NPU, **24** cube cores (see `get_num_cube_cores()`), date **2026-04-30**. + +| Step | Outcome | +| ---- | ------- | +| **`bash compile.sh`** | **Success** (~4s); links `../fa.cpp` via `-DKERNEL_CPP=...` | +| **`python3 run.py`** | **Fails** at `torch.npu.synchronize()` after `call_kernel`: **ACL 507015**, **aicore exception**, **CCU instruction address check** (vector core backtrace in device log) | + +So **`fa.cpp` does not reach a completed device execution** in this configuration; **kernel latency / TFLOP/s are not reported** for it. + +**Related checks on the same machine:** + +- Applying the **`wait_flag_dev` / `ffts_cross_core_sync`** CV handshake from [`split_pipe/debug_cpp/forward_debug/README.md`](../../split_pipe/debug_cpp/forward_debug/README.md) to a copy of `fa.cpp` **still hit 507015** here — the IR layout differs from the forward-debug S256 kernel that clears the sync fault. +- **`split_pipe`** AOT at **`FA_S1_TILE=512`**:** same-style 507015** on synchronize (see [`split_pipe/README.md`](../../split_pipe/README.md) §A7). +- **`split_pipe`** AOT at **`FA_S1_TILE=256`**:** synchronize completes** but **`torch.testing.assert_close` fails** (NaNs / large drift — §A11). +- **`split_pipe/debug_cpp/forward_debug`** (`fa.ptoas.forward_edited.cpp`): **synchronize completes**; **numerics still fail** vs fp32 reference (documented there). +- **Baseline hand-written JIT** [`cpp_ref/split_pipe/run.py`](../../cpp_ref/split_pipe/run.py) **passes** correctness on this NPU. Closest reported row (**same `S1=4096`, `HEAD=128`, but `Q_ROWS=3072` and `tile_s1=512`**, not the IR reference geometry): + +```bash +cd /workdir/pto-dsl/examples/aot/flash_attention/cpp_ref/split_pipe +python3 run.py +# excerpt (S1=4096 case), 2026-04-30: +# JIT flash kernel : 0.120 ms/iter (54.307 TFLOP/s) +# npu_fused_infer_attention : 0.254 ms/iter (25.628 TFLOP/s) +``` + +Use that run as an upper-bound sanity reference only; it is **not** the same kernel or tensor shapes as `ir_ref/fa.cpp`. + +## Files + +| File | Role | +| ---- | ---- | +| `compile.sh` | `bisheng` → `build_artifacts/fa.so` | +| `caller.cpp` | `call_kernel` → `call_both<<>>` (same pattern as `split_pipe/caller.cpp`) | +| `run.py` | Loads `.so`, correctness vs `fa_reference`, bench vs `torch_npu.npu_fused_infer_attention_score` | diff --git a/examples/aot/flash_attention/ir_ref/launch_kernel/caller.cpp b/examples/aot/flash_attention/ir_ref/launch_kernel/caller.cpp new file mode 100644 index 00000000..87546451 --- /dev/null +++ b/examples/aot/flash_attention/ir_ref/launch_kernel/caller.cpp @@ -0,0 +1,32 @@ +#ifndef KERNEL_CPP +#error "KERNEL_CPP must be defined at compile time." +#endif + +#include + +extern "C" int rtGetC2cCtrlAddr(uint64_t *ctrlAddr, uint32_t *ctrlLen); + +#include KERNEL_CPP + +extern "C" void call_kernel( + uint32_t blockDim, + void *stream, + uint8_t *gmSlotBuffer, + uint8_t *q, + uint8_t *k, // K: [S1_TOTAL, HEAD] fp16 + uint8_t *v, + uint8_t *o) // output O: [Q_ROWS, HEAD] fp32 +{ + void *fftsAddr = nullptr; + uint32_t fftsLen = 0; + (void)rtGetC2cCtrlAddr(reinterpret_cast(&fftsAddr), &fftsLen); + (void)fftsLen; + + call_both<<>>( + (__gm__ int64_t *)fftsAddr, + (__gm__ float *)gmSlotBuffer, + (__gm__ half *)q, + (__gm__ half *)k, + (__gm__ half *)v, + (__gm__ float *)o); +} diff --git a/examples/aot/flash_attention/ir_ref/launch_kernel/compile.sh b/examples/aot/flash_attention/ir_ref/launch_kernel/compile.sh new file mode 100755 index 00000000..858eaa69 --- /dev/null +++ b/examples/aot/flash_attention/ir_ref/launch_kernel/compile.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash +# Copyright (c) 2026 Huawei Technologies Co., Ltd. +# CANN Open Software License Agreement Version 2.0 +# +# AOT-compile ../fa.cpp (ptoas output from fa.pto; regenerate via ../gen_cpp.sh) into host-loaded fa.so. +# Geometry baked into IR: Q_ROWS=2048, S1_TOTAL=4096 (NUM_TILES=16 × S1_TILE=256), HEAD=128. +# +# Usage: +# bash compile.sh + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +ARTIFACT_DIR="${SCRIPT_DIR}/build_artifacts" +PTO_LIB_PATH="${PTO_LIB_PATH:-/sources/pto-isa}" +KERNEL_CPP="${SCRIPT_DIR}/../fa.cpp" +GENERATED_SO="${ARTIFACT_DIR}/fa.so" + +mkdir -p "${ARTIFACT_DIR}" +rm -f "${GENERATED_SO}" + +echo "==> bisheng ../fa.cpp -> ${GENERATED_SO}" +bisheng \ + -I"${PTO_LIB_PATH}/include" \ + -fPIC -shared -D_FORTIFY_SOURCE=2 -O2 -std=c++17 \ + -Wno-macro-redefined -Wno-ignored-attributes -fstack-protector-strong \ + -xcce -Xhost-start -Xhost-end \ + -mllvm -cce-aicore-stack-size=0x8000 \ + -mllvm -cce-aicore-function-stack-size=0x8000 \ + -mllvm -cce-aicore-record-overflow=true \ + -mllvm -cce-aicore-addr-transform \ + -mllvm -cce-aicore-dcci-insert-for-scalar=false \ + -cce-enable-mix \ + --npu-arch=dav-2201 -DMEMORY_BASE \ + -std=gnu++17 \ + -DKERNEL_CPP="\"${KERNEL_CPP}\"" \ + "${SCRIPT_DIR}/caller.cpp" \ + -o "${GENERATED_SO}" + +{ + echo "FA_NUM_TILES=16" + echo "FA_S1_TILE=256" + echo "FA_Q_ROWS=2048" +} >"${ARTIFACT_DIR}/fa.build_env" + +echo "Done." diff --git a/examples/aot/flash_attention/ir_ref/launch_kernel/run.py b/examples/aot/flash_attention/ir_ref/launch_kernel/run.py new file mode 100755 index 00000000..33194b19 --- /dev/null +++ b/examples/aot/flash_attention/ir_ref/launch_kernel/run.py @@ -0,0 +1,408 @@ +#!/usr/bin/env python3 +# Copyright (c) 2026 Huawei Technologies Co., Ltd. +# CANN Open Software License Agreement Version 2.0 +# +# Loads `build_artifacts/fa.so` built from `../fa.cpp` (ptoas-generated IR kernel). +# Host-side shapes must match the baked-in MLIR: Q_ROWS=2048, S1_TOTAL=4096, +# S1_TILE=256, NUM_TILES=16, HEAD=128 — kept in sync via `fa.build_env` + fa_performance_builder. +# +# Build first: `bash compile.sh` + +import ctypes +import importlib +import math +import os +import sys + +import torch +import torch_npu # noqa: F401 + +THIS_DIR = os.path.dirname(os.path.abspath(__file__)) +_SPLIT_PIPE_KERNELS = os.path.normpath(os.path.join(THIS_DIR, "..", "..", "split_pipe", "kernels")) +sys.path.insert(0, _SPLIT_PIPE_KERNELS) +import fa_performance_builder as fb # noqa: E402 + +from ptodsl import do_bench # noqa: E402 +from ptodsl.utils.npu_info import get_num_cube_cores, get_test_device # noqa: E402 + +ARTIFACT_DIR = os.path.join(THIS_DIR, "build_artifacts") +DEFAULT_PLOT_PATH = os.path.join(ARTIFACT_DIR, "fa_benchmark.png") + +# Single variant for bundled ../fa.cpp (4096 = 16 × 256). +DEFAULT_BENCH_LENGTHS = (4096,) + + +def _parse_bench_lengths(): + raw = os.environ.get("FA_BENCH_LENGTHS") + if not raw: + return DEFAULT_BENCH_LENGTHS + return tuple(int(x) for x in raw.split(",") if x.strip()) + + +ATOL = 1e-3 +RTOL = 1e-3 + + +def attn_flops_matmul_softmax_scale( + batch_size: int, + s_q: int, + s_k: int, + h: int, + include_scale: bool = True, + count_exp_as_flop: bool = True, + count_max_as_flop: bool = True, +): + flops_matmul = 4 * batch_size * s_q * s_k * h + flops_scale = (batch_size * s_q * s_k) if include_scale else 0 + + rows = batch_size * s_q + softmax_ops = 0 + if count_max_as_flop: + softmax_ops += rows * (s_k - 1) + softmax_ops += rows * s_k + if count_exp_as_flop: + softmax_ops += rows * s_k + softmax_ops += rows * (s_k - 1) + softmax_ops += rows * s_k + + return flops_matmul + flops_scale + softmax_ops + + +def get_block_dim() -> int: + # fa.cpp partitions NUM_TILES across get_block_num() / get_block_idx() (see cube/vec + # loops), not NUM_Q_BLOCKS — using NUM_Q_BLOCKS mis-launches the grid and faults (507015). + return min(fb.NUM_TILES, get_num_cube_cores()) + + +def get_slot_elems(block_dim: int) -> int: + return fb.GM_ELEMS_PER_BLOCK * block_dim + + +def num_tiles_for(seq_len: int) -> int: + s1_tile = fb.S1_TILE + if seq_len % s1_tile != 0: + raise ValueError(f"seq_len {seq_len} not divisible by S1_TILE={s1_tile}") + return seq_len // s1_tile + + +def _apply_build_env_matching_seq(seq_len: int) -> None: + if not os.path.isdir(ARTIFACT_DIR): + return + matches = [] + for fn in sorted(os.listdir(ARTIFACT_DIR)): + if not fn.endswith(".build_env"): + continue + path = os.path.join(ARTIFACT_DIR, fn) + kv = {} + try: + with open(path, encoding="utf-8") as f: + for line in f: + line = line.strip() + if not line or line.startswith("#"): + continue + k, _, v = line.partition("=") + if k.strip(): + kv[k.strip()] = v.strip() + except OSError: + continue + try: + nt = int(kv["FA_NUM_TILES"]) + s1 = int(kv["FA_S1_TILE"]) + except (KeyError, ValueError): + continue + if nt * s1 != seq_len: + continue + matches.append((fn, kv)) + + if not matches: + return + + env_s1 = os.environ.get("FA_S1_TILE") + if env_s1 is not None: + for fn, kv in matches: + if kv.get("FA_S1_TILE") == env_s1.strip(): + for k, v in kv.items(): + os.environ[k] = v + return + + matches.sort(key=lambda x: (0 if x[0] == "fa.build_env" else 1, x[0])) + for _, kv in matches: + for k, v in kv.items(): + os.environ[k] = v + return + + +def lib_path_for(num_tiles: int) -> str: + if num_tiles == 16: + return os.path.join(ARTIFACT_DIR, "fa.so") + return os.path.join(ARTIFACT_DIR, f"fa_{num_tiles}.so") + + +def require_lib(num_tiles: int) -> str: + lib_path = lib_path_for(num_tiles) + if not os.path.exists(lib_path): + raise FileNotFoundError( + f"Missing prebuilt kernel: {lib_path}\n" + "Run `bash compile.sh` in ir_ref/launch_kernel first." + ) + return lib_path + + +def torch_to_ctypes(t: torch.Tensor) -> ctypes.c_void_p: + return ctypes.c_void_p(t.data_ptr()) + + +def load_lib(lib_path: str) -> ctypes.CDLL: + lib = ctypes.CDLL(lib_path) + lib.call_kernel.argtypes = [ + ctypes.c_uint32, + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.c_void_p, + ] + lib.call_kernel.restype = None + return lib + + +def fa_reference(q, k, v): + scale = 1.0 / math.sqrt(q.shape[1]) + scores = q.float() @ k.float().T * scale + attn = torch.softmax(scores, dim=-1) + return (attn @ v.float()).float() + + +def fused_attention(q, k, v, is_causal=False): + scale = 1.0 / math.sqrt(q.shape[1]) + out, _ = torch_npu.npu_fused_infer_attention_score( + q.unsqueeze(0), + k.unsqueeze(0), + v.unsqueeze(0), + num_heads=1, + input_layout="BSH", + scale=scale, + next_tokens=0 if is_causal else 65535, + ) + return out.squeeze(0) + + +def test_flash(lib, device, num_tiles): + torch.manual_seed(0) + Q_ROWS = fb.Q_ROWS + HEAD = fb.HEAD + S1_TOTAL = fb.S1_TILE * num_tiles + GM_ELEMS_PER_BLOCK = fb.GM_ELEMS_PER_BLOCK + + block_dim = get_block_dim() + slot_elems = get_slot_elems(block_dim) + + q = torch.randn((Q_ROWS, HEAD), dtype=torch.float16, device=device) + k = torch.randn((S1_TOTAL, HEAD), dtype=torch.float16, device=device) + v = torch.randn((S1_TOTAL, HEAD), dtype=torch.float16, device=device) + + gm_slot = torch.zeros((slot_elems,), dtype=torch.float32, device=device) + o = torch.zeros((Q_ROWS, HEAD), dtype=torch.float32, device=device) + + stream_ptr = torch.npu.current_stream()._as_parameter_ + + lib.call_kernel( + block_dim, + stream_ptr, + torch_to_ctypes(gm_slot), + torch_to_ctypes(q), + torch_to_ctypes(k), + torch_to_ctypes(v), + torch_to_ctypes(o), + ) + torch.npu.synchronize() + + o_ref = fa_reference(q, k, v) + torch.testing.assert_close(o.cpu().float(), o_ref.cpu(), rtol=RTOL, atol=ATOL) + print( + f"[fa] q_rows={Q_ROWS} s1={S1_TOTAL} head={HEAD} " + f"({num_tiles} tiles, blockDim={block_dim}): PASSED " + f"(atol={ATOL}, rtol={RTOL}) GM/blk={GM_ELEMS_PER_BLOCK} fp32" + ) + + +def benchmark_flash(lib, device, num_tiles, warmup=10, iters=100): + torch.manual_seed(0) + Q_ROWS = fb.Q_ROWS + HEAD = fb.HEAD + S1_TILE = fb.S1_TILE + s1_total = S1_TILE * num_tiles + + block_dim = get_block_dim() + slot_elems = get_slot_elems(block_dim) + + q = torch.randn((Q_ROWS, HEAD), dtype=torch.float16, device=device) + k = torch.randn((s1_total, HEAD), dtype=torch.float16, device=device) + v = torch.randn((s1_total, HEAD), dtype=torch.float16, device=device) + + gm_slot = torch.zeros((slot_elems,), dtype=torch.float32, device=device) + o = torch.zeros((Q_ROWS, HEAD), dtype=torch.float32, device=device) + stream_ptr = torch.npu.current_stream()._as_parameter_ + + def run_kernel(): + lib.call_kernel( + block_dim, + stream_ptr, + torch_to_ctypes(gm_slot), + torch_to_ctypes(q), + torch_to_ctypes(k), + torch_to_ctypes(v), + torch_to_ctypes(o), + ) + + def run_reference(): + fused_attention(q, k, v) + + kernel_us = do_bench( + run_kernel, + warmup_iters=warmup, + benchmark_iters=iters, + unit="us", + flush_cache=False, + ) + ref_us = do_bench( + run_reference, + warmup_iters=warmup, + benchmark_iters=iters, + unit="us", + flush_cache=False, + ) + + run_kernel() + torch.npu.synchronize() + o_kernel = o.clone() + o_fused = fused_attention(q, k, v) + torch.npu.synchronize() + o_golden = fa_reference(q, k, v) + + diff_kernel = (o_kernel.cpu().float() - o_golden.cpu()).abs().max().item() + diff_fused = (o_fused.cpu().float() - o_golden.cpu()).abs().max().item() + torch.testing.assert_close( + o_kernel.cpu().float(), o_golden.cpu(), rtol=RTOL, atol=ATOL + ) + + flops = attn_flops_matmul_softmax_scale(1, Q_ROWS, s1_total, HEAD) + return { + "seq_len": s1_total, + "num_tiles": num_tiles, + "block_dim": block_dim, + "kernel_us": kernel_us, + "ref_us": ref_us, + "kernel_tflops": flops / (kernel_us * 1e-6) / 1e12, + "ref_tflops": flops / (ref_us * 1e-6) / 1e12, + "speedup": ref_us / kernel_us, + "kernel_max_err": diff_kernel, + "fused_max_err": diff_fused, + } + + +def print_bench_row(r): + print( + f" s1={r['seq_len']:>6} tiles={r['num_tiles']:>3} " + f"fa={r['kernel_us']:8.2f} us ({r['kernel_tflops']:7.3f} TFLOP/s) " + f"ref={r['ref_us']:8.2f} us ({r['ref_tflops']:7.3f} TFLOP/s) " + f"speedup={r['speedup']:.2f}x " + f"err: ours={r['kernel_max_err']:.2e} ref={r['fused_max_err']:.2e}" + ) + + +def plot_benchmark_results(results, out_png=None): + if not results: + return + + out_png = out_png or os.environ.get("FA_BENCH_PLOT_PATH", DEFAULT_PLOT_PATH) + + try: + import matplotlib + + matplotlib.use("Agg") + import matplotlib.pyplot as plt + except ImportError: + print("Warning: matplotlib is not installed; skipping plot generation.") + return + + style_candidates = ("seaborn-v0_8-whitegrid", "seaborn-whitegrid") + for style_name in style_candidates: + try: + plt.style.use(style_name) + break + except OSError: + continue + + seq_lens = [r["seq_len"] for r in results] + fa_tflops = [r["kernel_tflops"] for r in results] + ref_tflops = [r["ref_tflops"] for r in results] + + fig, ax_thr = plt.subplots(figsize=(7, 5)) + fig.patch.set_facecolor("white") + + ax_thr.plot(seq_lens, fa_tflops, "o-", label="PTO flash attention (ir_ref fa.cpp)") + ax_thr.plot(seq_lens, ref_tflops, "s-", label="torch_npu fused attention") + ax_thr.set_title("Throughput") + ax_thr.set_xlabel("S1 sequence length") + ax_thr.set_ylabel("TFLOP/s") + ax_thr.legend() + ax_thr.set_xscale("log", base=2) + ax_thr.set_xticks(seq_lens) + ax_thr.set_xticklabels([str(x) for x in seq_lens], rotation=30) + + fig.suptitle( + f"Flash Attention Benchmark: Q={fb.Q_ROWS}, H={fb.HEAD}, " + f"S1_TILE={fb.S1_TILE}" + ) + fig.tight_layout() + + out_dir = os.path.dirname(out_png) + if out_dir: + os.makedirs(out_dir, exist_ok=True) + fig.savefig(out_png, dpi=180) + plt.close(fig) + print(f"Saved benchmark plot: {out_png}") + + +def main(): + global fb + device = get_test_device() + torch.npu.set_device(device) + + bench_lengths = _parse_bench_lengths() + _apply_build_env_matching_seq(bench_lengths[0]) + fb = importlib.reload(fb) + + required = [(seq_len, num_tiles_for(seq_len)) for seq_len in bench_lengths] + for seq_len, nt in required: + require_lib(nt) + + _, first_nt = required[0] + default_lib = load_lib(require_lib(first_nt)) + test_flash(default_lib, device, num_tiles=first_nt) + + print(f"\n{'Benchmark (fa)':=^96}") + print( + f" Q_ROWS={fb.Q_ROWS} HEAD={fb.HEAD} " + f"S1_TILE={fb.S1_TILE} " + f"NUM_Q_BLOCKS={fb.NUM_Q_BLOCKS} cores={get_num_cube_cores()}" + ) + print(f" lengths: {list(bench_lengths)}") + print("-" * 96) + + results = [] + for seq_len, nt in required: + lib = load_lib(require_lib(nt)) + r = benchmark_flash(lib, device, num_tiles=nt) + print_bench_row(r) + results.append(r) + print("=" * 96) + + if os.environ.get("FA_BENCH_NO_PLOT", "").lower() not in ("1", "true", "yes"): + plot_benchmark_results(results) + + +if __name__ == "__main__": + main() From 46bd505840cd14d6e9bc6ae03d8e5d08e7e98b34 Mon Sep 17 00:00:00 2001 From: learning-chip Date: Tue, 5 May 2026 16:09:35 +0000 Subject: [PATCH 16/17] update FA cpp ref to match pto-isa master --- .github/workflows/ci.yml | 4 +- docker/Dockerfile | 8 +- .../split_pipe/fa_split_pipe_s1_plot.png | Bin 105389 -> 102582 bytes .../flash_atten/fa_performance_kernel.cpp | 221 ++++++++++-------- 4 files changed, 125 insertions(+), 108 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4edabd8f..94ec7f0a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -50,7 +50,7 @@ jobs: RELEASE_VER: 0.36 RELEASE_TAG: v0.36 CLI_DIR: /installers/ptoas-cli - PTOISA_COMMIT: 4d466a8e3cfa363281eb5e67449575eade5bf366 + PTOISA_COMMIT: 4e27a104f948e883e0bef44670252381bff794c5 steps: - name: Install system packages @@ -84,7 +84,7 @@ jobs: - name: Clone pto-isa headers run: | - git clone -b feature_subtile https://gitcode.com/csjlchen/pto-isa.git /sources/pto-isa + git clone https://gitcode.com/cann/pto-isa.git /sources/pto-isa cd /sources/pto-isa && git checkout ${PTOISA_COMMIT} - name: Install ptodsl (${{ matrix.install-mode }}) diff --git a/docker/Dockerfile b/docker/Dockerfile index ed4fea48..bf02490b 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -15,11 +15,11 @@ RUN pip install --no-cache-dir \ pytest pybind11 nanobind setuptools wheel \ ipython jupyterlab matplotlib pandas -# For modified FA style -# https://gitcode.com/csjlchen/pto-isa/commit/4d466a8e3cfa363281eb5e67449575eade5bf366?ref=feature_subtile -ARG PTOISA_COMMIT=4d466a8e3cfa363281eb5e67449575eade5bf366 +# For updated FA style +# https://gitcode.com/cann/pto-isa/commit/4e27a104f948e883e0bef44670252381bff794c5?ref=master +ARG PTOISA_COMMIT=4e27a104f948e883e0bef44670252381bff794c5 WORKDIR /sources -RUN git clone -b feature_subtile https://gitcode.com/csjlchen/pto-isa \ +RUN git clone https://gitcode.com/cann/pto-isa \ && cd pto-isa && git checkout $PTOISA_COMMIT ENV PTO_LIB_PATH=/sources/pto-isa diff --git a/examples/aot/flash_attention/cpp_ref/split_pipe/fa_split_pipe_s1_plot.png b/examples/aot/flash_attention/cpp_ref/split_pipe/fa_split_pipe_s1_plot.png index 3a9c375b00b6a8c4cb3a778d184f3084f4547612..28a3e2963883bceaf72cc893f72bd1a92eac9528 100644 GIT binary patch literal 102582 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

H8y4SIF|JPx@sN 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 literal 105389 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

e|My3WK?({uWl+W^W~V?jkzZ8 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 diff --git a/examples/aot/flash_attention/cpp_ref/split_pipe/kernels/flash_atten/fa_performance_kernel.cpp b/examples/aot/flash_attention/cpp_ref/split_pipe/kernels/flash_atten/fa_performance_kernel.cpp index ef96b38e..d8de88e0 100644 --- a/examples/aot/flash_attention/cpp_ref/split_pipe/kernels/flash_atten/fa_performance_kernel.cpp +++ b/examples/aot/flash_attention/cpp_ref/split_pipe/kernels/flash_atten/fa_performance_kernel.cpp @@ -230,12 +230,12 @@ AICORE inline int assign_running_acc_tile(AccTileT &accTile, int initial_id = -1 } template + int CV_FIFO_CONS_SYNC_PERIOD, bool INTERMEDIATE_CHECK, bool CAUSAL_MASK, typename TileMatQData, + typename TileMatKData, typename TileQKData, typename QKSlotGlobal> AICORE inline void compute_qk(QKPipe &qkPipe, int tile_id, int sub_tile_id, __gm__ half *q, __gm__ half *k, - TileMatQData &qMatTile, TileMatKData &kMatTile, TileQKData &qkAccTile, - QKSlotGlobal &qkSlotGlobal, uint64_t qkMatTileEventId, int accTileEvtID, int blk_idx) + __gm__ float *qk_tile_fifo, TileMatQData &qMatTile, TileMatKData &kMatTile, + TileQKData &qkAccTile, QKSlotGlobal &qkSlotGlobal, uint64_t qkMatTileEventId, + int accTileEvtID, int blk_idx) { if constexpr (DAV_CUBE) { constexpr uint32_t Cube_S0 = CUBE_S0; @@ -251,12 +251,12 @@ AICORE inline void compute_qk(QKPipe &qkPipe, int tile_id, int sub_tile_id, __gm const int s0_index = blk_idx * CUBE_S0; const int s1_index = tile_id * static_cast(Tile_S1) + sub_tile_id * static_cast(Cube_S1); if (sub_tile_id == 0) { - TALLOC(qkPipe, qkSlotGlobal); + TALLOC(qkPipe, qkSlotGlobal); } if constexpr (CAUSAL_MASK) { if (s1_index > s0_index) { if (sub_tile_id == static_cast(kTileFactor) - 1) { - TPUSH(qkPipe, qkSlotGlobal); + TPUSH(qkPipe, qkSlotGlobal); } return; } @@ -294,8 +294,13 @@ AICORE inline void compute_qk(QKPipe &qkPipe, int tile_id, int sub_tile_id, __gm #endif using QKStoreGlobal = - GlobalTensor, pto::Stride<1, 1, 1, Tile_S1, 1>>; - QKStoreGlobal qkStoreGlobal(qkSlotGlobal.data() + static_cast(sub_tile_id) * Cube_S1); + GlobalTensor, pto::Stride<1, 1, 1, Cube_S1, 1>>; + const uint32_t buf_idx = static_cast(tile_id % QKP_CV_FIFO); + const size_t base_elems = + static_cast(buf_idx) * static_cast(kTileFactor) * static_cast(Cube_S0) * + static_cast(Cube_S1) + + static_cast(sub_tile_id) * static_cast(Cube_S0) * static_cast(Cube_S1); + QKStoreGlobal qkStoreGlobal(qk_tile_fifo + base_elems); #if UF_ENABLE TSTORE(qkStoreGlobal, qkAccTile); #else @@ -303,7 +308,7 @@ AICORE inline void compute_qk(QKPipe &qkPipe, int tile_id, int sub_tile_id, __gm #endif if (sub_tile_id == static_cast(kTileFactor) - 1) { - TPUSH(qkPipe, qkSlotGlobal); + TPUSH(qkPipe, qkSlotGlobal); } #if !UF_ENABLE @@ -317,9 +322,9 @@ template AICORE inline void compute_pv(PPipe &pPipe, PVPipe &pvPipe, int tile_id, int sub_tile_id, __gm__ half *v, - TileMatPData &pMatTile, TileMatVData &vMatTile, TilePVData &pvAccTile, - PSlotGlobal &pSlotGlobal, PVSlotGlobal &pvSlotGlobal, uint64_t svMatTileEventId, - int accTileEvtID, int blk_idx) + __gm__ half *p_tile_fifo, TileMatPData &pMatTile, TileMatVData &vMatTile, + TilePVData &pvAccTile, PSlotGlobal &pSlotGlobal, PVSlotGlobal &pvSlotGlobal, + uint64_t svMatTileEventId, int accTileEvtID, int blk_idx) { constexpr uint32_t Cube_S0 = CUBE_S0; constexpr uint32_t Cube_S1 = CUBE_S1; @@ -338,12 +343,12 @@ AICORE inline void compute_pv(PPipe &pPipe, PVPipe &pvPipe, int tile_id, int sub if constexpr (DAV_CUBE) { if (sub_tile_id == 0) { - TPOP(pPipe, pSlotGlobal); + TPOP(pPipe, pSlotGlobal); } if constexpr (CAUSAL_MASK) { if (s1_index > s0_index) { if (is_last_subtile) { - TFREE(pPipe, pSlotGlobal); + TFREE(pPipe, pSlotGlobal); } return; } @@ -357,12 +362,15 @@ AICORE inline void compute_pv(PPipe &pPipe, PVPipe &pvPipe, int tile_id, int sub GlobalVT vLoad((__gm__ half *)(v + s1_index * HEAD_SIZE)); TLOAD(vMatTile, vLoad); - using PLoadGlobal = - GlobalTensor, pto::Stride<1, 1, 1, Tile_S1, 1>>; - PLoadGlobal pLoadGlobal(pSlotGlobal.data() + static_cast(sub_tile_id) * Cube_S1); + using PLoadGlobal = GlobalTensor, pto::Stride<1, 1, 1, Cube_S1, 1>>; + const uint32_t buf_idx = static_cast(tile_id % PPipe::RingFiFo::SLOT_NUM); + const size_t base_elems = + static_cast(buf_idx) * static_cast(Cube_S0) * static_cast(Tile_S1) + + static_cast(sub_tile_id) * static_cast(Cube_S0) * static_cast(Cube_S1); + PLoadGlobal pLoadGlobal(p_tile_fifo + base_elems); TLOAD(pMatTile, pLoadGlobal); if (is_last_subtile) { - TFREE(pPipe, pSlotGlobal); + TFREE(pPipe, pSlotGlobal); } set_flag(PIPE_MTE2, PIPE_MTE1, EVENT_ID0); @@ -395,32 +403,32 @@ AICORE inline void compute_pv(PPipe &pPipe, PVPipe &pvPipe, int tile_id, int sub using PVStoreGlobal = GlobalTensor, pto::Stride<1, 1, 1, HEAD_SIZE, 1>>; - TALLOC(pvPipe, pvSlotGlobal); + TALLOC(pvPipe, pvSlotGlobal); PVStoreGlobal pvStoreGlobal(pvSlotGlobal.data()); #if UF_ENABLE TSTORE(pvStoreGlobal, pvAccTile); #else TSTORE(pvStoreGlobal, pvAccTile); #endif - TPUSH(pvPipe, pvSlotGlobal); + TPUSH(pvPipe, pvSlotGlobal); #if !UF_ENABLE set_flag(PIPE_FIX, PIPE_M, accTileEvtID); #endif } // end loop - } // end if DAV_CUBE + } // end if DAV_CUBE } template + int CV_FIFO_CONS_SYNC_PERIOD, bool INTERMEDIATE_CHECK, bool CAUSAL_MASK, typename TileDataF_T, + typename TileDataH_T, typename ReduceTileF_T, typename QKVecSlotGlobal, typename PVecSlotGlobal> AICORE inline void compute_p(QKPipe &qkPipe, PPipe &pPipe, int tile_id, int row_slice, __gm__ float *exp_max_ififo, - __gm__ float *global_sum_out, __gm__ float *exp_max_out, TileDataF_T &qkVecTile, - TileDataH_T &x_expT, TileDataF_T &input_reduce_tmp, ReduceTileF_T &m1_local_max, - ReduceTileF_T &l1_local_sum, ReduceTileF_T &m2_global_max, ReduceTileF_T &l2_global_sum, - ReduceTileF_T &l1_exp_max_ififo, TileDataF_T triu, QKSlotGlobal &qkSlotGlobal, - PSlotGlobal &pSlotGlobal, uint64_t pTileEventId, int blk_idx) + __gm__ float *qk_tile_fifo, __gm__ half *p_tile_fifo, __gm__ float *global_sum_out, + __gm__ float *exp_max_out, TileDataF_T &qkVecTile, TileDataH_T &x_expT, + TileDataF_T &input_reduce_tmp, ReduceTileF_T &m1_local_max, ReduceTileF_T &l1_local_sum, + ReduceTileF_T &m2_global_max, ReduceTileF_T &l2_global_sum, + ReduceTileF_T &l1_exp_max_ififo, TileDataF_T triu, QKVecSlotGlobal &qkVecSlotGlobal, + PVecSlotGlobal &pVecSlotGlobal, uint64_t pTileEventId, int blk_idx) { constexpr uint32_t Cube_S0 = CUBE_S0; constexpr uint32_t Cube_S1 = CUBE_S1; @@ -435,21 +443,33 @@ AICORE inline void compute_p(QKPipe &qkPipe, PPipe &pPipe, int tile_id, int row_ if constexpr (DAV_VEC) { const size_t subblock_base_rows = static_cast(Cube_S0 / VEC_CORES) * static_cast(get_subblockid()); - const size_t row_offset = subblock_base_rows + static_cast(row_slice * Vec_S0); + const size_t local_row_offset = static_cast(row_slice * Vec_S0); + const size_t row_offset = subblock_base_rows + local_row_offset; const int s0_index = blk_idx * Cube_S0 + row_offset; const int s1_index = tile_id * static_cast(Tile_S1); wait_flag(PIPE_V, PIPE_MTE2, pTileEventId); if (row_slice == 0) { - TPOP(qkPipe, qkSlotGlobal); + TPOP(qkPipe, qkVecSlotGlobal); } + const uint32_t qk_buf_idx = static_cast(tile_id % QKP_CV_FIFO); + const size_t qk_base_elems = static_cast(qk_buf_idx) * static_cast(kTileFactor) * + static_cast(Cube_S0) * static_cast(Cube_S1); + __gm__ float *qk_ptr = qk_tile_fifo + qk_base_elems + row_offset * static_cast(Cube_S1); using QKLoadGlobal = - GlobalTensor, pto::Stride<1, 1, 1, Tile_S1, 1>>; - QKLoadGlobal qkLoadGlobal(qkSlotGlobal.data() + row_offset * Tile_S1); - TLOAD(qkVecTile, qkLoadGlobal); + GlobalTensor, pto::Stride<1, 1, 1, Cube_S1, 1>>; + using TileDataFSub = Tile; + for (int sub_col = 0; sub_col < static_cast(kTileFactor); ++sub_col) { + QKLoadGlobal qkLoadGlobal(qk_ptr + static_cast(sub_col) * static_cast(Cube_S0) * + static_cast(Cube_S1)); + TileDataFSub qkVecSub; + TASSIGN(qkVecSub, (uint64_t)qkVecTile.data() + + static_cast(sub_col) * static_cast(Cube_S1) * sizeof(float)); + TLOAD(qkVecSub, qkLoadGlobal); + } if (row_slice == static_cast(kTileFactor) - 1) { - TFREE(qkPipe, qkSlotGlobal); + TFREE(qkPipe, qkVecSlotGlobal); } set_flag(PIPE_MTE2, PIPE_V, EVENT_ID0); @@ -490,14 +510,21 @@ AICORE inline void compute_p(QKPipe &qkPipe, PPipe &pPipe, int tile_id, int row_ wait_flag(PIPE_V, PIPE_MTE3, EVENT_ID0); if (row_slice == 0) { - TALLOC(pPipe, pSlotGlobal); + TALLOC(pPipe, pVecSlotGlobal); + } + using PStoreGlobal = GlobalTensor, pto::Stride<1, 1, 1, Cube_S1, 1>>; + using TileDataHSub = Tile; + __gm__ half *p_ptr = p_tile_fifo + qk_base_elems + row_offset * static_cast(Cube_S1); + for (int sub_col = 0; sub_col < static_cast(kTileFactor); ++sub_col) { + PStoreGlobal pStoreGlobal(p_ptr + static_cast(sub_col) * static_cast(Cube_S0) * + static_cast(Cube_S1)); + TileDataHSub xExpSub; + TASSIGN(xExpSub, (uint64_t)x_expT.data() + + static_cast(sub_col) * static_cast(Cube_S1) * sizeof(half)); + TSTORE(pStoreGlobal, xExpSub); } - using PStoreGlobal = - GlobalTensor, pto::Stride<1, 1, 1, Tile_S1, 1>>; - PStoreGlobal pStoreGlobal(pSlotGlobal.data() + row_offset * Tile_S1); - TSTORE(pStoreGlobal, x_expT); if (row_slice == static_cast(kTileFactor) - 1) { - TPUSH(pPipe, pSlotGlobal); + TPUSH(pPipe, pVecSlotGlobal); } set_flag(PIPE_MTE3, PIPE_V, pTileEventId); @@ -750,45 +777,41 @@ __global__ AICORE void runTFA(__gm__ uint64_t *ffts_addr, __gm__ half *q, __gm__ // FIFO definitions constexpr uint8_t FiFoDepth = CV_FIFO_SIZE; - #if defined(__DAV_C220_CUBE__) || defined(__DAV_C220_VEC__) - using QKPipe = - TPipe; - #elif defined(__DAV_C310_CUBE__) || defined(__DAV_C310_VEC__) - using QKPipe = - TPipe; - #endif +#if defined(__DAV_C220_CUBE__) || defined(__DAV_C220_VEC__) + constexpr uint8_t QK_PIPE_DIR = Direction::DIR_C2V; + constexpr uint8_t P_PIPE_DIR = Direction::DIR_V2C; + constexpr uint8_t PV_PIPE_DIR = Direction::DIR_C2V; +#elif defined(__DAV_C310_CUBE__) || defined(__DAV_C310_VEC__) + constexpr uint8_t QK_PIPE_DIR = Direction::DIR_C2V_GM; + constexpr uint8_t P_PIPE_DIR = Direction::DIR_V2C_GM; + constexpr uint8_t PV_PIPE_DIR = Direction::DIR_C2V_GM; +#endif + + using QKPipe = TPipe; QKPipe qkPipe(qk_tile_fifo_block, (uint32_t)(uint64_t)qkVecTile[0].data(), 0x0); // pFiFo, pProd, pCons - #if defined(__DAV_C220_CUBE__) || defined(__DAV_C220_VEC__) - using PPipe = TPipe; - #elif defined(__DAV_C310_CUBE__) || defined(__DAV_C310_VEC__) - using PPipe = TPipe; - #endif + using PPipe = TPipe; PPipe pPipe(p_tile_fifo_block, 0x0, (uint32_t)(uint64_t)pMatTile[0].data()); // pvFiFo, pvProd, pvCons - #if defined(__DAV_C220_CUBE__) || defined(__DAV_C220_VEC__) - using PVPipe = - TPipe; - #elif defined(__DAV_C310_CUBE__) || defined(__DAV_C310_VEC__) - using PVPipe = - TPipe; - #endif + using PVPipe = TPipe; PVPipe pvPipe(pv_tile_fifo_block, (uint32_t)(uint64_t)pvVecTile[0].data(), 0x0); - using QKSlotGlobal = - GlobalTensor, pto::Stride<1, 1, 1, Tile_S1, 1>>; - using PSlotGlobal = - GlobalTensor, pto::Stride<1, 1, 1, Tile_S1, 1>>; + using QKSlotGlobal = GlobalTensor, pto::Stride<1, 1, 1, Tile_S1, 1>>; + using QKVecSlotGlobal = + GlobalTensor, pto::Stride<1, 1, 1, Tile_S1, 1>>; + using PSlotGlobal = GlobalTensor, pto::Stride<1, 1, 1, Tile_S1, 1>>; + using PVecSlotGlobal = + GlobalTensor, pto::Stride<1, 1, 1, Tile_S1, 1>>; using PVSlotGlobal = GlobalTensor, pto::Stride<1, 1, 1, HEAD_SIZE, 1>>; QKSlotGlobal qkSlotGlobal; + QKVecSlotGlobal qkVecSlotGlobal; PSlotGlobal pSlotGlobal; + PVecSlotGlobal pVecSlotGlobal; PVSlotGlobal pvSlotGlobal; // QK and P pre-computation (tile_id based) @@ -799,7 +822,7 @@ __global__ AICORE void runTFA(__gm__ uint64_t *ffts_addr, __gm__ half *q, __gm__ qkAccTileEvtID = assign_running_acc_tile(qkAccTile); compute_qk( - qkPipe, preload_tile, sub_tile, q_block, k, qMatTile[0], + qkPipe, preload_tile, sub_tile, q_block, k, qk_tile_fifo_block, qMatTile[0], kMatTile[k_src_pingpong_id % kMatTNBuffers], qkAccTile, qkSlotGlobal, k_src_pingpong_id % kMatTNBuffers, qkAccTileEvtID, block_idx); k_src_pingpong_id++; @@ -810,11 +833,11 @@ __global__ AICORE void runTFA(__gm__ uint64_t *ffts_addr, __gm__ half *q, __gm__ // Init only on the very first S1 tile; row_slice partitions rows within that tile compute_p( - qkPipe, pPipe, preload_tile, row_slice, exp_max_ififo_block, global_sum_block, exp_max_block, - qkVecTile[p_gu_src_pingpong_id % srcVecTNBuffers], x_expT[p_gu_src_pingpong_id % xexpVecTNBuffers], - input_reduce_tmp, m1_local_max, l1_local_sum, m2_global_max, l2_global_sum, - l1_exp_max_ififo[preload_tile % qkp_tile_fifo_size], triu, qkSlotGlobal, pSlotGlobal, - p_gu_src_pingpong_id % xexpVecTNBuffers, block_idx); + qkPipe, pPipe, preload_tile, row_slice, exp_max_ififo_block, qk_tile_fifo_block, p_tile_fifo_block, + global_sum_block, exp_max_block, qkVecTile[p_gu_src_pingpong_id % srcVecTNBuffers], + x_expT[p_gu_src_pingpong_id % xexpVecTNBuffers], input_reduce_tmp, m1_local_max, l1_local_sum, + m2_global_max, l2_global_sum, l1_exp_max_ififo[preload_tile % qkp_tile_fifo_size], triu, + qkVecSlotGlobal, pVecSlotGlobal, p_gu_src_pingpong_id % xexpVecTNBuffers, block_idx); p_gu_src_pingpong_id++; } } @@ -834,7 +857,7 @@ __global__ AICORE void runTFA(__gm__ uint64_t *ffts_addr, __gm__ half *q, __gm__ if (next_qk_tile != -1) { compute_qk( - qkPipe, next_qk_tile, sub_tile, q_block, k, qMatTile[0], + qkPipe, next_qk_tile, sub_tile, q_block, k, qk_tile_fifo_block, qMatTile[0], kMatTile[k_src_pingpong_id % kMatTNBuffers], qkAccTile, qkSlotGlobal, k_src_pingpong_id % kMatTNBuffers, qkAccTileEvtID, block_idx); k_src_pingpong_id++; @@ -843,14 +866,14 @@ __global__ AICORE void runTFA(__gm__ uint64_t *ffts_addr, __gm__ half *q, __gm__ if constexpr (DAV_VEC) { if (next_qk_tile != -1) { - compute_p( - qkPipe, pPipe, next_qk_tile, sub_tile, exp_max_ififo_block, global_sum_block, - exp_max_block, qkVecTile[p_gu_src_pingpong_id % srcVecTNBuffers], - x_expT[p_gu_src_pingpong_id % xexpVecTNBuffers], input_reduce_tmp, m1_local_max, - l1_local_sum, m2_global_max, l2_global_sum, - l1_exp_max_ififo[next_qk_tile % qkp_tile_fifo_size], triu, qkSlotGlobal, pSlotGlobal, - p_gu_src_pingpong_id % xexpVecTNBuffers, block_idx); + compute_p( + qkPipe, pPipe, next_qk_tile, sub_tile, exp_max_ififo_block, qk_tile_fifo_block, + p_tile_fifo_block, global_sum_block, exp_max_block, + qkVecTile[p_gu_src_pingpong_id % srcVecTNBuffers], + x_expT[p_gu_src_pingpong_id % xexpVecTNBuffers], input_reduce_tmp, m1_local_max, l1_local_sum, + m2_global_max, l2_global_sum, l1_exp_max_ififo[next_qk_tile % qkp_tile_fifo_size], triu, + qkVecSlotGlobal, pVecSlotGlobal, p_gu_src_pingpong_id % xexpVecTNBuffers, block_idx); p_gu_src_pingpong_id++; } } @@ -858,10 +881,10 @@ __global__ AICORE void runTFA(__gm__ uint64_t *ffts_addr, __gm__ half *q, __gm__ if constexpr (DAV_CUBE) { compute_pv( - pPipe, pvPipe, tile_id, sub_tile, v, pMatTile[pv_src_pingpong_id % pMatTNBuffers], - vMatTile[pv_src_pingpong_id % vMatTNBuffers], pvAccTile, - pSlotGlobal, pvSlotGlobal, pv_src_pingpong_id % vMatTNBuffers + PV_EVENT_ID0, pvAccTileEvtID, - block_idx); + pPipe, pvPipe, tile_id, sub_tile, v, p_tile_fifo_block, + pMatTile[pv_src_pingpong_id % pMatTNBuffers], vMatTile[pv_src_pingpong_id % vMatTNBuffers], + pvAccTile, pSlotGlobal, pvSlotGlobal, pv_src_pingpong_id % vMatTNBuffers + PV_EVENT_ID0, + pvAccTileEvtID, block_idx); pv_src_pingpong_id++; } } @@ -885,9 +908,6 @@ __global__ AICORE void runTFA(__gm__ uint64_t *ffts_addr, __gm__ half *q, __gm__ wait_flag(PIPE_MTE1, PIPE_MTE2, EVENT_ID3); wait_flag(PIPE_FIX, PIPE_M, EVENT_ID0); wait_flag(PIPE_FIX, PIPE_M, EVENT_ID1); -#ifdef __DAV_C220_CUBE__ - wait_flag_dev(CV_BLOCK_END); // wait for vector done all reading -#endif } if constexpr (DAV_VEC) { @@ -895,9 +915,6 @@ __global__ AICORE void runTFA(__gm__ uint64_t *ffts_addr, __gm__ half *q, __gm__ wait_flag(PIPE_V, PIPE_MTE2, EVENT_ID1); wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID0); wait_flag(PIPE_MTE3, PIPE_V, EVENT_ID1); -#ifdef __DAV_C220_VEC__ - ffts_cross_core_sync(PIPE_MTE2, _getFFTSMsg(CV_CORE_SYNC, CV_BLOCK_END)); // cube can exit CV comm now -#endif } pipe_barrier(PIPE_ALL); @@ -935,19 +952,19 @@ void LaunchTFA(uint16_t *ffts, aclFloat16 *q, aclFloat16 *k, aclFloat16 *v, aclF // Warm up all cores first, then prefetch q/k/v into L2 warmup_kernel<<<24, nullptr, stream>>>(); - const uint64_t q_bytes = static_cast(S0) * static_cast(HEAD_SIZE) * sizeof(half); - const uint64_t kv_bytes = static_cast(S1) * static_cast(HEAD_SIZE) * sizeof(half); + const uint64_t tensor_elems = static_cast(S0) * static_cast(HEAD_SIZE); + const uint64_t tensor_bytes = tensor_elems * sizeof(half); constexpr bool kPrefetchUseSdma = true; // simulation cannot use sdma constexpr int kPrefetchAivCores = 40; // only used when kPrefetchUseSdma is false if constexpr (kPrefetchUseSdma) { - PTO_PREFETCH((__gm__ void *)q, q_bytes, stream); - PTO_PREFETCH((__gm__ void *)k, kv_bytes, stream); - PTO_PREFETCH((__gm__ void *)v, kv_bytes, stream); + PTO_PREFETCH((__gm__ void *)q, tensor_bytes, stream); + PTO_PREFETCH((__gm__ void *)k, tensor_bytes, stream); + PTO_PREFETCH((__gm__ void *)v, tensor_bytes, stream); } else { - PTO_PREFETCH((__gm__ void *)q, q_bytes, stream); - PTO_PREFETCH((__gm__ void *)k, kv_bytes, stream); - PTO_PREFETCH((__gm__ void *)v, kv_bytes, stream); + PTO_PREFETCH((__gm__ void *)q, tensor_bytes, stream); + PTO_PREFETCH((__gm__ void *)k, tensor_bytes, stream); + PTO_PREFETCH((__gm__ void *)v, tensor_bytes, stream); } #endif From 6dfed5aaa63fd3b78c05c18c0fe224bb05b47dda Mon Sep 17 00:00:00 2001 From: learning-chip Date: Wed, 6 May 2026 08:20:55 +0000 Subject: [PATCH 17/17] add tile=256 perf result --- .../cpp_ref/split_pipe/README.md | 11 +++++++++++ .../results/fa_splitpipe_tile256.png | Bin 0 -> 106702 bytes .../fa_splitpipe_tile512.png} | Bin 3 files changed, 11 insertions(+) create mode 100644 examples/aot/flash_attention/cpp_ref/split_pipe/README.md create mode 100644 examples/aot/flash_attention/cpp_ref/split_pipe/results/fa_splitpipe_tile256.png rename examples/aot/flash_attention/cpp_ref/split_pipe/{fa_split_pipe_s1_plot.png => results/fa_splitpipe_tile512.png} (100%) diff --git a/examples/aot/flash_attention/cpp_ref/split_pipe/README.md b/examples/aot/flash_attention/cpp_ref/split_pipe/README.md new file mode 100644 index 00000000..2a4cb292 --- /dev/null +++ b/examples/aot/flash_attention/cpp_ref/split_pipe/README.md @@ -0,0 +1,11 @@ +Try different tile sizes (512 gets highest TFLOPs for long sequence) + +```bash +export PTODSL_TEST_DEVICE_ID=7 + +python ./run.py --tile-s1 512 # default +python ./run.py --tile-s1 256 # slower for long seq +python ./run.py --tile-s1 1024 # wrong result +``` + +Reference outputs in [./results](./results) diff --git a/examples/aot/flash_attention/cpp_ref/split_pipe/results/fa_splitpipe_tile256.png b/examples/aot/flash_attention/cpp_ref/split_pipe/results/fa_splitpipe_tile256.png new file mode 100644 index 0000000000000000000000000000000000000000..e3659c949e9fd221c23d6e91c8989cdf5ec18164 GIT binary patch literal 106702 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 v@qcfvK)(!q{U12T|MzRq75LxS*!2Uf5d7}Es5-