K i_.@ddlmZddlmZddlmZmZddlmZdZ Gdde Z eGdd Z Gd d Z d Zd Zdedee defdZde defdZde defdZdedee defdZde defdZdede defdZdede defdZde defdZde defdZdZedk(rddlmZeeZej?d d!d"#ej?d$d%ed&'ej?d(ed)d*+ejAZ!e ZgZ"e!jFD]FZ$ee$Z%e%jMZ'e"jQe%jRejUe'HejVjYDcgc]\}}e||c}}Z-ejVjYDcgc]\}}| c}}Z.e.ddZ/ee/Z0ee/Z1e!jdjgd,jid-5Z5d.Z2e2d/jme-z Z2e2d/z Z2e2e0z Z2e2d/z Z2e2e1z Z2e5joe2d0d0d0ejVjYDcgc]\}}e||c}}Z8ejVjsDcgc]}|c}Z:ee:e/Z;ee/Z<ee:e/Z=ee/Z>ee/Z?e!jdjgd1jid-5Z5d)Z2e2d.z Z2e2d2z Z2e2d3z Z2e2d/z Z2e2d/jme8z Z2e2d/z Z2e2e;z Z2e2d/z Z2e2e>z Z2e2d/z Z2e2exYwcc}}wcc}w#1swYy0xYw)4) defaultdict)Path)SequenceUnion) dataclassc |duSN)xs W/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/triton/tools/link.py_existsr s D=c eZdZy) LinkerErrorN)__name__ __module__ __qualname__r rr rr srrczeZdZUeed<eeed<eeed<eeedfed<eed<eed<eed<eed <y) KernelLinkerMetaorig_kernel_name arg_names arg_ctypesNsizessig_hash triton_suffixsuffix num_specs)rrrstr__annotations__rrintr rr rrsH}  E#t)$ %%M KN+rrcXeZdZddZdefdZdefdZdefdZd edefd Zd ed e fd Z y) HeaderParserNcddl}|jd|_|jd|_|jd|_|jd|_t t|_y)Nrz'//[\s]*tt-linker:[\s]*([\w]+):(.+):(.+)z^([\w]+)_([\w]+)_([\w]+)$z[\s]*(\w+)\s(\w+)[,]?z[c,d]) recompilelinker_directives kernel_namec_sig arg_suffixrlistkernels)selfr$s r __init__zHeaderParser.__init__sX"$,X!Y::&DEZZ ;< **W-"4( rheaderc|jD]}|jds|jj|}t |s<|j d|j d|j d}}}|j |\}}} |j|\} } |j| |\} } |jdj||gt|| | | || | | y)Nz//_)rrrrrrrr) splitlines startswithr&matchr group _match_name _match_c_sig _match_suffix _add_kerneljoinr)r,r.lnmker_namer( algo_infonamerrc_typesrrrs r extract_linker_metaz HeaderParser.extract_linker_meta-s##% B}}T"**0041:12QWWQZQRYeH-1-=-=h-G*D(F)-):):5)A&GY'+'9'9&%'H$Iu$$$ !23(-1&/'."'%-*0#)&/   rr?c|jj|}t|r8|jd|jd|jd}}}|||fSt |d)Nr0r1r2z is not a valid kernel name)r'r6r r7r)r,r?r>rArrs r r8zHeaderParser._match_nameDsd    " "8 , 1:%&WWQZQWWQZF(D6) )XJ&ABCCrr(c|jj|}t|r4gg}}|D]'\}}|j||j|)||fSt |d)Nz" is not a valid argument signature)r(findalllenappendr)r,r(r>tysargstyarg_names r r9zHeaderParser._match_c_sigKso JJ  u % q6BC ! & H 2 H% &9 UG#EFGGrrc6|jd}ddd}d}g}tt|D]}|jt |}|dk(rt |d|tt |z }|j j||rB|dz }|jdg|t|z z|j||||dz }|t|dz kr||d}|jdgt|t|z z||fS)N,r0)cdrz is not a valid kernel suffix) splitrangerGfindrrr)r6extendrH) r,rr(rJs2irriposs r r:zHeaderParser._match_suffixVs{{3B s4y! @A++c!f%Cby!VH,I"JKK 3s1v; C$$VS1Q  dVq3u:~67 S-.q3t9q=  dVs4y3u:'=>? @%rrAkerc f||jvr|j|d}t|j|jD]P\}}||k7s td|ddj |jddj |j|j|j |y)NrRz Mismatched signature for kernel z: existing sig is: rNz current is: )r+ziprrr<rH)r,rArZlastcurnew_s r r;zHeaderParser._add_kernelms 4<< %)\\$%7%;D #..A  T$;%:4&@WX[X`X`aeapapXqWrsCDGDLDLMPM[M[D\C]^  T!!#&r)returnN) rrrr-rrCr8r9r:rr;r rr r"r"sV )#.DCD H# H C  . ' '*: 'rr"c djt|j|jDcgc] \}}|d|c}}Scc}}w)N,  )r<r\rr)r>rKargs r gen_signature_with_full_argsrezs< 993q||Q[[3QRCAcUmR SSRsA c pt|j|jDcgc] \}}|dk7s |}}}t|j|jDcgc] \}}|dk7s |}}}dj t||Dcgc] \}}|d|c}}}|Scc}}wcc}}wcc}}w)Nr0rbrc)r\rrrr<)r>rKhint arg_typesrdrsigs r gen_signaturerj~s$' agg$>LD$!)LIL&)!++qww&?Md419MIM ))#i2KLwr3t1SE]L MC JMMLs B&B& B,*B, B2 rAmetasr`c 8d|dt|dd|d|d S)N CUresult (CUstream stream, rRz ); void load_(); void unload_(); )re)rArks r make_algo_declsrqsB !">uRy"I!JK & F rmetac d|jdt|d|jdt|d|jd|jd S)Nrm_default(CUstream stream, z ); CUresult rnz, int algo_id); void load_rorp)rre)rrs r make_global_declrusu    :;WX\;]:^_    23OPT3U2VW  !"  " " #$  rcd|jdt|d}|d|jddj|jdz }|dz }|S) N CUresult rtz){ return (stream, rbz, 0); } rrer<rrrsrcs r make_default_algo_kernelr~sd d++,,FGcdhGiFjjo pCi--.i $..8Q7RRY Z[C5LC Jrc rd|d}t|dD];}|d|jd|jd|jdt |d z }=|dz }|d|dt |d d z }|dz }t|d D]}d }d j t|j|jDcgc]\}}| |||c}}}|t|jrd|dndz }t|j|jDcgc] \}}|dk7s |} }}|d|jd|jd|jddj | d z }|dz }|dz }|dz }dD]} |d| d|dz }t|dD]2}|d| d|jd|jd|jd z }4|d| d|dz }|dz }t|dD]2}|d| d|jd|jd|jd z }4|dz }|Scc}}wcc}}w) Nz// launcher for:  c|j Sr rr>s r z.make_kernel_hints_dispatcher.. Q[[Lr)keyrwr3rn); rRz){c|j Sr rrs r rz.make_kernel_hints_dispatcher..rrc>|dk(r d|d|dS|dk(r d|d|dSdS)NrO(z % z == 0)r0z == )r )valrgs r rz.make_kernel_hints_dispatcher..sKrz!"#c$v6qySEdV1% rz && z if (z) zif (1) r0z return ryrbz# return CUDA_ERROR_INVALID_VALUE; rzloadunloadz // z for: c|j Sr rrs r rz.make_kernel_hints_dispatcher..  rvoid (); z() {c|j Sr rrs r rz.make_kernel_hints_dispatcher..rr ) sortedrrrrjrer<r\rrany) rArkr}rrcond_fnrrgcondsrdrmodes r make_kernel_hints_dispatcherrs dV2 &Cu"89| 40014==/4;;-Oaboptbuavvz{{|4KCiv/0LUSUY0W/XX[ \]C4KCu"89v     < T C    s4::&s#J *-dnndjj*IWYS$TUVYSW W T2231T]]O1T[[MQZ[_[d[den[oZpptuuv 4KC 11C5LC" tfF4&++5&<= ]D U4&$"7"7!8$--$++V[\ \C ] tfAdV5)) t 5&<= \D ba 5 56a a }TYZ [C \ u  J- Xs7H-  H3%H3cd|jdt|d}|d|jdz }|d|jddj|jd z }|d z }|S) Nrwrnz, int algo_id){ z assert (algo_id < (int)sizeof(z _kernels)); rxz_kernels[algo_id](stream, rbrrzr{r|s r !make_kernel_meta_const_dispatcherrs d++,,>?[\`?a>bbt uC -d.C.C-DM RRCYt,,--G RVR`R`HaGbbf ggC5LC Jrnamesctdt|d}|d|jdz }|D] }|d|dz } |dz }|S)Nz3typedef CUresult (*kernel_func_t)(CUstream stream, rzkernel_func_t z_kernels[] = { rz, z}; )rer)rrrr}rAs r make_func_pointersrsc ?@\]a@b?ccg hC^D1122C DDC D6~6MC Jrctd}dD]0}|d|d|jdz }|D]}|d|d|dz }|dz }2|S) Nrrr3z(void){ rrz} r)rrrr}rrAs r make_kernel_load_defrsn C" tfAd334J?? +D RvQtfE* *C + w  Jrc&d|jd}|S)Nint z_get_num_algos(void);rr|s r make_get_num_algos_declrs &&''< =C Jrcpd|jd}|d|jd|jdz }|dz }|S)Nrz_get_num_algos(void){ z return (int)(sizeof(z_kernels) / sizeof(z_kernels[0])); rzrr|s r make_get_num_algos_defrsP &&''? @C #D$9$9#::MdNcNcMddt uuC5LC Jra0 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) descriptionheaders+z_Paths to header files to link. Must include linker directive annotations (autogenerated by ttc))nargshelpz--outz-oz Out filename)typerz--prefixrz(String to prefix kernel dispatcher names)rdefaultrz.hwz#include rNz.cz#include z#include )@ collectionsrpathlibrtypingrr dataclassesrr Exceptionrrr"rerjrrqrur~rrrrrrdescrargparserparser add_argument parse_argsrJincludesrr.h_path read_texth_strrHrArCr+items algo_decls meta_listsrrget_num_algos_decl global_declout with_suffixopenfpr<writedefskeysrfunc_pointers_defmeta_const_defload_unload_defget_num_algos_defdefault_algo_kernel)rArrs00r rsv#"! )   , ,  ,Z'Z'zT#h/?&@S+#3%s%8M02 M6