Ë
    ÎÍ:jp\  ã                   óº  — 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                   j#                  ej                   j%                  e«      «      Zej                   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"y)é    N)ÚPath)Úknobs)Ú	GPUTarget)Ú	GPUDriver)Úcompile_module_from_src)ÚTensorDescriptorÚ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   €€úo/home/mcse/projects/srt_converter/srt-converter-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_tr3   Ú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                  j                  x}rC|j                  | «      r!t        j
                  j                  |«      r|S t        d|› d| › �«      ‚t        | «      }|r2t        j
                  j                  |«      r|S t        d|› d| › �«      ‚g }t        j
                  j                  t        j
                  j                  t        «      d| «      }t        j
                  j                  |«      r|S |j                  |«       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.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-péÿÿÿÿz/opt/rocm/lib/zcannot locate z after attempted paths )r   ÚamdÚlibhip_pathÚendswithr    r:   ÚexistsÚRuntimeErrorr;   ÚjoinÚdirnameÚ__file__ÚappendÚsiteÚgetsitepackagesÚgetusersitepackagesÚENABLE_USER_SITEÚgetenvÚsplitÚ
subprocessÚcheck_outputÚdecodeÚ
splitlinesÚstrip)r+   Úenv_libhip_pathÚmmapped_pathÚpathsÚ	local_librK   Úsite_packagesÚ	user_siter:   Úenv_ld_library_pathÚdÚfÚlibsÚlineÚlocsÚlocÚcommon_install_paths                    r   Ú_get_path_to_hip_runtime_dylibrd   @   s²  € à€Hô  Ÿ)™)×/Ñ/Ð/€Ð/Ø×#Ñ# HÔ-´"·'±'·.±.ÀÔ2QØ"Ð"ÜÐ1°/Ð1BÐB^Ð_gÐ^hÐiÓjÐjô 8¸ÓA€LÙÜ�7‰7�>‰>˜,Ô'ØÐÜ˜_¨\¨NÐ:aÐbjÐakÐlÓmÐmà€Eô —‘—‘œRŸW™WŸ_™_¬XÓ6¸¸xÓH€IÜ	‡w�w‡~�~�iÔ ØÐØ	‡L�L�Ôãð ×(Ñ(Ó*€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   É"$L<ÊL<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Úsuperrf   Ú__new__rh   )ÚclsÚ	__class__s    €r   rk   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t        ¬«      }|j                  | _
        |j                  | _        y )Nzdriver.cz/*py_libhip_search_path*/r   Ú	hip_utils©Úsrcr"   Úinclude_dirs)rd   r   r    r:   rG   rH   Ú	read_textÚreplacer   rr   Úload_binaryÚget_device_properties)ÚselfrC   rq   Úmods       r   Ú__init__zHIPUtils.__init__‹   si   € Ü4Ó6ˆÜ”2—7‘7—<‘<¤¨Ó4Ó5×?Ñ?ÓAˆð �k‰kÐ5°{ÀAÓFˆÜ%¨#°KÌlÔ[ˆØŸ?™?ˆÔØ%(×%>Ñ%>ˆÕ"r   )r   r   r   rk   ry   Ú__classcell__©rm   s   @r   rf   rf   „   s   ø„ ôö
	?r   rf   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Údouble)Úi1Úi8Úi16Úi32Úi64Úu1Úu8Úu16Úu32Úu64Úfp16Úbf16Úfp32Úf32Úfp64© )Útys    r   Ú	ty_to_cppr™   ˜   sQ   € Ø	ˆ!�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„Št         ||j                  «       «      «      D ��ci c]  \  }}||“Œ
 }}}dj                  |j                  «       D �cg c]
  } ‰|«      ‘Œ c}«      }t        |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}
g }|j                  «       D ]P  \  }	}|d
k(  rŒ|t        v r|j                  t        |   › d|	› �«       Œ2|j                  t        |«      › d|	› �«       ŒR dj                  |«      }g }|j                  «       D ][  \  }	}|d   dk(  r|j                  d|	› d�«       Œ$|t        v r|j                  d|	› d�«       ŒB|d
k7  sŒH|j                  d|	› �«       Œ] |j                  «       D �	�cg c])  \  }	}|t        v rt        |   › d|	› dt        |   › d|	› 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                  |«      › 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 c c}}	w c c}}	w ))Nc                 óâ  — g }| D ]ç  }t        |t        «      rÄ|j                  d«      r³|j                  d«      dz   }t	        j
                  d|«      j                  «       }|j                  d|z   «       t        d|z  «      D ]  }|j                  d«       Œ t        |«      D ]  }|j                  d«       Œ t        |«      D ]  }|j                  d«       Œ Œ×|j                  |«       Œé |S )	NÚ
tensordescú,r   ztensordesc<([^[>]*)r}   é   rŒ   r‹   )	Ú
isinstanceÚstrÚ
startswithÚcountÚreÚmatchÚgrouprJ   Úrange)Ú	signatureÚoutputÚsigÚndimÚdtypeÚ_s         r   Ú_expand_signaturez(make_launcher.<locals>._expand_signatureÂ   sá   € Øˆð ò 	#ˆCÜ˜#œsÔ#¨¯©°|Ô(DØ—y‘y “~¨Ñ)�ÜŸ™Ð!6¸Ó<×BÑBÓD�à—‘˜c E™kÔ*Ü˜q 4™x›ò )�AØ—M‘M %Õ(ð)ô ˜t›ò )�AØ—M‘M %Õ(ð)ä˜t›ò )�AØ—M‘M %Õ(ñ)ð —‘˜cÕ"ð%	#ð( ˆr   c                 ó^   •— t        | t        «      rdj                  t        ‰| «      «      S | S )Nr¢   )r¤   ÚtuplerG   Úmap)r®   Ú_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k(  ryt	        | «      S )Nr¢   ú[ú]r   r}   z	PyObject*Ú	constexpr©r¤   r´   rG   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k(  rydd	d
ddddddddœ
t	        | «         S )NÚ ú(ú)r   r}   ÚOrº   r]   Ú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�e˜1�:ÐØˆa‰5�CŠ<ØØ�ÒØàØØØØØØØØØñ
ô �B‹-ñð 	r   r¿   r¢   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   ‚rº   z argr}   Úptr_infoz.dev_ptrÚ_argÚ_storagez _argz_storage = z(_argz);z&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[] = {"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;
  ú z; 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
  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)_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ÚvaluesrG   Ú_BASE_ARGS_FORMATrµ   ÚlistÚfilterÚboolrP   r%   ÚitemsÚFLOAT_STORAGE_TYPErJ   r™   ÚFLOAT_PACK_FUNCTIONrd   r«   )Ú	constantsr¬   Ú	warp_sizer²   ÚidxÚsr˜   Úargs_formatÚformatrÆ   Ú	args_listÚarg_decl_listÚ	arg_declsÚinternal_args_listÚfloat_storage_declsrC   Úparamsrq   r½   r¶   rÍ   s                     @@@r   Úmake_launcherrê   À   sõ  ú€ òô4ô
ôô* '0Ñ0AÀ)×BRÑBRÓBTÓ0UÓ&V×W™F˜C ��a‘ÐW€IÑWà—'‘'°9×3CÑ3CÓ3EÖF¨R™9 R�=ÒFÓG€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ð €MØ—‘Ó"ò <‰ˆˆ2Ø�ÒØØÔ#Ñ#Ø× Ñ Ô$6°rÑ$:Ð#;¸4À¸sÐ!CÕDà× Ñ ¤I¨b£M ?°$°q°cÐ!:Õ;ð<ð —	‘	˜-Ó(€IØÐØ—‘Ó"ò 2‰ˆˆ2Øˆa‰5�CŠ<Ø×%Ñ%¨°°°8Ð&<Õ=ØÔ%Ñ%Ø×%Ñ%¨¨Q¨C¨xÐ&8Õ9Ø�;ÓØ×%Ñ%¨¨Q¨C jÕ1ð2ð —_‘_Ó&÷áˆAˆrØÔ#Ñ#ô ˜bÑ!Ð
" %¨ s¨+Ô6IÈ"Ñ6MÐ5NÈeÐTUÐSVÐVXÒYðÐñ ô 1Ó2€Kô ”%œ˜I›Ó'Ó(€FØ&/§o¡oÓ&7×M™U˜Q ¸2ÀÓ;L��Q�CŠjÐM€FÑMØ
‡M�MÐ#Ô$ð
-ð .9¨Mð U:`ôj 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]ð U^ðj ‡8�8¸Y¿_¹_Ó=N×O±E°A°r‘ Ó#Ð$ E¨!¨¨BÒ/ÓOÓPÐQð R Ø &˜xð (Rð S\ÐQ\ð ]ð ‡8�8ÐÓ Ð!ð "ð& ‡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ð +ðqC€CðH €JùóY	 XùâFùó 8ùó,ùó Nùó| Pùó6 ds/   ¸N5Á%N;Ã#O È%.OÊOÊOÌ	O Í #O0c                 ó   ‡ — ˆ fd„}|S )zN
    Replace all tensor descriptors with the base ptr, shape, and strides
    c                  óN  •— | d t        t        «       }| t        t        «      d  }g }|D ]p  }t        |t        «      rM|j	                  |j
                  g|j                  ¢|j                  ¢|j                  ¢|j                  ¢«       Œ`|j                  |«       Œr  ‰g |¢|¢­Ž S ©N)	r%   r×   r¤   r   ÚextendÚbaseÚshapeÚstridesrJ   )ÚargsÚ	meta_argsÚraw_kernel_argsÚ
final_argsÚargÚlaunchers        €r   Úinnerz,wrap_handle_tensor_descriptor.<locals>.inner4  s©   ø€ ØÐ0œ#Ô/Ó0Ð1ˆ	ØœsÔ#4Ó5Ð6Ð7ˆØˆ
Ø"ò 
	'ˆCÜ˜#Ô/Ô0ð ×!Ñ! 3§8¡8Ð"`¨c¯i©iÐ"`¸#¿+¹+Ð"`ÈÏ	É	Ð"`ÐTW×T_ÑT_Ð"`Õaà×!Ñ! #Õ&ð
	'ñ Ð0˜Ð0 ZÒ0Ð0r   r—   )r÷   rø   s   ` r   Úwrap_handle_tensor_descriptorrù   /  s   ø€ ô
1ð" €Lr   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t        ¬«      }t        d„ |j                  «       D «       «      }	|	rt        |j                  «      n|j                  | _        |j                  | _        y c c}}w c c}}w )NrÞ   c                 ót   •— t        | t        «      r&‰j                  j                  j	                  | «      fS | S rí   )r¤   r¥   ÚfnÚ	arg_namesÚindex)Úxrq   s    €r   ú<lambda>z&HIPLauncher.__init__.<locals>.<lambda>L  s-   ø€ ¼ZÈÌ3Ô=O˜SŸV™V×-Ñ-×3Ñ3°AÓ6Ð9€ ÐUV€ r   Ú__triton_launcherrp   c              3   ób   K  — | ]'  }t        |t        «      xr |j                  d «      –— Œ) y­w)r¡   N)r¤   r¥   r¦   )rÏ   r®   s     r   rÐ   z'HIPLauncher.__init__.<locals>.<genexpr>Q  s)   è ø€ Ò!vÐ\_¤*¨S´#Ó"6Ò"W¸3¿>¹>È,Ó;WÓ"WÑ!vùs   ‚-/)ri   rÞ   ÚdictrÛ   r¬   rê   rß   r   rr   ÚanyrÖ   rù   ÚlaunchÚlaunch_cooperative_grid)
rw   rq   ÚmetadatarÞ   Úarg_idxrà   Úvaluer¬   rx   Úhas_tensor_desc_args
    `        r   ry   zHIPLauncher.__init__J  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ˆÜ%¨#Ð4GÔVbÔcˆÜ!Ñ!vÐcl×csÑcsÓcuÔ!vÓvÐáCVÔ3°C·J±JÔ?Ð\_×\fÑ\fˆŒØ'/×'GÑ'GˆÕ$ùó NùÛHs   ¼DÁ/Dc                 ó>   —  | j                   | j                  g|¢­Ž  y rí   )r  r  )rw   rò   s     r   Ú__call__zHIPLauncher.__call__V  s   € Øˆ�‰�D×0Ñ0Ð8°4Ô8r   N)r   r   r   ry   r  r—   r   r   rû   rû   H  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í   )rj   ry   rf   Úutilsrû   Úlauncher_cls)rw   rm   s    €r   ry   zHIPDriver.__init__\  s   ø€ Ü‰ÑÔÜ“ZˆŒ
Ü'ˆÕr   c                 ó"   — dd l }|j                  S )Nr   )r>   Úcuda©rw   r>   s     r   Úget_device_interfacezHIPDriver.get_device_interfacea  s   € ÛØ�z‰zÐr   c                  ó’   — 	 dd l } | j                  j                  «       xr | j                  j                  d uS # t
        $ r Y yw xY w)Nr   F)r>   r  Úis_availableÚversionÚhipÚImportError)r>   s    r   Ú	is_activezHIPDriver.is_activee  sC   € ð	ÛØ—:‘:×*Ñ*Ó,ÒP°%·-±-×2CÑ2CÈ4Ð2OÐPøÜò 	Ùð	ús   ‚7: º	AÁAc                 óâ   — | j                  «       }| j                  j                  |«      }t        j                  j
                  xs |d   }|d   }t        d|j                  d«      d   |«      S )NÚarchÚwarpSizer  r@   r   )Úget_current_devicer  rv   r   ÚruntimeÚoverride_archr   rP   )rw   ÚdeviceÚdevice_propertiesr  rß   s        r   Úget_current_targetzHIPDriver.get_current_targetm  se   € Ø×(Ñ(Ó*ˆØ ŸJ™J×<Ñ<¸VÓDÐÜ�}‰}×*Ñ*ÒGÐ.?ÀÑ.GˆØ% 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_devicet  s   € Ûà�|‰|˜F D×$;Ñ$;Ó$=Ó>Ð>r   c                 ó   — ddl m} |S )Nr   )Údo_bench)Útriton.testingr*  )rw   r*  s     r   Úget_benchmarkerzHIPDriver.get_benchmarkery  s
   € Ý+Øˆr   c                 ób   — dd l }d}|j                  t        |dz  «      |j                  d¬«      S )Nr   i   é   r  )r°   r$  )r>   ÚemptyÚint)rw   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_)rw   Úcaches     r   Úclear_cachezHIPDriver.clear_cache„  s   € Ø�‰�r   )r   r   r   ry   r  Ústaticmethodr  r&  r(  r,  r2  r6  rz   r{   s   @r   r  r  Z  s;   ø„ ô(ò
ð ñó ðò?ò?ò
òQör   r  )#Ú	functoolsr    rQ   r¨   Úpathlibr   Útritonr   Útriton.backends.compilerr   Útriton.backends.driverr   Útriton.runtime.buildr   Útriton.tools.tensor_descriptorr   r:   rH   ÚrealpathrI   rG   rr   r;   Ú	lru_cacherd   Úobjectrf   r™   rÜ   rÝ   r×   rê   rù   rû   r  r—   r   r   ú<module>rB     sô   ðÛ Û 	Û Û 	Ý Ý Ý .Ý ,Ý 8Ý ;à
�'‰'�/‰/˜"Ÿ'™'×*Ñ*¨8Ó4Ó
5€Ø—‘—‘˜W iÓ0Ð1€ò-ð` €×ÑÓñ@Ró ð@RôF?ˆvô ?ò(
ð. ØØØØñÐ ð ØØØØñÐ ð !Ð òlò^ô29�&ô 9ô$+�	õ +r   