§
    �Štj�R  ã                  ó>  — U d Z ddlmZ ddlZddlZddlmZ erddlmZ ddl	m
Z
 ddlmZ ddlmZmZ ddlZdd	lmZ d
dlmZ dgZdaded<   daded<   e
 G d„ d¦  «        ¦   «         Zedhd„¦   «         Z	 didjd„Zdkd„Zdld„Zdmd+„Zdnd2„Zdod9„Z  ed:¦  «        Z!dpd=„Z"dqd?„Z#	 	 	 	 	 	 drdsdJ„Z$	 dtdudP„Z%	 	 	 dvddQdQdddddRddSœ	dwdV„Z&ddQdQdddddWœdxdX„Z'ddQdQddddddYœdydZ„Z(dddd[œdzd^„Z)	 	 	 	 	 	 d{dd`œd|da„Z*	 	 	 d}dd`œd~db„Z+dd`œdde„Z, ej-        dfe¬g¦  «         dS )€z�
PROTOTYPE!
Flash Attention 3 implementation.
For fp8: only supports forward pass right now.
For fp16/bf16: supports forward and backward pass.
é    )ÚannotationsN)ÚTYPE_CHECKING)ÚCallable)Ú	dataclass)Úcache)ÚTypeVarTupleÚUnpack)ÚLibraryé   )Ú	_registryÚregister_flash_attention_fa3zCallable | NoneÚ_FA3_CUDA_FWDÚ_FA3_CUDA_BWDc                  ó"   — e Zd ZU ded<   dd„ZdS )Ú
_FA3HandlezLibrary | NoneÚlibraryÚreturnÚNonec                óR   — d | _         t          j                             d¦  «         d S )NF)r   ÚtorchÚ_CÚ_set_sdp_use_fa3)Úselfs    úU/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/torch/nn/attention/_fa3.pyÚremovez_FA3Handle.remove*   s%   € ØˆŒåŒ×!Ò! %Ñ(Ô(Ð(Ð(Ð(ó    N)r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r   © r   r   r   r   &   s6   € € € € € € àÐÐÑð)ð )ð )ð )ð )ð )r   r   Údeviceútorch.devicer   Úintc                óJ   — t           j                             | ¦  «        \  }}|S ©N)r   ÚcudaÚget_device_capability)r"   ÚmajorÚ_s      r   Ú_get_device_majorr+   0   s    € åŒz×/Ò/°Ñ7Ô7�H€Eˆ1Ø€Lr   Úflash_attn_interfaceÚmodule_pathÚstrc                ó”   — t          | ¦  «         t          j                             d¦  «         t	          t          ¦   «         ¦  «        S )z™
    Register FA3 flash attention kernels with the PyTorch dispatcher.

    Args:
        module_path: Python module path to the FA3 implementation.
    T)Ú_fa3_import_moduler   r   r   r   Ú_fa3_register_kernels©r-   s    r   r   r   6   s?   € õ �{Ñ#Ô#Ð#õ 
„H×Ò˜dÑ#Ô#Ð#åÕ+Ñ-Ô-Ñ.Ô.Ð.r   r   c                ó¨  — t          j        | ¦  «         t          t          j        d¦  «        st          d| › d�¦  «        ‚t          t          j        j        d¦  «        st          d| › d�¦  «        ‚t          t          j        j        d¦  «        st          d| › d�¦  «        ‚t          j        j        j        at          j        j        j	        a
d S )NÚflash_attn_3zModule 'z' does not expose FA3 kernelsÚfwdz%' does not expose FA3 forward kernelsÚbwdz&' does not expose FA3 backward kernels)Ú	importlibÚimport_moduleÚhasattrr   ÚopsÚRuntimeErrorr4   r5   r   r6   r   r2   s    r   r0   r0   G   sÒ   € ÝÔ˜KÑ(Ô(Ð(Ý•5”9˜nÑ-Ô-ð RÝÐP kÐPÐPÐPÑQÔQÐQÝ•5”9Ô)¨5Ñ1Ô1ð 
ÝØI�{ÐIÐIÐIñ
ô 
ð 	
õ •5”9Ô)¨5Ñ1Ô1ð 
ÝØJ�{ÐJÐJÐJñ
ô 
ð 	
õ ”IÔ*Ô.€MÝ”IÔ*Ô.€M€M€Mr   r
   c                 ó°  — t          ddd¦  «        } |                      dt          d¦  «         |                      dt          d¦  «         |                      dt          d¦  «         |                      dt
          d¦  «         |                      dt          d¦  «         |                      d	t          d¦  «         |                      d
t          d¦  «         | S )NÚatenÚIMPLÚCUDAz"_flash_attention_forward.quantizedz-_scaled_dot_product_flash_attention.quantizedÚ_flash_attention_forwardÚ+_flash_attention_forward_no_dropout_inplaceÚ#_scaled_dot_product_flash_attentionÚ_flash_attention_backwardÚ,_scaled_dot_product_flash_attention_backward)	r
   ÚimplÚ!_fa3_flash_attention_forward_implÚ4_fa3_scaled_dot_product_flash_attention_forward_implÚ)_fa3_flash_attention_forward_impl_defaultÚ4_fa3_flash_attention_forward_no_dropout_inplace_implÚ<_fa3_scaled_dot_product_flash_attention_forward_impl_defaultÚ"_fa3_flash_attention_backward_implÚ5_fa3_scaled_dot_product_flash_attention_backward_impl)Úlibs    r   r1   r1   X   sõ   € Ý
�&˜& &Ñ
)Ô
)€CØ‡H‚HØ,Õ.OÐQWñô ð ð ‡H‚HØ7Ý<Øñô ð ð
 ‡H‚HØ"Õ$MÈvñô ð ð ‡H‚HØ5Ý<Øñô ð ð
 ‡H‚HØ-ÝDØñô ð ð ‡H‚HÐ(Õ*LÈfÑUÔUÐUØ‡H‚HØ6Ý=Øñô ð ð
 €Jr   Úqueryútorch.TensorÚtensorsútuple[torch.Tensor, ...]Ú	dropout_pÚfloatÚ	cum_seq_qútorch.Tensor | NoneÚ	q_descaleÚ	k_descaleÚ	v_descaleú
str | Nonec                óØ  — |dk    rdS t          d„ |D ¦   «         ¦  «        sdS t          d„ |D ¦   «         ¦  «        dk    rdS | j        t          j        k    r |�|�|€t          j        dt          ¦  «         |€|                      ¦   «         d	k    rd
S |�|                      ¦   «         dk    rdS t          j	         
                    ¦   «         sdS t          | j        ¦  «        dk    rdS d S )Nç        zdropout_p must be 0c              3  ó$   K  — | ]}|j         V — Œd S r&   )Úis_cuda©Ú.0Úts     r   ú	<genexpr>z,_fa3_common_support_error.<locals>.<genexpr>…   s$   è è € Ð*Ð*˜QˆqŒyÐ*Ð*Ð*Ð*Ð*Ð*r   zinputs must be CUDA tensorsc                ó   — h | ]	}|j         ’Œ
S r!   )r"   r^   s     r   ú	<setcomp>z,_fa3_common_support_error.<locals>.<setcomp>‡   s   € Ð&Ð&Ð&˜ˆAŒHÐ&Ð&Ð&r   r   úinputs must share devicez¯When using SDPA with fp8, descale tensor should always be used for accurate dequantization. Please use _scaled_dot_product_attention_quantized and provide the descale tensors.é   zdense query must be 4Dé   zragged query must be 3DzCUDA not availableé	   z#FA3 requires compute capability 9.0)ÚallÚlenÚdtyper   Úfloat8_e4m3fnÚwarningsÚwarnÚUserWarningÚdimr'   Úis_availabler+   r"   )rN   rP   rR   rT   rV   rW   rX   s          r   Ú_fa3_common_support_errorrq   y   s  € ð �CÒÐØ$Ð$åÐ*Ð* 'Ð*Ñ*Ô*Ñ*Ô*ð -Ø,Ð,Ý
Ð&Ð&˜gÐ&Ñ&Ô&Ñ'Ô'¨1Ò,Ð,Ø)Ð)Ø„{•eÔ)Ò)Ð)ØÐ˜YÐ.°)Ð2CåŒð+õ ñ	
ô 	
ð 	
ð Ð˜UŸYšY™[œ[¨AÒ-Ð-Ø'Ð'ØÐ §¢¡¤°Ò!1Ð!1Ø(Ð(ÝŒ:×"Ò"Ñ$Ô$ð $Ø#Ð#Ý˜œÑ&Ô&¨!Ò+Ð+Ø4Ð4Øˆ4r   ÚkeyÚvalueÚreturn_debug_maskÚboolÚalibi_slopesÚ	seqused_kc           	     ót  ‡— |rdS |�dS |� |j         t          j        k    rdS |j        sdS t          j        t          j        t          j        fŠt          ˆfd„| ||hD ¦   «         ¦  «        sd‰› �S t          d„ | ||hD ¦   «         ¦  «        dk    rd	S t          | | ||f||||	|
¦  «        }|�
|d
k    rdS |S d S )Nzreturn_debug_mask must be Falsezalibi_slopes not supportedzseqused_k must be int32zseqused_k must be CUDAc              3  ó*   •K  — | ]}|j         ‰v V — Œd S r&   ©rj   ©r_   r`   Úsupported_dtypess     €r   ra   z-_fa3_forward_support_error.<locals>.<genexpr>µ   s+   øè è € ÐHÐH¨qˆqŒwÐ*Ð*ÐHÐHÐHÐHÐHÐHr   úinputs must be one of c                ó   — h | ]	}|j         ’Œ
S r!   rz   r^   s     r   rc   z-_fa3_forward_support_error.<locals>.<setcomp>·   s   € Ð1Ð1Ð1˜ˆAŒGÐ1Ð1Ð1r   r   ú#all inputs must have the same dtyperd   z(query, key, value must be on same device)
rj   r   Úint32r]   rk   Úfloat16Úbfloat16rh   ri   rq   )rN   rr   rs   rR   rt   rv   rw   rT   rV   rW   rX   Úerrorr|   s               @r   Ú_fa3_forward_support_errorr„   ž   s  ø€ ð ð 1Ø0Ð0ØÐØ+Ð+ØÐØŒ?�eœkÒ)Ð)Ø,Ð,ØÔ ð 	,Ø+Ð+ÝÔ+­U¬]½E¼NÐKÐÝÐHÐHÐHÐH°U¸CÀÐ4GÐHÑHÔHÑHÔHð ;Ø:Ð(8Ð:Ð:Ð:Ý
Ð1Ð1˜e S¨%Ð0Ð1Ñ1Ô1Ñ2Ô2°aÒ7Ð7Ø4Ð4Ý%ØØ	��UÐØØØØØñô €Eð ÐØÐ.Ò.Ð.Ø=Ð=ØˆØˆ4r   Úgrad_outÚoutÚ	logsumexpÚwindow_size_leftú
int | NoneÚwindow_size_rightc
           	     óf  ‡— |j         t          j        k    r	 dS |j         t          j        k    rdS t          j        t          j        fŠt          ˆfd„| ||||hD ¦   «         ¦  «        sd‰› �S t          d„ | ||||hD ¦   «         ¦  «        dk    rdS t          || |||||f||d d d ¦  «        }
|
�|
S d S )NzHFA3 backward does not support fp8 - use inference only (torch.no_grad())zlogsumexp dtype must be float32c              3  ó*   •K  — | ]}|j         ‰v V — Œd S r&   rz   r{   s     €r   ra   z._fa3_backward_support_error.<locals>.<genexpr>Ý   s+   øè è € ÐWÐW¨qˆqŒwÐ*Ð*ÐWÐWÐWÐWÐWÐWr   r}   c                ó   — h | ]	}|j         ’Œ
S r!   rz   r^   s     r   rc   z._fa3_backward_support_error.<locals>.<setcomp>ß   s   € Ð@Ð@Ð@˜ˆAŒGÐ@Ð@Ð@r   r   r   )	rj   r   rk   Úfloat32r�   r‚   rh   ri   rq   )r…   rN   rr   rs   r†   r‡   rR   rT   rˆ   rŠ   rƒ   r|   s              @r   Ú_fa3_backward_support_errorr�   É   sþ   ø€ ð „{•eÔ)Ò)Ð)àVð	
ð 	
ð „�%œ-Ò'Ð'Ø0Ð0Ýœ¥u¤~Ð6ÐÝÐWÐWÐWÐW°X¸uÀcÈ5ÐRUÐ4VÐWÑWÔWÑWÔWð ;Ø:Ð(8Ð:Ð:Ð:Ý
Ð@Ð@˜h¨¨s°E¸3Ð?Ð@Ñ@Ô@ÑAÔAÀQÒFÐFØ4Ð4Ý%ØØ	�5˜#˜u c¨9Ð5ØØØØØñô €Eð ÐØˆØˆ4r   ÚTsú
Unpack[Ts]útuple[Unpack[Ts]]c                 ó4   — t          d„ | D ¦   «         ¦  «        S )Nc              3  óB   K  — | ]}|                      d d¦  «        V — ŒdS )r   é   N)Ú	transposer^   s     r   ra   z#_transpose_dense.<locals>.<genexpr>ó   s0   è è € Ð4Ð4 q�—’˜Q Ñ"Ô"Ð4Ð4Ð4Ð4Ð4Ð4r   )Útuple)rP   s    r   Ú_transpose_denser˜   ò   s   € ÝÐ4Ð4¨GÐ4Ñ4Ô4Ñ4Ô4Ð4r   Úxc                ód   — | �-|                       d¦  «        dk    r|                      ¦   «         n| S )z2Ensure tensor is contiguous in the last dimension.Néÿÿÿÿr   )ÚstrideÚ
contiguous)r™   s    r   Ú_maybe_contiguousrž   ö   s,   € à˜]¨q¯xªx¸©|¬|¸qÒ/@Ð/@ˆ1�<Š<‰>Œ>ˆ>ÀaÐGr   Úcu_seq_qÚcu_seq_kÚmax_qÚmax_kÚscaleúfloat | NoneÚ	is_causalÚblock_tableÚ
num_splitsú!tuple[torch.Tensor, torch.Tensor]c                ó  — t           €t          d¦  «        ‚t          | ¦  «        }t          |¦  «        }|j        t          j        k    rF|                     d¦  «        dk    r-|                     d¦  «        dk    r|                     ¦   «         nt          |¦  «        }t          |¦  «        }t          |¦  «        }t          |¦  «        }t          |¦  «        }t          g |‘|‘|‘d‘d‘d‘|‘|‘|‘d‘d‘|‘|‘|‘|‘d‘d‘d‘d‘d‘|‘|‘|‘|‘|‘|	�|	nd‘|
�|
nd‘d‘d‘d‘d‘|pt	          j        ¦   «         rdnd‘d‘t          j	         
                    ¦   «         pd‘R Ž \  }}}}||                     ¦   «         fS )	zF
    Run the FA3 forward pass by calling the C++ kernel directly.
    NúFA3 not registeredr›   r   éýÿÿÿr   r[   T)r   r;   rž   rj   r   rk   rœ   r�   Ú$are_deterministic_algorithms_enabledr   Ú_get_sm_carveout_experimental)rN   rr   rs   rŸ   r    r¡   r¢   r£   r¥   rˆ   rŠ   rw   r†   rV   rW   rX   r¦   r§   ÚqÚkÚvÚcu_seqlens_qÚcu_seqlens_kÚsoftmax_lseÚ	out_accumÚsoftmax_lse_accums                             r   Ú_fa3_run_forwardr¶   û   s¡  € õ. ÐÝÐ/Ñ0Ô0Ð0å˜%Ñ Ô €AÝ˜#ÑÔ€Að Œ;�%Ô-Ò-Ð-Ø�LŠL˜ÑÔ Ò!Ð!Ø�LŠL˜ÑÔ Ò!Ð!ð 	×ÒÑÔÐõ ˜uÑ%Ô%ð õ % XÑ.Ô.€LÝ$ XÑ.Ô.€LÝ! )Ñ,Ô,€IÝ# KÑ0Ô0€Kå5Bð $6Ø	ð$6à	ð$6ð 	
ð$6ð 	ð	$6ð
 	ð$6ð 	ð$6ð 	ð$6ð 	ð$6ð 	ð$6ð 	ð$6ð 	ð$6ð 	ð$6ð 	ð$6ð 	ð$6ð 	ð$6ð  	ð!$6ð" 	ð#$6ð$ 	ð%$6ð& 	ð'$6ð( 	ð)$6ð* 	ð+$6ð, 	ð-$6ð. 	ð/$6ð0 	ð1$6ð2 	ð3$6ð4 -Ð8ÐÐ¸bð5$6ð6 /Ð:ÐÐÀð7$6ð8 	
ð9$6ð: 	ð;$6ð< 	ð=$6ð> 	ð?$6ð@ 	ð 	FÝÔ;Ñ=Ô=ÐDˆAˆAÀ1ðC$6ðD 	ðE$6õF 	Œ×.Ò.Ñ0Ô0Ð5°AðG$6ð $6ð $6Ñ2€Cˆ�iÐ!2ðJ �×&Ò&Ñ(Ô(Ð(Ð(r   FÚmax_seqlen_qÚmax_seqlen_kÚdeterministicú/tuple[torch.Tensor, torch.Tensor, torch.Tensor]c                ó¨  — t           €t          d¦  «        ‚t          | ¦  «        }|                     d¦  «        dk    r|                     ¦   «         n|}|                     d¦  «        dk    r|                     ¦   «         n|}|                     d¦  «        dk    r|                     ¦   «         n|}t          |¦  «        }t          |¦  «        }t          j        |¦  «        }t          j        |¦  «        }t          j        |¦  «        }t          |||||||||||d d ||	|
|||d|t
          j                             ¦   «         pd¦  «         |||fS )Nrª   r›   r   r[   r   )	r   r;   rž   rœ   r�   r   Ú
empty_liker   r­   )r…   rN   rr   rs   r†   r‡   rŸ   r    r·   r¸   r£   r¥   rˆ   rŠ   r¹   Údoutr®   r¯   r°   ÚoÚlseÚdqÚdkÚdvs                           r   Ú_fa3_run_backwardrÃ   L  si  € õ" ÐÝÐ/Ñ0Ô0Ð0õ ˜XÑ&Ô&€DØ#Ÿlšl¨2Ñ.Ô.°!Ò3Ð3ˆ×ÒÑÔÐ¸€AØŸJšJ r™NœN¨aÒ/Ð/ˆ�ŠÑÔÐ°S€AØ#Ÿlšl¨2Ñ.Ô.°!Ò3Ð3ˆ×ÒÑÔÐ¸€AÝ˜#ÑÔ€AÝ
˜IÑ
&Ô
&€Cõ 
Ô	˜!Ñ	Ô	€BÝ	Ô	˜!Ñ	Ô	€BÝ	Ô	˜!Ñ	Ô	€BÝØØ	Ø	Ø	Ø	ØØ
Ø
Ø
ØØØØØØØØØØØØÝŒ×.Ò.Ñ0Ô0Ð5°Añ-ô ð ð0 ˆr�2ˆ:Ðr   r›   T©	r£   rˆ   rŠ   rw   rv   r†   r¦   Úcompute_auxiliaryr§   Ú	cum_seq_krÅ   c       	        óœ  — t          | ||||	||||
||¦  «        }|�t          d|› �¦  «        ‚t          | |||||||||||||
||||¦  «        \  }}|rnt          j        dt          j        | j        ¬¦  «        }t          j        dt          j        | j        ¬¦  «        }t          j        d| j        | j        ¬¦  «        }nd }d }d }|||||fS )Nz)FA3 flash_attention forward unsupported: )r•   )rj   r"   r!   r   )	r„   r;   r¶   r   ÚzerosÚuint64r"   Úemptyrj   )rN   rr   rs   rT   rÆ   r¡   r¢   rR   r¥   rt   rV   rW   rX   r£   rˆ   rŠ   rw   rv   r†   r¦   rÅ   r§   rƒ   r¿   Ú	rng_stateÚphilox_offsetÚ
debug_masks                              r   rF   rF   ‡  s  € õ2 'ØØØØØØØØØØØñô €Eð ÐÝÐNÀuÐNÐNÑOÔOÐOÝØØØØØØØØØØØØØØØØØØñ%ô �H€Cˆð( ð Ý”K ­E¬LÀÄÐNÑNÔNˆ	Ýœ B­e¬lÀ5Ä<ÐPÑPÔPˆÝ”[ ¨%¬+¸e¼lÐKÑKÔKˆ
ˆ
àˆ	ØˆØˆ
Ø��Y ¨zÐ9Ð9r   )r£   rˆ   rŠ   rw   rv   r¦   r§   c               óT   — t          |||||||||	|
d d d f|||||| |d|dœ	Ž\  }}}}}|S )NFrÄ   ©rF   )r†   rN   rr   rs   rT   rÆ   r¡   r¢   rR   r¥   rt   r£   rˆ   rŠ   rw   rv   r¦   r§   r*   r¿   s                       r   rI   rI   Î  sr   € õ* 8ØØØØØØØØØØØØØðð Ø)Ø+ØØ!ØØØØð-ð ð �O€A€sˆAˆq�!ð0 €Jr   )r£   rˆ   rŠ   rw   rv   r¦   r†   r§   c
               óJ   — t          | |||||||||	d d d |
|||||||¬¦  «        S )N)r£   rˆ   rŠ   rw   rv   r†   r¦   r§   rÏ   )rN   rr   rs   rT   rÆ   r¡   r¢   rR   r¥   rt   r£   rˆ   rŠ   rw   rv   r¦   r†   r§   s                     r   rH   rH   þ  sZ   € õ* -ØØØØØØØØØØØØØØØ)Ø+ØØ!ØØØð+ñ ô ð r   )r£   rˆ   rŠ   rË   Úunusedc               óÜ   — t          | ||||||
|||¦
  «
        }|�t          d|› �¦  «        ‚t          j        ¦   «         }t	          | |||||||||	|||�|nd|�|nd|¦  «        \  }}}|||fS )z0FA3 implementation of _flash_attention_backward.Nz*FA3 flash_attention backward unsupported: r›   )r�   r;   r   r¬   rÃ   )r…   rN   rr   rs   r†   r‡   rT   rÆ   r¡   r¢   rR   r¥   rË   rÑ   r£   rˆ   rŠ   rƒ   r¹   rÀ   rÁ   rÂ   s                         r   rK   rK   ,  sÄ   € õ* (ØØØØØØØØØØñô €Eð ÐÝÐOÈÐOÐOÑPÔPÐPåÔ>Ñ@Ô@€Må"ØØØØØØØØØØØØØ,Ð8ÐÐ¸bØ.Ð:ÐÐÀØñô �J€BˆˆBð" ˆr�2ˆ:Ðr   r[   ©r£   c	               ó4  — t          | ||||d d d |||¦  «        }
|
�t          d|
› �¦  «        ‚t          | ||¦  «        \  }}}| j        t          j        k    rt          j        n| j        }t	          j        | |¬¦  «        }|                     dd¦  «        }| 	                    d¦  «        }| 	                    d¦  «        }t          |||d d ||||||	||||¬¦  «        \  }}}}}|  	                    d¦  «        }| 	                    d¦  «        }||d d |||||f	S )NzFA3 SDPA forward unsupported: rz   r   r•   )r£   r†   rV   rW   rX   )r„   r;   r˜   rj   r   rk   r‚   r¼   r–   ÚsizerF   )rN   rr   rs   rV   rW   rX   rR   r¥   rt   r£   rƒ   r®   r¯   r°   Ú	out_dtypeÚout_bhsdÚout_bshdÚmax_q_flashÚmax_k_flashr*   r¿   rË   rÌ   rÍ   r¡   r¢   s                             r   rG   rG   g  sa  € õ 'ØØØØØØØØØØØñô €Eð ÐÝÐC¸EÐCÐCÑDÔDÐDÝ˜u c¨5Ñ1Ô1�G€A€qˆ!ð
 #(¤+µÔ1DÒ"DÐ"D•”�È%Ì+€IÝÔ ¨YÐ7Ñ7Ô7€HØ×!Ò! ! QÑ'Ô'€Hà—&’&˜‘)”)€KØ—&’&˜‘)”)€KÝ3TØ	Ø	Ø	ØØØØØØØØØØØØð4ñ 4ô 4Ñ0€A€sˆI�} jð" �JŠJ�q‰MŒM€EØ�HŠH�Q‰KŒK€EàØØØØØØØØð
ð 
r   c               ó4   — t          | ||d d d ||||¬¦
  «
        S )NrÓ   )rG   )rN   rr   rs   rR   r¥   rt   r£   s          r   rJ   rJ   ®  s:   € õ @ØØØØØØØØØØðñ ô ð r   Úphilox_seedrÌ   c               ó  — t          | ||||||
ddd¦
  «
        }|�t          d|› �¦  «        ‚t          | ||||¦  «        \  }}}}}t          ||||||dd||	|
||||¬¦  «        \  }}}t          |||¦  «        \  }}}|||fS )zCFA3 implementation of _scaled_dot_product_flash_attention_backward.NzFA3 SDPA backward unsupported: rÓ   )r�   r;   r˜   rK   )r…   rN   rr   rs   r†   r‡   rT   rÆ   r¡   r¢   rR   r¥   rÜ   rÌ   r£   rƒ   Ú
grad_out_tÚq_tÚk_tÚv_tÚout_trÀ   rÁ   rÂ   Údq_outÚdk_outÚdv_outs                              r   rL   rL   Æ  sÞ   € õ& (Ø�%˜˜e S¨)°YÀÀdÈDñô €Eð ÐÝÐD¸UÐDÐDÑEÔEÐEõ (8Ø�%˜˜e Sñ(ô (Ñ$€J��S˜#˜uõ 4ØØØØØØØØØØØØØØØðñ ô �J€BˆˆBõ& .¨b°"°bÑ9Ô9Ñ€FˆF�FØ�6˜6Ð!Ð!r   ÚFA3)Úregister_fn)r"   r#   r   r$   )r,   )r-   r.   r   r   )r-   r.   r   r   )r   r
   )rN   rO   rP   rQ   rR   rS   rT   rU   rV   rU   rW   rU   rX   rU   r   rY   )rN   rO   rr   rO   rs   rO   rR   rS   rt   ru   rv   rU   rw   rU   rT   rU   rV   rU   rW   rU   rX   rU   r   rY   )r…   rO   rN   rO   rr   rO   rs   rO   r†   rO   r‡   rO   rR   rS   rT   rU   rˆ   r‰   rŠ   r‰   r   rY   )rP   r‘   r   r’   )r™   rU   r   rU   )NNNNNN)&rN   rO   rr   rO   rs   rO   rŸ   rU   r    rU   r¡   r$   r¢   r$   r£   r¤   r¥   ru   rˆ   r‰   rŠ   r‰   rw   rU   r†   rU   rV   rU   rW   rU   rX   rU   r¦   rU   r§   r‰   r   r¨   )F) r…   rO   rN   rO   rr   rO   rs   rO   r†   rO   r‡   rO   rŸ   rU   r    rU   r·   r‰   r¸   r‰   r£   r¤   r¥   ru   rˆ   r$   rŠ   r$   r¹   ru   r   rº   )NNN),rN   rO   rr   rO   rs   rO   rT   rU   rÆ   rU   r¡   r$   r¢   r$   rR   rS   r¥   ru   rt   ru   rV   rU   rW   rU   rX   rU   r£   r¤   rˆ   r$   rŠ   r$   rw   rU   rv   rU   r†   rU   r¦   rU   rÅ   ru   r§   r‰   )$r†   rO   rN   rO   rr   rO   rs   rO   rT   rU   rÆ   rU   r¡   r$   r¢   r$   rR   rS   r¥   ru   rt   ru   r£   r¤   rˆ   r$   rŠ   r$   rw   rU   rv   rU   r¦   rU   r§   r‰   )$rN   rO   rr   rO   rs   rO   rT   rU   rÆ   rU   r¡   r$   r¢   r$   rR   rS   r¥   ru   rt   ru   r£   r¤   rˆ   r$   rŠ   r$   rw   rU   rv   rU   r¦   rU   r†   rU   r§   r‰   )"r…   rO   rN   rO   rr   rO   rs   rO   r†   rO   r‡   rO   rT   rU   rÆ   rU   r¡   r$   r¢   r$   rR   rS   r¥   ru   rË   rO   rÑ   rO   r£   r¤   rˆ   r‰   rŠ   r‰   )NNNr[   FF)rN   rO   rr   rO   rs   rO   rV   rU   rW   rU   rX   rU   rR   rS   r¥   ru   rt   ru   r£   r¤   )r[   FF)rN   rO   rr   rO   rs   rO   rR   rS   r¥   ru   rt   ru   r£   r¤   )r…   rO   rN   rO   rr   rO   rs   rO   r†   rO   r‡   rO   rT   rU   rÆ   rU   r¡   r$   r¢   r$   rR   rS   r¥   ru   rÜ   rO   rÌ   rO   r£   r¤   ).Ú__doc__Ú
__future__r   r7   rl   Útypingr   Úcollections.abcr   Údataclassesr   Ú	functoolsr   Útyping_extensionsr   r	   r   Útorch.libraryr
   Ú r   Ú__all__r   r    r   r   r+   r   r0   r1   rq   r„   r�   r�   r˜   rž   r¶   rÃ   rF   rI   rH   rK   rG   rJ   rL   Úregister_flash_attention_implr!   r   r   ú<module>ró      s  ððð ð ð #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ø €€€Ø  Ð  Ð  Ð  Ð  Ð  ð ð )Ø(Ð(Ð(Ð(Ð(Ð(à !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2à €€€Ø !Ð !Ð !Ð !Ð !Ð !à Ð Ð Ð Ð Ð ð #ð€ð
 "&€Ð %Ð %Ð %Ñ %Ø!%€Ð %Ð %Ð %Ñ %ð ð)ð )ð )ð )ð )ñ )ô )ñ „ð)ð ðð ð ñ „ðð .ð/ð /ð /ð /ð /ð"/ð /ð /ð /ð"ð ð ð ðB"ð "ð "ð "ðJ(ð (ð (ð (ðV#ð #ð #ð #ðL €\�$ÑÔ€ð5ð 5ð 5ð 5ðHð Hð Hð Hð$  $Ø%)Ø%)Ø%)Ø'+Ø!ð%N)ð N)ð N)ð N)ð N)ð@  ð8ð 8ð 8ð 8ð 8ðL &*Ø%)Ø%)ðD:ð ØØØ%)Ø(,Ø#Ø'+Ø"Ø!ð/D:ð D:ð D:ð D:ð D:ð D:ðh ØØØ%)Ø(,Ø'+Ø!ð'-ð -ð -ð -ð -ð -ðx ØØØ%)Ø(,Ø'+Ø#Ø!ð'+ð +ð +ð +ð +ð +ð| Ø#'Ø$(ð%8ð 8ð 8ð 8ð 8ð 8ð~ &*Ø%)Ø%)ØØØ#ðDð ðDð Dð Dð Dð Dð DðV ØØ#ðð ðð ð ð ð ð ðP ð!2"ð 2"ð 2"ð 2"ð 2"ð 2"ðj (€	Ô '¨Ð;WÐ XÑ XÔ XÐ XÐ XÐ Xr   