Ë
    g^(hx1  ã                   óò  — d dl Z d dlmZ d dlZd dlmc mZ d dlm	Z	 d dl
mZ ddlmZmZ ddlmZ  e j"                  e«      Zdej(                  d	ej*                  d
efd„Zdej(                  d	ej*                  ded
dfd„Zdej(                  d
ej4                  fd„Z eeeef      «       Zdej4                  d
dfd„Zdej4                  d
efd„Z dej(                  dedefd„Z!dej(                  fd„Z"d„ Z#y)é    N)Úcast)Úis_symbolic)Ú
OrderedSeté   )ÚconfigÚir)ÚVÚxÚcomm_buffer_typeÚreturnc                 ó  — t        | «      }t        |t        j                  «      ry|j	                  «       }t        |t        j
                  «      ryt        |t        j                  «      rt        |j                  «       «      syy)ze
    Check if an input can be realized as a comm buffer of the specified
    `comm_buffer_type`.
    TF)	Ú	_get_dataÚ
isinstancer   ÚLoopsÚget_output_specÚCommBufferLayoutÚFlexibleLayoutr   Ú	get_numel)r
   r   ÚdataÚlayouts       ú[/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/_inductor/comm_lowering.pyÚcan_realize_as_comm_bufferr   8   sc   € ô �Q‹<€Dä�$œŸ™Ô!Øà×!Ñ!Ó#€FÜ�&œ"×-Ñ-Ô.Øä�&œ"×+Ñ+Ô,´[ÀÇÁÓAQÔ5RØàó    Ú
group_namec                 ó¤  — | j                  «        t        | «      }t        |t        j                  «      sJ ‚|j                  «       }t        |t        j                  «      ryt        |t        j                  «      st        d|› d�«      ‚t        |j                  «       «      rt        d|› d�«      ‚t        j                  |||¬«      |_        y)zã
    Realize an input as a comm buffer of the specified `comm_buffer_type`.

    Specifically, this realizes the underlying buffer if it's still unrealized
    and changes the layout of the buffer to `ir.CommBufferLayout`.
    NzOA buffer can only be realized as a comm buffer if it has `FlexibleLayout` (got ú).zGA buffer with symbolic shape cannot be converted to a comm buffer (got )r   r   r   )Úrealizer   r   r   ÚBufferr   r   r   ÚAssertionErrorr   r   r   )r
   r   r   Úbufferr   s        r   Úrealize_as_comm_bufferr!   N   sÇ   € ð ‡I�I„KÜ�q‹\€FÜ�fœbŸi™iÔ(Ð(Ð(à×#Ñ#Ó%€FÜ�&œ"×-Ñ-Ô.Øä�fœb×/Ñ/Ô0Üð)Ø)/¨°ð4ó
ð 	
ô
 �6×#Ñ#Ó%Ô&Üð"Ø"( ¨ð-ó
ð 	
ô
 ×'Ñ'ØØ)Øô€F…Mr   c                 óh  — t        | j                  t        j                  «      r$| j                  j	                  «       j                  S t        | j                  t        j
                  «      r.t        t        j                  | j                  j                  «      S t        d| j                  › d�«      ‚)Nz\Expect the data attr of a `TensorBox` to be either an `ir.BaseView` or `ir.StorageBox` (got r   )	r   r   r   ÚBaseViewÚunwrap_viewÚ
StorageBoxr   r   r   ©r
   s    r   r   r   r   s{   € Ü�!—&‘&œ"Ÿ+™+Ô&à�v‰v×!Ñ!Ó#×(Ñ(Ð(Ü	�A—F‘FœBŸM™MÔ	*ä”B—I‘I˜qŸv™vŸ{™{Ó+Ð+äð8Ø89¿¹°x¸rðCó
ð 	
r   c                 ó|   — t         j                  t        t        j                  «      | j                  «       f«       y)z¤
    If a non-blocking collective is lowered as a blocking collective, the wait
    node in the original graph becomes useless and we can skip the lowering it.
    N)Ú_bufs_to_skip_waitÚaddÚidr	   ÚgraphÚget_namer&   s    r   Úmark_as_skip_waitr-   ƒ   s%   € ô
 ×ÑœBœqŸw™w›K¨¯©«Ð6Õ7r   c                 ó`   — t        t        j                  «      | j                  «       ft        v S ©N)r*   r	   r+   r,   r(   r&   s    r   Úshould_skip_waitr0   ‹   s!   € ÜŒq�w‰w‹K˜Ÿ™›Ð&Ô*<Ð<Ð<r   ÚinpÚ	reduce_opc                 óB  — ddl m} | j                  «       | j                  «       j                  z  }t
        j                  j                  xrS  ||«      xrI t        | t        j                  j                  «      xr# |dv xr |t
        j                  j                  k  S )Nr   )Úis_symm_mem_enabled_for_group)Úsum)Ú#torch.distributed._symmetric_memoryr4   r   Ú	get_dtypeÚitemsizer   Ú_collectiveÚauto_selectr   r   ÚCommBufferTypeÚSYMM_MEMÚ#one_shot_all_reduce_threshold_bytes)r1   r2   r   r4   Úinp_sizes        r   Ú$_should_lower_as_one_shot_all_reducer?   �   sŽ   € õ Rà�}‰}‹ §¡£×!9Ñ!9Ñ9€Hä×Ñ×&Ñ&ò 	OÙ)¨*Ó5ò	Oä& s¬B×,=Ñ,=×,FÑ,FÓGò	Oð ˜Ð!ò	Oð œ×*Ñ*×NÑNÑNðr   c           	      ó@  — t        | t        j                  j                  |«       t	        j
                  t        j                  j                  t        j                  j                  t        j                  j                  j                  j                  | ||«      «      S r/   )r!   r   r;   r<   ÚpytreeÚtree_mapÚ	TensorBoxÚcreateÚFallbackKernelÚtorchÚopsÚsymm_memÚone_shot_all_reduceÚdefault)r1   r2   r   s      r   Ú_one_shot_all_reducerK   ž   sn   € Ü˜3¤× 1Ñ 1× :Ñ :¸JÔGÜ�?‰?Ü
�‰×ÑÜ
×Ñ× Ñ Ü�I‰I×Ñ×2Ñ2×:Ñ:ØØØó		
óð r   c            	      óÀ  ‡‡‡‡‡‡— 	 t         j                  j                  j                   ddlmŠm	Šm
ŠmŠmŠ ˆˆˆfd„} t         j                  j                  Š | ‰j                  «      dt        j                  dt        dt        dt        j                  fˆˆfd	„«       } | ‰j                   «      dt        j                  dt        dt        dt        j                  fˆˆfd
„«       } | ‰j"                  «      ˆˆfd„«       } | ‰j$                  «      ˆfd„«       } | ‰j&                  «      ˆfd„«       } | ‰j(                  «      ˆfd„«       } | ‰j*                  «      ˆfd„«       } | ‰j,                  «      ˆfd„«       } | ‰j.                  «      ˆfd„«       }	 | ‰j0                  «      ˆfd„«       }
 | ‰j2                  «      ˆˆfd„«       } | ‰j4                  «      ˆfd„«       } | t         j                  j6                  j8                  «      d„ «       } | ‰j:                  «      ˆfd„«       }y # t        $ r t
        j                  d«       Y y w xY w)NzRInductor support for distributed collectives depends on building torch.distributedr   )Úadd_layout_constraintÚcloneÚconstrain_to_fx_stridesÚcopy_Úregister_loweringc                 ó&   •—  ‰| ‰«        ‰| «      S r/   © )ÚfnrM   rO   rQ   s    €€€r   Úregister_comm_loweringz7register_comm_lowerings.<locals>.register_comm_lowering½   s   ø€ Ù˜bÐ"9Ô:Ù  Ó$Ð$r   r1   r2   r   r   c                 ó¤  •— t        | ||«      rt        | ||«      S  ‰| «      } t        j                  rG| j	                  «        t
        j                  j                  j                  | j                  «       «       t        j                  j                  | «      } t        j                  j                  ‰j                  j                   | ||«       | S r/   )r?   rK   r   Ú reorder_for_compute_comm_overlapr   r	   r+   Úno_fuse_buffer_namesr)   r,   r   ÚExternKernelÚrequire_contiguousÚ_CollectiveKernelÚcreate_inplaceÚall_reduce_rJ   )r1   r2   r   Úc10drN   s      €€r   Ú_all_reducez,register_comm_lowerings.<locals>._all_reduceÃ   sŸ   ø€ ä/°°YÀ
ÔKÜ'¨¨Y¸
ÓCÐCñ �C‹jˆÜ×2Ò2ð �K‰KŒMÜ�G‰G×(Ñ(×,Ñ,¨S¯\©\«^Ô<Ü�o‰o×0Ñ0°Ó5ˆÜ
×Ñ×+Ñ+Ø×Ñ×$Ñ$ c¨9°jô	
ð ˆ
r   c                 ó  •— t        | ||«      r! ‰| t        | ||«      «      }t        |«       | S t        j                  j                  | «      } t        j                  j                  ‰j                  j                  | ||«       | S r/   )
r?   rK   r-   r   rY   rZ   r[   r\   r]   rJ   )r1   r2   r   Úretr^   rP   s       €€r   Ú_all_reduce_z-register_comm_lowerings.<locals>._all_reduce_Ø   s   ø€ ô 0°°YÀ
ÔKÙØÜ$ S¨)°ZÓ@óˆCô ˜cÔ"ØˆJô �o‰o×0Ñ0°Ó5ˆÜ
×Ñ×+Ñ+Ø×Ñ×$Ñ$ c¨9°jô	
ð ˆ
r   c                 ó¨   •— | D �cg c]
  } ‰|«      ‘Œ } }t         j                  j                  ‰j                  j                  | ||«       | S c c}w r/   ©r   r[   r\   Úall_reduce_coalesced_rJ   )Úinputsr2   r   r1   r^   rN   s       €€r   Ú_all_reduce_coalescedz6register_comm_lowerings.<locals>._all_reduce_coalescedë   sR   ø€ à(.Ö/ ‘%˜•*Ð/ˆÐ/Ü
×Ñ×+Ñ+Ø×&Ñ&×.Ñ.ØØØô		
ð ˆùò 0s   †Ac                 ót   •— t         j                  j                  ‰j                  j                  | ||«       | S r/   rd   )rf   r2   r   r^   s      €r   Ú_all_reduce_coalesced_z7register_comm_lowerings.<locals>._all_reduce_coalesced_ö   s6   ø€ ä
×Ñ×+Ñ+Ø×&Ñ&×.Ñ.ØØØô		
ð ˆr   c                 óª   •— t         j                  j                  t         j                  j	                  ‰j
                  j                  | ||«      «      S r/   )r   rC   rD   r[   Úcreate_out_of_placeÚall_gather_into_tensorrJ   )r1   Ú
group_sizer   r^   s      €r   Ú_all_gather_into_tensorz8register_comm_lowerings.<locals>._all_gather_into_tensor   sF   ø€ ä�|‰|×"Ñ"Ü× Ñ ×4Ñ4Ø×+Ñ+×3Ñ3ØØØó	ó
ð 	
r   c           	      óÈ   •— t        j                  t        j                  j                  t        j
                  j                  ‰j                  j                  | ||«      «      S r/   )	rA   rB   r   rC   rD   r[   rk   Ú all_gather_into_tensor_coalescedrJ   )rf   rm   r   r^   s      €r   Ú!_all_gather_into_tensor_coalescedzBregister_comm_lowerings.<locals>._all_gather_into_tensor_coalesced  sM   ø€ ä�‰Ü�L‰L×ÑÜ× Ñ ×4Ñ4Ø×5Ñ5×=Ñ=ØØØó	ó
ð 	
r   c                óx   •— t         j                  j                  ‰j                  j                  | |||¬«       |S )N)Úout)r   r[   r\   Úall_gather_into_tensor_outrJ   )r1   rm   r   rs   r^   s       €r   Ú_all_gather_into_tensor_outz<register_comm_lowerings.<locals>._all_gather_into_tensor_out  s>   ø€ ä
×Ñ×+Ñ+Ø×+Ñ+×3Ñ3ØØØØð 	,ô 	
ð ˆ
r   c           	      ó¬   •— t         j                  j                  t         j                  j	                  ‰j
                  j                  | |||«      «      S r/   )r   rC   rD   r[   rk   Úreduce_scatter_tensorrJ   )r1   r2   rm   r   r^   s       €r   Ú_reduce_scatter_tensorz7register_comm_lowerings.<locals>._reduce_scatter_tensor"  sI   ø€ ä�|‰|×"Ñ"Ü× Ñ ×4Ñ4Ø×*Ñ*×2Ñ2ØØØØóó
ð 	
r   c           
      óÊ   •— t        j                  t        j                  j                  t        j
                  j                  ‰j                  j                  | |||«      «      S r/   )	rA   rB   r   rC   rD   r[   rk   Úreduce_scatter_tensor_coalescedrJ   )rf   r2   rm   r   r^   s       €r   Ú _reduce_scatter_tensor_coalescedzAregister_comm_lowerings.<locals>._reduce_scatter_tensor_coalesced.  sP   ø€ ä�‰Ü�L‰L×ÑÜ× Ñ ×4Ñ4Ø×4Ñ4×<Ñ<ØØØØóó	
ð 		
r   c           	      ó¬   •— t         j                  j                  t         j                  j	                  ‰j
                  j                  | |||«      «      S r/   )r   rC   rD   r[   rk   Úall_to_all_singlerJ   )r1   Úoutput_split_sizesÚinput_split_sizesr   r^   s       €r   Ú_all_to_all_singlez3register_comm_lowerings.<locals>._all_to_all_single;  sI   ø€ ä�|‰|×"Ñ"Ü× Ñ ×4Ñ4Ø×&Ñ&×.Ñ.ØØ"Ø!Øóó
ð 	
r   c                 ó„   •—  ‰| «      } t         j                  j                  ‰j                  j                  | ||«       | S r/   ©r   r[   r\   Ú
broadcast_rJ   )r1   Úsrcr   r^   rN   s      €€r   Ú
_broadcastz+register_comm_lowerings.<locals>._broadcastG  s:   ø€ á�C‹jˆÜ
×Ñ×+Ñ+Ø�O‰O×#Ñ# S¨#¨zô	
ð ˆ
r   c                 ót   •— t         j                  j                  ‰j                  j                  | ||«       | S r/   r‚   )r1   r„   r   r^   s      €r   Ú_broadcast_z,register_comm_lowerings.<locals>._broadcast_O  s1   ø€ ä
×Ñ×+Ñ+Ø�O‰O×#Ñ# S¨#¨zô	
ð ˆ
r   c           	      óÚ   — t         j                  j                  t         j                  j	                  t
        j                  j                  j                  j                  | |||«      «      S r/   )
r   rC   rD   r[   rk   rF   rG   Ú_dtensorÚshard_dim_alltoallrJ   )r1   Ú
gather_dimÚ	shard_dimr   s       r   Ú_shard_dim_alltoallz4register_comm_lowerings.<locals>._shard_dim_alltoallV  sR   € ä�|‰|×"Ñ"Ü× Ñ ×4Ñ4Ü—	‘	×"Ñ"×5Ñ5×=Ñ=ØØØØóó
ð 	
r   c                 óŠ   •— t        | «      r| S t        j                  j                  ‰j                  j
                  | «       | S r/   )r0   r   Ú_WaitKernelÚcreate_waitÚwait_tensorrJ   )r1   r^   s    €r   Ú_wait_tensorz-register_comm_lowerings.<locals>._wait_tensorb  s5   ø€ ä˜CÔ ØˆJä
�‰×"Ñ" 4×#3Ñ#3×#;Ñ#;¸SÔAØˆ
r   )rF   rG   Ú_c10d_functionalÚ
all_reduceÚAttributeErrorÚlogÚinfoÚloweringrM   rN   rO   rP   rQ   r   rC   Ústrr]   Úall_reduce_coalescedre   rl   rp   rt   rw   rz   r}   Ú	broadcastrƒ   r‰   rŠ   r‘   )rU   r_   rb   rg   ri   rn   rq   ru   rx   r{   r€   r…   r‡   r�   r’   rM   r^   rN   rO   rP   rQ   s                  @@@@@@r   Úregister_comm_loweringsrœ   «   sf  ý€ ðÜ�	‰	×"Ñ"×-Ò-÷õ ö%ô �9‰9×%Ñ%€Dá˜DŸO™OÓ,ðœŸ™ð ´#ð Ä3ð Ì2Ï<É<õ ó -ðñ( ˜D×,Ñ,Ó-ðÜ�\‰\ðÜ&)ðÜ7:ðä	�‰õó .ðñ$ ˜D×5Ñ5Ó6ôó 7ðñ ˜D×6Ñ6Ó7óó 8ðñ ˜D×7Ñ7Ó8ó
ó 9ð
ñ ˜D×AÑAÓBó	
ó Cð	
ñ ˜D×;Ñ;Ó<óó =ðñ ˜D×6Ñ6Ó7ó	
ó 8ð	
ñ ˜D×@Ñ@ÓAó

ó Bð

ñ ˜D×2Ñ2Ó3ó	
ó 4ð	
ñ ˜DŸN™NÓ+ôó ,ðñ ˜DŸO™OÓ,óó -ðñ œEŸI™I×.Ñ.×AÑAÓBñ	
ó Cð	
ñ ˜D×,Ñ,Ó-óó .ñøôk ò Ü�‰ð ô	
ñ 	ðús   ˆ$H< È<IÉI)$ÚloggingÚtypingr   rF   Útorch.utils._pytreeÚutilsÚ_pytreerA   Útorch._inductor.utilsr   Útorch.utils._ordered_setr   Ú r   r   Úvirtualizedr	   Ú	getLoggerÚ__name__r–   rC   r;   Úboolr   r™   r!   ÚIRNoder   ÚtupleÚintr(   r-   r0   r?   rK   rœ   rS   r   r   ú<module>r¬      s&  ðã Ý ã ß $Ð $Ý -Ý /ç Ý ð €g×Ñ˜Ó!€ðTØ	‡|�|ðØ')×'8Ñ'8ðà	óð,!Ø	‡|�|ð!Ø')×'8Ñ'8ð!ØFIð!à	ó!ðH
�—‘ð 
 "§)¡)ó 
ð 1�Z  c¨3 h¡Ñ0Ó2Ð ð8˜Ÿ™ð 8 tó 8ð=˜Ÿ	™	ð = dó =ðØ	�‰ðØ"%ðØ36óð
˜bŸl™ló 
ó}r   