
    çg_.                     z   d dl mZ d dlmZ d dlmZmZ d dlmZ d Z	 G d de
          Ze G d d	                      Z G d
 d          Zd Zd Zdedee         defdZdedefdZdedefdZdedee         defdZdedefdZdededefdZdededefdZdedefdZdedefdZdZedk    rd dlmZ  ee          Ze                    d d!d"#           e                    d$d%ed&'           e                    d(ed)d*+           e                                 Z! e            Zg Z"e!j#        D ]PZ$ ee$          Z%e%&                                Z'e"(                    e%j)                   e*                    e'           Qd, ej+        ,                                D             Z-d- ej+        ,                                D             Z.e.d          d          Z/ ee/          Z0 ee/          Z1e!j2        3                    d.          4                    d/          5 Z5d0Z2e2d16                    e-          z  Z2e2d1z  Z2e2e0z  Z2e2d1z  Z2e2e1z  Z2e57                    e2           d2d2d2           n# 1 swxY w Y   d3 ej+        ,                                D             Z8d4 ej+        9                                D             Z: ee:e/          Z; ee/          Z< ee:e/          Z= ee/          Z> ee/          Z?e!j2        3                    d5          4                    d/          5 Z5d)Z2e2d0z  Z2e2d6z  Z2e2d7z  Z2e2d1z  Z2e2d16                    e8          z  Z2e2d1z  Z2e2e;z  Z2e2d1z  Z2e2e>z  Z2e2d1z  Z2e2e<z  Z2e2d1z  Z2e2e=z  Z2e2d1z  Z2e2e?z  Z2e57                    e2           d2d2d2           d2S # 1 swxY w Y   d2S d2S )8    )defaultdict)Path)SequenceUnion)	dataclassc                 
    | d uS N )xs    M/var/www/html/ai-engine/env/lib/python3.11/site-packages/triton/tools/link.py_existsr      s    D=    c                       e Zd ZdS )LinkerErrorN)__name__
__module____qualname__r
   r   r   r   r      s        Dr   r   c                       e Zd ZU eed<   ee         ed<   ee         ed<   eeedf                  ed<   eed<   eed<   eed<   eed	<   dS )
KernelLinkerMetaorig_kernel_name	arg_names
arg_ctypesNsizessig_hashtriton_suffixsuffix	num_specs)r   r   r   str__annotations__r   r   intr
   r   r   r   r      s         }E#t)$%%%%MMMKKKNNN++r   r   c                   Z    e Zd ZddZdefdZdefdZdefd	Zd
edefdZdede	fdZ
dS )HeaderParserreturnNc                    dd l }|                    d          | _        |                    d          | _        |                    d          | _        |                    d          | _        t          t                    | _        d S )Nr   z'//[\s]*tt-linker:[\s]*([\w]+):(.+):(.+)z^([\w]+)_([\w]+)_([\w]+)$z[\s]*(\w+)\s(\w+)[,]?z[c,d])	recompilelinker_directiveskernel_namec_sig
arg_suffixr   listkernels)selfr%   s     r   __init__zHeaderParser.__init__   sq    			 "$,X!Y!Y::&DEEZZ ;<<
**W--"4((r   headerc                 F   |                                 D ]
}|                    d          r| j                            |          }t	          |          r|                    d          |                    d          |                    d          }}}|                     |          \  }}}	|                     |          \  }
}|                     |	|          \  }}| 	                    d
                    ||g          t          |||
|||	|	|                     d S )Nz//         _)r   r   r   r   r   r   r   r   )
splitlines
startswithr'   matchr   group_match_name_match_c_sig_match_suffix_add_kerneljoinr   )r-   r/   lnmker_namer)   	algo_infonamer   r   c_typesr   r   r   s                 r   extract_linker_metaz HeaderParser.extract_linker_meta-   s.   ##%% 	 	B}}T"" *00441:: 12QWWQZZQRYeH-1-=-=h-G-G*D(F)-):):5)A)A&GY'+'9'9&%'H'H$Iu$$$	!233(-1&/'."'%-*0#)&/	 	 	  	 	r   r@   c                     | j                             |          }t          |          rD|                    d          |                    d          |                    d          }}}|||fS t	          | d          )Nr1   r2   r3   z is not a valid kernel name)r(   r7   r   r8   r   )r-   r@   r?   rB   r   r   s         r   r9   zHeaderParser._match_nameD   su    ""8,,1:: 	*%&WWQZZQWWQZZF(D6))XBBBCCCr   r)   c                     | j                             |          }t          |          r:g g }}|D ]/\  }}|                    |           |                    |           0||fS t	          | d          )Nz" is not a valid argument signature)r)   findalllenappendr   )r-   r)   r?   tysargstyarg_names          r   r:   zHeaderParser._match_c_sigK   s    Ju%%q66 	BC ! & &H

2H%%%%9UFFFGGGr   r   c                    |                     d          }ddd}d}g }t          t          |                    D ]"}|                    t	          |                    }|dk    rt          | d          |t          t	          |                    z  }| j                            ||          rT|dz  }|                    d g|t          |          z
  z             |	                    |||                             |dz  }|t          |          dz
  k     r||d          }|                    d gt          |          t          |          z
  z             $||fS )N,r1      )cdr   z is not a valid kernel suffix)
splitrangerH   findr   r   r*   r7   extendrI   )	r-   r   r)   rK   s2ir   r   iposs	            r   r;   zHeaderParser._match_suffixV   s^   {{3B	 s4yy!! 	@ 	@A++c!ff%%Cbyy!V"J"J"JKKK3s1vv;;C$$VS11 Q	dVq3u::~6777S-...q3t99q=  dVs4yy3u::'=>????%r   rB   kerc                 Z   || j         v r| j         |         d         }t          |j        |j                  D ]S\  }}||k    rHt          d| dd                    |j                   dd                    |j                             T| j         |                             |           d S )NrS   z Mismatched signature for kernel z: 
	existing sig is: rO   z
	current is: )r,   zipr   r   r=   rI   )r-   rB   r[   lastcurnew_s         r   r<   zHeaderParser._add_kernelm   s    4<%)\$%7%;D #.AA  	T$;;% ^4  ^  ^X[X`X`aeapXqXq  ^  ^  DG  DL  DL  MP  M[  D\  D\  ^  ^   
 	T!!#&&&&&r   )r#   N)r   r   r   r.   r   rD   r9   r:   r;   r   r<   r
   r   r   r"   r"      s        ) ) ) )#    .DC D D D D	H# 	H 	H 	H 	H C          .
' 
'*: 
' 
' 
' 
' 
' 
'r   r"   c                 p    d                     d t          | j        | j                  D                       S )N, c                 "    g | ]\  }}| d | S  r
   .0rL   args      r   
<listcomp>z0gen_signature_with_full_args.<locals>.<listcomp>{   s&    RRRCmmcmmRRRr   )r=   r]   r   r   r?   s    r   gen_signature_with_full_argsrk   z   s1    99RR3q|Q[3Q3QRRRSSSr   c                     d t          | j        | j                  D             }d t          | j        | j                  D             }d                    d t          ||          D                       }|S )Nc                 $    g | ]\  }}|d k    |S r1   r
   )rg   rL   hints      r   ri   z!gen_signature.<locals>.<listcomp>   s!    LLLD$!)))))r   c                 $    g | ]\  }}|d k    |S rn   r
   rg   rh   ro   s      r   ri   z!gen_signature.<locals>.<listcomp>   s!    MMMd4199999r   rb   c                 "    g | ]\  }}| d | S rd   r
   rf   s      r   ri   z!gen_signature.<locals>.<listcomp>   s&    LLLwr3]]S]]LLLr   )r]   r   r   r   r=   )r?   	arg_typesr   sigs       r   gen_signatureru   ~   ss    LLCag$>$>LLLIMMc!+qw&?&?MMMI
))LL#i2K2KLLL
M
MCJr   rB   metasr#   c           	      F    d|  dt          |d                    d|  d|  d	S )N

CUresult (CUstream stream, rS   z);
void load_();
void unload_();
    )rk   )rB   rv   s     r   make_algo_declsr|      sS    
 ">uRy"I"I      r   metac                     d| j          dt          |            d| j          dt          |            d| j          d| j          dS )Nrx   _default(CUstream stream, z);
CUresult ry   z, int algo_id);
void load_rz   r{   )r   rk   )r}   s    r   make_global_declr      s    

 ;WX\;];] 

 3OPT3U3U     "	   r   c                     d| j          dt          |            d}|d| j          dd                    | j                   dz  }|dz  }|S )	N	CUresult r   z){
	  return 	(stream, rb   z, 0);
}
r   rk   r=   r   r}   srcs     r   make_default_algo_kernelr      sd    
pd+
p
pGcdhGiGi
p
p
pCZ-ZZ		$.8Q8QZZZ[C5LCJr   c                    d|  d}t          |d           D ]0}|d|j         d|j         d|j         dt	          |           d	z  }1|dz  }|d|  dt          |d	                    d
z  }|dz  }t          |d           D ]}d d                    fdt          |j        |j	                  D                       }|t          |j	                  rd| dndz  }d t          |j        |j	                  D             }|d|j         d|j         d|j         dd                    |           d	z  }|dz  }|dz  }|dz  }dD ]}|d| d|  dz  }t          |d           D ]#}|d| d|j         d|j         d|j         d	z  }$|d| d|  dz  }|dz  }t          |d           D ]#}|d | d|j         d|j         d|j         d	z  }$|dz  }|S )!Nz// launcher for: 
c                     | j          S r	   r   rj   s    r   <lambda>z.make_kernel_hints_dispatcher.<locals>.<lambda>   
    Q[L r   )keyr   r4   ry   );
rS   z){c                     | j          S r	   r   rj   s    r   r   z.make_kernel_hints_dispatcher.<locals>.<lambda>   r   r   c                 B    |dk    r	d|  d| dn|dk    r	d|  d| dnd S )NrP   (z % z == 0)r1   z == )r
   )valro   s     r   r   z.make_kernel_hints_dispatcher.<locals>.<lambda>   sT    rzz 7#66$6666 qyy &S%%d%%%%	 r   z && c                 2    g | ]\  }}| ||          S r	   r
   )rg   r   ro   cond_fns      r   ri   z0make_kernel_hints_dispatcher.<locals>.<listcomp>   s9     
 
 
T GCr   z  if (z)
zif (1)
c                 $    g | ]\  }}|d k    |S rn   r
   rq   s      r   ri   z0make_kernel_hints_dispatcher.<locals>.<listcomp>   s"    WWWYS$TUVYYSYYYr   z    return r   rb   z#  return CUDA_ERROR_INVALID_VALUE;
r   loadunloadz
// z for: c                     | j          S r	   r   rj   s    r   r   z.make_kernel_hints_dispatcher.<locals>.<lambda>   
     r   void ();
z() {c                     | j          S r	   r   rj   s    r   r   z.make_kernel_hints_dispatcher.<locals>.<lambda>   r   r     )sortedr   r   r   ru   rk   r=   r]   r   r   any)rB   rv   r   r}   condsr   moder   s          @r   make_kernel_hints_dispatcherr      s   
&d
&
&
&Cu"8"8999 | |{40{{4={{4;{{boptbubu{{{{4KC\\\0LUSUY0W0W\\\]C4KCu"8"8999 v v  	  
 
 
 
 <<
 
 
  
 	s4:F#####J 	WW#dndj*I*IWWW	uT2uuT]uuT[uu[_[d[den[o[ouuuu4KC11C5LC"  +t++4++++5&<&<=== 	] 	]D\4\\$"7\\$-\\$+\\\\CC)t))d))))t5&<&<=== 	\ 	\DZZZ 5ZZZZZZZ[CCuJr   c                     d| j          dt          |            d}|d| j          dz  }|d| j          dd                    | j                   d	z  }|d
z  }|S )Nr   ry   z, int algo_id){
z   assert (algo_id < (int)sizeof(z_kernels));
r   z_kernels[algo_id](stream, rb   r   r   r   r   s     r   !make_kernel_meta_const_dispatcherr      s    
ud+
u
u?[\`?a?a
u
u
uCRd.CRRRRCgt,gg		RVR`HaHaggggC5LCJr   namesc                 n    dt          |           d}|d|j         dz  }| D ]}|d| dz  }|dz  }|S )Nz3typedef CUresult (*kernel_func_t)(CUstream stream, r   zkernel_func_t z_kernels[] = {
r   z,
z};
)rk   r   )r   r}   r   rB   s       r   make_func_pointersr      sf    
h@\]a@b@b
h
h
hCDD1DDDDC  ~D~~~6MCJr   c                 b    d}dD ])}|d| d|j          dz  }| D ]}|d| d| dz  }|dz  }*|S )	N r   r   r4   z(void){
r   r   z}

r   )r   r}   r   r   rB   s        r   make_kernel_load_defr      sv    
C"  ?t??d3???? 	+ 	+D***t****CCwJr   c                     d| j          d}|S )Nint z_get_num_algos(void);r   r   s     r   make_get_num_algos_declr      s    
=&
=
=
=CJr   c                 R    d| j          d}|d| j          d| j          dz  }|dz  }|S )Nr   z_get_num_algos(void){
z  return (int)(sizeof(z_kernels) / sizeof(z_kernels[0]));
r   r   r   s     r   make_get_num_algos_defr      sG    
@&
@
@
@CuD$9uudNcuuuuC5LCJr   a0  
Triton ahead-of-time linker:

This program takes in header files generated by compile.py, and generates a
single entry-point responsible for dispatching the user's input to the right
kernel given the specializations that were compiled.

Example usage:
python link.py /path/to/headers/*.h -o kernel_name
__main__)ArgumentParser)descriptionheaders+z_Paths to header files to link. Must include linker directive annotations (autogenerated by ttc))nargshelpz--outz-ozOut filename)typer   z--prefixr   z(String to prefix kernel dispatcher names)r   defaultr   c                 4    g | ]\  }}t          ||          S r
   )r|   rg   rB   r}   s      r   ri   ri     s&    WWW*$/$--WWWr   c                     g | ]\  }}|S r
   r
   r   s      r   ri   ri     s    @@@:4$@@@r   z.hwz#include <cuda.h>
r   Nc                 4    g | ]\  }}t          ||          S r
   )r   r   s      r   ri   ri   *  s'    ^^^t(t44^^^r   c                     g | ]}|S r
   r
   )rg   rB   s     r   ri   ri   +  s    444dT444r   z.cz#include <stdint.h>
z#include <assert.h>
)@collectionsr   pathlibr   typingr   r   dataclassesr   r   	Exceptionr   r   r"   rk   ru   r   r|   r   r   r   r   r   r   r   r   descr   argparser   parseradd_argument
parse_argsrK   includesr   r/   h_path	read_texth_strrI   rB   rD   r,   items
algo_decls
meta_listsr}   get_num_algos_declglobal_decloutwith_suffixopenfpr=   writedefskeysr   func_pointers_defmeta_const_defload_unload_defget_num_algos_defdefault_algo_kernelr
   r   r   <module>r      s   # # # # # #       " " " " " " " " ! ! ! ! ! !  	 	 	 	 	) 	 	 	 	, 	, 	, 	, 	, 	, 	, 	,Z' Z' Z' Z' Z' Z' Z' Z'zT T T  # h/?&@ S    +     #3     %s %8<L3M %RU % % % %R,<     c )9 c     +;     "2 s    
!1 c    	 z''''''^---F
n    
 D~FFF
7	     D \^^FH, * *f  ""$$$""5)))) XW@T@T@V@VWWWJ@@)=)=)?)?@@@Ja=D0066""4((K			d	#	#	(	(	-	- #tyy$$$t!!t{
               _^v~G[G[G]G]^^^D44fn1133444E**5$7766t<<N**5$77O..t4422488			d	#	#	(	(	-	- $$&&&&ttyyt  t  t~tt""
#                 e s&   $AI44I8;I8+A6N..N25N2