U
    h@                     @  s|  d dl mZ d dlZd dlZddlmZmZ ddlm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 ddlmZ d dlmZ d dlZd dlZd dlZeG dd dZdZdZeeedZ dZ!dZ"e!e!e"dZ#dd Z$ddddZ%G dd dZ&G dd dZ'e( d d! Z)d"d# Z*d$d%d&d'Z+d0d(d)Z,d*d+ Z-G d,d- d-Z.G d.d/ d/Z/dS )1    )annotationsN   )get_cache_invalidating_env_varsir)backends)	GPUTarget)__version__)OutOfResources)get_cache_managerget_dump_managerget_override_manager)driver)	dataclass   )ast_to_ttir)Pathc                   @  sJ   e Zd ZU dZded< dZded< dd Zdd Zed	d
 Z	dd Z
dS )AttrsDescriptorNsetdivisible_by_16
equal_to_1c                 C  s(   | j d krt | _ | jd kr$t | _d S N)r   r   r   self r   J/var/www/html/venv/lib/python3.8/site-packages/triton/compiler/compiler.py__post_init__   s    

zAttrsDescriptor.__post_init__c                 C  s   t | jt | jdS )Nr   r   )listr   r   r   r   r   r   to_dict   s    zAttrsDescriptor.to_dictc                 C  s$   t t| dg t| dg dS )Nr   r   r   )r   r   get)datar   r   r   	from_dict"   s    zAttrsDescriptor.from_dictc                 C  s,   t dd | j D }t|d S )Nc                 S  s   g | ]}t |qS r   )sorted.0xr   r   r   
<listcomp>(   s     z(AttrsDescriptor.hash.<locals>.<listcomp>utf-8)str__dict__valueshashlibsha256encode	hexdigest)r   keyr   r   r   hash'   s    zAttrsDescriptor.hash)__name__
__module____qualname__r   __annotations__r   r   r   staticmethodr!   r0   r   r   r   r   r      s   

r   z^\s*tt\.func\s+(?:public\s+)?(@\w+)(\((?:%\w+: [\S\s]+(?: \{\S+ = \S+ : \S+\})?(?:, )?)*\))\s*(attributes \{[\S\s]+\})?\s+\{\s*$z=\.(?:visible|extern)\s+\.(?:entry|func)\s+(\w+)\s*\(([^)]*)\))ttirttgirptxz %\w+: ((?:[^,\s<)]+|<[^>]+>)+),?z\.param\s+\.(\w+)c                 C  s*   t d| }|d k	r&dt|d S | S )Nz!tt\.ptr<([^,]+)*r   )researchconvert_type_reprgroup)r%   matchr   r   r   r<   E   s    r<   r(   )srcc                 C  s4   d}t || }t|dks$tdt|d }|S )Nz&"triton_gpu.num-warps"\s?=\s?(\d+)\s?:r   z(Expected exactly one match for num_warpsr   )r:   findalllenAssertionErrorint)r?   Zttgir_num_warps_patternZnum_warps_matches	num_warpsr   r   r   _get_num_warps_from_ir_strN   s
    rE   c                   @  s4   e Zd ZdddddZdd Zdd	 Zd
d ZdS )	ASTSourceNNonereturnc                 C  sv   || _ d| _|j| _|| _|| _|| _t| jtrNdd t	| j
dD | _| jd kr`t | _| jd krrt | _d S )Nr6   c                 S  s   i | ]\}}||  qS r   )stripr$   kvr   r   r   
<dictcomp>b   s      z&ASTSource.__init__.<locals>.<dictcomp>,)fnextr1   name	signature	constantsattrs
isinstancer(   	enumeratesplitdictr   )r   rP   rS   rT   rU   r   r   r   __init__Z   s    

zASTSource.__init__c                 C  sh   dd t | j D }t dd | j D }| jj d| j  d| d| }t	|
d S )Nc                 S  s   g | ]\}}|qS r   r   rK   r   r   r   r&   i   s     z"ASTSource.hash.<locals>.<listcomp>c                 s  s   | ]\}}t ||fV  qd S r   )r(   rK   r   r   r   	<genexpr>l   s     z!ASTSource.hash.<locals>.<genexpr>-r'   )r"   rS   itemsrT   rP   	cache_keyrU   r0   r+   r,   r-   r.   )r   Z
sorted_sigZsorted_constantsr/   r   r   r   r0   h   s    $zASTSource.hashc                 C  s   t | j| |||dS )N)contextoptionscodegen_fns)r   rP   )r   r`   ra   r_   r   r   r   make_irp   s    zASTSource.make_irc                 C  s   t  S r   )rY   r   r   r   r   parse_optionss   s    zASTSource.parse_options)NNr1   r2   r3   rZ   r0   rb   rc   r   r   r   r   rF   X   s   rF   c                   @  s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
IRSourcec                 C  s   || _ t|}|jdd  | _| | _tt| j | jtj	}|
d| _|
d}tt| j |}dd t|D | _d S )Nr   r   c                 S  s   i | ]\}}|t |qS r   )r<   )r$   rL   tyr   r   r   rN      s      z%IRSource.__init__.<locals>.<dictcomp>)pathr   suffixrQ   	read_textr?   r:   r;   prototype_pattern	MULTILINEr=   rR   r@   arg_type_patternrW   rS   )r   rg   r>   rS   typesr   r   r   rZ   y   s    

zIRSource.__init__c                 C  s   t | jd S )Nr'   )r+   r,   r?   r-   r.   r   r   r   r   r0      s    zIRSource.hashc                 C  s   t | j|}||_|S r   )r   parse_mlir_modulerg   r_   )r   r`   ra   r_   moduler   r   r   rb      s    zIRSource.make_irc                 C  s   | j dkrdt| jiS t S )Nr7   rD   )rQ   rE   r?   rY   r   r   r   r   rc      s    
zIRSource.parse_optionsNrd   r   r   r   r   re   w   s   re   c                  C  s  dd l } tjtjtjt}g }ttd}|t|	 
 g7 }W 5 Q R X tj|ddftj|ddfg}|D ]X\}}| j|g|dD ]>}t|j|jjd}|t|	 
 g7 }W 5 Q R X qq~t }ttj|dd&}|	d	}	|	s
q||	 qW 5 Q R X ||
  tj|d
}
| |
gD ]@}t|j|jjd}|t|	 
 g7 }W 5 Q R X qHt d| S )Nr   rbcompilerztriton.compiler.r   ztriton.backends.)prefixz_C/libtriton.soi   languager\   )pkgutilosrg   dirnameabspath__file__openr+   r,   readr.   joinwalk_packagesmodule_finder	find_specrR   originupdateappenditer_modulesr   )rt   ZTRITON_PATHcontentsfZpath_prefixesrg   rr   libZlibtriton_hashchunkZlanguage_pathr   r   r   
triton_key   s0    "&
&r   c                 C  sZ   |dks|dkr&t | |}||_|S |dks6|dkrBt|  S |dkrVt|  S d S )Nr6   r7   Zllirr8   Zcubin)r   rn   r_   r   ri   
read_bytes)	full_namerQ   r_   ro   r   r   r   parse   s    r   BaseException)ec                   s   | j dk	rt| j  | jdk	r(t| j ddg}| j g } dk	rjt fdd|D sb|   j q:t||dd D ]\}}||_q||sd| _nd|d _|d | _dS )	z
    Removes code_generator.py and related files from tracebacks.

    These are uninteresting to the user -- "just show me *my* code!"
    Nz"/triton/compiler/code_generator.pyz/ast.pyc                 3  s"   | ]} j jj|r|V  qd S r   )tb_framef_codeco_filenameendswith)r$   r   tbr   r   r[      s      z#filter_traceback.<locals>.<genexpr>r   r   )	__cause__filter_traceback__context____traceback__anyr   tb_nextzip)r   Z	BAD_FILESframesZ	cur_frameZ
next_framer   r   r   r      s&    





r   c                  C  sL  |d krt j }t|ts$tdt|}t| t }|rVt| tsNtdt	| } | 
 }|
t|plt f|}t }t  d|   d|  d|  dtt|  	}t|d }t|}	tjdddk}
tjdddk}|
rt|  nd }|rt|  nd }| j d	}|	|p<i }||}tjd
ddk}|s|d k	rtt|  }t!| ||S ||d|j"|}t }|#|| t$|% &| j'}|r|d7 }t() }t(*| |*| |+ }z| ,|||}W n. t-k
r2 } zt.|  W 5 d }~X Y nX tjdddk}t$| |d  D ]\}}|||}| j d| }|	/||||< |d k	r|/|| |d k	r|0|rt1d|  |2|}t3|||}|r|dkr|	2|}|4| t1d|  |}qZ|	j/tj5|t6d|dd||< |	7|| t!| ||S )Nz target must be of GPUTarget typez'source must be either AST or a filepathr\   r'   ZTRITON_KERNEL_OVERRIDE01ZTRITON_KERNEL_DUMP.jsonZTRITON_ALWAYS_COMPILE)r0   targetr   ZUSE_TTGIR_LOC.z
Overriding kernel with file r7   zCreate new locations for )defaultF)binary)8r   activeZget_current_targetrV   r   rB   make_backendrF   r(   re   rc   rY   r   r   r0   r"   r]   r+   r,   r-   r.   r
   ru   environr   r   r   rR   Z	get_groupjsonloadsr   ri   CompiledKernelr)   Z
add_stagesr   keysindexrQ   r   r_   Zload_dialectsZget_codegen_implementationrb   	Exceptionr   putZhas_fileprintZget_filer   Zcreate_location_snapshotdumpsvarsZ	put_group) r?   r   r`   backendZ	ir_sourceZextra_optionsZenv_varsr/   r0   Zfn_cache_managerZenable_overrideZenable_ir_dumpZfn_override_managerZfn_dump_managerZmetadata_filenamemetadata_groupmetadata_pathZalways_compilemetadataZstagesZfirst_stager_   ra   ro   r   Zuse_ttgir_locrQ   Z
compile_irZnext_moduleZir_filenamer   Zttgir_full_namer   r   r   compile   s    
:








r   c                   sN    fddt  D }t|dkrBtt| d j d| d|d  S )Nc                   s   g | ]}|j  r|j qS r   )rq   Zsupports_targetr#   r   r   r   r&   2  s      z make_backend.<locals>.<listcomp>r   z! compatible backends for target (z) (z). There should only be one.r   )r   r*   rA   RuntimeErrorr   )r   Zactivesr   r   r   r   1  s    r   c                   @  s*   e Zd Zdd ZddddZdd Zd	S )
LazyDictc                 C  s   || _ g | _d S r   )r    extras)r   r    r   r   r   rZ   ;  s    zLazyDict.__init__rG   rH   c                 C  s0   | j D ]\}}| j|| B | _q| j   | jS r   )r   r    clearr   funcargsr   r   r   r   ?  s    
zLazyDict.getc                 C  s   | j ||f d S r   )r   r   r   r   r   r   addE  s    zLazyDict.addN)r1   r2   r3   rZ   r   r   r   r   r   r   r   9  s   r   c                      sD   e Zd ZdZdZdd Zdd Z fddZdd	 Zd
d Z	  Z
S )r   Nc                   s   ddl m} tdd | D }t| }t|d |d< |d }t|d |d |d	 |d< |d
t	t
| }|f || _t| jj}	|	| j| _|| _|| _| jj| _dd | D }
|	j  fdd|
D | _| j  | _d | _d | _d S )Nr   )
namedtuplec                 s  s$   | ]\}}| d rt|V  qdS )r   Nr   r   r$   cpr   r   r   r[   R  s     
 z*CompiledKernel.__init__.<locals>.<genexpr>Zcluster_dimsr   r   archZ	warp_sizeKernelMetadatac                 S  s"   g | ]\}}| d st|qS )r   r   r   r   r   r   r&   `  s     
 z+CompiledKernel.__init__.<locals>.<listcomp>c                   s:   i | ]2}|j d d |j d d  kr.| n| qS )r   N)rh   r   ri   )r$   file
binary_extr   r   rN   b  s    z+CompiledKernel.__init__.<locals>.<dictcomp>)collectionsr   nextr]   r   r   ri   tupler   r"   r   r   r   r   r   Zpack_metadatapacked_metadatar?   r0   rR   r   asmkernelro   function)r   r?   r   r0   r   r   r   r   r   r   Z	asm_filesr   r   r   rZ   P  s*    

zCompiledKernel.__init__c                 C  s   | j d k	rd S tj }tj| j| j| _tjj	|d }| jj
|krZt| jj
|dtjj| j| j| jj
|\| _ | _| _| _d S )NZmax_shared_memzshared memory)ro   r   r   get_current_deviceZlauncher_clsr?   r   runutilsZget_device_propertiesZsharedr	   Zload_binaryrR   r   r   Zn_regsZn_spills)r   deviceZ
max_sharedr   r   r   _init_handlesm  s    

   zCompiledKernel._init_handlesc                   s   |dkr|    t |S )Nr   )r   super__getattribute__)r   rR   	__class__r   r   r   {  s    zCompiledKernel.__getattribute__c           	      G  s   t jd krd S t| j| j|d}t| jtr<| jjj	d kr@|S i }d}t
| jjjD ]<\}}|| jjjkr~| jj| ||< qV|| ||< |d7 }qV|| jjj	|| j|f |S )N)rR   r   streamr   r   )r   launch_enter_hookr   rR   r   rV   r?   rF   rP   launch_metadatarW   	arg_namesZ
constexprsrT   r   r   )	r   gridr   r   retZarg_dictZarg_idxiarg_namer   r   r   r     s    

zCompiledKernel.launch_metadatac                   s       d d fdd
}|S )N)r   c              
     sh   | d krt j }t j|} j | f| }j d  d  d | jj|tj	tj
f	|  d S )Nr   r   r   )r   r   r   Zget_current_streamr   r   r   r   r   r   launch_exit_hook)r   r   r   r   r   r   r   r   runner  s    
" z*CompiledKernel.__getitem__.<locals>.runner)r   )r   r   r   r   r   r   __getitem__  s    zCompiledKernel.__getitem__)r1   r2   r3   r   r   rZ   r   r   r   r   __classcell__r   r   r   r   r   I  s   r   )NN)0
__future__r   r+   r   Z_C.libtritonr   r   r   Zbackends.compilerr    r   Zruntime.autotunerr	   Zruntime.cacher
   r   r   Zruntime.driverr   dataclassesr   Zcode_generatorr   pathlibr   r:   	functoolsru   r   Zmlir_prototype_patternZptx_prototype_patternrj   Zmlir_arg_type_patternZptx_arg_type_patternrl   r<   rE   rF   re   	lru_cacher   r   r   r   r   r   r   r   r   r   r   <module>   sR   	

""
O