
    Vh                         d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZm	Z	m
Z
 d dlmZ d dlZddlmZmZmZ ddlmZmZ ddlmZmZmZ dd	lmZ d
dlmZ d
dlmZmZ  ej@                  e!      Z" G d de      Z#y)    N)Iterable)CallableOptionalUnion)patch   )	codecacheconfigir)CppBenchmarkRequest
TensorMeta)IndentedBufferPlaceholderunique)V   )KernelTemplate)CppTemplateCallerCppTemplateKernelc                        e Zd Z ej                         Z	 ddedej                  de	de
eej                  gej                  f      ddf
 fdZd Zdefd	Zdefd
Z xZS )CppTemplateNnamelayoutnum_threadsepilogue_creatorreturnc                     t         |   |       || _        t        | j                        | _        t        j                  d| j
                   |      | _        || _	        || _
        || _        y )Nbuf_out)r   r   )super__init__input_nodesnextindex_counterindexr   Bufferoutput_noder   r   r   )selfr   r!   r   r   r   	__class__s         T/home/dcms/DCMS/lib/python3.12/site-packages/torch/_inductor/codegen/cpp_template.pyr    zCppTemplate.__init__   sf     	&$,,-
>@ii4::,'?
 & 0    c           	      8    d j                    }t        j                  t        j                  d j                   j                              5  t        j                  t        j                  dd      5  t        | j                        5 } |j                   fi }|j                  j                         \  }}}}t        j                  d|       t        j                  d|j                  j!                         |j                  j                                d d d        d d d        d d d        t#        t%        d  j&                  D                    }t)         j                  t*              r8|j-                   j                  D cg c]  }|j/                          c}       n*|j-                   j                  j/                         g       t#              d t1        |       |k(  s	J ||f       t        j                  j2                  j5                  t7        t8        j:                  |t1        |      d              }	t=        d	 |	D              }	d j                    d
 j>                   }
tA        |tC        jD                   j&                        tC        jD                   j                        |	      }	 ddt        jF                  dtH        dtJ        t"        t        jL                        f fd}tO        |
 j                    j&                  t)         j                  t*              r j                  d   jQ                         n j                  jQ                         ||       S # 1 sw Y   TxY w# 1 sw Y   YxY w# 1 sw Y   ^xY wc c}w )Ncpp_	get_dtypeallow_indexingTkernel_namer   zGenerated Code:
%sz)Args: cpp_argdefs: %s, python_argdefs: %sc              3   <   K   | ]  }|j                           y wN)get_name).0
input_nodes     r)   	<genexpr>z'CppTemplate.generate.<locals>.<genexpr>@   s     LZ:&&(Ls   c              3   F   K   | ]  }t        j                  |        y wr2   )ctypesc_ulonglong)r4   xs     r)   r6   z'CppTemplate.generate.<locals>.<genexpr>O   s     EQ6--a0Es   !_)r0   input_tensor_metaoutput_tensor_meta
extra_argssource_codetemplate_node$flag_template_buffer_has_other_usersepilogue_nodesc                     t        t        t        j                        j                        }t        j                  |j                  f| ||d}||fS )Nr/   )template_buffer_noderA   rB   )r   strr   KERNEL_NAMEr   	functoolspartialrender)r@   rA   rB   kernelrI   kwargsr'   s        r)   make_kernel_renderz0CppTemplate.generate.<locals>.make_kernel_render\   sg    
 ' 7 78dFVFVF && &35Y- F 6>!r*   r   r2   ))r   r   objectr   graph_fake_get_dtyper&   r   FlexibleLayoutr   r   rI   argspython_argdefslogdebugcpp_argdefslistr   r!   
isinstancer   extendr3   lensizevars
size_hintsmapsympyexpandtupler$   r   r   from_irnodesCppTemplateBufferboolr   IRNoder   
get_layout)r'   rK   r0   rJ   coder;   	call_argsexpected_argsnoder>   kernel_hash_namebmreqrL   s   ``           r)   generatezCppTemplate.generate-   s   TYYK(LL+t/C/CDDTDT/UV	LL**,<dC	 'T5E5E	
  6==00D!'!;!;!=Ay!QII+T2II;'')**,	 	 	  L4;K;KLL
 d&&1  d>N>N!Od$--/!OP  $"2"2";";"=!>?I3]!34E 	
H
 	
E WW%%00iM(:(<=>


 E*EE
!$))Adjj\: $#(55d6F6FG)66t7G7GH!
 9=	"//	"26	" %T"))_5	"$ !II$**H5 Q**,!!,,.

 
	
	 	 	 	 	 	( "PsC   &N
6M=BM0M=&N
N0M:5M==N	N

Nc                 (   t               }|j                  t        j                                |j	                  d       |j	                  d       t
        j                  j                  xr t        j                  dv }|r|j                  dg       |S )Nz#include <c10/util/Unroll.h>z2#include <torch/csrc/inductor/aoti_torch/c/shim.h>)linuxwin32z!#include <ATen/record_function.h>)r   	writeliner	   
cpp_prefixsplicer
   cppenable_kernel_profilesysplatform
writelines)r'   resrs   s      r)   headerzCppTemplate.headerz   sz    i**,-

56

KL &

 @ @ !
S\\ V
 F
 !NN?@A
r*   c                     t         r2   )NotImplementedError)r'   rK   s     r)   rI   zCppTemplate.render   s    !!r*   r2   )__name__
__module____qualname__	itertoolscountr#   rE   r   Layoutintr   r   r%   	Pointwiser    rk   r   rx   rI   __classcell__)r(   s   @r)   r   r      s    #IOO%M KO11 			1
 1 #8RYYK,E#FG1 
1$K
Z "# "r*   r   )$r8   rG   r~   loggingrt   collections.abcr   typingr   r   r   unittest.mockr   r]    r	   r
   r   autotune_processr   r   utilsr   r   r   virtualizedr   commonr   cpp_template_kernelr   r   	getLoggerr{   rS   r    r*   r)   <module>r      s]        
 $ , ,   $ $ > 7 7  " E g!q". q"r*   