
    ^j)&                     @   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	m
Z
mZ ddlmZ ddlmZ d d	lmZmZ d
ZdefdZdedeeeef      defdZdeddf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eef      dee   fdZd"dee   ddfdZd#dee   deddfdZd$dee   dee   ddfdZ	 	 	 	 	 	 d%dee   dee   dee   dee   dee   deeeef      f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eef      fd!Zy)&    N)proton)getenv   )flags)HookManager
LaunchHookInstrumentationHook)Hook)BaseMode)OptionalUnionr   returnc                      t         j                  j                  j                  j	                         j
                  } | dk(  ry| dk(  ry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   s    b/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/triton/profiler/profile.py_select_backendr      sH    nn##**==?GGG&	E	JKK    r   modec                     | dk(  rGt         j                  j                  j                  j	                         j
                  }|r| d| S |S |rt        |      S dS )Ninstrumentation: )r   r   r   r   r   r   str)r   r   prefixs      r   _get_mode_strr%      sX    ##&&--@@BJJ%)&4&!5v53t9$"$r   c                    | dk(  r&ddg}|D ]  }t        |d       t        d| d       t        j                  j                  j
                  j                         D ]  \  }}|j                  }t        |d       t        t        j                  j                  |      }|Ft        j                  j                  |      x}sht        j                  j                  ||d           y )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` insteadr   )r   r   r   knobsr   knob_descriptorsitemskeygetattrtoenvsetenv)r   hip_device_envsenvattrdescr,   valenv_vals           r   
_check_envr6       s    +02HI" 	Cc4 , I#  OZ  [ 	 ll))::@@B 9
dhh#t$&,,--t4C$ll005575LL''WQZ89r   shadowtreecontextdatar   r   hooknamer:   r;   r<   c                   t         j                  s$t        j                  j                  j
                  rydt         _        | t        n| } |
t               n|}t        ||      }t        |       t        j                  | ||||      }t        |t              rt        j                   ||       n4|dk(  rt        j                   t#               |       n|t%        d|      |dk(  rt        j                   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", "periodic_flushing"].
                                               For "roctracer", available options are ["periodic_flushing"].
                                               For "instrumentation", available options are [None].
                                               Each mode has a set of control knobs following with the mode name.
                                               For example, "periodic_flushing" mode has a knob:
                                               - format: The output format of the profiling results. Available options are ["hatchet", "hatchet_msgpack", "chrome_trace"]. Default is "hatchet".
                                               The can be set via `mode="periodic_flushing:format=chrome_trace"`.
        hook (Union[str, Hook], optional): The hook to use for profiling.
                                           You may pass either:
                                           - a string hook name, e.g. "triton" (kernel launch metadata), or
                                           - a custom Hook instance.
                                           Defaults to None.
    Returns:
        session (Optional[int]): The session ID of the profiling session, or None if profiling is disabled.
    NTr   zUnsupported hook: r    )r   command_liner   r)   r   disableprofiling_onDEFAULT_PROFILE_NAMEr   r%   r6   	libprotonstart
isinstancer
   r   registerr   r   r	   )r=   r:   r;   r   r   r<   mode_strsessions           r   rD   rD   3   s    f V\\0088E#'<TD#*?oGWd+HwoodGT7HEG$T7+		Z\73		-dX677##06@Nr   rH   c                     t         j                  r| dk7  rt        d      t        j                  |        | t        j                          yt        j                  |        y)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   r   activaterC   activate_all)rH   s    r   rJ   rJ      sL     gl`aa! 7#r   flushingc                     t         j                  r| dk7  rt        d      t        j                  |        | t        j                  |       yt        j                  | |       y)ap  
    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)
        flushing (bool): Whether to flush the profiling data before deactivating. Defaults to True.

    Returns:
        None
    r   zGOnly one session can be deactivated when running from the command line.N)r   r?   r   r   
deactivaterC   deactivate_all)rH   rL   s     r   rN   rN      sP     glbcc7#  *Wh/r   output_formatc                     t        j                  |        | !dt        _        t	        j
                  |       yt        j                  r| dk7  rt        d      t	        j                  | |       y)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", "hatchet_msgpack", "chrome_trace"].

    Returns:
        None
    NFr   zEOnly one session can be finalized when running from the command line.)	r   
unregisterr   rA   rC   finalize_allr?   r   finalize)rH   rP   s     r   rT   rT      sX     7#"}-'Q,dee7M2r   c                 Z     t        j                          fd       }|S )z
    Context manager for profiling. Internally use only.

    Args:
        See start() for the arguments.

    Returns:
        wrapper (function): The wrapped function.
    c                  P    t        
	      } | i |}t        |       |S )Nr9   )rD   rN   )argskwargsrH   retr   r:   r;   funcr<   r   r=   s       r   wrapperz_profiling.<locals>.wrapper   s5    gD'PT[_`D#F#7
r   )	functoolswraps)rZ   r=   r:   r;   r   r   r<   r[   s   ``````` r   
_profilingr^      s,    & __T   Nr   r=   r:   r;   r   r   r<   c          	      N    | fd}|S t        |       S )z
    Decorator for profiling.

    Usage:

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

    Args:
        See start() for the arguments.

    Returns:
        decorator (function): The decorator function.
    c           	      (    t        |       S )Nr_   r^   )fr   r:   r;   r<   r   r=   s    r   	decoratorzprofile.<locals>.decorator   s    adG$PW^bimnnr   r_   rb   )rZ   r=   r:   r;   r   r   r<   rd   s    `````` r   profilere      s9    6 |	o 	o  $T7w]ahlmmr   )N)NF)Nr"   )Nr7   r8   NNN) r\   r   triton._C.libprotonr   rC   triton._C.libtritonr   r   hooksr   r   r	   
hooks.hookr
   r   r   typingr   r   rB   r#   r   r%   r6   intrD   rJ   boolrN   rT   r^   re    r   r   <module>rn      sf     3 &  ? ?   " L L%3 %huS(]/C&D % %9 9 9( K & !+/'+K
3-K c]K 3-	K
 c]K 5h'
(K 5d#
$K c]K\$hsm $t $,0 0 0 0.3hsm 38C= 3RV 34 % !'+
3- c] 3-	
 c] 3- 5d#
$< 
#n % !'+#n 3-#n c]	#n
 3-#n c]#n 3-#n 5d#
$#nr   