Ë
    6^(hÇM  ã                   ó:  — d dl Z 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 d dlmZ ej$                  j'                  ej$                  j)                  e«      «      Zej$                  j-                  ed«      gZej$                  j-                  ed	«      Zd
gZ e j4                  «       d„ «       Z e j4                  «       d„ «       Z e j4                  «       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)Ú_allocation)Ú	GPUTarget)Ú	GPUDriverÚincludeÚlibÚcudac            	      óÆ  — t        j                  d«      } | r| gS t        j                  ddg«      j	                  «       }|j                  «       D �cg c]  }d|v sŒ|j                  «       d   ‘Œ }}|D �cg c]!  }t         j                  j                  |«      ‘Œ# }}t        j                  d«      }|r^|s\|j                  d«      D �cg c]B  }t         j                  j                  t         j                  j                  |d«      «      sŒA|‘ŒD }}d}|r|d	t        |«      z  z  }|d
z  }n
|dz  }|dz  }t        d„ |D «       «      sJ |«       ‚|S c c}w c c}w c c}w )NÚTRITON_LIBCUDA_PATHz/sbin/ldconfigz-púlibcuda.so.1éÿÿÿÿÚLD_LIBRARY_PATHú:zlibcuda.so cannot found!
z!Possible files are located at %s.z:Please create a symlink of libcuda.so to any of the files.z<Please make sure GPU is set up and then run "/sbin/ldconfig"z- (requires sudo) to refresh the linker cache.c              3   ó–   K  — | ]A  }t         j                  j                  t         j                  j                  |d «      «      –— ŒC y­w)r   N)ÚosÚpathÚexistsÚjoin)Ú.0r   s     ú[/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/triton/backends/nvidia/driver.pyú	<genexpr>zlibcuda_dirs.<locals>.<genexpr>)   s,   è ø€ ÒSÀdŒr�w‰w�~‰~œbŸg™gŸl™l¨4°Ó@×AÑSùs   ‚AA	)r   ÚgetenvÚ
subprocessÚcheck_outputÚdecodeÚ
splitlinesÚsplitr   Údirnamer   r   ÚstrÚany)	Úenv_libcuda_pathÚlibsÚlineÚlocsÚlocÚdirsÚenv_ld_library_pathÚdirÚmsgs	            r   Úlibcuda_dirsr,      sO  € ä—y‘yÐ!6Ó7ÐÙØ Ð!Ð!ä×"Ñ"Ð$4°dÐ#;Ó<×CÑCÓE€Dð *.¯©Ó):ÖU ¸nÐPTÒ>TˆD�J‰J‹L˜ÓÐU€DÐUØ,0Ö1 SŒB�G‰G�O‰O˜CÕ Ð1€DÐ1ÜŸ)™)Ð$5Ó6ÐÙ¡4Ø2×8Ñ8¸Ó=Ös˜ÄÇÁÇÁÔPR×PWÑPW×P\ÑP\Ð]`ÐbpÓPqÕAr’ÐsˆÐsØ
&€CÙØÐ2´S¸³YÑ>Ñ>ˆØÐKÑK‰àÐMÑMˆØÐ>Ñ>ˆÜÑSÈdÔSÔSÐXÐUXÓXÐSØ€Kùò VùÚ1ùò ts   Á	EÁEÁ7&EÃAEÄEc                  ó$   — t         gt        «       ¢S ©N)Úlibdevice_dirr,   © ó    r   Úlibrary_dirsr2   -   s   € äÐ+œL›NÐ+Ð+r1   c                  ó^   — ddl m} m}m} dj	                   | «        |«       g |«       ¢«      S )Nr   ©ÚmachineÚsystemÚarchitectureú,)Úplatformr5   r6   r7   r   r4   s      r   Úplatform_keyr:   2   s'   € ç6Ñ6Ø�8‰8‘W“Y¡£Ð:©<«>Ð:Ó;Ð;r1   c           	      ó†  — t        j                  | t        «       z   j                  d«      «      j	                  «       }t        |«      }t        j                  d«      j                  d«      d   }|j                  |› d|› �«      }|€¿t        j                  «       5 }t        j                  j                  |d«      }t        |d«      5 }|j!                  | «       d d d «       t#        |||t%        «       t&        t(        «      }	t        |	d«      5 }|j+                  |j-                  «       |› d|› �d¬	«      }d d d «       d d d «       d
d l}
|
j0                  j3                  ||«      }|
j0                  j5                  |«      }|j6                  j9                  |«       |S # 1 sw Y   ŒÅxY w# 1 sw Y   ŒuxY w# 1 sw Y   ŒyxY w)Nzutf-8Ú
EXT_SUFFIXú.r   zmain.cÚwÚrbT)Úbinaryr   )ÚhashlibÚsha256r:   ÚencodeÚ	hexdigestr   Ú	sysconfigÚget_config_varr   Úget_fileÚtempfileÚTemporaryDirectoryr   r   r   ÚopenÚwriter   r2   Úinclude_dirÚ	librariesÚputÚreadÚimportlib.utilÚutilÚspec_from_file_locationÚmodule_from_specÚloaderÚexec_module)ÚsrcÚnameÚkeyÚcacheÚextÚ
cache_pathÚtmpdirÚsrc_pathÚfÚsoÚ	importlibÚspecÚmods                r   Úcompile_module_from_srcrc   8   s~  € Ü
�.‰.˜#¤£Ñ.×6Ñ6°wÓ?Ó
@×
JÑ
JÓ
L€CÜ˜cÓ"€EÜ
×
"Ñ
" <Ó
0×
6Ñ
6°sÓ
;¸BÑ
?€CØ—‘ 4 &¨¨#¨ Ó0€JØÐÜ×(Ñ(Ó*ð 	O¨fÜ—w‘w—|‘| F¨HÓ5ˆHÜ�h Ó$ð ¨Ø—‘˜”÷ä˜˜h¨´³ÄÌYÓWˆBÜ�b˜$“ð O 1Ø"ŸY™Y q§v¡v£x°D°6¸¸3¸%°È˜YÓN�
÷O÷	Oó Ø�>‰>×1Ñ1°$¸
ÓC€DØ
�.‰.×
)Ñ
)¨$Ó
/€CØ‡K�K×Ñ˜CÔ Ø€J÷ð ú÷Oð Oú÷	Oð 	Oús<   Â-F7Ã	FÃ4F7Ä(F+Ä7F7ÆF(	Æ$F7Æ+F4	Æ0F7Æ7G c                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )Ú	CudaUtilsc                 ód   •— t        | d«      st        t        | �  | «      | _        | j                  S )NÚinstance)ÚhasattrÚsuperre   Ú__new__rg   )ÚclsÚ	__class__s    €r   rj   zCudaUtils.__new__S   s*   ø€ Ü�s˜JÔ'Ü ¤¨CÑ8¸Ó=ˆCŒLØ�|‰|Ðr1   c                 óZ  — t        t        t        j                  j	                  t
        d«      «      j                  «       d«      }|j                  | _        |j                  | _        |j                  | _	        |j                  | _
        |j                  | _        |j                  | _        y )Nzdriver.cÚ
cuda_utils)rc   r   r   r   r   r    Ú	read_textÚload_binaryÚget_device_propertiesÚcuOccupancyMaxActiveClustersÚset_printf_fifo_sizeÚfill_1d_tma_descriptorÚfill_2d_tma_descriptor)Úselfrb   s     r   Ú__init__zCudaUtils.__init__X   s~   € Ü%¤d¬2¯7©7¯<©<¼ÀÓ+LÓ&M×&WÑ&WÓ&YÐ[gÓhˆØŸ?™?ˆÔØ%(×%>Ñ%>ˆÔ"Ø,/×,LÑ,LˆÔ)Ø$'×$<Ñ$<ˆÔ!Ø&)×&@Ñ&@ˆÔ#Ø&)×&@Ñ&@ˆÕ#r1   )Ú__name__Ú
__module__Ú__qualname__rj   rw   Ú__classcell__©rl   s   @r   re   re   Q   s   ø„ ôö
Ar1   re   c                 ó~   — | d   dk(  ryi dd“dd“dd	“d
d“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“|    S )Nr   Ú*ÚCUdeviceptrÚi1Úint32_tÚi8Úint8_tÚi16Úint16_tÚi32Úi64Úint64_tÚu1Úuint32_tÚu8Úuint8_tÚu16Úuint16_tÚu32Úu64Úuint64_tÚfp16ÚfloatÚbf16Úfp32Úf32Úfp64ÚdoubleÚ	nvTmaDescÚCUtensorMapr0   )Útys    r   Ú	ty_to_cpprœ   g   sà   € Ø	ˆ!�u�‚|ØðØˆiðàˆhðð 	ˆyðð 	ˆyð	ð
 	ˆyðð 	ˆjðð 	ˆiðð 	ˆzðð 	ˆzðð 	ˆzðð 	�ðð 	�ðð 	�ðð 	ˆwðð 	�ðð  	�]ð!ð" 	ñ#
ð 
r1   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 ]W  \  }}|d   dk(  r|	j                  d|› d�«       Œ$|dk(  r|	j                  d|› �«       Œ>|dk7  sŒD|	j                  d|› �«       ŒY t        t        |«      «      }
d}|j                  «       D ��cg c]  \  }}|d   dk(  rd|› d|› d|› d|› d�	‘Œ }}}|j                  «       D ��cg c]  \  }}|dk(  rd|› d|› d|› d�‘Œ }}}|j                  «       D ��cg c]  \  }}|dk7  sŒd|› �‘Œ }
}}|
j                  d«       dt        |«      dkD  rd|z   nd› ddj                  |
«      › d|j                  |j                  «       D ��cg c]  \  }} ‰|«      › d |› d!�‘Œ c}}«      › d"|› d#|› d$|j                  |«      › d|j                  |«      › 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 )'Nc                 ó^   •— t        | t        «      rdj                  t        ‰| «      «      S | S )Nr8   )Ú
isinstanceÚtupler   Úmap)ÚsigÚ_serialize_signatures    €r   r£   z+make_launcher.<locals>._serialize_signature€   s)   ø€ Ü�cœ5Ô!Ø—8‘8œCÐ 4°cÓ:Ó;Ð;Øˆ
r1   c                 ó˜   •— t        | t        «      r!dj                  t        ‰| «      «      }d|› d�S | d   dk(  ry| dv ryt	        | «      S )Nr8   ú[ú]r   r~   z	PyObject*©Ú	constexprr™   ©rŸ   r    r   r¡   rœ   )r›   ÚvalÚ_extracted_types     €r   r«   z&make_launcher.<locals>._extracted_type…   sT   ø€ Ü�bœ%Ô Ø—(‘(œ3˜°Ó3Ó4ˆCØ�s�e˜1�:ÐØˆa‰5�CŠ<ØØÐ+Ñ+ØÜ˜‹}Ðr1   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§   r^   ÚdÚ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‹-ñð 	r1   r­   ÚiiiKKpOOOOOr8   r   z, c              3   ó,   K  — | ]  \  }}d |› �–— Œ y­w)z&_argNr0   ©r   rµ   r›   s      r   r   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™   z*tma_ptrr¨   Ú_argz
  zDevicePtrInfo ptr_infoz = getPointer(_argz); if (!ptr_infoz.valid) return NULL;zCUtensorMap* tma_ptrz = getTmaDesc(_argz); if (!tma_ptrz) return NULL;z&argz&global_scratchaB  
#include "cuda.h"
#include <stdbool.h>
#include <Python.h>
#include <dlfcn.h>

static inline void gpuAssert(CUresult code, const char *file, int line)
{
   if (code != CUDA_SUCCESS)
   {
      const char* prefix = "Triton Error [CUDA]: ";
      const char* str;
      cuGetErrorString(code, &str);
      char err[1024] = {0};
      strcat(err, prefix);
      strcat(err, str);
      PyGILState_STATE gil_state;
      gil_state = PyGILState_Ensure();
      PyErr_SetString(PyExc_RuntimeError, err);
      PyGILState_Release(gil_state);
   }
}

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

typedef CUresult (*cuLaunchKernelEx_t)(const CUlaunchConfig* config, CUfunction f, void** kernelParams, void** extra);

static cuLaunchKernelEx_t getLaunchKernelExHandle() {
  // Open the shared library
  void* handle = dlopen("libcuda.so.1", RTLD_LAZY);
  if (!handle) {
    PyErr_SetString(PyExc_RuntimeError, "Failed to open libcuda.so.1");
    return NULL;
  }
  // Clear any existing error
  dlerror();
  cuLaunchKernelEx_t cuLaunchKernelExHandle = (cuLaunchKernelEx_t)dlsym(handle, "cuLaunchKernelEx");
  // Check for errors
  const char *dlsym_error = dlerror();
  if (dlsym_error) {
    PyErr_SetString(PyExc_RuntimeError, "Failed to retrieve cuLaunchKernelEx from libcuda.so.1");
    return NULL;
  }
  return cuLaunchKernelExHandle;
}

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, CUstream stream, CUfunction function, CUdeviceptr global_scratchz) {
  void *params[] = { aO   };
  if (gridX*gridY*gridZ > 0) {
    if ((num_ctas == 1) && (0 == launch_cooperative_grid)) {
      CUDA_CHECK(cuLaunchKernel(function, gridX, gridY, gridZ, 32*num_warps, 1, 1, shared_memory, stream, params, 0));
    } else if ((num_ctas == 1) && (0 != launch_cooperative_grid)) {
      CUlaunchAttribute launchAttr[1];
      CUlaunchAttribute coopAttr = { .id = CU_LAUNCH_ATTRIBUTE_COOPERATIVE, .value = 1};
      launchAttr[0] = coopAttr;

      CUlaunchConfig config;
      config.gridDimX = gridX;
      config.gridDimY = gridY;
      config.gridDimZ = gridZ;
      config.blockDimX = 32 * num_warps;
      config.blockDimY = 1;
      config.blockDimZ = 1;
      config.sharedMemBytes = shared_memory;
      config.hStream = stream;
      config.attrs = launchAttr;
      config.numAttrs = 1;

      static cuLaunchKernelEx_t cuLaunchKernelExHandle = NULL;
      if (cuLaunchKernelExHandle == NULL) {
        cuLaunchKernelExHandle = getLaunchKernelExHandle();
      }
      CUDA_CHECK(cuLaunchKernelExHandle(&config, function, params, 0));

    } else {
      CUlaunchAttribute launchAttr[3];
      launchAttr[0].id = CU_LAUNCH_ATTRIBUTE_CLUSTER_DIMENSION;
      launchAttr[0].value.clusterDim.x = clusterDimX;
      launchAttr[0].value.clusterDim.y = clusterDimY;
      launchAttr[0].value.clusterDim.z = clusterDimZ;
      launchAttr[1].id = CU_LAUNCH_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE;
      launchAttr[1].value.clusterSchedulingPolicyPreference = CU_CLUSTER_SCHEDULING_POLICY_SPREAD;

      unsigned numAttrs = 2;
      if (0 != launch_cooperative_grid) {
        CUlaunchAttribute coopAttr = { .id = CU_LAUNCH_ATTRIBUTE_COOPERATIVE, .value = 1};
        launchAttr[2] = coopAttr;
        numAttrs = 3;
      }

      CUlaunchConfig config;
      config.gridDimX = gridX * clusterDimX;
      config.gridDimY = gridY * clusterDimY;
      config.gridDimZ = gridZ * clusterDimZ;
      config.blockDimX = 32 * num_warps;
      config.blockDimY = 1;
      config.blockDimZ = 1;
      config.sharedMemBytes = shared_memory;
      config.hStream = stream;
      config.attrs = launchAttr;
      config.numAttrs = numAttrs;
      static cuLaunchKernelEx_t cuLaunchKernelExHandle = NULL;
      if (cuLaunchKernelExHandle == NULL) {
        cuLaunchKernelExHandle = getLaunchKernelExHandle();
      }
      CUDA_CHECK(cuLaunchKernelExHandle(&config, function, params, 0));
    }
  }
}

typedef struct _DevicePtrInfo {
    CUdeviceptr 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 = 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 = PyLong_AsUnsignedLongLong(ret);
    if(!ptr_info.dev_ptr)
      return ptr_info;
    uint64_t dev_ptr;
    int status = cuPointerGetAttribute(&dev_ptr, CU_POINTER_ATTRIBUTE_DEVICE_POINTER, ptr_info.dev_ptr);
    if (status == CUDA_ERROR_INVALID_VALUE) {
        PyErr_Format(PyExc_ValueError,
                     "Pointer argument (at %d) cannot be accessed from Triton (cpu tensor?)", idx);
        ptr_info.valid = false;
    } else if (status != CUDA_SUCCESS) {
        CUDA_CHECK(status);  // Catch any other cuda API errors
        ptr_info.valid = false;
    }
    ptr_info.dev_ptr = dev_ptr;
    Py_DECREF(ret);  // Thanks ChatGPT!
    return ptr_info;
  }
  PyErr_SetString(PyExc_TypeError, "Pointer argument must be either uint64 or have data_ptr method");
  ptr_info.valid = false;
  return ptr_info;
}

static inline CUtensorMap* getTmaDesc(PyObject *obj) {
  if (sizeof(CUtensorMap*) != 8) {
    PyErr_SetString(PyExc_SystemError, "getTmaDesc() requires 64-bit compilation");
    return NULL;
  }

  PyObject *method_handle = PyObject_GetAttrString(obj, "tma_desc_cpu_ptr");
  if (!method_handle) {
    PyErr_SetString(PyExc_TypeError, "tma_desc_cpu_ptr() method does not exist");
    return NULL;
  }

  PyObject *empty_tuple = PyTuple_New(0);
  if (!empty_tuple) {
    Py_DECREF(method_handle);
    PyErr_SetString(PyExc_SystemError, "Internal Python error!");
    return NULL;
  }
  PyObject *method_ret = PyObject_Call(method_handle, empty_tuple, NULL);
  Py_DECREF(empty_tuple);
  Py_DECREF(method_handle);
  if (!method_ret) {
    PyErr_SetString(PyExc_SystemError, "Internal Python error!");
    return NULL;
  }

  if (!PyLong_Check(method_ret)) {
    PyErr_SetString(PyExc_TypeError, "tma_desc_cpu_ptr() must return 64-bit int");
    Py_DECREF(method_ret);
    return NULL;
  }

  uint64_t ptr_as_uint = PyLong_AsUnsignedLongLong(method_ret);
  Py_DECREF(method_ret);
  if (!ptr_as_uint) {
    PyErr_SetString(PyExc_ValueError, "received NULL ptr from tma_desc_cpu_ptr()");
    return NULL;
  }
  if (ptr_as_uint % 64 != 0) {
    PyErr_SetString(PyExc_ValueError, "tma_desc_cpu_ptr() must be 64-byte aligned");
    return NULL;
  }

  return (CUtensorMap*)(ptr_as_uint);
}

static void ensureCudaContext() {
  CUcontext pctx;
  CUDA_CHECK(cuCtxGetCurrent(&pctx));
  if (!pctx) {
    // Ensure device context.
    CUdevice device;
    CUDA_CHECK(cuDeviceGet(&device, 0));
    CUDA_CHECK(cuDevicePrimaryCtxRetain(&pctx, device));
    CUDA_CHECK(cuCtxSetCurrent(pctx));
  }
}

static PyObject* launch(PyObject* self, PyObject* args) {
  // ensure cuda context is valid before calling any CUDA APIs, e.g. before getPointer calls cuPointerGetAttributes
  ensureCudaContext();

  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;
  PyObject *global_scratch_obj = NULL;
  z _argú;z
  if(!PyArg_ParseTuple(args, "a*  ", &gridX, &gridY, &gridZ,
                                           &_stream, &_function, &launch_cooperative_grid, &global_scratch_obj,
                                           &kernel_metadata, &launch_metadata,
                                           &launch_enter_hook, &launch_exit_hookat  )) {
    return NULL;
  }

  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)) {
    PyErr_SetString(PyExc_TypeError, "kernel_metadata must be a tuple");
    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;
  }

  CUdeviceptr global_scratch = 0;
  if (global_scratch_obj != Py_None) {
    DevicePtrInfo global_scratch_info = getPointer(global_scratch_obj, -1);
    if (!global_scratch_info.valid) {
      return NULL;
    }
    global_scratch = global_scratch_info.dev_ptr;
  }

  // raise exception asap
  zÖ
  Py_BEGIN_ALLOW_THREADS;
  _launch(gridX, gridY, gridZ, num_warps, num_ctas, launch_cooperative_grid, clusterDimX, clusterDimY, clusterDimZ, shared_memory, (CUstream)_stream, (CUfunction)_function, global_scratcha0  );
  Py_END_ALLOW_THREADS;
  if (PyErr_Occurred()) {
    return NULL;
  }

  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_RETURN_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) {
  PyObject *m = PyModule_Create(&ModuleDef);
  if(m == NULL) {
    return NULL;
  }
  PyModule_AddFunctions(m, ModuleMethods);
  return m;
}
)r   Úvaluesr¡   ÚlistÚfilterÚboolr   Ú	enumerateÚlenÚitemsÚappendÚrange)Ú	constantsÚ	signaturer›   Úargs_formatÚformatrµ   ÚsÚ	args_listÚ	arg_declsÚinternal_args_listÚparamsÚnewlineÚ	ptr_declsÚ	tma_declsrV   r«   r£   r¼   s                  @@@r   Úmake_launcherrÙ   ~   sâ  ú€ ôô
ôð, —'‘'°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ð —	‘	ÑhÀÇÁÓARÔhÓh€IØÐØ—‘Ó"ò 2‰ˆˆ2Øˆa‰5�CŠ<Ø×%Ñ%¨°°°8Ð&<Õ=Ø�;Òà×%Ñ%¨°° nÕ5Ø�;ÓØ×%Ñ%¨¨Q¨C jÕ1ð2ô ”3�y“>Ó"€Fð €Gð —_‘_Ó&÷áˆAˆrØˆa‰5�CŠ<ð !  Ð#5°a°S¸¸1¸#Ð=MÈaÈSÐPdÒeð€Iñ ð fo×etÑetÓev÷Ù\aÐ\]Ð_aØ�Òð ˜q˜cÐ!3°A°3°oÀaÀSÈÒWð€Iñ ð '0§o¡oÓ&7×M™U˜Q ¸2ÀÓ;L��Q�CŠjÐM€FÑMØ
‡M�MÐ#Ô$ð.vô\ KNð  OXó  KYð  \]ò  K]ð  w{ð  ~Gò  wGð  ceð  vfð fØ—y‘y Ó(Ð)ð x*ðp ‡<�<À	ÇÁÓ@Q×R±u°q¸"‘O BÓ'Ð(¨¨a¨S°Ò2ÓRÓSÐTð U Ø &˜xð (Qð R[ÐP[ð \ð: ‡<�<�	ÓÐð Ø
‡<�<�	ÓÐð |ô ehð  i{ó  e|ð  @ò  e@ð  }Að  DH÷  DMñ  DMð  N`ó  Daò  }að  FHð  |Ið 'IðWr€Cðf	 €Jùòi
 Gùó 8ùó$ùó
ùó NùóR Ss)   °K:Â*K?Æ.!LÇ%LÈLÈ$LÊLc                   ó   — e Zd Zd„ Zd„ Zy)ÚCudaLauncherc                 óÐ  ‡— t        ‰d«      r‰j                  n	t        «       }ˆfd„}|j                  «       D ��ci c]  \  }} ||«      |“Œ }}}‰j                  j                  «       D ��ci c]  \  }}||“Œ
 }}}t        ||«      Št        ‰d«      }|j                  | _        |j                  | _        |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)ÚxrV   s    €r   ú<lambda>z'CudaLauncher.__init__.<locals>.<lambda>   s-   ø€ ¼ZÈÌ3Ô=O˜SŸV™V×-Ñ-×3Ñ3°AÓ6Ð9€ ÐUV€ r1   Ú__triton_launcher)rh   rÍ   ÚdictrÊ   rÎ   rÙ   rc   ÚlaunchÚglobal_scratch_sizeÚglobal_scratch_alignÚlaunch_cooperative_grid)	rv   rV   ÚmetadatarÍ   Úarg_idxÚidxÚvaluerÎ   rb   s	    `       r   rw   zCudaLauncher.__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Ó1ˆÜ% cÐ+>Ó?ˆØ—j‘jˆŒØ#+×#?Ñ#?ˆÔ Ø$,×$AÑ$AˆÔ!Ø'/×'GÑ'GˆÕ$ùó NùÛHs   ¼CÁ/C"c           	      óÞ   — | j                   dkD  r9||z  |z  }|| j                   z  }t        j                  || j                  |«      }	nd }	 | j                  |||||| j
                  |	g|¢­Ž  y ©Nr   )ræ   r   Ú
_allocatorrç   rå   rè   )
rv   ÚgridXÚgridYÚgridZÚstreamÚfunctionÚargsÚ	grid_sizeÚ
alloc_sizeÚglobal_scratchs
             r   Ú__call__zCudaLauncher.__call__
  su   € Ø×#Ñ# aÒ'Ø ™¨Ñ-ˆIØ" T×%=Ñ%=Ñ=ˆJÜ(×3Ñ3°JÀ×@YÑ@YÐ[aÓb‰Nà!ˆNØˆ�‰�E˜5 %¨°¸4×;WÑ;WÐYgÐoÐjnÔor1   N)rx   ry   rz   rw   rù   r0   r1   r   rÛ   rÛ   ü  s   „ ò
Hópr1   rÛ   c                   óR   ‡ — e Zd Zˆ fd„Zd„ Zd„ Zd„ Zed„ «       Zd„ Z	d„ Z
d„ Zˆ xZS )	Ú
CudaDriverc                 óV   •— t        «       | _        t        | _        t        ‰| �  «        y r.   )re   ÚutilsrÛ   Úlauncher_clsri   rw   )rv   rl   s    €r   rw   zCudaDriver.__init__  s   ø€ Ü“[ˆŒ
Ü(ˆÔÜ‰ÑÕr1   c                 ó~   — | j                  «       }| j                  |«      }|d   dz  |d   z   }d}t        d||«      S )Nr   é
   é   é    r   )Úget_current_deviceÚget_device_capabilityr   )rv   ÚdeviceÚ
capabilityÚ	warp_sizes       r   Úget_current_targetzCudaDriver.get_current_target  sK   € Ø×(Ñ(Ó*ˆØ×/Ñ/°Ó7ˆ
Ø ‘] RÑ'¨*°Q©-Ñ7ˆ
Øˆ	Ü˜ ¨YÓ7Ð7r1   c                 óJ   — dd l }|j                  d| j                  «       «      S )Nr   r   )Útorchr  r  ©rv   r
  s     r   Úget_active_torch_devicez"CudaDriver.get_active_torch_device"  s   € ÛØ�|‰|˜F D×$;Ñ$;Ó$=Ó>Ð>r1   c                 ó"   — dd l }|j                  S rî   )r
  r   r  s     r   Úget_device_interfacezCudaDriver.get_device_interface&  s   € ÛØ�z‰zÐr1   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CudaDriver.is_active*  sC   € ð	ÛØ—:‘:×*Ñ*Ó,ÒL°%·-±-×2CÑ2CÀtÐ2KÐLøÜò 	Ùð	ús   ‚7: º	AÁAc                 ó   — ddl m} |S )Nr   )Údo_bench)Útriton.testingr  )rv   r  s     r   Úget_benchmarkerzCudaDriver.get_benchmarker2  s
   € Ý+Øˆr1   c                 ób   — dd l }d}|j                  t        |dz  «      |j                  d¬«      S )Nr   i   é   r   )Údtyper  )r
  ÚemptyÚint)rv   r
  Ú
cache_sizes      r   Úget_empty_cache_for_benchmarkz(CudaDriver.get_empty_cache_for_benchmark6  s.   € Ûð
 'ˆ
Ø�{‰{œ3˜z¨Q™Ó/°u·y±yÈˆ{ÓPÐPr1   c                 ó$   — |j                  «        y r.   )Úzero_)rv   rY   s     r   Úclear_cachezCudaDriver.clear_cache?  s   € Ø�‰�r1   )rx   ry   rz   rw   r  r  r  Ústaticmethodr  r  r  r"  r{   r|   s   @r   rû   rû     s;   ø„ ôò
8ò?òð ñó ðòòQör1   rû   )%Ú	functoolsr   rE   rA   r   rH   Úpathlibr   Útriton.runtime.buildr   Útriton.runtime.cacher   Útriton.runtimer   Útriton.backends.compilerr   Útriton.backends.driverr   r   r    ÚrealpathÚ__file__r   rL   r/   rM   Ú	lru_cacher,   r2   r:   rc   Úobjectre   rœ   rÙ   rÛ   rû   r0   r1   r   ú<module>r/     s  ðÛ Û 	Û Û Û Û Ý Ý 'Ý 2Ý &Ý .Ý ,à
�'‰'�/‰/˜"Ÿ'™'×*Ñ*¨8Ó4Ó
5€Ø�w‰w�|‰|˜G YÓ/Ð0€Ø—‘—‘˜W eÓ,€ØˆH€	ð €×ÑÓñó ðð0 €×ÑÓñ,ó ð,ð €×ÑÓñ<ó ð<ò
ô2A�ô Aò,
ò.{ô|p�6ô pô0,�õ ,r1   