Ë
    ÄÓ^jU.  ã                   ó¶  — d dl 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dl
mZmZmZ ddlmZ dd	lmZmZmZmZ dd
lmZ ddlmZmZmZmZ ddlmZmZm Z m!Z!m"Z"m#Z#m$Z$ ddl%m&Z&m'Z' ddl(m)Z)m*Z*m+Z+m,Z, erddlm-Z- ddlm.Z.  e j^                  e0«      Z1ejL                  jd                  Z2ed„ «       Z3 ede3 e	d«      d¬«      Z4 eejj                  de2jj                  jl                  ¬«      Z7 eejj                  ejp                  js                  «       rdndde2jj                  jt                  ¬«      Z; eejx                  de2jx                  jl                  ¬«      Z=dZ>ej~                  ej€                  ej‚                  ej„                  fZC ejˆ                  e2jj                  «      d#ddœd „«       ZE ejˆ                  e2jx                  «      dddd!œd"„«       ZFy)$é    N)ÚTYPE_CHECKING)Úcounters)ÚCKGemmTemplate)Úload_kernel_templateé   )ÚconfigÚirÚlowering)ÚMMKernelInputs)Ú	loweringsÚmake_pointwiseÚmake_reductionÚtransform_args©Úget_max_y_grid)Úautotune_select_algorithmÚExternKernelChoiceÚSymbolicGridFnÚTritonTemplate)Ú_use_cutlass_for_opÚuse_aten_gemm_kernelsÚuse_ck_gemm_templateÚuse_cpp_bmm_templateÚuse_cutlass_templateÚuse_nv_universal_gemm_templateÚuse_triton_template)ÚopsÚVé   )Ú_is_static_problemÚis_batch_stride_largest_or_zeroÚmm_argsÚuse_native_matmul)ÚChoiceCaller)ÚKernelTemplatec                ó„   —  |||d   «       |||d   «      z  }t        «       } | || |«      d«      } || |«      }	||	|fS )NÚBLOCK_MÚBLOCK_Nr   r   )
ÚbÚmÚnÚmetaÚcdivÚmaxÚtilesÚ
max_y_gridÚgrid_zÚgrid_ys
             úe/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/_inductor/kernel/bmm.pyÚbmm_gridr4   .   sW   € á��D˜‘OÓ$¡t¨A¨t°I©Ó'?Ñ?€Eô  Ó!€JÙ‘�a˜Ó$ aÓ(€FÙ�!�V‹_€FØ�6˜6Ð"Ð"ó    ÚbmmÚ
triton_bmmT)ÚnameÚgridÚsourceÚ"cache_codegen_enabled_for_templatezat::bmm_out)Úop_overloadzat::_bmm_out_dtype_xpuzat::_bmm_out_dtype_cudaÚ	bmm_dtype)r8   r<   zat::baddbmm_outé    ©Úlayoutc          
      ó0  ‡ ‡$‡%— t         j                  j                  Š%‰ j                  «       }‰ j	                  «       j
                  }ˆ%fd„}ˆ%fd„}|€ã|dv rß||j	                  «       j
                  k(  rÂ||j                  «       k(  r¯|t        v r§ |‰ j                  «       d   «      rŽ ||j                  «       d   «      ru |‰ j                  «       d   t        «      rWt        j                  ‰ d«      Š t        j                  |d«      }t        j                  t        j                  ‰ |«      d¬«      S t        d	„ ‰ |fD «       «      rþ‰ j                  «       d   dk(  s|j                  «       d   dk(  rWt        j                  ‰ d«      Š t        j                  |d«      }t        j                  t        j                  ‰ |«      d¬«      S d
„ }d„ Š$ˆ$fd„}	 |‰ «      r0t         j                  j                  j                  d   }
 |	‰ |
«      Š  ||«      r0t         j                  j                  j                  d   } |	||«      }t!        ‰ |«      rèt#        t$        j                     ‰ d«      Š t#        t$        j                     |d«      }t'        ‰ |gi ddd¬«      \  }}t(        j*                  j,                  rO‰ j.                  t0        j2                  t0        j4                  fv r#ˆ fd„}|D �cg c]  } t7        |«      |«      ‘Œ }} t7        t8        j:                  «      |Ž } t=        d«      |d«      }|S t?        ‰ |||¬«      \  }}}}Š }d}tA        ‰ |g|¬«      }‰ j                  «       d   }tB        d   d|› d|› d|› d|› �xx   dz  cc<   tD        jG                  d||||‰ j                  «       |j                  «       |«       tH        }i }|r-‰ j	                  «       j
                  dv sJ d«       ‚tJ        }d|i}g }g }i }tM        «       r |jO                  |«       |||jP                  <   tS        |d¬«      r|jO                  tT        «       |jW                  t         jX                  j[                  ||||¬«      «       t]        |«      \  }}t_        ‰ ||«      }|rB|r@ta        ||||«      r2tc        |«      r'ddl2m3}  | ji                  |||jk                  «       «       tm        |‰ |«      r'ddl7m8}! |!js                  |||jk                  «       «       tu        ||||«      r%tw        jx                  |||jk                  «       «       |r t{        ||||‰ |«      rdd l>m?}"  |"|||«       t�        |||jk                  «       |«      \  }#}|#S c c}w )!z`
    Lowering for autotuning aten.bmm with different backends (Aten, Triton, CUTLASS, etc.)
    c                 ó0   •— ‰j                  | d¬«      dk(  S )Nr   )Úfallbackr   )Úoptimization_hint)ÚdimÚsizevarss    €r3   Údim_is_one_or_hintz%tuned_bmm.<locals>.dim_is_one_or_hintd   s    ø€ ð ×)Ñ)¨#¸Ð)Ó:¸aÑ?Ð?r5   c                 ó*   •— ‰j                  | |«       S ©N)Ústatically_known_gt)rE   Ú	thresholdrF   s     €r3   Údim_is_not_known_gtz&tuned_bmm.<locals>.dim_is_not_known_gti   s   ø€ ð ×/Ñ/°°YÓ?Ð?Ð?r5   N)ÚcudaÚxpur   r   éÿÿÿÿ)Úaxisc              3   óV   K  — | ]!  }|j                  «       j                  d k(  –— Œ# y­w)ÚcpuN)Ú
get_deviceÚtype)Ú.0Úxs     r3   ú	<genexpr>ztuned_bmm.<locals>.<genexpr>~   s!   è ø€ Ò
>¨Aˆ1�<‰<‹>×Ñ %Õ'Ñ
>ùs   ‚')c                 ó–   — t        j                  | «      syt        j                  | d¬«      \  }}t        |t         j                  «      S )NTF)Úfreeze)r	   Úis_storage_and_layoutÚas_storage_and_layoutÚ
isinstanceÚFlexibleLayout)ÚtÚ_r@   s      r3   Úis_valid_to_require_contiguousz1tuned_bmm.<locals>.is_valid_to_require_contiguous…   s<   € Ü×+Ñ+¨AÔ.ØÜ×0Ñ0°¸5ÔA‰IˆAˆvÜ˜f¤b×&7Ñ&7Ó8Ð8r5   c                 ó‚   — |d   dk(  xr | d   dk(  xs |d   | d   k\  xs |d   dk(  xr | d   dk(  xs |d   | d   k\  S )NrO   r   éþÿÿÿ© )ÚsizesÚstridess     r3   Ú is_preferred_layout_as_bmm_inputz3tuned_bmm.<locals>.is_preferred_layout_as_bmm_input‹   sf   € ð ˜‘˜qÑ ÒQ e¨B¡i°1¡nÒ&P¸À¹ÀuÈRÁyÑ8PòUà˜"‘+ Ñ"ÒS¨¨b©	°Q©Ò(R¸'À"¹+ÈÈrÉÑ:RðUr5   c                 óÌ   •— |j                   d   j                  «       }|j                   d   j                  «       } ‰||«      st        j                  j                  | «      } | S )NÚval)r,   ÚsizeÚstrider	   ÚExternKernelÚrequire_contiguous)r^   Úmeta_trd   re   rf   s       €r3   Úmay_require_contiguousz)tuned_bmm.<locals>.may_require_contiguous•   sT   ø€ Ø—K‘K Ñ&×+Ñ+Ó-ˆEØ—k‘k %Ñ(×/Ñ/Ó1ˆGÙ3°E¸7ÔCÜ—O‘O×6Ñ6°qÓ9�ØˆHr5   r   TF)ÚargsÚkwargsÚ	broadcastÚtype_promotion_kindÚconvert_input_to_boolc                 óH   •— t        j                  | ‰j                  d¬«      S )NF)Úuse_compute_types)r   Úto_dtypeÚdtype)rV   Úmat1s    €r3   Ú	_to_dtypeztuned_bmm.<locals>._to_dtype³   s   ø€ Ü—|‘| A t§z¡zÀUÔKÐKr5   Údot)r@   Ú	out_dtyper6   )r{   Úaten_mm_infoz	aten.bmm_r_   zZTuned aten.bmm: batch=%s, m=%s, n=%s, k=%s, mat1_dtype=%s, mat2_dtype=%s, output_layout=%sz+out_dtype is only supported for CUDA or XPUr{   ©Úcheck_max_autotune)Úkwarg_overrides)ÚCUTLASS3xGemmTemplate)ÚCppBmmTemplate)Úadd_nv_universal_gemm_choices)Ar   ÚgraphrF   Ú	get_dtyperS   rT   Ú_BMM_DOT_DECOMPOSE_DTYPESÚget_sizeÚ_BMM_DOT_K_DECOMPOSE_THRESHOLDÚLÚ	unsqueezeÚsum_ÚmulÚallÚcurrent_nodero   r#   r   Úatenr   Úinductor_configÚtritonÚcodegen_upcast_to_fp32rw   ÚtorchÚfloat16Úbfloat16r   r   rz   r   r"   r   r   ÚlogÚinfoÚaten_bmmÚaten_bmm_dtyper   ÚappendÚuidr   Úbmm_templateÚextendÚchoicesÚget_template_configsr    r!   r   r   Úcodegen.cutlass.gemm_templater€   Úadd_cutlass_gemm_choicesÚnodesr   Úcodegen.cpp_bmm_templater�   Úadd_choicesr   r   Úadd_ck_gemm_choicesr   Úcodegen.nv_universal_gemmr‚   r   )&rx   Úmat2r{   r@   rw   Údevice_typerG   rL   r`   rn   Ú	meta_mat1Ú	meta_mat2ro   rp   ry   rV   Úmul_pointwiseÚdot_reductionr*   r+   Úkr8   Úkernel_inputsÚ
batch_sizeÚaten_handlerÚaten_extra_kwargsr�   Útemplates_to_user   r_   Ú
is_nonzeroÚbatch_stride_largest_or_zeror€   r�   r‚   Únoderf   rF   s&   `                                   @@r3   Ú	tuned_bmmrµ   [   s+  ú€ ô
 �w‰w×Ñ€HØ�N‰NÓ€EØ—/‘/Ó#×(Ñ(€Kô@ô
@ð 	ÐØ˜?Ñ*Ø˜4Ÿ?™?Ó,×1Ñ1Ò1Ø�T—^‘^Ó%Ò%ØÔ.Ñ.Ù˜tŸ}™}›¨qÑ1Ô2Ù˜tŸ}™}›¨qÑ1Ô2Ù §¡£°Ñ 2Ô4RÔSô �{‰{˜4 Ó$ˆÜ�{‰{˜4 Ó#ˆÜ�v‰v”a—e‘e˜D $Ó'¨aÔ0Ð0ä
Ñ
>°$¸°Ô
>Ô>à�=‰=‹?˜1Ñ Ò" d§m¡m£o°aÑ&8¸AÒ&=Ü—;‘;˜t RÓ(ˆDÜ—;‘;˜t QÓ'ˆDÜ—6‘6œ!Ÿ%™%  dÓ+°!Ô4Ð4ò	9ò	Uô	ñ *¨$Ô/ÜŸ™×,Ñ,×1Ñ1°!Ñ4ˆIÙ)¨$°	Ó:ˆDÙ)¨$Ô/ÜŸ™×,Ñ,×1Ñ1°!Ñ4ˆIÙ)¨$°	Ó:ˆDä˜˜tÔ$ÜœŸ™Ñ(¨¨rÓ2ˆÜœŸ™Ñ(¨¨qÓ1ˆÜ%Ø˜�ØØØ $Ø"'ô
‰ˆˆfô ×!Ñ!×8Ò8¸T¿Z¹ZÜ�M‰MÜ�N‰NðL
ñ >
ô
Lð ;?Ö?°QÐ-”N 9Ó-¨aÕ0Ð?ˆDÐ?à/œ¤s§w¡wÓ/°Ð6ˆØ-œ uÓ-¨m¸QÓ?ˆàÐô #*Øˆd˜6¨Yô#Ñ€A€qˆ!ˆV�T˜4ð €Dô # D¨$ <¸9ÔE€Mð —‘“ Ñ#€JÜˆ^Ñ˜y¨¨°A°a°S¸¸!¸¸A¸a¸SÐAÓBÀaÑGÓBÜ‡H�HØdØØ	Ø	Ø	Ø�‰ÓØ�‰ÓØô	ô (0€LØÐÙØ�‰Ó ×%Ñ%¨Ñ8ð 	
Ø9ó	
Ð8ô &ˆØ(¨)Ð4Ðà"$€Gð CEÐØ€OäÔØ×Ñ Ô-Ø,=ˆ˜×(Ñ(Ñ)ä˜6°eÕ<Ø×Ñ¤Ô-ð ‡N�NÜ	�	‰	×&Ñ&ØØØØ+ð	 	'ó 	
ôô ' vÓ.�M€A€zÜ#BÀ4ÈÈvÓ#VÐ á$ÙÜ  ¨¨A¨qÔ1Ü Ô%åIà×6Ñ6Ø�V˜]×0Ñ0Ó2ô	
ô ˜F D¨$Ô/Ý=à×"Ñ"ØØØ×ÑÓ!ô	
ô ˜F A q¨!Ô,Ü×*Ñ*¨7°F¸M×<OÑ<OÓ<QÔRáÔ4°V¸QÀÀ1ÀdÈDÔQÝMá% g¨v°}ÔEä'¨¨g°}×7JÑ7JÓ7LÈfÓU�G€Dˆ!Ø€Kùò{ @s   Ë3V)ÚalphaÚbetar@   c                ó¦  — t        ||«      r‚|dk(  rd}nt        t        j                     || «      }|dk(  rd}n8t        t        j                     |t        t        j                     ||«      «      }t        t        j
                     ||«      S t        ||| |¬«      \  }}	}
}}}} t        | ||gt        ||¬«      ¬«      }|j                  «       d   }t        d   d|› d|› d|	› d|
› �xx   dz  cc<   t        j                  d	|||	|
|j                  «       |j                  «       | j                  «       |«	       d
}g }g }t        «       r|j                  t         «       t#        |d¬«      r|j                  t$        «       |j'                  t(        j*                  j-                  |||«      «       t/        |||j1                  «       |«      \  }}|S )z_
    Lowering for autotuning aten.mm with different backends (Aten, Triton, CUTLASS, etc.)
    r   r?   )r¶   r·   )Úscalarsr|   zaten.baddbmm_r_   r   zkTuned aten.baddbmm: batch_size=%s, m=%s, n=%s, k=%s, mat1_dtype=%s, mat2_dtype=%s, inp=%s, output_layout=%sÚbaddbmmFr}   )r#   r   rŽ   r‹   r6   Úaddr"   r   Údictr†   r   r•   r–   r„   r   r™   Úaten_baddbmmr   r›   rœ   r   r�   rž   r   r¡   )Úinprx   r¦   r¶   r·   r@   Úarg1Úarg2r*   r+   r¬   r­   r®   r8   r�   r±   r´   r_   s                     r3   Útuned_baddbmmrÁ     s¼  € ô
 ˜˜tÔ$Ø�1Š9Ø‰DäœTŸX™XÑ& t¨SÓ1ˆDà�AŠ:Ø‰DäœTŸX™XÑ& u¬i¼¿¹Ñ.AÀ$ÈÓ.MÓNˆDäœŸ™Ñ" 4¨Ó.Ð.ô (/¨t°T¸3ÀvÔ'NÑ$€A€qˆ!ˆV�T˜4 ô #Ø	ˆd�DÐ¤4¨e¸$Ô#?ô€Mð
 —‘“ Ñ#€JÜˆ^Ñ˜}¨Z¨L¸¸!¸¸A¸a¸SÀÀ!ÀÐEÓFÈ!ÑKÓFÜ‡H�HØuØØ	Ø	Ø	Ø�‰ÓØ�‰ÓØ�‰‹Øô
ð €Dà"$€Gð CEÐÜÔØ×Ñ¤Ô-ä˜6°eÕ<Ø×Ñ¤Ô-ð ‡N�NÜ	�	‰	×&Ñ& }Ð6FÈÓMôô (¨¨g°}×7JÑ7JÓ7LÈfÓU�G€Dˆ!Ø€Kr5   rI   )GÚloggingÚtypingr   r’   Útorch._dynamo.utilsr   Ú7torch._inductor.codegen.rocm.ck_universal_gemm_templater   Ú torch._inductor.kernel.mm_commonr   Ú r   r�   r	   r
   rˆ   r­   r   r   r   r   r   Úruntime.runtime_utilsr   Úselect_algorithmr   r   r   r   Úutilsr   r   r   r   r   r   r   Úvirtualizedr   r   Ú	mm_commonr    r!   r"   r#   r$   r%   Ú	getLoggerÚ__name__r•   rŽ   r4   r›   r6   Úoutr—   rN   Ú_is_compiledÚ	dtype_outr˜   rº   r½   r‡   r“   r”   Úfloat32Úfloat64r…   Úregister_loweringrµ   rÁ   rc   r5   r3   ú<module>rÕ      s©  ðã Ý  ã Ý (Ý RÝ Aç ;Ñ ;Ý *ß PÓ PÝ 2÷ó ÷÷ ñ ÷ !÷ó ñ Ý!Ý1à€g×Ñ˜Ó!€Ø‡y�y‡~�~€ð ñ#ó ð#ñ Ø	Ø	Ù Ó-Ø'+ô	€ñ ˜eŸi™i¨ÀDÇHÁHÇLÁLÔQ€Ù#Ø	‡I�IØ %§	¡	× 6Ñ 6Ô 8ÑÐ>WØ	Ø—‘×"Ñ"ô	€ñ "Ø	‡M�MÐ$°$·,±,×2BÑ2Bô€ð "$Ð à	‡M�MØ	‡N�NØ	‡M�MØ	‡M�Mð	Ð ð €×Ñ�T—X‘XÓðw°Dó wó ðwðt €×Ñ�T—\‘\Ó"Ø,-°A¸dó 9ó #ñ9r5   