
    nVh                        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m	Z	 ddl
mZmZmZ d dlmZ dZdefd	Zd
edefdZd
eddfdZ	 dddddddee   dee   dee   d
ee   dee   f
dZddee   dd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ee   d
ee   dee   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   f
dZy)     N)proton   )register_triton_hookunregister_triton_hook)set_profiling_offset_profiling_onis_command_line)Optionalr   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    G/home/dcms/DCMS/lib/python3.12/site-packages/triton/profiler/profile.py_select_backendr      sH    nn##**==?GGG&	E	JKK    r   c                     d}| dk(  rht        j                  dd       }|Pt        t        j                  t
              j                  j                  j                         dz  dz  dz  dz        }|S )N r   TRITON_CUPTI_LIB_PATHbackendsnvidialib)osgetenvstrpathlibPath__file__parentabsolute)r   lib_paths     r   _get_backend_default_pathr*      sl    H'994d; 7<<188??HHJZWZbbejjmttuHOr   c                 p    | dk(  r1ddg}|D ]'  }t        j                  |d       t        d| d       y 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` instead)r!   r"   r   )r   hip_device_envsenvs      r   
_check_envr0   $   s[    +02HI" 	Cyyd#/ I#  OZ  [ 	 r   shadowtreecontextdatar   hooknamer4   r5   r6   c                    t               ry| t        } |
t               }t        |       t	        |      }t                |r|dk(  r
t                t        j                  | ||||      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.hatchet".
        backend (str, optional): The backend to use for profiling.
                                 Available options are [None, "cupti", "cupti_pcsampling", "roctracer"].
                                 Defaults to None, which automatically selects the backend matching the current active runtime.
        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"].
                              Defaults to "tree".
        hook (str, optional): The hook to use for profiling.
                              Available options are [None, "triton"].
                              Defaults to None.
    Returns:
        session (int): The session ID of the profiling session.
    Nr   )	r	   DEFAULT_PROFILE_NAMEr   r0   r*   r   r   	libprotonstart)r7   r4   r5   r   r6   backend_paths         r   r;   r;   .   sd    J |#!#w,W5L ??4$FFr   sessionc                     t               r| dk7  rt        d      | 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:   activate_allactivater=   s    r   r@   r@   g   s;     W\`aa 7#r   c                     t               r| dk7  rt        d      | t        j                          yt        j                  |        y)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:   deactivate_all
deactivaterA   s    r   rD   rD   z   s;     W\bcc  "W%r   output_formatc                     | *t                t        j                  |       t                yt	               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.
                                       Aavailable options are ["hatchet"].

    Returns:
        None
    Nr   zEOnly one session can be finalized when running from the command line.)r   r:   finalize_allr   r	   r   finalize)r=   rE   s     r   rH   rH      sK     }- Adee7M2r   c                 V     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                  N    t        	      } | i |}t        |       |S )Nr3   )r;   rD   )
argskwargsr=   retr   r4   r5   funcr6   r7   s
       r   wrapperz_profiling.<locals>.wrapper   s2    gD'PTUD#F#7
r   )	functoolswraps)rN   r7   r4   r5   r   r6   rO   s   `````` r   
_profilingrR      s,    $ __T   Nr   r7   r4   r5   r   r6   c                H    | 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 )NrS   rR   )fr   r4   r5   r6   r7   s    r   	decoratorzprofile.<locals>.decorator   s    adG$PW^bccr   rS   rV   )rN   r7   r4   r5   r   r6   rX   s    ````` r   profilerY      s6    4 |	d 	d  $T7w]abbr   )N)Nhatchet)Nr1   r2   NN)rP   r   r!   r$   triton._C.libprotonr   r:   r6   r   r   flagsr   r   r	   typingr
   r9   r#   r   r*   r0   r;   intr@   rD   rH   rR   rY    r   r   <module>r`      s     	  3 > G G  L L	s 	s 	   6G & !6G
3-6G c]6G 3-	6G
 c]6G 3-6Gr$hsm $t $&& & &&3hsm 33 3t 32 % !
3- c] 3-	
 c] 3-: 
"c % !"c 3-"c c]	"c
 3-"c c]"c 3-"cr   