o
    ^i*#                     @   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	m
Z
mZ ddlmZmZmZ ddlmZ d dlmZmZ d	Zd
efddZded
efddZdedeeeef  d
efddZded
dfddZ	d,dddddddee dee dee dee deeeef  dee fddZd,dee d
dfdd Zd,dee d
dfd!d"Zd-dee d$ee d
dfd%d&Z						d.dee dee dee dee dee dee fd'd(Z 	d,ddddddd)dee dee dee dee dee dee fd*d+Z!dS )/    N)knobs)proton   )set_profiling_offset_profiling_onis_command_line)HookManager
LaunchHookInstrumentationHook)BaseMode)OptionalUnionr   returnc                  C   s0   t jjj j} | dkrdS | dkrdS td)Ncudacuptihip	roctracerz/No backend is available for the current target.)tritonruntimedriveractiveget_current_targetbackend
ValueError)r    r   R/var/www/html/RAG/RAG_venv/lib/python3.10/site-packages/triton/profiler/profile.py_select_backend   s   r   r   c                 C   sF   d}| dkr!t jj}|d u r!tttjj d d d d }|S )N r   backendsnvidialib)	r   r   	cupti_dirstrpathlibPath__file__parentabsolute)r   lib_pathr   r   r   _get_backend_default_path   s   &r)   modec                 C   s>   | dkrt jjj j}|r| d| S |S |rt|S dS )Ninstrumentation:r   )r   r   r   r   r   r   r"   )r   r*   prefixr   r   r   _get_mode_str&   s   r.   c                 C   sB   | dkrddg}|D ]}t |d d urtd| dq
d S d S )Nr   HIP_VISIBLE_DEVICESCUDA_VISIBLE_DEVICESz3Proton does not work when the environment variable zK is set on AMD GPUs. Please unset it and use `ROCR_VISIBLE_DEVICES` instead)osgetenvr   )r   hip_device_envsenvr   r   r   
_check_env-   s   
r5   shadowtreecontextdatar   r*   hooknamer9   r:   r;   c          	      C   s   t  rdS t  | du rtn| } |du rt n|}t|}t||}t| t| |||||}|dkr;t	
t | |dkrGt	
t|| |S )a	  
    Start profiling with the given name and backend.

    Usage:

        ```python
        proton.start("my_profile")
        # do something
        proton.finalize()
        ```

    Args:
        name (str, optional): The name (with path) of the profiling session.
                              If not provided, the default name is "~/proton.<suffix>", where suffix is the default
                              format according to the data type. For example, if data is "tree", the default name is "~/proton.hatchet".
        context (str, optional): The context to use for profiling.
                                 Available options are ["shadow", "python"].
                                 Defaults to "shadow".
        data (str, optional): The data structure to use for profiling.
                              Available options are ["tree", "trace"].
                              Defaults to "tree".
        backend (str, optional): The backend to use for profiling.
                                 Available options are [None, "cupti", "roctracer", "instrumentation"].
                                 Defaults to None, which automatically selects the backend matching the current active runtime.
        mode (Union[str, BaseMode], optional): The "mode" to use for profiling, which is specific to the backend.
                                               Can be a string or an instance of BaseMode (or any subclass thereof).
                                               Defaults to None.
                                               For "cupti", available options are [None, "pcsampling"].
                                               For "roctracer", available options are [None].
                                               For "instrumentation", available options are [None].
                                               Each mode has a set of control knobs following with the mode name.
                                               For example, "pcsampling" has an "interval" control knob, expressed as "pcsampling:interval=1000".
        hook (str, optional): The hook to use for profiling.
                              Available options are [None, "launch"].
                              Defaults to None.
    Returns:
        session (int): The session ID of the profiling session.
    Nr   r+   )r   r   DEFAULT_PROFILE_NAMEr   r)   r.   r5   	libprotonstartr   registerr	   r
   )	r<   r9   r:   r   r*   r;   backend_pathmode_strsessionr   r   r   r?   7   s   /
r?   rC   c                 C   B   t  r| dkrtdt|  | du rt  dS t|  dS )z
    Activate the specified session.
    The profiling session will be active and data will be recorded.

    Args:
        session (int): The session ID of the profiling session. Defaults to None (all sessions)

    Returns:
        None
    r   zEOnly one session can be activated when running from the command line.N)r   r   r   activater>   activate_allrC   r   r   r   rE   ~      
rE   c                 C   rD   )a  
    Stop the specified session.
    The profiling session's data will still be in the memory, but no more data will be recorded.

    Args:
        session (int): The session ID of the profiling session. Defaults to None (all sessions)

    Returns:
        None
    r   zGOnly one session can be deactivated when running from the command line.N)r   r   r   
deactivater>   deactivate_allrG   r   r   r   rI      rH   rI   r   output_formatc                 C   sL   t |  | du rt  t| dS t r| dkrtdt| | dS )a  
    Finalizes a profiling session.
    Flush and write the profiling data to the file specified by the session name.

    Args:
        session (int, optional): The session ID to finalize. If None, all sessions are finalized. Defaults to None.
        output_format (str, optional): The output format for the profiling results.
                                       Available options are ["hatchet", "chrome_trace"].

    Returns:
        None
    Nr   zEOnly one session can be finalized when running from the command line.)r   
unregisterr   r>   finalize_allr   r   finalize)rC   rK   r   r   r   rN      s   
rN   c                    s&   t  fdd}|S )z
    Context manager for profiling. Internally use only.

    Args:
        See start() for the arguments.

    Returns:
        wrapper (function): The wrapped function.
    c                     s.   t  d}| i |}t| |S )Nr8   )r?   rI   )argskwargsrC   retr   r9   r:   funcr;   r*   r<   r   r   wrapper   s   z_profiling.<locals>.wrapper)	functoolswraps)rS   r<   r9   r:   r   r*   r;   rT   r   rR   r   
_profiling   s   rW   r<   r9   r:   r   r*   r;   c             	      s8   | du r fdd}|S t |  dS )z
    Decorator for profiling.

    Usage:

    ```python
    @proton.profile
    def foo():
        pass
    ```

    Args:
        See start() for the arguments.

    Returns:
        decorator (function): The decorator function.
    Nc              	      s   t |  dS )NrX   rW   )fr   r9   r:   r;   r*   r<   r   r   	decorator   s   zprofile.<locals>.decoratorrX   rY   )rS   r<   r9   r:   r   r*   r;   r\   r   r[   r   profile   s   r]   )N)Nr   )Nr6   r7   NNN)"rU   r   r1   r#   r   triton._C.libprotonr   r>   flagsr   r   r   hooksr   r	   r
   r*   r   typingr   r   r=   r"   r   r)   r.   r5   r?   intrE   rI   rN   rW   r]   r   r   r   r   <module>   s    
"
G 
