§
    8˜ºhp\  ã                   óÊ  — 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	 d dl
mZ d dlmZ d dlmZ ej                             ej                             e¦  «        ¦  «        Zej                             ed¦  «        gZd	„ Z e j        ¦   «         d
„ ¦   «         Z G d„ de¦  «        Zd„ ZddddddœZddddddœZdZd„ Zd„ Z  G d„ de¦  «        Z! G d„ de¦  «        Z"dS )é    N)ÚPath)Úknobs)Ú	GPUTarget)Ú	GPUDriver)Úcompile_module_from_src)ÚTensorDescriptorÚincludec                 ó:  ‡ ‡‡‡‡— dd l }|                     ¦   «         dk    rd S dd lŠddlm}m}m}mŠmŠm}  G ˆˆfd„d‰j	        ¦  «        }‰ 
                    | ||¦  «         ||¦  «         ||¦  «        ¦  «        }	 ‰                     d¦  «        j        }n# t          $ r Y d S w xY w|‰g|_        ||_        dŠ‰                     ‰dz   ¦  «        }	ˆˆ ˆfd	„}
 | ||
¦  «        |	¦  «        r't#          j        ‰                     |	¦  «        ¦  «        S d S )
Nr   ÚLinux)Úc_charÚc_intÚc_size_tÚc_void_pÚc_char_pÚPOINTERc                   ó    •— e Zd Zd”fd” fgZdS )ú8_find_already_mmapped_dylib_on_linux.<locals>.DlPhdrInfoÚ	dlpi_addrÚ	dlpi_nameN)Ú__name__Ú
__module__Ú__qualname__Ú_fields_)r   r   s   €€úb/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/triton/backends/amd/driver.pyÚ
DlPhdrInfor      s&   ø€ € € € € à˜(Ð#Ø˜(Ð#ð
ˆˆˆó    r   z	libc.so.6i   é   c           
      óÜ   •— | j         j        }t          t          j        |¦  «        ¦  «        }‰|j        v r4‰                     ||t          ‰t          |¦  «        ¦  «        ¦  «         dS dS )Nr   r   )	Úcontentsr   r   ÚosÚfsdecodeÚnameÚmemmoveÚminÚlen)ÚinfoÚsizeÚdatar   ÚpÚctypesÚlib_nameÚmax_path_lengths        €€€r   Úcallbackz6_find_already_mmapped_dylib_on_linux.<locals>.callback2   sa   ø€ Ø”MÔ+ˆ	Ý•”˜YÑ'Ô'Ñ(Ô(ˆØ�q”vÐÐà�NŠN˜4 ­C°ÅÀYÁÄÑ,PÔ,PÑQÔQÐQØ�1Øˆqr   )ÚplatformÚsystemr*   r   r   r   r   r   r   Ú	StructureÚ	CFUNCTYPEÚCDLLÚdl_iterate_phdrÚ	ExceptionÚargtypesÚrestypeÚcreate_string_bufferr    r!   Ú	string_at)r+   r.   r   r   r   r   r   Ú
callback_tr3   Úpathr-   r   r   r*   r,   s   `          @@@@r   Ú$_find_already_mmapped_dylib_on_linuxr;      s´  øøøøø€ Ø€O€O€OØ‡‚ÑÔ˜GÒ#Ð#Øˆtð
 €M€M€MØKÐKÐKÐKÐKÐKÐKÐKÐKÐKÐKÐKÐKÐKÐKÐKð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
�VÔ%ñ 
ô 
ð 
ð ×!Ò! %¨¨°Ñ)<Ô)<¸g¸gÀhÑ>OÔ>OÐQXÐQXÐY_ÑQ`ÔQ`ÑaÔa€JðØ Ÿ+š+ kÑ2Ô2ÔBˆˆøÝð ð ð Øˆtˆtðøøøð !+¨HÐ5€OÔØ#€OÔà€OØ×&Ò& ¸Ñ':Ñ;Ô;€Dðð ð ð ð ð ð ð €�z�z (Ñ+Ô+¨TÑ2Ô2ð 3ÝŒ{˜6×+Ò+¨DÑ1Ô1Ñ2Ô2Ð2Øˆ4s   ÂB Â
B+Â*B+c                  ód  ‡— dŠt           j        j        x} rK|                      ‰¦  «        r!t          j                             | ¦  «        r| S t          d| › d‰› �¦  «        ‚t          ‰¦  «        }|r6t          j                             |¦  «        r|S t          d|› d‰› �¦  «        ‚g }t          j         	                    t          j         
                    t          ¦  «        d‰¦  «        }t          j                             |¦  «        r|S |                     |¦  «         dd l}|                     ¦   «         }|                     ¦   «         }|j        r|g|z   }|D ]\}t          j         	                    |dd‰¦  «        }t          j                             |¦  «        r|c S |                     |¦  «         Œ]t	          j        d	¦  «        }|rp|                     d
¦  «        D ]Z}	t          j         	                    |	‰¦  «        }
t          j                             |
¦  «        r|
c S |                     |
¦  «         Œ[t'          j        ddg¦  «                             ¦   «         }ˆfd„|                     ¦   «         D ¦   «         }|D ]:}t          j                             |¦  «        r|c S |                     |¦  «         Œ;t          j         	                    d‰¦  «        }t          j                             |¦  «        r|S |                     |¦  «         t          d‰› d|› �¦  «        ‚)Nzlibamdhip64.sozTRITON_LIBHIP_PATH 'z' does not point to a valid zmemory mapped 'z'' in process does not point to a valid Úlibr   ÚtorchÚLD_LIBRARY_PATHú:z/sbin/ldconfigz-pc                 ó’   •— g | ]C}|                      ¦   «                              ‰¦  «        ¯)|                     ¦   «         d          ‘ŒDS )éÿÿÿÿ)ÚstripÚendswithÚsplit)Ú.0Úliner+   s     €r   ú
<listcomp>z2_get_path_to_hip_runtime_dylib.<locals>.<listcomp>u   sB   ø€ Ð^Ð^Ð^ ¸d¿jºj¹l¼l×>SÒ>SÐT\Ñ>]Ô>]Ð^ˆD�JŠJ‰LŒL˜ÔÐ^Ð^Ð^r   z/opt/rocm/lib/zcannot locate z after attempted paths )r   ÚamdÚlibhip_pathrD   r    r:   ÚexistsÚRuntimeErrorr;   ÚjoinÚdirnameÚ__file__ÚappendÚsiteÚgetsitepackagesÚgetusersitepackagesÚENABLE_USER_SITEÚgetenvrE   Ú
subprocessÚcheck_outputÚdecodeÚ
splitlines)Úenv_libhip_pathÚmmapped_pathÚpathsÚ	local_librQ   Úsite_packagesÚ	user_siter:   Úenv_ld_library_pathÚdÚfÚlibsÚlocsÚlocÚcommon_install_pathr+   s                  @r   Ú_get_path_to_hip_runtime_dylibrg   @   s.  ø€ à€Hõ  œ)Ô/Ð/€ð kØ×#Ò# HÑ-Ô-ð 	#µ"´'·.².ÀÑ2QÔ2Qð 	#Ø"Ð"ÝÐi°/ÐiÐiÐ_gÐiÐiÑjÔjÐjõ 8¸ÑAÔA€LØð nÝŒ7�>Š>˜,Ñ'Ô'ð 	 ØÐÝÐl¨\ÐlÐlÐbjÐlÐlÑmÔmÐmà€Eõ ”—’�RœWŸ_š_­XÑ6Ô6¸¸xÑHÔH€IÝ	„w‡~‚~�iÑ Ô ð ØÐØ	‡L‚L�ÑÔÐà€K€K€Kð ×(Ò(Ñ*Ô*€MØ×(Ò(Ñ*Ô*€IØÔð 4Ø"˜ mÑ3ˆØð ð ˆÝŒw�|Š|˜D '¨5°(Ñ;Ô;ˆÝŒ7�>Š>˜$ÑÔð 	ØˆKˆKˆKØ�Š�TÑÔÐÐõ œ)Ð$5Ñ6Ô6ÐØð Ø$×*Ò*¨3Ñ/Ô/ð 	ð 	ˆAÝ”—’˜Q Ñ)Ô)ˆAÝŒw�~Š~˜aÑ Ô ð Ø���Ø�LŠL˜‰OŒOˆOˆOõ Ô"Ð$4°dÐ#;Ñ<Ô<×CÒCÑEÔE€Dð _Ð^Ð^Ð^¨¯ªÑ):Ô):Ð^Ñ^Ô^€DØð ð ˆÝŒ7�>Š>˜#ÑÔð 	ØˆJˆJˆJØ�Š�SÑÔÐÐõ œ'Ÿ,š,Ð'7¸ÑBÔBÐÝ	„w‡~‚~Ð)Ñ*Ô*ð #Ø"Ð"Ø	‡L‚LÐ$Ñ%Ô%Ð%å
ÐP¨ÐPÐPÈÐPÐPÑ
QÔ
QÐQr   c                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )ÚHIPUtilsc                 óŒ   •— t          | d¦  «        s-t          t          | ¦  «                             | ¦  «        | _        | j        S )NÚinstance)ÚhasattrÚsuperri   Ú__new__rk   )ÚclsÚ	__class__s    €r   rn   zHIPUtils.__new__†   s<   ø€ Ý�s˜JÑ'Ô'ð 	=Ý ¥¨3Ñ/Ô/×7Ò7¸Ñ<Ô<ˆCŒLØŒ|Ðr   c                 ó6  — t          ¦   «         }t          t          j                             t
          d¦  «        ¦  «                             ¦   «         }|                     d|d¦  «        }t          |dt          ¬¦  «        }|j
        | _
        |j        | _        d S )Nzdriver.cz/*py_libhip_search_path*/r   Ú	hip_utils©Úsrcr"   Úinclude_dirs)rg   r   r    r:   rM   rN   Ú	read_textÚreplacer   ru   Úload_binaryÚget_device_properties)ÚselfrJ   rt   Úmods       r   Ú__init__zHIPUtils.__init__‹   s}   € Ý4Ñ6Ô6ˆÝ•2”7—<’<¥¨Ñ4Ô4Ñ5Ô5×?Ò?ÑAÔAˆð �kŠkÐ5°{ÀAÑFÔFˆÝ%¨#°KÍlÐ[Ñ[Ô[ˆØœ?ˆÔØ%(Ô%>ˆÔ"Ð"Ð"r   )r   r   r   rn   r|   Ú__classcell__©rp   s   @r   ri   ri   „   sG   ø€ € € € € ðð ð ð ð ð
	?ð 	?ð 	?ð 	?ð 	?ð 	?ð 	?r   ri   c                 óN   — | d         dk    rdS ddddddd	d
ddddddddœ|          S )Nr   Ú*ÚhipDeviceptr_tÚint32_tÚint8_tÚint16_tÚint64_tÚuint32_tÚuint8_tÚuint16_tÚuint64_tÚdouble)Úi1Úi8Úi16Úi32Úi64Úu1Úu8Úu16Úu32Úu64Úfp16Úbf16Úfp32Úf32Úfp64© )Útys    r   Ú	ty_to_cpprœ   ˜   s[   € Ø	ˆ!„u�‚|€|ØÐàØØØØØØØØØØØØØØðð ð  	ô!
ð 
r   rˆ   r†   r‰   )r•   r–   r—   r˜   r™   Ú	pack_fp16Ú	pack_bf16Ú	pack_fp32Ú	pack_fp64Ú
piiiKKOOOOc                 ó¶  ‡‡‡— d„ }ˆfd„Šˆfd„Šˆfd„Šd„ t           ||                     ¦   «         ¦  «        ¦  «        D ¦   «         }d                     ˆfd„|                     ¦   «         D ¦   «         ¦  «        }t          |z   }d                     t	          ‰|                     ¦   «         ¦  «        ¦  «        }t          t          t          |                     d¦  «        ¦  «        ¦  «        }d	„ t          |¦  «        D ¦   «         }t          |¦  «        d
k    r4dd                     d„ | 
                    ¦   «         D ¦   «         ¦  «        z   nd}g }| 
                    ¦   «         D ]b\  }}	|	dk    rŒ|	t          v r&|                     t          |	         › d|› �¦  «         Œ;|                     t          |	¦  «        › d|› �¦  «         Œcd                     |¦  «        }
g }| 
                    ¦   «         D ]l\  }}	|	d
         dk    r|                     d|› d�¦  «         Œ+|	t          v r|                     d|› d�¦  «         ŒN|	dk    r|                     d|› �¦  «         Œmd„ | 
                    ¦   «         D ¦   «         }t          ¦   «         }t          t          t          |¦  «        ¦  «        ¦  «        }d„ | 
                    ¦   «         D ¦   «         }|                     d¦  «         d|› dt          |
¦  «        d
k    rd|
z   nd› dd                     |¦  «        › d|› d|› dd                     ˆfd„| 
                    ¦   «         D ¦   «         ¦  «        › d|› d |› d!d                     |¦  «        › d"d#                     d$„ | 
                    ¦   «         D ¦   «         ¦  «        › d%t          |¦  «        d
k    rdd                     |¦  «        z   nd› d&�}|S )'Nc                 ó6  — g }| D �]}t          |t          ¦  «        rå|                     d¦  «        rÐ|                     d¦  «        dz   }t	          j        d|¦  «                             ¦   «         }|                     d|z   ¦  «         t          d|z  ¦  «        D ]}|                     d¦  «         Œt          |¦  «        D ]}|                     d¦  «         Œt          |¦  «        D ]}|                     d¦  «         ŒŒý|                     |¦  «         �Œ|S )	NÚ
tensordescú,r   ztensordesc<([^[>]*)r€   é   r�   rŽ   )	Ú
isinstanceÚstrÚ
startswithÚcountÚreÚmatchÚgrouprP   Úrange)Ú	signatureÚoutputÚsigÚndimÚdtypeÚ_s         r   Ú_expand_signaturez(make_launcher.<locals>._expand_signatureÂ   s*  € Øˆð ð 	#ñ 	#ˆCÝ˜#�sÑ#Ô#ð #¨¯ª°|Ñ(DÔ(Dð #Ø—y’y ‘~”~¨Ñ)�ÝœÐ!6¸Ñ<Ô<×BÒBÑDÔD�à—’˜c E™kÑ*Ô*Ð*Ý˜q 4™x™œð )ð )�AØ—M’M %Ñ(Ô(Ð(Ð(õ ˜t™œð )ð )�AØ—M’M %Ñ(Ô(Ð(Ð(Ý˜t™œð )ð )�AØ—M’M %Ñ(Ô(Ð(Ð(ð)ð —’˜cÑ"Ô"Ð"Ñ"àˆr   c                 óx   •— t          | t          ¦  «        r#d                     t          ‰| ¦  «        ¦  «        S | S )Nr¥   )r§   ÚtuplerM   Úmap)r±   Ú_serialize_signatures    €r   r¹   z+make_launcher.<locals>._serialize_signatureÜ   s7   ø€ Ý�c�5Ñ!Ô!ð 	<Ø—8’8�CÐ 4°cÑ:Ô:Ñ;Ô;Ð;Øˆ
r   c                 óÊ   •— t          | t          ¦  «        r)d                     t          ‰| ¦  «        ¦  «        }d|› d�S | d         dk    rdS | dk    rdS t	          | ¦  «        S )Nr¥   ú[ú]r   r€   z	PyObject*Ú	constexpr©r§   r·   rM   r¸   rœ   )r›   ÚvalÚ_extracted_types     €r   rÀ   z&make_launcher.<locals>._extracted_typeá   sl   ø€ Ý�b�%Ñ Ô ð 	Ø—(’(�3˜°Ñ3Ô3Ñ4Ô4ˆCØ�s�:�:�:ÐØˆaŒ5�CŠ<ˆ<Ø�;Ø�ÒÐØ�;Ý˜‰}Œ}Ðr   c                 óì   •— t          | t          ¦  «        r)d                     t          ‰| ¦  «        ¦  «        }d|› d�S | d         dk    rdS | dk    rdS dd	d
ddddddddœ
t	          | ¦  «                 S )NÚ ú(ú)r   r€   ÚOr½   ra   ÚlÚbÚhÚiÚLÚBÚHÚIÚK)
rŠ   Úlongrƒ   r„   r‚   r…   r‡   rˆ   r†   r‰   r¾   )r›   r¿   Ú	format_ofs     €r   rÐ   z make_launcher.<locals>.format_ofë   s�   ø€ Ý�b�%Ñ Ô ð 	Ø—'’'�#˜i¨Ñ,Ô,Ñ-Ô-ˆCØ�s�:�:�:ÐØˆaŒ5�CŠ<ˆ<Ø�3Ø�ÒÐØ�3àØØØØØØØØØð
ð 
õ �B‰-Œ-ôð 	r   c                 ó   — i | ]\  }}||“Œ	S rš   rš   )rF   ÚidxÚss      r   ú
<dictcomp>z!make_launcher.<locals>.<dictcomp>   s   € ÐWÐWÐW™F˜C ��aÐWÐWÐWr   rÂ   c                 ó&   •— g | ]} ‰|¦  «        ‘ŒS rš   rš   )rF   r›   rÐ   s     €r   rH   z!make_launcher.<locals>.<listcomp>  s!   ø€ ÐFÐFÐF¨R˜9˜9 R™=œ=ÐFÐFÐFr   r¥   c                 ó   — i | ]\  }}||“Œ	S rš   rš   )rF   rÉ   rÓ   s      r   rÔ   z!make_launcher.<locals>.<dictcomp>  s   € Ð7Ð7Ð7™$˜!˜Q��AÐ7Ð7Ð7r   r   ú, c              3   ó&   K  — | ]\  }}d |› �V — ŒdS )z&_argNrš   ©rF   rÉ   r›   s      r   ú	<genexpr>z make_launcher.<locals>.<genexpr>  s,   è è € Ð LÐ L±°°B ¨  Ð LÐ LÐ LÐ LÐ LÐ Lr   r½   z argr€   Úptr_infoz.dev_ptrÚ_argÚ_storagec           
      ón   — g | ]2\  }}|t           v ¯t           |         › d |› dt          |         › d|› d�‘Œ3S )ú _argz_storage = z(_argz);)ÚFLOAT_STORAGE_TYPEÚFLOAT_PACK_FUNCTIONrÙ   s      r   rH   z!make_launcher.<locals>.<listcomp>  s_   € ð ð ð áˆAˆrØÕ#Ð#Ð#õ ˜bÔ!ÐYÐY¨ÐYÐYÕ6IÈ"Ô6MÐYÐYÐTUÐYÐYÐYà#Ð#Ð#r   c                 ó*   — g | ]\  }}|d k    ¯d|› �‘ŒS )r½   z&argrš   rÙ   s      r   rH   z!make_launcher.<locals>.<listcomp>&  s,   € ÐMÐMÐM™U˜Q ¸2ÀÒ;LÐ;Lˆj�QˆjˆjÐ;LÐ;LÐ;Lr   z&global_scratcha;  
#define __HIP_PLATFORM_AMD__
#include <hip/hip_runtime.h>
#include <Python.h>
#include <dlfcn.h>
#include <stdbool.h>
#include <dlfcn.h>

// The list of paths to search for the HIP runtime library. The caller Python
// code should substitute the search path placeholder.
static const char *hipLibSearchPaths[] = {"aj  "};

// The list of HIP dynamic library symbols and their signature we are interested
// in this file.
#define HIP_SYMBOL_LIST(FOR_EACH_ERR_FN, FOR_EACH_STR_FN)                     \
  FOR_EACH_STR_FN(hipGetErrorString, hipError_t hipError)                     \
  FOR_EACH_ERR_FN(hipModuleLaunchKernel, hipFunction_t f,                     \
                  unsigned int gridDimX, unsigned int gridDimY,               \
                  unsigned int gridDimZ, unsigned int blockDimX,              \
                  unsigned int blockDimY, unsigned int blockDimZ,             \
                  unsigned int sharedMemBytes, hipStream_t stream,            \
                  void **kernelParams, void **extra)                          \
  FOR_EACH_ERR_FN(hipModuleLaunchCooperativeKernel, hipFunction_t f,          \
                  unsigned int gridDimX, unsigned int gridDimY,               \
                  unsigned int gridDimZ, unsigned int blockDimX,              \
                  unsigned int blockDimY, unsigned int blockDimZ,             \
                  unsigned int sharedMemBytes, hipStream_t stream,            \
                  void **kernelParams, void **extra)                          \
  FOR_EACH_ERR_FN(hipPointerGetAttribute, void *data,                         \
                  hipPointer_attribute attribute, hipDeviceptr_t ptr)

// The HIP symbol table for holding resolved dynamic library symbols.
struct HIPSymbolTable {
#define DEFINE_EACH_ERR_FIELD(hipSymbolName, ...)                             \
  hipError_t (*hipSymbolName)(__VA_ARGS__);
#define DEFINE_EACH_STR_FIELD(hipSymbolName, ...)                             \
  const char *(*hipSymbolName)(__VA_ARGS__);

  HIP_SYMBOL_LIST(DEFINE_EACH_ERR_FIELD, DEFINE_EACH_STR_FIELD)
};

static struct HIPSymbolTable hipSymbolTable;

bool initSymbolTable() {
  // Use the HIP runtime library loaded into the existing process if it exits.
  void *lib = dlopen("libamdhip64.so", RTLD_NOLOAD);

  // Otherwise, go through the list of search paths to dlopen the first HIP
  // driver library.
  if (!lib) {
    int n = sizeof(hipLibSearchPaths) / sizeof(hipLibSearchPaths[0]);
    for (int i = 0; i < n; ++i) {
      void *handle = dlopen(hipLibSearchPaths[i], RTLD_LAZY | RTLD_LOCAL);
      if (handle) {
        lib = handle;
      }
    }
  }
  if (!lib) {
    PyErr_SetString(PyExc_RuntimeError, "cannot open libamdhip64.so");
    return false;
  }

  // Resolve all symbols we are interested in.
  dlerror(); // Clear existing errors
  const char *error = NULL;
#define QUERY_EACH_FN(hipSymbolName, ...)                                     \
  *(void **)&hipSymbolTable.hipSymbolName = dlsym(lib, #hipSymbolName);       \
  error = dlerror();                                                          \
  if (error) {                                                               \
    PyErr_SetString(PyExc_RuntimeError,                                       \
                    "cannot query " #hipSymbolName " from libamdhip64.so");   \
    dlclose(lib);                                                             \
    return false;                                                             \
  }

  HIP_SYMBOL_LIST(QUERY_EACH_FN, QUERY_EACH_FN)

  return true;
}

static inline void gpuAssert(hipError_t code, const char *file, int line)
{
   if (code != HIP_SUCCESS)
   {
      const char* prefix = "Triton Error [HIP]: ";
       const char* str = hipSymbolTable.hipGetErrorString(code);
      char err[1024] = {0};
      snprintf(err, 1024, "%s Code: %d, Messsage: %s", prefix, code, str );
      PyErr_SetString(PyExc_RuntimeError, err);
   }
}

#define HIP_CHECK(ans) { gpuAssert((ans), __FILE__, __LINE__); }

static void _launch(int gridX, int gridY, int gridZ, int num_warps, int num_ctas, int launch_cooperative_grid, int clusterDimX, int clusterDimY, int clusterDimZ, int shared_memory, hipStream_t stream, hipFunction_t functionz>) {
  hipDeviceptr_t global_scratch = 0;
  void *params[] = { z› };
  if (gridX*gridY*gridZ > 0 && launch_cooperative_grid) {
    HIP_CHECK(hipSymbolTable.hipModuleLaunchCooperativeKernel(function, gridX, gridY, gridZ, z·*num_warps, 1, 1, shared_memory, stream, params, 0));
    return;
  }
  if (gridX*gridY*gridZ > 0) {
    HIP_CHECK(hipSymbolTable.hipModuleLaunchKernel(function, gridX, gridY, gridZ, aü	  *num_warps, 1, 1, shared_memory, stream, params, 0));
  }
}

typedef struct _DevicePtrInfo {
    hipDeviceptr_t dev_ptr;
    bool valid;
} DevicePtrInfo;

static inline DevicePtrInfo getPointer(PyObject *obj, int idx) {
  DevicePtrInfo ptr_info;
  ptr_info.dev_ptr = 0;
  ptr_info.valid = true;
  if (PyLong_Check(obj)) {
    ptr_info.dev_ptr = (hipDeviceptr_t)PyLong_AsUnsignedLongLong(obj);
    return ptr_info;
  }
  if (obj == Py_None) {
    // valid nullptr
    return ptr_info;
  }
  PyObject *ptr = PyObject_GetAttrString(obj, "data_ptr");
  if(ptr){
    PyObject *empty_tuple = PyTuple_New(0);
    PyObject *ret = PyObject_Call(ptr, empty_tuple, NULL);
    Py_DECREF(empty_tuple);
    Py_DECREF(ptr);
    if (!PyLong_Check(ret)) {
      PyErr_SetString(PyExc_TypeError, "data_ptr method of Pointer object must return 64-bit int");
      ptr_info.valid = false;
      return ptr_info;
    }
    ptr_info.dev_ptr = (hipDeviceptr_t)PyLong_AsUnsignedLongLong(ret);
    if(!ptr_info.dev_ptr)
      return ptr_info;
    uint64_t dev_ptr;
    hipError_t status = hipSymbolTable.hipPointerGetAttribute(&dev_ptr, HIP_POINTER_ATTRIBUTE_DEVICE_POINTER, ptr_info.dev_ptr);
    if (status == hipErrorInvalidValue) {
        PyErr_Format(PyExc_ValueError,
                     "Pointer argument (at %d) cannot be accessed from Triton (cpu tensor?)", idx);
        ptr_info.valid = false;
    }
    ptr_info.dev_ptr = (hipDeviceptr_t)dev_ptr;
    Py_DECREF(ret);
    return ptr_info;
  }
  PyErr_SetString(PyExc_TypeError, "Pointer argument must be either uint64 or have data_ptr method");
  return ptr_info;
}

static uint16_t pack_fp16(double f) {
    uint16_t result;
    // from https://github.com/python/pythoncapi-compat
#if 0x030600B1 <= PY_VERSION_HEX && PY_VERSION_HEX <= 0x030B00A1 && !defined(PYPY_VERSION)
    _PyFloat_Pack2(f, (unsigned char*)&result, 1);
#else
    PyFloat_Pack2(f, (unsigned char*)&result, 1);
#endif
    return result;
}

static uint16_t pack_bf16(double f) {
    float f32 = (float)f;
    uint32_t u32 = *(uint32_t*)&f32;
    return (uint16_t)(u32 >> 16);
}

static uint32_t pack_fp32(double f) {
    float f32 = (float)f;
    return *(uint32_t*)&f32;
}

static uint64_t pack_fp64(double f) {
    return *(uint64_t*)&f;
}

static PyObject* launch(PyObject* self, PyObject* args) {
  int gridX, gridY, gridZ;
  uint64_t _stream;
  uint64_t _function;
  int launch_cooperative_grid;
  PyObject *launch_enter_hook = NULL;
  PyObject *launch_exit_hook = NULL;
  PyObject *kernel_metadata = NULL;
  PyObject *launch_metadata = NULL;
  ú c                 ó8   •— g | ]\  }} ‰|¦  «        › d |› d�‘ŒS )rß   ú; rš   )rF   rÉ   r›   rÀ   s      €r   rH   z!make_launcher.<locals>.<listcomp>ä  s8   ø€ ÐOÐOÐO±E°A°r�� Ñ#Ô#Ð/Ð/¨!Ð/Ð/Ð/ÐOÐOÐOr   z
  if(!PyArg_ParseTuple(args, "a  ", &launch_cooperative_grid,
                                           &gridX, &gridY, &gridZ, &_stream, &_function,
                                           &kernel_metadata, &launch_metadata,
                                           &launch_enter_hook, &launch_exit_hook z)) {
    return NULL;
  }

  a8  

  // extract kernel metadata
  int num_warps, num_ctas, shared_memory, clusterDimX, clusterDimY, clusterDimZ;
  if (!PyArg_ParseTuple(kernel_metadata, "iiiiii", &num_warps, &num_ctas, &shared_memory, &clusterDimX, &clusterDimY, &clusterDimZ)) {
    return NULL;
  }
  // extract launch metadata
  if (launch_enter_hook != Py_None){
    PyObject* args = Py_BuildValue("(O)", launch_metadata);
    PyObject* ret = PyObject_CallObject(launch_enter_hook, args);
    Py_DECREF(args);
    if (!ret)
      return NULL;
    Py_DECREF(ret);
  }


  // raise exception asap
  rå   c                 óN   — g | ]"\  }}|d          dk    rd|› d|› d|› d|› d�	nd‘Œ#S )r   r€   zDevicePtrInfo ptr_infoz = getPointer(_argr×   z); if (!ptr_infoz.valid) return NULL;rÂ   rš   rÙ   s      r   rH   z!make_launcher.<locals>.<listcomp>ÿ  s~   € ð  dð  dð  dñ  INð  IJð  LNÐoqÐrsÔotÐx{Òo{Ðo{Ðk qÐkÐk¸AÐkÐkÀÐkÐkÐTUÐkÐkÐkÐkð  BDð  dð  dð  dr   z³;
  _launch(gridX, gridY, gridZ, num_warps, num_ctas, launch_cooperative_grid, clusterDimX, clusterDimY, clusterDimZ, shared_memory, (hipStream_t)_stream, (hipFunction_t)_functiona‚  );

  if(launch_exit_hook != Py_None){
    PyObject* args = Py_BuildValue("(O)", launch_metadata);
    PyObject* ret = PyObject_CallObject(launch_exit_hook, args);
    Py_DECREF(args);
    if (!ret)
      return NULL;
    Py_DECREF(ret);
  }

  if(PyErr_Occurred()) {
    return NULL;
  }
  // return None
  Py_INCREF(Py_None);
  return Py_None;
}

static PyMethodDef ModuleMethods[] = {
  {"launch", launch, METH_VARARGS, "Entry point for all kernels with this signature"},
  {NULL, NULL, 0, NULL} // sentinel
};

static struct PyModuleDef ModuleDef = {
  PyModuleDef_HEAD_INIT,
  "__triton_launcher",
  NULL, //documentation
  -1, //size
  ModuleMethods
};

PyMODINIT_FUNC PyInit___triton_launcher(void) {
  if (!initSymbolTable()) {
    return NULL;
  }
  PyObject *m = PyModule_Create(&ModuleDef);
  if(m == NULL) {
    return NULL;
  }
  PyModule_AddFunctions(m, ModuleMethods);
  return m;
}
)Ú	enumerateÚvaluesrM   Ú_BASE_ARGS_FORMATr¸   ÚlistÚfilterÚboolrE   r%   Úitemsrà   rP   rœ   rg   r®   )Ú	constantsr¯   Ú	warp_sizerµ   Úargs_formatÚformatÚ	args_listÚarg_decl_listrÉ   r›   Ú	arg_declsÚinternal_args_listÚfloat_storage_declsrJ   Úparamsrt   rÀ   r¹   rÐ   s                   @@@r   Úmake_launcherrø   À   s‘  øøø€ ðð ð ð4ð ð ð ð ð
ð ð ð ð ðð ð ð ð ð* XÐW¥iÐ0AÐ0AÀ)×BRÒBRÑBTÔBTÑ0UÔ0UÑ&VÔ&VÐWÑWÔW€Ià—'’'ÐFÐFÐFÐF°9×3CÒ3CÑ3EÔ3EÐFÑFÔFÑGÔG€KÝ Ñ,€FØ—’�Ð1°9×3CÒ3CÑ3EÔ3EÑFÔFÑGÔG€IÝ•V�D )§/¢/°#Ñ"6Ô"6Ñ7Ô7Ñ8Ô8€IØ7Ð7¥)¨IÑ"6Ô"6Ð7Ñ7Ô7€IÝPSÐT]ÑP^ÔP^ÐabÒPbÐPb��t—y’yÐ LÐ L¸)¿/º/Ñ:KÔ:KÐ LÑ LÔ LÑLÔLÑLÐLÐhj€Ið €MØ—’Ñ"Ô"ð <ð <‰ˆˆ2Ø�ÒÐØØÕ#Ð#Ð#Ø× Ò Õ$6°rÔ$:Ð!CÐ!CÀÐ!CÐ!CÑDÔDÐDÐDà× Ò ¥I¨b¡M¤MÐ!:Ð!:°qÐ!:Ð!:Ñ;Ô;Ð;Ð;Ø—	’	˜-Ñ(Ô(€IØÐØ—’Ñ"Ô"ð 2ð 2‰ˆˆ2ØˆaŒ5�CŠ<ˆ<Ø×%Ò%Ð&<°Ð&<Ð&<Ð&<Ñ=Ô=Ð=Ð=ØÕ%Ð%Ð%Ø×%Ò%Ð&8¨QÐ&8Ð&8Ð&8Ñ9Ô9Ð9Ð9Ø�;ÒÐØ×%Ò% j¨Q j jÑ1Ô1Ð1øðð à—_’_Ñ&Ô&ðñ ô Ðõ 1Ñ2Ô2€Kõ •%�˜I™œÑ'Ô'Ñ(Ô(€FØMÐM i§o¢oÑ&7Ô&7ÐMÑMÔM€FØ
‡M‚MÐ#Ñ$Ô$Ð$ðCð .9ðCð Cõ~ uxð  yBñ  uCô  uCð  FGò  uGð  uGð  aeð  hqñ  aqð  aqð  MOðCð CðB —y’y Ñ(Ô(ðCCð CðF _hðGCð CðN T]ðOCð Cðx ‡8‚8ÐOÐOÐOÐO¸Y¿_º_Ñ=NÔ=NÐOÑOÔOÑPÔPðyCð Cðz !'ð{Cð Cð@ S\ðACð CðH ‡8‚8ÐÑ Ô ðICð Cðn ‡9‚9ð  dð  dð  R[÷  Raò  Rañ  Rcô  Rcð  dñ  dô  dñ  eô  eðoCð Cõp [^ð  _qñ  [rô  [rð  uvò  [vð  [vð  swð  z~÷  zCò  zCð  DVñ  zWô  zWñ  sWð  sWð  |~ðqCð Cð C€CðH €Jr   c                 ó   ‡ — ˆ fd„}|S )zN
    Replace all tensor descriptors with the base ptr, shape, and strides
    c                  óZ  •— | d t          t          ¦  «        …         }| t          t          ¦  «        d …         }g }|D ]d}t          |t          ¦  «        r8|                     |j        g|j        ¢|j        ¢|j        ¢|j        ¢¦  «         ŒO|                     |¦  «         Œe ‰g |¢|¢R Ž S ©N)	r%   ré   r§   r   ÚextendÚbaseÚshapeÚstridesrP   )ÚargsÚ	meta_argsÚraw_kernel_argsÚ
final_argsÚargÚlaunchers        €r   Úinnerz,wrap_handle_tensor_descriptor.<locals>.inner4  sÊ   ø€ ØÐ0�#Õ/Ñ0Ô0Ð0Ô1ˆ	Ø�sÕ#4Ñ5Ô5Ð6Ð6Ô7ˆØˆ
Ø"ð 
	'ð 
	'ˆCÝ˜#Õ/Ñ0Ô0ð 	'ð ×!Ò! 3¤8Ð"`¨c¬iÐ"`¸#¼+Ð"`ÈÌ	Ð"`ÐTWÔT_Ð"`ÑaÔaÐaÐaà×!Ò! #Ñ&Ô&Ð&Ð&ØˆxÐ0˜Ð0 ZÐ0Ð0Ð0Ð0r   rš   )r  r  s   ` r   Úwrap_handle_tensor_descriptorr  /  s#   ø€ ð
1ð 1ð 1ð 1ð 1ð" €Lr   c                   ó   — e Zd Zd„ Zd„ ZdS )ÚHIPLauncherc                 óð  ‡‡— t          ‰d¦  «        r‰j        nt          ¦   «         }ˆfd„Šˆfd„|                     ¦   «         D ¦   «         }d„ ‰j                             ¦   «         D ¦   «         }t          |||j        ¦  «        Št          ‰dt          ¬¦  «        }t          d„ | 
                    ¦   «         D ¦   «         ¦  «        }|rt          |j        ¦  «        n|j        | _        |j        | _        d S )Nrî   c                 ór   •— t          | t          ¦  «        r ‰j        j                             | ¦  «        fn| S rû   )r§   r¨   ÚfnÚ	arg_namesÚindex)Úxrt   s    €r   ú<lambda>z&HIPLauncher.__init__.<locals>.<lambda>L  s2   ø€ ½ZÈÍ3Ñ=OÔ=OÐV˜SœVÔ-×3Ò3°AÑ6Ô6Ð9Ð9ÐUV€ r   c                 ó.   •— i | ]\  }} ‰|¦  «        |“ŒS rš   rš   )rF   rÒ   ÚvalueÚarg_idxs      €r   rÔ   z(HIPLauncher.__init__.<locals>.<dictcomp>M  s'   ø€ ÐMÐMÐM©Z¨S°%�W�W˜S‘\”\ 5ÐMÐMÐMr   c                 ó   — i | ]\  }}||“Œ	S rš   rš   )rF   rÒ   r  s      r   rÔ   z(HIPLauncher.__init__.<locals>.<dictcomp>N  s   € ÐHÐHÐH¡J C¨�S˜%ÐHÐHÐHr   Ú__triton_launcherrs   c              3   ój   K  — | ].}t          |t          ¦  «        o|                     d ¦  «        V — Œ/dS )r¤   N)r§   r¨   r©   )rF   r±   s     r   rÚ   z'HIPLauncher.__init__.<locals>.<genexpr>Q  s>   è è € Ð!vÐ!vÐ\_¥*¨Sµ#Ñ"6Ô"6Ð"W¸3¿>º>È,Ñ;WÔ;WÐ!vÐ!vÐ!vÐ!vÐ!vÐ!vr   )rl   rî   Údictrí   r¯   rø   rï   r   ru   Úanyrè   r  ÚlaunchÚlaunch_cooperative_grid)rz   rt   Úmetadatarî   r¯   r{   Úhas_tensor_desc_argr  s    `     @r   r|   zHIPLauncher.__init__J  sù   øø€ Ý%,¨S°+Ñ%>Ô%>ÐJ�C”M�MÅDÁFÄFˆ	ØVÐVÐVÐVˆØMÐMÐMÐM¸9¿?º?Ñ;LÔ;LÐMÑMÔMˆ	ØHÐH°#´-×2EÒ2EÑ2GÔ2GÐHÑHÔHˆ	Ý˜I y°(Ô2DÑEÔEˆÝ%¨#Ð4GÕVbÐcÑcÔcˆÝ!Ð!vÐ!vÐcl×csÒcsÑcuÔcuÐ!vÑ!vÔ!vÑvÔvÐàCVÐfÕ3°C´JÑ?Ô?Ð?Ð\_Ô\fˆŒØ'/Ô'GˆÔ$Ð$Ð$r   c                 ó,   —  | j         | j        g|¢R Ž  d S rû   )r  r  )rz   r   s     r   Ú__call__zHIPLauncher.__call__V  s%   € ØˆŒ�DÔ0Ð8°4Ð8Ð8Ð8Ð8Ð8Ð8r   N)r   r   r   r|   r  rš   r   r   r	  r	  H  s5   € € € € € ð
Hð 
Hð 
Hð9ð 9ð 9ð 9ð 9r   r	  c                   óX   ‡ — e Zd Zˆ fd„Zd„ Zed„ ¦   «         Zd„ Zd„ Zd„ Z	d„ Z
d„ Zˆ xZS )	Ú	HIPDriverc                 ó†   •— t          ¦   «                              ¦   «          t          ¦   «         | _        t          | _        d S rû   )rm   r|   ri   Úutilsr	  Úlauncher_cls)rz   rp   s    €r   r|   zHIPDriver.__init__\  s2   ø€ Ý‰Œ×ÒÑÔÐÝ‘Z”ZˆŒ
Ý'ˆÔÐÐr   c                 ó   — dd l }|j        S )Nr   )r>   Úcuda©rz   r>   s     r   Úget_device_interfacezHIPDriver.get_device_interfacea  s   € ØˆˆˆØŒzÐr   c                  ó|   — 	 dd l } | j                             ¦   «         o| j        j        d uS # t
          $ r Y dS w xY w)Nr   F)r>   r%  Úis_availableÚversionÚhipÚImportError)r>   s    r   Ú	is_activezHIPDriver.is_activee  sU   € ð	ØˆLˆLˆLØ”:×*Ò*Ñ,Ô,ÐP°%´-Ô2CÈ4Ð2OÐPøÝð 	ð 	ð 	Ø�5�5ð	øøøs   ‚*- ­
;º;c                 óô   — |                       ¦   «         }| j                             |¦  «        }t          j        j        p|d         }|d         }t          d|                     d¦  «        d         |¦  «        S )NÚarchÚwarpSizer+  r@   r   )Úget_current_devicer"  ry   r   ÚruntimeÚoverride_archr   rE   )rz   ÚdeviceÚdevice_propertiesr/  rï   s        r   Úget_current_targetzHIPDriver.get_current_targetm  si   € Ø×(Ò(Ñ*Ô*ˆØ œJ×<Ò<¸VÑDÔDÐÝŒ}Ô*ÐGÐ.?ÀÔ.GˆØ% jÔ1ˆ	Ý˜ §
¢
¨3¡¤°Ô 2°IÑ>Ô>Ð>r   c                 óZ   — dd l }|                     d|                      ¦   «         ¦  «        S )Nr   r%  )r>   r4  r1  r&  s     r   Úget_active_torch_devicez!HIPDriver.get_active_torch_devicet  s+   € Øˆˆˆà�|Š|˜F D×$;Ò$;Ñ$=Ô$=Ñ>Ô>Ð>r   c                 ó   — ddl m} |S )Nr   )Údo_bench)Útriton.testingr:  )rz   r:  s     r   Úget_benchmarkerzHIPDriver.get_benchmarkery  s   € Ø+Ð+Ð+Ð+Ð+Ð+Øˆr   c                 óh   — dd l }d}|                     t          |dz  ¦  «        |j        d¬¦  «        S )Nr   i   é   r%  )r³   r4  )r>   ÚemptyÚint)rz   r>   Ú
cache_sizes      r   Úget_empty_cache_for_benchmarkz'HIPDriver.get_empty_cache_for_benchmark}  s8   € Øˆˆˆð 'ˆ
Ø�{Š{�3˜z¨Q™Ñ/Ô/°u´yÈˆ{ÑPÔPÐPr   c                 ó.   — |                      ¦   «          d S rû   )Úzero_)rz   Úcaches     r   Úclear_cachezHIPDriver.clear_cache„  s   € Ø�Š‰Œˆˆˆr   )r   r   r   r|   r'  Ústaticmethodr-  r6  r8  r<  rB  rF  r}   r~   s   @r   r   r   Z  s°   ø€ € € € € ð(ð (ð (ð (ð (ð
ð ð ð ðð ñ „\ðð?ð ?ð ?ð?ð ?ð ?ð
ð ð ðQð Qð Qðð ð ð ð ð ð r   r   )#Ú	functoolsr    rV   r«   Úpathlibr   Útritonr   Útriton.backends.compilerr   Útriton.backends.driverr   Útriton.runtime.buildr   Útriton.tools.tensor_descriptorr   r:   rN   ÚrealpathrO   rM   ru   r;   Ú	lru_cacherg   Úobjectri   rœ   rà   rá   ré   rø   r  r	  r   rš   r   r   ú<module>rR     s  ðØ Ð Ð Ð Ø 	€	€	€	Ø Ð Ð Ð Ø 	€	€	€	Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø .Ð .Ð .Ð .Ð .Ð .Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø ;Ð ;Ð ;Ð ;Ð ;Ð ;à
Œ'�/Š/˜"œ'×*Ò*¨8Ñ4Ô4Ñ
5Ô
5€Ø”—’˜W iÑ0Ô0Ð1€ð-ð -ð -ð` €ÔÑÔð@Rð @Rñ Ôð@RðF?ð ?ð ?ð ?ð ?ˆvñ ?ô ?ð ?ð(
ð 
ð 
ð. ØØØØðð Ð ð ØØØØðð Ð ð !Ð ðlð lð lð^ð ð ð29ð 9ð 9ð 9ð 9�&ñ 9ô 9ð 9ð$+ð +ð +ð +ð +�	ñ +ô +ð +ð +ð +r   