Ë
    ÄÓ^j˜1  ã                   ó¸  — d dl Z d dlZd dlmZmZ d dlZd dlmZ d dlmZm	Z	m
Z
mZmZ ddlmZ ej                  	 ddej                   dedej"                  d	ej                   d
ej                   f
d„«       Zej                  	 	 ddej                   dedej"                  dej&                  d	ej                   dee   d
ej                   fd„«       Zej                  	 	 ddej                   dedej"                  deej&                     dee   d	ej                   d
ej                   fd„«       Zej                  	 	 	 	 	 ddej,                  ej                   z  dej.                  dej0                  e   deej"                     deej&                     dee   d	ej                   dee   d
ej                   fd„«       Zej                  	 	 	 	 	 ddej,                  dej0                  e   deej"                     deej&                     dee   dee   ded
e
e
eej,                     gfd„«       Zej                  	 d dej"                  dededed
ej"                  f
d„«       Zy)!é    N)ÚCallableÚOptional)ÚInt32ÚInt64ÚFloat32ÚBooleanÚ
const_expré   )ÚutilsÚvalÚopÚreduction_bufferÚinit_valÚreturnc                 ó‚  — t         j                  j                  «       t         j                  j                  «       }}t        j                  |j
                  d   «      }||z  ||z  }}|dk(  r| |||f<   t         j                  j                  «        |}	||k  r|||f   }	t         j                  j                  |	|«      S )zDreduction_buffer has shape (num_warps / warp_per_row, warps_per_row)r
   r   )ÚcuteÚarchÚlane_idxÚwarp_idxÚsizeÚshapeÚbarrierÚwarp_reduction)
r   r   r   r   r   r   Úwarps_per_rowÚrow_idxÚcol_idxÚblock_reduce_vals
             úe/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/_vendor/quack/reduce.pyÚblock_reducer      s±   € ô
 Ÿ™×+Ñ+Ó-¬t¯y©y×/AÑ/AÓ/Cˆh€HÜ—I‘IÐ.×4Ñ4°QÑ7Ó8€MØ =Ñ0°(¸]Ñ2JˆW€GØ�1‚}Ø-0Ð˜ 'Ð)Ñ*Ü‡I�I×ÑÔØÐØ�-ÒØ+¨G°XÐ,=Ñ>ÐÜ�9‰9×#Ñ#Ð$4°bÓ9Ð9ó    Úmbar_ptrÚphasec           	      ó  — t         j                  j                  «       }t         j                  j                  «       t         j                  j	                  «       }}|j
                  \  }	\  }
}||
z  ||
z  }}|dk(  rit         j                  j                  «       5  |	|
z  }t         j                  j                  |||z  |j                  j                  z  dz  «       ddd«       ||k  r1t        j                  | t        j                  ||||ff«      ||¬«       t         j                  j                  ||�|nd¬«       |}t        j                  |
|z  t         j                  j                  «      }t!        j"                  |«      D ]L  }||t         j                  j                  z  z   }|t        j$                  |dg¬«      k  sŒ? |||||f   «      }ŒN t         j                  j'                  ||«      S # 1 sw Y   �ŒxY w)zRreduction_buffer has shape (num_warps / warps_per_row, (warps_per_row, cluster_n))r   é   N©Úpeer_cta_rank_in_cluster©r"   r
   ©Úmode)r   r   Úblock_idx_in_clusterr   r   r   Ú	elect_oneÚmbarrier_arrive_and_expect_txÚelement_typeÚwidthr   Ústore_shared_remoteÚelem_pointerÚmbarrier_waitÚceil_divÚ	WARP_SIZEÚcutlassÚrange_constexprr   r   )r   r   r   r!   r   r"   Úcta_rank_in_clusterr   r   Úrows_per_blockr   Ú	cluster_nr   r   Ú	num_warpsr   Únum_iterÚiÚidxs                      r   Úcluster_reducer=      sË  € ô Ÿ)™)×8Ñ8Ó:ÐÜŸ™×+Ñ+Ó-¬t¯y©y×/AÑ/AÓ/Cˆh€HØ1A×1GÑ1GÑ.€NÑ.�] IØ =Ñ0°(¸]Ñ2JˆW€GØ�1‚}Ü�Y‰Y× Ñ Ó"ñ 	Ø&¨Ñ6ˆIÜ�I‰I×3Ñ3ØØ˜IÑ%Ð(8×(EÑ(E×(KÑ(KÑKÈqÑPô÷	ð �)ÒÜ×!Ñ!ØÜ×ÑÐ/°'¸GÐEXÐ;YÐ1ZÓ[ØØ%-õ		
ô 	‡I�I×Ñ˜H°UÐ5F©EÈAÐÔNØÐÜ�}‰}˜]¨YÑ6¼¿	¹	×8KÑ8KÓL€HÜ×$Ñ$ XÓ.ò TˆØ˜œTŸY™Y×0Ñ0Ñ0Ñ0ˆØ”—‘Ð+°1°#Ô6Ó6Ù!Ð"2Ð4DÀWÈcÀ\Ñ4RÓSÑðTô �9‰9×#Ñ#Ð$4°bÓ9Ð9÷)	ñ 	ús   ÂAG7Ç7Hc                 ó\   — t        |du «      rt        | |||¬«      S t        | |||||¬«      S )zPPerform either block or cluster reduction based on whether mbar_ptr is provided.N)r   ©r"   r   )r	   r   r=   )r   r   r   r!   r"   r   s         r   Úblock_or_cluster_reducer@   E   s:   € ô �(˜dÐ"Ô#Ü˜C Ð%5ÀÔIÐIä˜c 2Ð'7¸ÈÐYaÔbÐbr    ÚxÚthreads_per_rowÚhook_fnc                 ó^  — t        t        | t        j                  «      «      r| j	                  ||d¬«      }n| }t        j
                  j                  t        j                  t        j
                  j                  t        | j                  t        k(  «      rt        j                  j                  nt        t        j
                  j                  t         t        j
                  j"                  t        j$                  i|   }	t        j                  j'                  ||	t!        |t        j                  j(                  «      ¬«      }t        |du«      r |«        t        |du«      rF|j*                  d   \  }
}|dk(  s	|€J d«       ‚t        |
dkD  xs |dkD  «      rt-        ||	||||¬«      }|S )zXreduction_buffer must have shape (num_warps / warps_per_row, (warps_per_row, cluster_n))r   ©r   Úreduction_profile©Úthreads_in_groupNr
   ú/mbar_ptr must be provided for cluster reductionr?   )r	   Ú
isinstancer   Ú	TensorSSAÚreduceÚReductionOpÚADDÚoperatorÚaddÚMAXÚdtyper   r   ÚfmaxÚmaxÚMINÚminÚMULÚmulr   r3   r   r@   )rA   r   rB   r   r!   r"   r   rC   r   Úwarp_opr   r8   s               r   Ú
row_reducerZ   U   sh  € ô ”*˜Q¤§¡Ó/Ô0Ø�h‰h�r HÀˆhÓB‰àˆä×Ñ×ÑœhŸl™lÜ×Ñ×Ñ´
¸1¿7¹7ÄgÑ;MÔ0NœdŸi™iŸnšnÔTWÜ×Ñ×ÑœcÜ×Ñ×ÑœhŸl™lð	ð
 	ñ
€Gô �)‰)×
"Ñ
"ØØÜ˜_¬d¯i©i×.AÑ.AÓBð #ó €Cô
 �' Ð%Ô&ÙŒ	ÜÐ"¨$Ð.Ô/Ø#3×#9Ñ#9¸!Ñ#<Ñ ˆ�yØ˜AŠ~ Ð!5ð 	
Ø=ó	
Ð5ô �m aÑ'Ò8¨9°q©=Ô9Ü)Ø�WÐ.°ÀÐPXôˆCð €Jr    Úreturn_exp_xc           	      óž  — | j                   t        k(  sJ d«       ‚	 t        j                  j	                  | j                  t        j                  j                  t        j                   d¬«      t        j                  j                  t        |t        j                  j                  «      ¬«      }t        j                  t        j                  «      }t        j                  j                  | |z  ||z  z
  d¬«      }	t        j                  j	                  |	j                  t        j                  j                   dd¬«      t"        j$                  t        |t        j                  j                  «      ¬«      }
t'        |d u«      r |«        t'        |d u«      �r|j(                  \  }\  }}|dk(  s	|€J d	«       ‚t'        |dkD  xs |dkD  «      �rÝ|j*                  t,        k(  sJ d
«       ‚t        j                  j/                  «       t        j                  j1                  «       }}||z  ||z  }}t'        |d u «      �r6|dk(  rt3        j4                  ||
«      |||f<   t        j                  j7                  «        t        j                   }d}
||k  rt3        j8                  |||f   «      \  }}
t        j                  j	                  |t        j                  j                  «      }|
t        j                  j;                  ||z
  d¬«      z  }
t        j                  j	                  |
t"        j$                  «      }
t'        |«      r'|	t        j                  j;                  ||z
  d¬«      z  }	|}�n9t        j                  j=                  «       }|dk(  rit        j                  j?                  «       5  ||z  }t        j                  jA                  |||z  |j*                  jB                  z  dz  «       d d d «       ||k  rEt3        jD                  t3        j4                  ||
«      t3        jF                  ||||ff«      ||¬«       t        j                  jI                  ||�|nd¬«       t        jJ                  ||z  t        j                  j                  «      }t        jL                  |t        «      }|jO                  t        j                   «       t        jL                  |t        «      }|jO                  d«       tQ        jR                  |«      D ]a  }||t        j                  j                  z  z   }|t        jT                  |dg¬«      k  sŒ?t3        j8                  |||f   «      \  ||<   ||<   Œc |jW                  «       j                  t        j                  j                  t        j                   d¬«      }t        j                  j	                  |t        j                  j                  «      }d}
tQ        jR                  |«      D ]2  }|
||   t        j                  j;                  ||   |z
  d¬«      z  z  }
Œ4 t        j                  j	                  |
t"        j$                  «      }
t'        |«      r'|	t        j                  j;                  ||z
  d¬«      z  }	|}||
t'        |«      r|	fS d fS # 1 sw Y   �ŒÊxY w)Nzx must be of type Float32r   rE   rG   T)Úfastmathç        r
   rI   z+reduction_buffer must be of type cute.Int64r$   r%   r'   r(   ),rR   r   r   r   r   rL   rM   rQ   ÚinfrS   rV   r3   ÚmathÚlog2ÚeÚexp2rN   rO   rP   r	   r   r-   r   r   r   r   Úf32x2_to_i64r   Úi64_to_f32x2Úexpr*   r+   r,   r.   r/   r0   r1   r2   Úmake_rmem_tensorÚfillr4   r5   r   Úload)rA   rB   r   r!   rC   r"   r[   Úmax_xÚlog2_eÚexp_xÚ	sum_exp_xr7   r   r8   r   r   r   r   Úmax_x_single_warpÚmax_x_finalr6   r9   r:   Úsum_exp_x_single_warpr;   r<   s                             r   Úonline_softmax_reducerq   ~   s³  € ð �7‰7”gÒÐ:Ð:Ó:ÐØeÜ�I‰I×$Ñ$Ø	�‰”×!Ñ!×%Ñ%´·±°ÐPQˆÓRÜ�	‰	�‰Ü˜_¬d¯i©i×.AÑ.AÓBð %ó €Eô
 �Y‰Y”t—v‘vÓ€FÜ�I‰I�N‰N˜1˜v™:¨°©Ñ8À4ˆNÓH€EÜ—	‘	×(Ñ(Ø�‰”T×%Ñ%×)Ñ)°CÈ1ˆÓMÜ�‰Ü˜_¬d¯i©i×.AÑ.AÓBð )ó €Iô
 �' Ð%Ô&ÙŒ	ÜÐ"¨$Ð.Õ/Ø5E×5KÑ5KÑ2ˆÑ2˜¨	Ø˜AŠ~ Ð!5ð 	
Ø=ó	
Ð5ô �m aÑ'Ò8¨9°q©=Õ9Ø#×0Ñ0´EÒ9ð Ø=óÐ9ô "&§¡×!3Ñ!3Ó!5´t·y±y×7IÑ7IÓ7K�hˆHØ'¨=Ñ8¸(À]Ñ:R�WˆGÜ˜( dÐ*Õ+Ø˜q’=Ü9>×9KÑ9KÈEÐS\Ó9]Ð$ W¨gÐ%5Ñ6Ü—	‘	×!Ñ!Ô#Ü%,§[¡[ LÐ!Ø�	Ø˜mÒ+Ü38×3EÑ3EØ(¨°(Ð):Ñ;ó4Ñ0Ð% yô #Ÿi™i×6Ñ6Ð7HÌ$Ï)É)Ï.É.ÓY�ØœTŸY™YŸ]™]Ð+<¸{Ñ+JÐUY˜]ÓZÑZ�	Ü ŸI™I×4Ñ4°YÄÇÁÓM�	Ü˜lÔ+ØœTŸY™YŸ]™]¨5°;Ñ+>È˜]ÓNÑN�EØ#’ä&*§i¡i×&DÑ&DÓ&FÐ#Ø˜q’=ÜŸ™×,Ñ,Ó.ñ Ø$2°]Ñ$B˜	ÜŸ	™	×?Ñ?Ø$Ø%¨	Ñ1Ð4D×4QÑ4Q×4WÑ4WÑWÐ[\Ñ\ô÷ð ˜iÒ'Ü×-Ñ-Ü×*Ñ*¨5°)Ó<Ü×*Ñ*Ø,¨w¸ÐBUÐ8VÐ.Wóð !Ø19õô —	‘	×'Ñ'¨ÀÐAR¹ÐXYÐ'ÔZÜŸ=™=¨¸Ñ)BÄDÇIÁI×DWÑDWÓX�Ü$(×$9Ñ$9¸(ÄGÓ$LÐ!Ø!×&Ñ&¬¯© |Ô4Ü(,×(=Ñ(=¸hÌÓ(PÐ%Ø%×*Ñ*¨3Ô/Ü ×0Ñ0°Ó:ò �AØ" Q¬¯©×)<Ñ)<Ñ%<Ñ<�CØœTŸY™YÐ'7¸q¸cÔBÓBÜIN×I[ÑI[Ø,¨W°c¨\Ñ:óJÑFÐ)¨!Ñ,Ð.CÀAÒ.Fðð 0×4Ñ4Ó6×=Ñ=Ü×$Ñ$×(Ñ(´G·K±K°<ÐSTð >ó �ô #Ÿi™i×6Ñ6°{ÄDÇIÁIÇNÁNÓS�Ø�	Ü ×0Ñ0°Ó:ò �AØÐ!6°qÑ!9¼D¿I¹I¿M¹MØ)¨!Ñ,¨{Ñ:ÀTð =Jó =ñ "ñ ‘Iðô !ŸI™I×4Ñ4°YÄÇÁÓM�	Ü˜lÔ+ØœTŸY™YŸ]™]¨5°;Ñ+>È˜]ÓNÑN�EØ#�Ø�)¤z°,Ô'?˜eÐJÐJÀTÐJÐJ÷Qñ ús   Î7A[Û[ÚXÚelem_per_laneÚsubwarp_sizeÚ	warp_sizec           
      ó@  — |dk\  r)|dk  r$|dt        t        j                  |«      «      z  k(  sJ ‚|dk  r,||z  dk(  r$|dt        t        j                  |«      «      z  k(  sJ ‚t        j                  j                  «       |z  }t        j                  | t        j                  |«      «      } t        j                  | dg¬«      }|d|z  k  sJ ‚t        j                  t        t        j                  |«      «      t        t        j                  ||z  «      «      d¬«      D ]f  }t        j                  t        j                  | «      d¬«      D ]7  }t        j                  j                  | |   d|z  |z  ¬«      }| |   |z   | |<   Œ9 Œh t        j                  t        t        j                  t        j                  | dg¬«      «      «      dz
  dd«      D ]À  }	d|	z  }
t        j                  |
d¬«      D ]Ÿ  }| d	|f   }| d	||
z   f   }t        ||
z  «       }t        j                  t        j                  |«      d¬«      D ]P  }||   ||   }}|r|n|||<   |r|n|||<   t        j                  j                  ||   |
|z  ¬«      }||   |z   ||<   ŒR Œ¡ ŒÂ | d
   S )aX  
    For warp reduction, we use Swap Shuffle
    The normal way to reduction among threads:
    use shuffle to let *** the first half of threads *** have *** whole data *** from the second half of threads.
    After each step of reduction, a half of threads won't work in the following steps.
    That is, as the reduction progresses, the efficiency of shuffle & reduction instructions gradually change from 1/2, 1/4 to 1/32 (the worst case).
    To overcome this shortcoming, for a NxN matrix to be reduced among N threads as a 1XN vectors,
    we use swap & shuffle aiming to let *** each half of threads *** have *** a half of data *** from the other half of threads.
    After reduction, each half of threads should deal with a (N/2)x(N/2) sub-matrix independently in the following step.
    We can recursively do this until the problem size is 1.
    r
   é    r   r(   T)Úunroll_full)ÚoffsetéÿÿÿÿN)Nr   )Úintr`   ra   r   r   r   Úlogical_divideÚmake_layoutr   r4   ÚrangeÚshuffle_sync_bflyr5   r   )rr   rs   rt   ru   r   Únumvecr;   ÚvÚshfl_valÚlogmÚmÚrÚfrg_AÚfrg_BÚshould_swapÚlowerÚuppers                    r   Úsum_swap_shuffler‹   á   s’  € ð  	˜ÒØ˜BÒØ˜A¤¤T§Y¡Y¨|Ó%<Ó!=Ñ=Ò=ðð	>ð
 	�RŠØ˜Ñ$¨Ò)Ø˜œc¤$§)¡)¨IÓ"6Ó7Ñ7Ò7ðð	8ô �y‰y×!Ñ!Ó# |Ñ3€HÜ×Ñ˜Aœt×/Ñ/°Ó>Ó?€AÜ�Y‰Y�q ˜sÔ#€FØ�R˜<Ñ'Ò'Ð'Ð'ô �]‰]ÜŒD�I‰I�fÓÓ¤¤D§I¡I¨i¸<Ñ.GÓ$HÓ IÐW[ôò #ˆô —‘œtŸy™y¨›|¸Ô>ò 	#ˆAÜ—y‘y×2Ñ2°1°Q±4ÀÀaÁÈ<Ñ@WÐ2ÓXˆHØ�Q‘4˜(‘?ˆAˆaŠDñ	#ð#ô ×'Ñ'¬¬D¯I©I´d·i±iÀÈÈÔ6LÓ,MÓ(NÐQRÑ(RÐTVÐXZÓ[ò /ˆØ�‰IˆÜ—‘˜q¨dÔ3ò 	/ˆAØ�d˜A�g‘JˆEØ�d˜A ™E�k‘NˆEä% h°¡lÓ3Ð3ˆKÜ—]‘]¤4§9¡9¨UÓ#3ÀÔFò 	/�à$ Q™x¨¨q©�u�Ù$/™5°U��a‘Ù$/™5°U��a‘ô  Ÿ9™9×6Ñ6°u¸Q±xÈÈLÑHXÐ6ÓY�à  ™8 hÑ.��a’ñ	/ñ	/ð/ð" ˆW‰:Ðr    )r^   )r^   N)Nr^   )NNNr^   N)NNNNF)r
   r
   rw   )r`   rO   Útypingr   r   r4   Úcutlass.cuter   r   r   r   r   r	   Ú r   ÚjitÚNumericÚTensorr   ÚPointerr=   r@   rK   rM   Ú	Constexprr{   rZ   Úboolrq   r‹   © r    r   ú<module>r–      sE  ðó Û ß %ã Ý ß >Õ >å ð ‡�à]`ñ:Ø	�‰ð:Ø#ð:Ø7;·{±{ð:ØNRÏlÉlð:à	‡\�\ò:ó 
ð:ð  ‡�ð !Ø!ñ":Ø	�‰ð":àð":ð —k‘kð":ð �l‰lð	":ð
 �l‰lð":ð �E‰?ð":ð 
‡\�\ò":ó 
ð":ðJ ‡�ð "Ø ñcØ	�‰ðcàðcð —k‘kðcð �t—|‘|Ñ$ð	cð
 �E‰?ðcð �l‰lðcð 
‡\�\òcó 
ðcð ‡�ð
 /3Ø'+Ø!Ø Ø"&ñ%Ø‡~�~˜Ÿ™Ñ$ð%à×Ñð%ð ×&Ñ& sÑ+ð%ð ˜tŸ{™{Ñ+ð	%ð
 �t—|‘|Ñ$ð%ð �E‰?ð%ð �l‰lð%ð �hÑð%ð 
‡\�\ò%ó 
ð%ðP ‡�ð /3Ø'+Ø"&Ø!Øñ_KØ‡~�~ð_Kà×&Ñ& sÑ+ð_Kð ˜tŸ{™{Ñ+ð_Kð �t—|‘|Ñ$ð	_Kð
 �hÑð_Kð �E‰?ð_Kð ð_Kð ˆw˜ §¡Ñ0Ð1ò_Kó 
ð_KðD ‡�àTVñ5Ø‡{�{ð5Ø#&ð5Ø:=ð5ØNQð5à	‡[�[ò5ó 
ñ5r    