U
    yÊ¹j$  ã                   @   sö   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m	Z	 ddlm
Z
 dd	lmZ dd
lmZmZmZmZ e	jZi Zdd„ Zdd„ Zdd„ Zeedf eedf dœdd„ZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZdd„ ZdS )é    N)ÚTupleé   )Úlanguage)Úcoreé   )Útorch_wrapper)ÚExecutionContext)Ú	MemoryMap)ÚTritonLangProxyÚWrappedTensorÚ_primitive_to_tensorÚdebugger_constexprc                    s   t | |ƒ‰ ‡ fdd„}|S )Nc                     s
   ˆ | |ŽS ©N© )ÚargsÚkwarg©Úmethodr   ú]/var/www/html/bwave/python/venv/lib/python3.8/site-packages/triton/interpreter/interpreter.pyÚfun   s    zget_proxy_method.<locals>.fun)Úgetattr)ÚproxyÚnamer   r   r   r   Úget_proxy_method   s    
r   c                 C   sj   dd„ t tƒD ƒ}|D ]N}t| |ƒrt| |ƒ}|t|< t|ƒrRt| |t||ƒƒ qt| |t||ƒƒ qd S )Nc                 S   s   g | ]}|d  dkr|‘qS )r   Ú_r   )Ú.0Úfuncr   r   r   Ú
<listcomp>   s      z!attach_triton.<locals>.<listcomp>)Údirr
   Úhasattrr   Útl_method_backupÚcallableÚsetattrr   )Úmoduler   Zmethod_listr   Úattrr   r   r   Úattach_triton   s    

r%   c                 C   s"   t  ¡ D ]\}}t| ||ƒ qd S r   )r    Úitemsr"   )r#   r   r   r   r   r   Údetach_triton'   s    r'   .)ÚgridÚreturnc                 c   sB   t | ƒ}dd„ |D ƒ}ttj|Ž ƒ}t |¡ |D ]
}|V  q2d S )Nc                 S   s   g | ]}t |ƒ‘qS r   )Úrange)r   Údimr   r   r   r   /   s     z)program_ids_from_grid.<locals>.<listcomp>)ÚreversedÚlistÚ	itertoolsÚproductÚrandomÚshuffle)r(   Zreversed_gridZranges_for_each_dimensionZindex_combinationsZindex_combinationr   r   r   Úprogram_ids_from_grid,   s    
r2   c                   @   s>   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ ZdS )ÚDebuggerFunction©r   c                 C   s   || _ || _d S r   )r   r(   )Úselfr   r(   r   r   r   Ú__init__:   s    zDebuggerFunction.__init__c                 C   s   || j jko| j j| tjkS r   )r   Ú__annotations__ÚlcoreÚ	constexpr)r5   r   r   r   r   Ú_is_constexpr>   s    zDebuggerFunction._is_constexprc                 C   s2   g }| j j ¡ D ]\}}|tjkr| |¡ q|S r   )r   r7   r&   r8   r9   Úappend)r5   Úresultr   Ú
annotationr   r   r   Ú_get_constexprA   s
    
zDebuggerFunction._get_constexprc                    s8   |   ¡ }‡ fdd„|D ƒ}t|ƒdks4td|› �ƒ‚d S )Nc                    s   g | ]}|ˆ   ¡ kr|‘qS r   )Úkeys)r   Úi©Úkwargsr   r   r   J   s      z6DebuggerFunction._assert_constexpr.<locals>.<listcomp>r   zYou must specify constexpr )r>   ÚlenÚAssertionError)r5   rB   ZconstexpÚmissingr   rA   r   Ú_assert_constexprH   s    z"DebuggerFunction._assert_constexprc                 K   s   t | jƒr|  |¡S | jS d S r   )r!   r(   )r5   rB   r   r   r   Ú	_get_gridM   s    

zDebuggerFunction._get_gridc                    sœ   ˆj f |Ž tƒ ‰‡‡fdd„‰ ttˆ tˆjjj|ƒƒƒ}‡ fdd„| ¡ D ƒ}ˆj	f |Ž}t
|ƒD ]2}tˆt||ƒƒ}tt|ƒ ˆj||Ž ttƒ qdd S )Nc                    sR   | \}}t  |¡r4ˆ  |¡}tt j|gt jdd�ƒS ˆ |¡rFt|ƒS tt|ƒƒS )NÚcuda)ZdtypeZdevice)	ÚtorchÚ	is_tensorZ
add_tensorr   ZtensorZint64r:   r   r   )Úvr   ÚargZptr)Úmemoryr5   r   r   Úconvert_argX   s    


z.DebuggerFunction.__call__.<locals>.convert_argc                    s&   i | ]\}}|d kr|ˆ ||fƒ“qS ))Z	num_warpsZ
num_stagesr   ©r   ÚkrK   ©rN   r   r   Ú
<dictcomp>b   s       z-DebuggerFunction.__call__.<locals>.<dictcomp>)rF   r	   ÚtupleÚmapÚzipr   Ú__code__Úco_varnamesr&   rG   r2   r
   r   r%   Útlr'   )r5   r   rB   Únew_argsÚ
new_kwargsr(   Z
program_idr   r   )rN   rM   r5   r   Ú__call__S   s    	
zDebuggerFunction.__call__N)r4   )	Ú__name__Ú
__module__Ú__qualname__r6   r:   r>   rF   rG   r[   r   r   r   r   r3   9   s   
r3   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚGridSelectorz%
    Entry point of the debugger
    c                 C   s*   t j}|d dks td|› �ƒ‚|| _d S )Nr   Ú2z2Triton Debugger only supports torch >= 2.0, using )rI   Ú__version__rD   r   )r5   r   Úversionr   r   r   r6   q   s    zGridSelector.__init__c                 C   s   t | j|ƒS r   ©r3   r   ©r5   r(   r   r   r   Ú__getitem__v   s    zGridSelector.__getitem__c                 O   s   t | jƒ||ŽS r   rc   ©r5   r   rB   r   r   r   r[   y   s    zGridSelector.__call__N)r\   r]   r^   Ú__doc__r6   re   r[   r   r   r   r   r_   l   s   r_   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚAutotuneGridSelectorc                 C   s   || _ || _d S r   )r   Úautotune_params)r5   r   ri   r   r   r   r6   ~   s    zAutotuneGridSelector.__init__c                 C   s   t | j| j|ƒS r   ©ÚAutotuneRunnerr   ri   rd   r   r   r   re   ‚   s    z AutotuneGridSelector.__getitem__c                 O   s   t | j| jƒ||ŽS r   rj   rf   r   r   r   r[   …   s    zAutotuneGridSelector.__call__N)r\   r]   r^   r6   re   r[   r   r   r   r   rh   }   s   rh   c                   @   s   e Zd Zddd„Zdd„ ZdS )rk   Nc                 C   s   || _ || _|| _d S r   )r   ri   r(   )r5   r   ri   r(   r   r   r   r6   Š   s    zAutotuneRunner.__init__c                    sÐ   t | jd ƒdkst‚| jd dd … D ]b}dd„ ‰ ttˆ |ƒƒ}‡ fdd„| ¡ D ƒ}| jrx| j| j |||j—Ž q(| j|||j—Ž q(| jd d }| jrº| j| j |||j—Ž n| j|||j—Ž d S )NZconfigsr   c                 S   s   t  | ¡rt  | ¡S | S r   )rI   rJ   Úclone)rK   r   r   r   rN   ”   s    

z,AutotuneRunner.__call__.<locals>.convert_argc                    s   i | ]\}}|ˆ |ƒ“qS r   r   rO   rQ   r   r   rR   š   s      z+AutotuneRunner.__call__.<locals>.<dictcomp>r   )	rC   ri   rD   rS   rT   r&   r(   r   rB   )r5   r   rB   ÚconfigrY   rZ   Zmain_configr   rQ   r   r[   �   s    zAutotuneRunner.__call__)N)r\   r]   r^   r6   r[   r   r   r   r   rk   ‰   s   
rk   c                     s   ‡ fdd„}|S )Nc                    s
   t | ˆ ƒS r   )rh   )r   ©Úkwarsr   r   Úwrapper¨   s    z&triton_debug_autotune.<locals>.wrapperr   )ro   rp   r   rn   r   Útriton_debug_autotune§   s    rq   )r.   r0   Útypingr   Ú r   rX   r   r8   r   r   Z
memory_mapr	   Ztl_langr
   r   r   r   rI   r    r   r%   r'   Úintr2   r3   r_   rh   rk   rq   r   r   r   r   Ú<module>   s&   	 3