§
     ’Þj´?  ã                   óŠ  — d Z ddlmZ ddlZddlmZ 	 ddlmZ ddlm	Z	 d„ Z
n# e$ r ddlmZ ddlm	Z	 d„ Z
Y nw xY w	 d	d
lm	ZmZ n# e$ r dxZZY nw xY wddiZddiZdZddd	dœZdZdZd„ Zd+d„Zd„ Z ed¦  «        d„ ¦   «         Z ed¦  «        d„ ¦   «         Z ed¦  «        d„ ¦   «         Zd„ Zd„ Zd„ Z d,d„Z!ej"        j#        d„ ¦   «         Z$d,d„Z%ej"        j#        d „ ¦   «         Z&ej"        j#        d,d!„¦   «         Z'ej"        j#        d-d"„¦   «         Z(d#„ Z)d$„ Z*d%„ Z+d&„ Z,d'„ Z-d(„ Z.d)„ Z/ej"        j#        d.d*„¦   «         Z0dS )/a  SageAttention (1): INT8 q/k per block of tokens and fp16 v, the Triton kernels of sageattn_varlen (SageAttention 1.0.6, or the copy
SageAttention 2 keeps in its triton package), launched without its device sync (the sizes of its scales read on the GPU) so that CUDA
graphs can record them, and in stages for the attention kit: v, k and q quantized as soon as each is computed, the output written into
q. Same values as sageattn_varlen for sequences of the same length (all batch items), head_dim 64 or 128, no mask.é    )Ú	lru_cacheN)Ú
token_mean)Úquant_per_block_int8_kernel)Ú	_attn_fwdc                 ó   — d| dz  z  S )Nç      ð?g      à?© ©Úhead_dims    ú9C:\Users\johnn\OneDrive\Documents\AI\shared\sage1_core.pyÚ	_sm_scaler      s   € Ø�X ‘_Ñ$Ð$ó    c                 ó   — | dz  S )Ng      à¿r	   r
   s    r   r   r      s   € Ø˜4ÑÐr   é   )r   Ú quant_per_block_int8_bits_kernelÚscale_vFT)é@   é€   é   é   é   g      €@i   c           
      óT  — t           j                             | t          d¦  «        |d¬¦  «                             ¦   «         }t          j        t          j        t          j        |                     dt          z  ¦  «        ¦  «        ¦  «        ¦  «         	                    d¬¦  «        S )zuPowers of two, at least 1, per head and channel of v (its batch and token dimensions: tokens_dims, kept with size 1).ÚinfT)ÚdimÚkeepdimr   )Úmin)
ÚtorchÚlinalgÚvector_normÚfloatÚexp2ÚceilÚlog2Úmul_Ú_V_LIMITÚclamp_)ÚvÚtokens_dimsÚamaxs      r   Úv_scalesr*   (   sx   € åŒ<×#Ò# A¥u¨U¡|¤|¸ÈdÐ#ÑSÔS×YÒYÑ[Ô[€DÝŒ:•e”j¥¤¨D¯IªI°a½(±lÑ,CÔ,CÑ!DÔ!DÑEÔEÑFÔF×MÒMÐRSÐMÑTÔTÐTr   ©r   r   c           	      óì   — |s!|                       t          j        ¦  «        dfS t          | |¦  «        }t          j        | |t          j        | j        t          j        | j        ¬¦  «        ¬¦  «        |fS )zKfp16 v and, with scale_v, its v_scales (v divided by them), None otherwise.N©ÚdtypeÚdevice)Úout)Útor   Úfloat16r*   ÚdivÚemptyÚshaper/   )r'   r   r(   Úscales       r   Úfp16_vr7   .   sh   € àð )Ø�tŠt•E”MÑ"Ô" DÐ(Ð(Ý�Q˜Ñ$Ô$€EÝŒ9�Q˜¥5¤;¨q¬w½e¼mÐTUÔT\Ð#]Ñ#]Ô#]Ð^Ñ^Ô^Ð`eÐeÐer   c                 óš   — | j         |         |j         |         z  }|                      |dk    r|n|                     ||¦  «        ¦  «        S )zkout multiplied in place by the v scales of its attention (out has more heads with grouped query attention).r   )r5   r$   Úrepeat_interleave)r0   r6   Ú	heads_dimÚgroupss       r   Úscale_outputr<   6   sH   € àŒY�yÔ! U¤[°Ô%;Ñ;€FØ�8Š8˜V qš[˜[�E�E¨e×.EÒ.EÀfÈiÑ.XÔ.XÑYÔYÐYr   c                 óT   — t           j                             | ¦  «        d         dk     S )Nr   é   )r   ÚcudaÚget_device_capability©r/   s    r   Ú_fp16_requiredrB   <   s"   € åŒ:×+Ò+¨FÑ3Ô3°AÔ6¸Ò:Ð:r   c                 ó2   — t           duot          | ¦  «        S )zbAttention masks run on the Turing kernel (compute capability 7.5); the packaged kernel takes none.N)Ú_attn_fwd_bitsrB   rA   s    r   Úmasks_supportedrE   A   s   € õ  Ð%Ð@­.¸Ñ*@Ô*@Ð@r   c                 óL   — t          | ¦  «        rt          dd…         nt          S )z�Head dims of the kernels on this device: at 256, q blocks of 128 rows need more shared memory than before compute capability 8.0.Né   )rB   Ú	HEAD_DIMSrA   s    r   Ú	head_dimsrI   G   s#   € õ +¨6Ñ2Ô2ÐA�9�R�a�RŒ=ˆ=½	ÐAr   c                 óV   ‡ — t          ˆ fd„t          |¦  «        D ¦   «         d¦  «        S )aK  The head_dim the kernels run a head_dim at: the next of head_dims(device), None beyond. attention pads q, k and v with zeros up to
    it, as SageAttention 2 does: the same q.k products (INT8, summed exactly), INT8 scales and key means, with the softmax scale of the
    real head_dim; the extra output channels (zero) are dropped.c              3   ó(   •K  — | ]}|‰k    ¯|V — Œd S ©Nr	   )Ú.0r   r   s     €r   ú	<genexpr>z"padded_head_dim.<locals>.<genexpr>Q   s'   øè è € ÐEÐE˜°S¸H²_°_�°_°_°_°_ÐEÐEr   N)ÚnextrI   )r   r/   s   ` r   Úpadded_head_dimrP   M   s2   ø€ õ ÐEÐEÐEÐE¥	¨&Ñ 1Ô 1ÐEÑEÔEÀtÑLÔLÐLr   c                 óT   — t          j        d| dz   |z  |t           j        |¬¦  «        S )zr[0, length, 2 length, ...] of the batch items, made on the GPU (a host copy would not be allowed in a CUDA graph).r   r   r-   )r   ÚarangeÚint32)ÚbatchÚlengthr/   s      r   Ú_offsetsrV   T   s)   € åŒ<˜˜E A™I¨Ñ/°½u¼{ÐSYÐZÑZÔZÐZr   c                 óf   — t           duo(| j        t          j        k    ot	          | j        ¦  «        S )zdA BF16 tensor on compute capability 7.5: the Turing kernels read it as bits instead of an FP16 copy.N)Ú_quant_bitsr.   r   Úbfloat16rB   r/   )Úxs    r   Ú_bits_inputr[   Y   s,   € å˜dÐ"Ð] q¤wµ%´.Ò'@Ð]Å^ÐTUÔT\ÑE]ÔE]Ð]r   c                 óœ  — | j         \  }}}}||z   dz
  |z  }t          j        ||z  ||ft          j        | j        ¬¦  «        }	t          j        ||z  |ft          j        | j        ¬¦  «        }
t          ||| j        ¦  «        t          ||| j        ¦  «        }}t          | ¦  «        rœt          |||f         |  	                    t          j
        ¦  «        |	|
|€|	n||||                      d¦  «        |                      d¦  «        |	                     d¦  «        |	                     d¦  «        |||||du¬¦  «         |	|
||fS |�t          d¦  «        ‚t          |||f         | |	|
|||                      d¦  «        |                      d¦  «        |	                     d¦  «        |	                     d¦  «        ||||¬¦  «         |	|
||fS )	a8  x (batch, tokens, heads, head_dim), batch items one after another in memory, as INT8 rows (batch * tokens, heads, head_dim) and
    scales per block of tokens and head, with the offsets of the batch items in both. mean (heads, head_dim), FP32: subtracted first
    inside the Turing kernel (BF16 x read as bits).r   r-   NrG   r   )Úsm_scaleÚHÚCÚBLKÚHAS_MEANzFthe key mean is folded into the quantization on the Turing kernel only)r]   r^   r_   r`   )r5   r   r4   Úint8r/   Úfloat32rV   r[   rX   ÚviewÚint16ÚstrideÚ
ValueErrorr   )rZ   Úblockr]   ÚmeanrT   ÚtokensÚheadsr   ÚblocksÚx_int8r6   ÚoffsetsÚscale_offsetss                r   Ú	_quantizerp   ^   s2  € ð &'¤WÑ"€Eˆ6�5˜(Ø�u‰n˜qÑ  UÑ*€FÝŒ[˜% &™.¨%°Ð:Å%Ä*ÐUVÔU]Ð^Ñ^Ô^€FÝŒK˜ ™¨Ð/µu´}ÈQÌXÐVÑVÔV€EÝ% e¨V°Q´XÑ>Ô>ÅÈÐPVÐXYÔX`Ñ@aÔ@aˆ]€GÝ�1�~„~ð 5Ý�V˜U EÐ*Ô+¨A¯FªFµ5´;Ñ,?Ô,?ÀÈÐZ^ÐZfÐPVÐPVÐlpÐryð  |IØ,-¯HªH°Q©K¬K¸¿ºÀ!¹¼ÀfÇmÂmÐTUÑFVÔFVÐX^×XeÒXeÐfgÑXhÔXhØ5=ÀÈ(ÐX]ÐhlÐtxÐhxð	zñ 	zô 	zð 	zð �u˜g }Ð4Ð4ØÐÝÐaÑbÔbÐbÝ ¨°Ð 6Ô7¸¸6À5È'ÐS`Ðbc×bjÒbjÐklÑbmÔbmÐop×owÒowÐxyÑozÔozð  }C÷  }Jò  }Jð  KLñ  }Mô  }Mð  OU÷  O\ò  O\ð  ]^ñ  O_ô  O_ØAIÈUÐV^Ðdiðkñ kô kð kà�5˜' =Ð0Ð0r   c                 ó  — | d         }|                       ¦   «          t          �L|j        t          j        k    r7|d         s/|j        d         t          k    rt          |j        ¦  «        r|ddfS g t          ||d         ¦  «        ¢d‘R S )zÜfp16 v with its scales (fp16_v, None without settings["scale_v"]); v is released. On compute capability 7.5, an unscaled BF16 v
    of a short sequence stays as it is: the Turing kernel reads its bits (staged_attention).r   Nr   r   )
ÚclearrD   r.   r   rY   r5   Ú_V_BITS_MAX_TOKENSrB   r/   r7   )Úv_listÚsettingsr'   s      r   Ústaged_quantize_vrv   s   sœ   € ð 	ˆqŒ	€AØ
‡L‚L�N„N€NÝÐ" q¤wµ%´.Ò'@Ð'@ÈÐR[ÔI\Ð'@ÐabÔahÐijÔakõ  pBò  bBð  bBÝ˜qœxÑ(Ô(ð bBà�$˜ˆ}ÐØ0�F�1�h˜yÔ)Ñ*Ô*Ð0¨DÐ0Ð0Ð0r   c           
      ó<  —  | j         dg| j        dd…         ¢R Ž }t          | ¦  «        r,t          | dd|€t	          |dd¬¦  «        d         n|¦  «        S |�t          d	¦  «        ‚| j        t          j        k    rNt          | j
        ¦  «        r:|                      t          j        ¦  «        }  | j         dg| j        dd…         ¢R Ž }t	          |d¦  «        }t          |r|                     |¦  «        n||z
                        | j        ¦  «        dd¦  «        S )
z€INT8 k minus its mean over the tokens of all batch items (or mean, (heads, head_dim) FP32: Turing kernel only), with its scales.éÿÿÿÿrG   Nr   r   r   T)Úfp32z8A given key mean is subtracted by the Turing kernel only)rd   r5   r[   rp   r   rg   r.   r   rY   rB   r/   r1   r2   Úsub_)ÚkÚin_placeri   Úrowss       r   Ú_quantize_kr~      s  € àˆ1Œ6�"Ð#�q”w˜q˜r˜r”{Ð#Ð#Ð#€DÝ�1�~„~ð bÝ˜˜B È$È,¥Z°°a¸dÐ%CÑ%CÔ%CÀAÔ%FÐ%FÐ\`ÑaÔaÐaØÐÝÐSÑTÔTÐTØ„w•%”.Ò Ð ¥^°A´HÑ%=Ô%=Ð Ø�DŠD•”ÑÔˆØˆqŒv�bÐ'˜1œ7 1 2 2œ;Ð'Ð'Ð'ˆÝ�d˜AÑÔ€DÝ¨ÐB�d—i’i ‘o”o�o°t¸d±{×HÒHÈÌÑQÔQÐSUÐWZÑ[Ô[Ð[r   c                 ó‚   — | d         }|                       ¦   «          t          |d|                     d¦  «        ¦  «        S )a  INT8 k minus its mean over the tokens of all batch items, with its scales; k is released (the mean is subtracted in place).
    settings["k_mean"] (heads, head_dim) FP32, when present, is the mean subtracted instead (a cached prefix's: shared.attention_kit).r   TÚk_mean)rr   r~   Úget)Úk_listru   r{   s      r   Ústaged_quantize_krƒ   �   s8   € ð 	ˆqŒ	€AØ
‡L‚L�N„N€NÝ�q˜$ §¢¨XÑ 6Ô 6Ñ7Ô7Ð7r   c                 ó  — | j         t          j        k    rBt          | j        ¦  «        r.t          | ¦  «        s|                      t          j        ¦  «        } t          | d|€t          | j
        d         ¦  «        n|dz  ¦  «        S )z°INT8 q with its scales (the softmax scale, in base 2, goes into them: sm_scale, or that of q's head_dim); q is not released
    (staged_attention can write the output into it).r   Nrx   g/lîdG÷?)r.   r   rY   rB   r/   r[   r1   r2   rp   r   r5   )Úqru   r]   s      r   Ústaged_quantize_qr†   –   sq   € ð 	„w•%”.Ò Ð ¥^°A´HÑ%=Ô%=Ð ÅkÐRSÁnÄnÐ Ø�DŠD•”ÑÔˆÝ�Q˜¸Ð8H�i¨¬°¬Ñ4Ô4Ð4ÈhÐZdÑdÑeÔeÐer   c                 óÈ  — |\  \  }}}}\  }	}
}}\  }}}|                      ¦   «          | j        \  }}}}|                      d||¦  «         |j        dg|j        dd…         ¢R Ž }}| j        t          j        k    ot          duot          | j        ¦  «        }|j        t          j        k    }|r|st          d| j        › �¦  «        ‚| j        t          j        k    ot          | j        ¦  «        o| }|r+t	          j
        |j        t          j        | j        ¬¦  «        }|dz   dz  ||f}||	|r|                     t          j        ¦  «        n|||||
|||r|                     t          j        ¦  «        n|f
}|                     d¦  «        |                     d	¦  «        |	                     d¦  «        |	                     d	¦  «        |                     d¦  «        |                     d	¦  «        |                     d¦  «        |                     d	¦  «        f}t          dd
|d|d
k    rdndt          |         ¬¦  «        }|�rd\  }}|�’|j        t          j        k    r|                     t          j        ¦  «        n|                     t          j        ¦  «        }|                     ||||	j        d	         |z  ¦  «        }|j        t          j        k    rdnd}|r)t	          j
        |||ft          j        | j        ¬¦  «        n|}t          |         g |¢|€|n|‘|‘|¢|�|                     ¦   «         nd¢|‘||	j        d         z  ‘R |||dœ|¤Ž n<|€|rt          d¦  «        ‚t+          |         g |¢|¢|‘||	j        d         z  ‘R i |¤Ž |r-|                      |                     | j        ¦  «        ¦  «         |€| nt/          | |d¦  «        } |r| |fn| S )a­  Attention of the staged [q, k, v], written into out and returned: out has q's shape (batch, tokens, heads, head_dim) and its
    batch items one after another in memory: q itself, or a slice of heads of a larger output. Fewer heads in k/v: grouped query
    attention. return_lse (Turing kernel only): (out, lse), lse (batch, heads, tokens) FP32 the base-2 log-sum-exp of each query's
    scores without the keys' smoothing mean.rx   rG   NzFSageAttention on this GPU takes a BF16 v only with a BF16 output, not r-   é   r   r   r   r   r   r>   )ÚBLOCK_MÚBLOCK_NÚHEAD_DIMÚSTAGEÚ	num_warpsÚ
num_stages)Nr   )r   r   r   r   )ÚV_BITSÚ	MASK_MODEÚ
RETURN_LSEzZSageAttention takes an attention mask or returns the log-sum-exp only on the Turing kernel)rr   r5   rd   r.   r   rY   rD   rB   r/   rg   r4   r2   re   rf   ÚdictÚ_STAGESÚboolÚuint8r1   rc   Úexpandr   Úcopy_r<   )r0   Úquantized_listru   Ú	attn_maskÚ
return_lseÚq_int8Úq_scaleÚ	q_offsetsÚq_scale_offsetsÚk_int8Úk_scaleÚ	k_offsetsÚk_scale_offsetsr'   Úv_scaleÚ_rT   rj   rk   r   r}   ÚbitsÚv_bitsÚfp16_outputÚgridÚargsÚstridesÚlaunchÚmaskÚ	mask_modeÚlses                                  r   Ústaged_attentionr¯   Ÿ   s›  € ð uCÑqÑ1€VˆW�i Ñ3`°F¸GÀYÐP_ÑbqÐcdÐfmÐopØ×ÒÑÔÐØ%(¤YÑ"€Eˆ6�5˜(Ø�hŠh�r˜5 (Ñ+Ô+¨V¨Q¬V°BÐ-E¸¼ÀÀÀ¼Ð-EÐ-EÐ-Eˆ!€Dð Œ9�œÒ&Ðd­>ÀÐ+EÐdÍ.ÐY\ÔYcÑJdÔJd€DØŒW�œÒ&€FØð o�dð oÝÐmÐbeÔbkÐmÐmÑnÔnÐnØ”)�uœ~Ò-ÐYµ.ÀÄÑ2LÔ2LÐYÐUYÐQY€KØð OÝŒ{˜4œ:­U¬]À3Ä:ÐNÑNÔNˆØ�c‰\˜cÑ! 5¨%Ð0€DØ�F°6Ð@˜AŸFšF¥5¤;Ñ/Ô/Ð/¸qÀ)ÈYÐX_ÐahÐjyð  |KØ&*Ð4ˆD�IŠI•e”kÑ"Ô"Ð"°ð6€Dà�}Š}˜QÑÔ §¢¨qÑ!1Ô!1°6·=²=ÀÑ3CÔ3CÀVÇ]Â]ÐSTÑEUÔEUÐWX×W_ÒW_Ð`aÑWbÔWbÐde×dlÒdlÐmnÑdoÔdoÐqu×q|Òq|Ð}~ÑqÔqð  BF÷  BMò  BMð  NOñ  BPô  BPð  Q€GÝ˜# r°HÀAÐV^ÐbdÒVdÐVdÐQRÐQRÐjkÕxð  AIô  yJð  Kñ  Kô  K€FØñ Tà!‰ˆˆiØÐ Ø2;´/ÅUÄZÒ2OÐ2O�9—>’>¥%¤+Ñ.Ô.Ð.ÐU^×UaÒUaÕbgÔboÑUpÔUpˆDØ—;’;˜u e¨V°V´\À!´_ÈÑ5MÑNÔNˆDØ&œ_µ´
Ò:Ð:˜˜ÀˆIà]gÐs�eŒk˜5 %¨Ð0½¼ÈcÌjÐYÑYÔYÐYÐmsˆÝ�tÔð 	C˜dð 	C¨d¨l F FÀð 	CÀcð 	CÈGð 	CÐhlÐhxÐW[×WbÒWbÑWdÔWdÐWdð  Kð 	CØ"ð	CØ$)¨V¬\¸!¬_Ñ$<ð	Cð 	CØEKÐW`Ðmwð	Cð 	Cð |Bð	Cð 	Cð 	Cð 	Cð Ð  JÐ ÝÐyÑzÔzÐzÝ�$ŒÐS˜ÐS ÐS¨ÐS°¸¼Àa¼Ñ0HÐSÐSÐSÈFÐSÐSÐSØð (Ø�	Š	�$—)’)˜CœIÑ&Ô&Ñ'Ô'Ð'Ø�ˆ#ˆ#¥l°3¸ÀÑ&CÔ&C€CØ#Ð,ˆC�ˆ:ˆ:¨Ð,r   c                 óR   — t           d uo|t          j        k    ot          |¦  «        S rL   )rD   r   rY   rB   )ru   r/   r.   s      r   Úprefix_supportedr±   Î   s'   € Ý Ð%Ð\¨%µ5´>Ò*AÐ\ÅnÐU[ÑF\ÔF\Ð\r   c                 ó   — | S rL   r	   )ru   r/   r   s      r   Úprefix_settingsr³   Ò   s   € Ø€Or   c                 ó   — dS ©NFr	   )ru   s    r   Úprefix_fp8_vr¶   Ö   s   € Øˆ5r   c                 ó„   — t           | j        dg| j        dd…         ¢R Ž d¦  «        d                              ¦   «         S )zs(heads, head_dim) FP32 mean over the tokens of all batch items, rounded to k's dtype as SageAttention 2's prefixes.rx   rG   Nr   )r   Úreshaper5   r    )r{   s    r   Úprefix_meanr¹   Ú   sA   € å�i�a”i Ð1 Q¤W¨Q¨R¨R¤[Ð1Ð1Ð1°1Ñ5Ô5°aÔ8×>Ò>Ñ@Ô@Ð@r   c                 ó*   — | |j         |j        …         S rL   )ÚstartÚstop)ri   rk   s     r   Úprefix_mean_headsr½   ß   s   € Ø�”˜EœJÐ&Ô'Ð'r   c                 óä   — | d         j         dd…         \  }}t          | i |¥d|i¥¦  «        \  }}}} |j        ||g|j         dd…         ¢R Ž |                     |d|j         d         ¦  «        fS )zœA prefix's k (batch, tokens, heads, head_dim, released) quantized with mean: k_int8 (batch, tokens, heads, head_dim) and k_scale
    (batch, blocks, heads).r   NrG   r€   r   rx   )r5   rƒ   rd   )r‚   ru   ri   rT   rj   rŸ   r    r¤   s           r   Úprefix_quantize_kr¿   ã   sŠ   € ð ˜1”I”O B Q BÔ'�M€Eˆ6Ý-¨fÐ6R¸Ð6RÀ8ÈTÐ6RÐ6RÑSÔSÑ€FˆG�Q˜Øˆ6Œ;�u˜fÐ8 v¤|°A°B°BÔ'7Ð8Ð8Ð8¸'¿,º,ÀuÈbÐRYÔR_Ð`bÔRcÑ:dÔ:dÐdÐdr   c                 ó6  — | dd…dd…|j         |j        …f         |dd…dd…|j         |j        …f         }} | j        d         |k    r/|                      |ddd¦  «        |                     |dd¦  «        }} | j        d         |j        d         }} | j        dg| j        dd…         ¢R Ž                      ¦   «         |                     d|j        d         ¦  «                             ¦   «         t          ||| j        ¦  «        t          ||| j        ¦  «        fS )a   The quantized k of staged_attention for the heads of a cached prefix: k_int8 (batch, tokens, heads, head_dim) and k_scale
    (batch, blocks, heads) as _quantize makes them (batch items one after another), for batch items (one prefix item serves them all).Nr   rx   r   rG   )r»   r¼   r5   r–   r¸   Ú
contiguousrV   r/   )rŸ   r    rk   rT   rj   rl   s         r   Úprefix_krÂ   ë   s  € ð ˜Q˜Q˜Q    5¤;¨u¬zÐ#9Ð9Ô:¸GÀAÀAÀAÀqÀqÀqÈ%Ì+ÐV[ÔV`ÐJ`ÐD`Ô<aˆG€FØ„|�A„˜%ÒÐØ Ÿ-š-¨¨r°2°rÑ:Ô:¸G¿NºNÈ5ÐRTÐVXÑ<YÔ<Y�ˆØ”\ !”_ g¤m°AÔ&6ˆF€FØˆFŒN˜2Ð1 ¤¨Q¨R¨RÔ 0Ð1Ð1Ð1×<Ò<Ñ>Ô>ÀÇÂÐPRÐT[ÔTaÐbdÔTeÑ@fÔ@f×@qÒ@qÑ@sÔ@sÝ�U˜F F¤MÑ2Ô2µH¸UÀFÈFÌMÑ4ZÔ4Zð\ð \r   c                 ó  ‡‡— | \  }}}|                       ¦   «          |j        d         Št          ‰|j        ¦  «        |€t	          ‰¦  «        n|cŠ}‰‰k    rˆˆfd„|||fD ¦   «         \  }}}|rt
          nt          }dt          |d¦  «        t          |g|¦  «        g}	dx}}t          |||¦  «        |	d<   t          |r|nt          j        |t          j        ¬¦  «        |	||¦  «        }
‰‰k    r|
n|
dd‰…f         S )aR  sageattn_varlen of q, k and v (batch, tokens, heads, head_dim, batch items one after another in memory) handed off in qkv_list,
    every batch item with all its tokens. k and v are not modified (others may hold them); the output is written into q with
    recycle_q. scale_v: v scaled by powers of two (fp16_v). attention_mask: SageAttention's (batch, heads, q, k) layout
    (shared.attention.sage_attention_mask), Turing kernel only (masks_supported). sm_scale: the softmax scale, that of the head_dim by
    default. A head_dim the kernels do not run is padded with zeros (padded_head_dim).rx   Nc              3   ól   •K  — | ].}t           j        j                             |d ‰‰z
  f¦  «        V — Œ/dS )r   N)r   ÚnnÚ
functionalÚpad)rM   Útensorr   Úpaddeds     €€r   rN   zattention.<locals>.<genexpr>  sB   øè è € ÐcÐcÈv•5”8Ô&×*Ò*¨6°A°vÀÑ7HÐ3IÑJÔJÐcÐcÐcÐcÐcÐcr   Fr   )Úmemory_format.)rr   r5   rP   r/   r   ÚSCALED_V_SETTINGSÚSETTINGSr~   rv   r†   r¯   r   Ú
empty_likeÚcontiguous_format)Úqkv_listÚ	recycle_qr   Úattention_maskr]   r…   r{   r'   ru   Ú	quantizedr0   r   rÉ   s              @@r   Ú	attentionrÓ   ö   s>  øø€ ð �G€A€qˆ!Ø‡N‚NÑÔÐØŒw�rŒ{€HÝ& x°´Ñ:Ô:ÐS[ÐSc½IÀhÑ<OÔ<OÐ<OÐiqÐ€FˆHØ�ÒÐØcÐcÐcÐcÐcÐZ[Ð]^Ð`aÐYbÐcÑcÔc‰ˆˆ1ˆaØ$+Ð9Õ Ð µ€HØ•{ 1 eÑ,Ô,Õ.?ÀÀÀXÑ.NÔ.NÐO€IØ€L€AˆÝ$ Q¨°(Ñ;Ô;€Iˆa�LÝ
 	Ði˜1˜1­uÔ/?ÀÕQVÔQhÐ/iÑ/iÔ/iÐktÐv~ð  AOñ  Pô  P€CØ˜HÒ$Ð$ˆ3ˆ3¨#¨c°9°H°9¨nÔ*=Ð=r   )r+   rL   rµ   )FFNN)1Ú__doc__Ú	functoolsr   r   Úshared.kernels.token_meanr   Ú+sageattention.triton.quant_per_block_varlenr   Ú.sageattention.triton.attn_qk_int8_block_varlenr   r   ÚImportErrorÚ$sageattention.quant_per_block_varlenÚ'sageattention.attn_qk_int8_block_varlenÚsage1_turingrD   r   rX   rÌ   rË   rH   r“   r%   rs   r*   r7   r<   rB   rE   rI   rP   rV   r[   rp   ÚcompilerÚdisablerv   r~   rƒ   r†   r¯   r±   r³   r¶   r¹   r½   r¿   rÂ   rÓ   r	   r   r   ú<module>rß      s�  ððvð vð  Ð Ð Ð Ð Ð à €€€à 0Ð 0Ð 0Ð 0Ð 0Ð 0ð	 ØWÐWÐWÐWÐWÐWØHÐHÐHÐHÐHÐHð%ð %ð %ð %øàð  ð  ð  ØPÐPÐPÐPÐPÐPØAÐAÐAÐAÐAÐAð ð  ð  ð  ð  ð øøøð
(ØjÐjÐjÐjÐjÐjÐjÐjÐjøØð (ð (ð (Ø#'Ð'€N�[�[�[ð(øøøð �uÐ€Ø Ð%Ð Ø€	Ø�q˜qÐ
!Ð
!€ð
 €ð Ð ðUð Uð Uðfð fð fð fðZð Zð Zð €ˆ4�„ð;ð ;ñ „ð;ð €ˆ4�„ðAð Añ „ðAð
 €ˆ4�„ðBð Bñ „ðBð
Mð Mð Mð[ð [ð [ð
^ð ^ð ^ð
1ð 1ð 1ð 1ð* „Ôð1ð 1ñ Ôð1ð\ð \ð \ð \ð „Ôð8ð 8ñ Ôð8ð „Ôðfð fð fñ Ôðfð „Ôð)-ð )-ð )-ñ Ôð)-ð\]ð ]ð ]ðð ð ðð ð ðAð Að Að
(ð (ð (ðeð eð eð\ð \ð \ð „Ôð>ð >ð >ñ Ôð>ð >ð >s   ”$ ¤;º;¿A Á	AÁA