Ë
    5^(h˜O  ã                   ó’  — d dl Z 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 ej                  j!                  ej                  j#                  e«      «      Zej                  j'                  ed«      gZd„ Z e j,                  «       d	„ «       Zd
„ Z G d„ de«      Zd„ Zd„ Z G d„ de«      Z G d„ de«      Zy)é    N)ÚPath)Ú_build)Úget_cache_manager)Ú	GPUTarget)Ú	GPUDriverÚincludec                 óø  ‡ ‡‡‡‡— dd l }|j                  «       dk7  ry dd lŠddlm}m}m}mŠmŠm}  G ˆˆfd„d‰j                  «      }‰j                  | ||«       ||«       ||«      «      }	 ‰j                  d«      j                  }|‰g|_        ||_        dŠ‰j!                  ‰dz   «      }	ˆˆ ˆfd	„}
 | ||
«      |	«      r$t#        j$                  ‰j'                  |	«      «      S y # t        $ r Y y w xY w)
Nr   ÚLinux)Úc_charÚc_intÚc_size_tÚc_void_pÚc_char_pÚPOINTERc                   ó"   •— e Zd ZdW °fdW ° fgZy)ú8_find_already_mmapped_dylib_on_linux.<locals>.DlPhdrInfoÚ	dlpi_addrÚ	dlpi_nameN)Ú__name__Ú
__module__Ú__qualname__Ú_fields_)r   r   s   €€úX/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/triton/backends/amd/driver.pyÚ
DlPhdrInfor      s   ø„ à™(Ð#Ø™(Ð#ð
‰ó    r   z	libc.so.6i   é   c           
      óØ   •— | j                   j                  }t        t        j                  |«      «      }‰|j
                  v r'‰j                  ||t        ‰t        |«      «      «       yy)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   sR   ø€ Ø—M‘M×+Ñ+ˆ	Ü”—‘˜YÓ'Ó(ˆØ�q—v‘vÑà�N‰N˜4 ¬C°ÄÀYÃÓ,PÔQØØr   )Ú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_tr2   Úpathr,   r   r   r)   r+   s   `          @@@@r   Ú$_find_already_mmapped_dylib_on_linuxr:      sï   ü€ ÛØ‡�Ó˜GÒ#Øó
 ßK×K÷
�V×%Ñ%ô 
ð ×!Ñ! %©°Ó)<¹gÀhÓ>OÑQXÐY_ÓQ`Óa€JðØ Ÿ+™+ kÓ2×BÑBˆð !+¨HÐ5€OÔØ#€OÔà€OØ×&Ñ& ¸Ñ':Ó;€Döñ ‘z (Ó+¨TÔ2Ü�{‰{˜6×+Ñ+¨DÓ1Ó2Ð2Øøô+ ò Ùðús   Á1C- Ã-	C9Ã8C9c                  ó�  — d} t        j                  d«      }|rC|j                  | «      r!t         j                  j	                  |«      r|S t        d|› d| › �«      ‚t        | «      }|r2t         j                  j	                  |«      r|S t        d|› d| › �«      ‚g }dd l}|j                  «       }|j                  «       }|j                  r|g|z   }|D ]X  }t         j                  j                  |dd	| «      }t         j                  j	                  |«      r|c S |j                  |«       ŒZ t        j                  d
«      }|rj|j                  d«      D ]V  }	t         j                  j                  |	| «      }
t         j                  j	                  |
«      r|
c S |j                  |
«       ŒX t        j                  ddg«      j!                  «       }|j#                  «       D �cg c]5  }|j%                  «       j                  | «      sŒ#|j                  «       d   ‘Œ7 }}|D ]6  }t         j                  j	                  |«      r|c S |j                  |«       Œ8 t         j                  j                  d| «      }t         j                  j	                  |«      r|S |j                  |«       t        d| › d|› �«      ‚c c}w )Nzlibamdhip64.soÚTRITON_LIBHIP_PATHzTRITON_LIBHIP_PATH 'z' does not point to a valid zmemory mapped 'z'' in process does not point to a valid r   ÚtorchÚlibÚLD_LIBRARY_PATHú:z/sbin/ldconfigz-péÿÿÿÿz/opt/rocm/lib/zcannot locate z after attempted paths )r   ÚgetenvÚendswithr9   ÚexistsÚRuntimeErrorr:   ÚsiteÚgetsitepackagesÚgetusersitepackagesÚENABLE_USER_SITEÚjoinÚappendÚsplitÚ
subprocessÚcheck_outputÚdecodeÚ
splitlinesÚstrip)r*   Úenv_libhip_pathÚmmapped_pathÚpathsrF   Úsite_packagesÚ	user_siter9   Úenv_ld_library_pathÚdÚfÚlibsÚlineÚlocsÚlocÚcommon_install_paths                   r   Ú_get_path_to_hip_runtime_dylibr_   @   sh  € à€Hô —i‘iÐ 4Ó5€OÙØ×#Ñ# HÔ-´"·'±'·.±.ÀÔ2QØ"Ð"ÜÐ1°/Ð1BÐB^Ð_gÐ^hÐiÓjÐjô 8¸ÓA€LÙÜ�7‰7�>‰>˜,Ô'ØÐÜ˜_¨\¨NÐ:aÐbjÐakÐlÓmÐmà€Eãð ×(Ñ(Ó*€MØ×(Ñ(Ó*€IØ×ÒØ"˜ mÑ3ˆØò ˆÜ�w‰w�|‰|˜D '¨5°(Ó;ˆÜ�7‰7�>‰>˜$ÔØŠKØ�‰�TÕð	ô Ÿ)™)Ð$5Ó6ÐÙØ$×*Ñ*¨3Ó/ò 	ˆAÜ—‘—‘˜Q Ó)ˆAÜ�w‰w�~‰~˜aÔ Ø’Ø�L‰L˜�Oð		ô ×"Ñ"Ð$4°dÐ#;Ó<×CÑCÓE€Dð *.¯©Ó):Ö^ ¸d¿j¹j»l×>SÑ>SÐT\Õ>]ˆD�J‰J‹L˜ÓÐ^€DÐ^Øò ˆÜ�7‰7�>‰>˜#ÔØŠJØ�‰�SÕðô Ÿ'™'Ÿ,™,Ð'7¸ÓBÐÜ	‡w�w‡~�~Ð)Ô*Ø"Ð"Ø	‡L�LÐ$Ô%ä
˜¨ zÐ1HÈÈÐPÓ
QÐQùò _s   Ç)$KÈKc           	      ó  — t        j                  | j                  d«      «      j                  «       }t	        |«      }|j                  |› d�«      }|€±t        j                  «       5 }t        j                  j                  |d«      }t        |d«      5 }|j                  | «       d d d «       t        |||g t        g «      }t        |d«      5 }|j                  |j!                  «       |› d�d¬«      }d d d «       d d d «       dd l}	|	j$                  j'                  ||«      }
|	j$                  j)                  |
«      }|
j*                  j-                  |«       |S # 1 sw Y   Œ·xY w# 1 sw Y   ŒuxY w# 1 sw Y   ŒyxY w)	Nzutf-8z.sozmain.cÚwÚrbT)Úbinaryr   )ÚhashlibÚsha256ÚencodeÚ	hexdigestr   Úget_fileÚtempfileÚTemporaryDirectoryr   r9   rJ   ÚopenÚwriter   Úinclude_dirÚputÚreadÚimportlib.utilÚutilÚspec_from_file_locationÚmodule_from_specÚloaderÚexec_module)Úsrcr!   ÚkeyÚcacheÚ
cache_pathÚtmpdirÚsrc_pathrY   ÚsoÚ	importlibÚspecÚmods               r   Úcompile_module_from_srcr€      sK  € Ü
�.‰.˜Ÿ™ GÓ,Ó
-×
7Ñ
7Ó
9€CÜ˜cÓ"€EØ—‘ 4 &¨ Ó-€JØÐÜ×(Ñ(Ó*ð 	L¨fÜ—w‘w—|‘| F¨HÓ5ˆHÜ�h Ó$ð ¨Ø—‘˜”÷ä˜˜h¨°´KÀÓDˆBÜ�b˜$“ð L 1Ø"ŸY™Y q§v¡v£x°D°6¸°Àd˜YÓK�
÷L÷	Ló Ø�>‰>×1Ñ1°$¸
ÓC€DØ
�.‰.×
)Ñ
)¨$Ó
/€CØ‡K�K×Ñ˜CÔ Ø€J÷ð ú÷Lð Lú÷	Lð 	Lús<   Á(-E5ÂEÂ'(E5Ã&E)Ã5E5ÅE&	Å"E5Å)E2	Å.E5Å5E>c                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )ÚHIPUtilsc                 ód   •— t        | d«      st        t        | �  | «      | _        | j                  S )NÚinstance)ÚhasattrÚsuperr‚   Ú__new__r„   )ÚclsÚ	__class__s    €r   r‡   zHIPUtils.__new__”   s*   ø€ Ü�s˜JÔ'Ü ¤¨3Ñ7¸Ó<ˆCŒLØ�|‰|Ðr   c                 ó  — t        «       }t        t        j                  j	                  t
        d«      «      j                  «       }|j                  d|d«      }t        |d«      }|j                  | _	        |j                  | _
        y )Nzdriver.cz/*py_libhip_search_path*/r   Ú	hip_utils)r_   r   r   r9   rJ   ÚdirnameÚ	read_textÚreplacer€   Úload_binaryÚget_device_properties)ÚselfÚlibhip_pathrv   r   s       r   Ú__init__zHIPUtils.__init__™   sg   € Ü4Ó6ˆÜ”2—7‘7—<‘<¤¨Ó4Ó5×?Ñ?ÓAˆð �k‰kÐ5°{ÀAÓFˆÜ% c¨;Ó7ˆØŸ?™?ˆÔØ%(×%>Ñ%>ˆÕ"r   )r   r   r   r‡   r“   Ú__classcell__©r‰   s   @r   r‚   r‚   ’   s   ø„ ôö
	?r   r‚   c                 ó>   — | d   dk(  ry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ÚfloatÚdouble)Úi1Úi8Úi16Úi32Úi64Úu1Úu8Úu16Úu32Úu64Úfp16Úbf16Úfp32Úf32Úfp64© )Útys    r   Ú	ty_to_cppr´   ¦   sQ   € Ø	ˆ!�u�‚|ØàØØØØØØØØØØØØØØñð  	ñ!
ð 
r   c                  óª  ‡‡‡— ˆfd„Šˆfd„Šˆfd„Šdj                  |j                  «       D �cg c]
  } ‰|«      ‘Œ c}«      }d|z   }dj                  t        ‰|j                  «       «      «      }t        t	        t
        |j                  d«      «      «      }t        |«      D ��ci c]  \  }}||“Œ
 }}}t        |«      dkD  r)ddj                  d	„ |j                  «       D «       «      z   nd}dj                  d
„ |j                  «       D «       «      }	g }
|j                  «       D ]=  \  }}|d   dk(  r|
j                  d|› d�«       Œ$|dk7  sŒ*|
j                  d|› �«       Œ? t        «       }t        t        t        |«      «      «      }|j                  «       D ��cg c]  \  }}|dk7  sŒd|› �‘Œ }}}|j                  d«       d|› dt        |	«      dkD  rd|	z   nd› ddj                  |«      › d|› d|› ddj                  |j                  «       D ��cg c]  \  }} ‰|«      › d|› d�‘Œ c}}«      › d|› d|› ddj                  |j                  «       D ��cg c]  \  }}|d   dk(  rd|› d|› d|› d |› d!�	nd‘Œ  c}}«      › d"t        |
«      dkD  rddj                  |
«      z   nd› d#�}|S c c}w c c}}w c c}}w c c}}w c c}}w )$Nc                 ó^   •— t        | t        «      rdj                  t        ‰| «      «      S | S )Nú,)Ú
isinstanceÚtuplerJ   Úmap)ÚsigÚ_serialize_signatures    €r   r¼   z+make_launcher.<locals>._serialize_signature¾   s)   ø€ Ü�cœ5Ô!Ø—8‘8œCÐ 4°cÓ:Ó;Ð;Øˆ
r   c                 ó˜   •— t        | t        «      r!dj                  t        ‰| «      «      }d|› d�S | d   dk(  ry| dv ryt	        | «      S )Nr·   ú[ú]r   r—   z	PyObject*Ú	constexpr©r¸   r¹   rJ   rº   r´   )r³   ÚvalÚ_extracted_types     €r   rÃ   z&make_launcher.<locals>._extracted_typeÃ   sS   ø€ Ü�bœ%Ô Ø—(‘(œ3˜°Ó3Ó4ˆCØ�s�e˜1�:ÐØˆa‰5�CŠ<ØØ�+ÑØÜ˜‹}Ðr   c                 ó¶   •— t        | t        «      r!dj                  t        ‰| «      «      }d|› d�S | d   dk(  ry| dv rydd	d
dddddddddœt	        | «         S )NÚ ú(ú)r   r—   ÚOrÀ   rY   rX   ÚlÚbÚhÚiÚLÚBÚHÚIÚK)r¡   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�e˜1�:ÐØˆa‰5�CŠ<ØØ�+ÑØàØØØØØØØØØØñ
ô �B‹-ñð 	r   rÅ   Ú
piiiKKOOOOr·   r   z, c              3   ó,   K  — | ]  \  }}d |› �–— Œ y­w)z&_argNr²   ©Ú.0rÌ   r³   s      r   ú	<genexpr>z make_launcher.<locals>.<genexpr>è   s   è ø€ Ò L±°°B 5¨¨¤Ñ Lùs   ‚c              3   óN   K  — | ]  \  }}|d k7  sŒt        |«      › d|› �–— Œ y­w)rÀ   z argN)r´   rÖ   s      r   rØ   z make_launcher.<locals>.<genexpr>ë   s,   è ø€ Òh¹¸¸2ÐVXÐ\gÓVgœY r›]˜O¨4°¨sÔ3Ñhùs   ‚%�%r—   Úptr_infoz.dev_ptrrÀ   Ú_argz&argz&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[] = {"a  "};

// 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);
  if (lib) {
    // printf("[triton] chosen loaded libamdhip64.so in the process\n");
  }

  // 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;
        // printf("[triton] chosen %s\n", hipLibSearchPaths[i]);
      }
    }
  }
  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 functionzc) {
  // printf("_launch hip kernel\n");
  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 PyObject* launch(PyObject* self, PyObject* args) {
   // printf("launch\n");
  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;
  ú z _argz; z
  if(!PyArg_ParseTuple(args, "a  ", &launch_cooperative_grid,
                                           &gridX, &gridY, &gridZ, &_stream, &_function,
                                           &kernel_metadata, &launch_metadata,
                                           &launch_enter_hook, &launch_exit_hook a=  )) {
    return NULL;
  }

  // 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;
  }


  // raise exception asap
  zDevicePtrInfo ptr_infoz = getPointer(_argz); if (!ptr_infoz.valid) return NULL;z³;
  _launch(gridX, gridY, gridZ, num_warps, num_ctas, launch_cooperative_grid, clusterDimX, clusterDimY, clusterDimZ, shared_memory, (hipStream_t)_stream, (hipFunction_t)_functionan  );

  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;
  }

  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;
}
)rJ   Úvaluesrº   ÚlistÚfilterÚboolrL   Ú	enumerater$   ÚitemsrK   r_   Úrange)Ú	constantsÚ	signatureÚ	warp_sizer³   Úargs_formatÚformatrÌ   ÚsÚ	args_listÚ	arg_declsÚinternal_args_listr’   Úparamsrv   rÃ   r¼   rÓ   s                 @@@r   Úmake_launcherrî   ¼   sÁ  ú€ ôô
ôð, —'‘'°9×3CÑ3CÓ3EÖF¨R™9 R�=ÒFÓG€KØ˜KÑ'€FØ—‘œÐ1°9×3CÑ3CÓ3EÓFÓG€IÜ”VœD )§/¡/°#Ó"6Ó7Ó8€IÜ"+¨IÓ"6×7™$˜!˜Q��A‘Ð7€IÑ7ÜPSÐT]ÓP^ÐabÒPb��t—y‘yÑ L¸)¿/¹/Ó:KÔ LÓLÒLÐhj€Ið —	‘	ÑhÀÇÁÓARÔhÓh€IØÐØ—‘Ó"ò 2‰ˆˆ2Øˆa‰5�CŠ<Ø×%Ñ%¨°°°8Ð&<Õ=Ø�;ÓØ×%Ñ%¨¨Q¨C jÕ1ð	2ô
 1Ó2€Kô ”%œ˜I›Ó'Ó(€FØ&/§o¡oÓ&7×M™U˜Q ¸2ÀÓ;L��Q�CŠjÐM€FÑMØ
‡M�MÐ#Ô$ð
-ð .9¨Mð Y:`ôr uxð  yBó  uCð  FGò  uGð  aeð  hqò  aqð  MOð  `Pð Pð —y‘y Ó(Ð)ð *^à^gÐ]hð iSð T]ÐR]ð <^ðx ‡8�8¸Y¿_¹_Ó=N×O±E°A°r‘ Ó#Ð$ E¨!¨¨BÒ/ÓOÓPÐQð R Ø &˜xð (Rð S\ÐQ\ð ]ð( ‡9�9ð  R[÷  Rañ  Raó  Rc÷  dñ  INð  IJð  LNÐoqÐrsÑotÐx{Òo{Ð& q cÐ);¸A¸3¸bÀÀÐCSÐTUÐSVÐVjÑkð  BDñ  Dó  dó  eð  fð frô [^ð  _qó  [rð  uvò  [vð  swð  z~÷  zCñ  zCð  DVó  zWò  sWð  |~ð  rð *ðCk€CðX €JùòC Gùó 8ùó NùóT Pùó0 ds#   °J8Â*J=Æ%KÆ3KÈK	 É##K,c                   ó   — e Zd Zd„ Zd„ Zy)ÚHIPLauncherc                 ó¢  ‡— t        ‰d«      r‰j                  n	t        «       }ˆfd„}|j                  «       D ��ci c]  \  }} ||«      |“Œ }}}‰j                  j                  «       D ��ci c]  \  }}||“Œ
 }}}t        |||j                  «      Št        ‰d«      }|j                  | _        |j                  | _	        y c c}}w c c}}w )Nrä   c                 ót   •— t        | t        «      r&‰j                  j                  j	                  | «      fS | S ©N)r¸   ÚstrÚfnÚ	arg_namesÚindex)Úxrv   s    €r   ú<lambda>z&HIPLauncher.__init__.<locals>.<lambda>ë  s-   ø€ ¼ZÈÌ3Ô=O˜SŸV™V×-Ñ-×3Ñ3°AÓ6Ð9€ ÐUV€ r   Ú__triton_launcher)
r…   rä   Údictrâ   rå   rî   ræ   r€   ÚlaunchÚlaunch_cooperative_grid)	r‘   rv   Úmetadatarä   Úarg_idxÚidxÚvaluerå   r   s	    `       r   r“   zHIPLauncher.__init__é  s°   ø€ Ü%,¨S°+Ô%>�C—M’MÄDÃFˆ	ÛVˆØ;D¿?¹?Ó;L×M©Z¨S°%‘W˜S“\ 5Ñ(ÐMˆ	ÑMØ25·-±-×2EÑ2EÓ2G×H¡J C¨�S˜%‘ZÐHˆ	ÑHÜ˜I y°(×2DÑ2DÓEˆÜ% cÐ+>Ó?ˆØ—j‘jˆŒØ'/×'GÑ'GˆÕ$ùó NùÛHs   ¼CÁ/Cc                 ó>   —  | j                   | j                  g|¢­Ž  y ró   )rü   rý   )r‘   Úargss     r   Ú__call__zHIPLauncher.__call__ó  s   € Øˆ�‰�D×0Ñ0Ð8°4Ô8r   N)r   r   r   r“   r  r²   r   r   rð   rð   ç  s   „ òHó9r   rð   c                   óR   ‡ — 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                 óV   •— t         ‰| �  «        t        «       | _        t        | _        y ró   )r†   r“   r‚   Úutilsrð   Úlauncher_cls)r‘   r‰   s    €r   r“   zHIPDriver.__init__ù  s   ø€ Ü‰ÑÔÜ“ZˆŒ
Ü'ˆÕr   c                 ó"   — dd l }|j                  S )Nr   )r=   Úcuda©r‘   r=   s     r   Úget_device_interfacezHIPDriver.get_device_interfaceþ  s   € ÛØ�z‰zÐr   c                  óZ   — 	 dd l } | j                  j                  d uS # t        $ r Y yw xY w)Nr   F)r=   ÚversionÚhipÚImportError)r=   s    r   Ú	is_activezHIPDriver.is_active  s1   € ð	ÛØ—=‘=×$Ñ$¨DÐ0Ð0øÜò 	Ùð	ús   ‚ ž	*©*c                 óª   — | j                  «       }| j                  j                  |«      }|d   }|d   }t        d|j	                  d«      d   |«      S )NÚarchÚwarpSizer  r@   r   )Úget_current_devicer  r�   r   rL   )r‘   ÚdeviceÚdevice_propertiesr  ræ   s        r   Úget_current_targetzHIPDriver.get_current_target
  sU   € Ø×(Ñ(Ó*ˆØ ŸJ™J×<Ñ<¸VÓDÐØ  Ñ(ˆØ% jÑ1ˆ	Ü˜ §
¡
¨3£°Ñ 2°IÓ>Ð>r   c                 óJ   — dd l }|j                  d| j                  «       «      S )Nr   r  )r=   r  r  r  s     r   Úget_active_torch_devicez!HIPDriver.get_active_torch_device  s   € Ûà�|‰|˜F D×$;Ñ$;Ó$=Ó>Ð>r   c                 ó   — ddl m} |S )Nr   )Údo_bench)Útriton.testingr  )r‘   r  s     r   Úget_benchmarkerzHIPDriver.get_benchmarker  s
   € Ý+Øˆr   c                 ób   — dd l }d}|j                  t        |dz  «      |j                  d¬«      S )Nr   i   é   r  )Údtyper  )r=   ÚemptyÚint)r‘   r=   Ú
cache_sizes      r   Úget_empty_cache_for_benchmarkz'HIPDriver.get_empty_cache_for_benchmark  s.   € Ûð 'ˆ
Ø�{‰{œ3˜z¨Q™Ó/°u·y±yÈˆ{ÓPÐPr   c                 ó$   — |j                  «        y ró   )Úzero_)r‘   rx   s     r   Úclear_cachezHIPDriver.clear_cache!  s   € Ø�‰�r   )r   r   r   r“   r  Ústaticmethodr  r  r  r  r&  r)  r”   r•   s   @r   r  r  ÷  s;   ø„ ô(ò
ð ñó ðò?ò?ò
òQör   r  )Ú	functoolsr   rd   rM   ri   Úpathlibr   Útriton.runtime.buildr   Útriton.runtime.cacher   Útriton.backends.compilerr   Útriton.backends.driverr   r9   rŒ   ÚrealpathÚ__file__rJ   rm   r:   Ú	lru_cacher_   r€   Úobjectr‚   r´   rî   rð   r  r²   r   r   ú<module>r5     s¸   ðÛ Û 	Û Û Û Ý Ý 'Ý 2Ý .Ý ,à
�'‰'�/‰/˜"Ÿ'™'×*Ñ*¨8Ó4Ó
5€Ø�w‰w�|‰|˜G YÓ/Ð0€ò-ð` €×ÑÓñ;Ró ð;Rò|ô&?ˆvô ?ò(
ò,hôV	9�&ô 9ô +�	õ +r   