U
    9%e                     @   s  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 d dl	m
Z
 d dlZd dlmZ d dlmZ dZedkreed	Zejd
dd ejddedddd ejddeddd ejddeddd ejddeddd ejdded dd! e ZejrejnejZejrejneZeejZejd eej ej ej!eZ"ej#e"Z$e"j%&e$ e'e$ejZ(e)e*d"d# ej+,d$Z+e
e d%d&d'Z-e-e+Z.d(d) Z/d*d+ e0e+D Z1d,d+ e12 D Z1d-d+ e0e+D Z3d.d+ e32 D Z3d/d+ e0e+D Z+e14 D ]Z5e5d0kst6d1e5 qd2d3 e12 D Z7d4d3 e12 D Z8ej9j:e7e8d5Z;ej<e(e+e3e;gej=d6Z>d7d3 e+? D Z@ee+4 e;ZAd8Bee.eAgZCd8BejeAgZDee Ee>jFd9 d:d; ZGeCeDeHeGd<Bd=d3 eIeGddd: eGddd: D d<Bd>d3 eIe@e+4 D d<Bd?d3 e@D eHe@de>jJej=dd@ZKdAD ]bZLeeMjdBeL  ZNeOdCe. d8eA dCeL PdD ZQeQReeNS jTf eK W 5 Q R X qVdS )E    N)ArgumentParser)Path)List)kernel_suffix	ty_to_cppa  
Triton ahead-of-time compiler:

This program compiles the kernel with name `kernel-name` in the file at the
provided `path` into self-contained C source-code that embeds the `cubin`
data along with utilities to load, unload and launch the kernel.

signature is provided as a list of (optionally divisibility-hinted) types
or constexpr values, e.g.

`compile.py --kernel-name kernel --signature "*f32:16, i32:16, 1024, i32" --out-name kernel /path/to/kernel.py`

will compile triton.JITFunction of name `kernel` inside the file `/path/to/kernel.py`.
Said kernel will be specialized such that argument 0, 1 are assumed to be multiple of 16,
and argument 2 is assumed to be a compile-time constant of value 1024, i.e. it won't be part of the generated prototype.

The resulting entry point will have signature

CUresult kernel_{specialization_suffix}(CUstream stream, unsigned gX, unsigned gY, unsigned gZ, float* arg0, int32_t arg1, int32_t arg2)

Different such specialized entry points can be combined using the `linker.py` script.

NOTE: when resolving the scope of /path/to/kernel.py, the file will be executed from within its parent directory with the python interpreter
used to run this `compile.py` script
__main__)descriptionpathzTPath to Python source containing desired kernel in its scope. File will be executed.)helpz--kernel-namez-n zName of the kernel to compileT)typedefaultr   requiredz--num-warpsz-w   z$Number of warps to launch the kernel)r   r   r   z
--out-namez-onz Out name for the compiled kernelz
--out-pathz-ozOut filenamez--signaturez-szSignature of the kernel)r   r   r   c                 C   s
   |  dS )N )strip)s r   S/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/triton/tools/compile.py<lambda>?       r   ,)	signaturec                 C   s,   t  }|d|   | d d S )Nr      )hashlibsha256updatejoinencode	hexdigest)r   mr   r   r   hash_signatureA   s    r"   c                 C   sL   zt | }|W S  tk
r"   Y nX zt| }|W S  tk
rF   Y nX d S N)int
ValueErrorfloat)r   retr   r   r   	constexprH   s    r(   c                 C   s,   i | ]$\}}d |kr|t |d d qS ):r   )r(   split.0ir   r   r   r   
<dictcomp>U   s       r.   c                 C   s   i | ]\}}|d k	r||qS r#   r   r,   kvr   r   r   r.   V   s       c                 C   s   i | ]\}}|t |qS r   )r(   r+   r   r   r   r.   W   s      c                 C   s   i | ]\}}|d k	r||qS r#   r   r/   r   r   r   r.   X   s       c                 C   s(   i | ] \}}|t kr||d d qS )r)   r   )
constexprsr*   r+   r   r   r   r.   Y   s       )r      z#Only 1 and 16 are valid hints, got c                 C   s   g | ]\}}|d kr|qS )r3   r   r,   r-   hr   r   r   
<listcomp>^   s      r6   c                 C   s   g | ]\}}|d kr|qS )r   r   r4   r   r   r   r6   _   s      )divisible_by_16
equal_to_1)r   	constantsZconfigs	num_warpsc                 C   s   g | ]}t j| qS r   )kernel	arg_names)r,   r-   r   r   r   r6   b   s     _Zcubin   z, c                 C   s   g | ]\}}d | | qS )0xr   )r,   xyr   r   r   r6   m   s     c                 C   s"   g | ]\}}t | d | qS )r   r   )r,   nametyr   r   r   r6   n   s     c                 C   s   g | ]}d | qS )&r   )r,   argr   r   r   r6   o   s     )kernel_nametriton_kernel_nameZbin_sizeZbin_datar   Zarg_pointersnum_argsZkernel_docstringsharedr:   Z_placeholder)r5   czcompile..w)Ubinasciir   importlib.util	importlibsysargparser   pathlibr   typingr   ZtritonZtriton.compiler.code_generatorr   Ztriton.compiler.make_launcherr   desc__name__parseradd_argumentstrr$   
parse_argsargsZout_namerG   Zout_pathr
   Zarg_pathinsertparentutilspec_from_file_locationstemspecmodule_from_specmodloaderexec_modulegetattrr;   listmapr   r*   r"   Zsig_hashr(   	enumeratehintsitemsr2   valuesr5   AssertionErrorr7   r8   compilerZinstance_descriptorconfigcompiler:   Zccinfokeysr<   suffixr   	func_namerH   hexlifyasmZhex_lenziprJ   paramsext__file__Ztemplate_pathwith_suffixopenfpwrite	read_textformatr   r   r   r   <module>   s~   


,$