o
    (iA                     @   s@  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
mZmZmZmZm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mZ d	dlmZ ejejdd ejejdd G dd de Z!G dd dej"Z#e#dZ$dd Z%dd Z&ddgZ'ddgZ(ddge' Z)dge' Z*dge' Z+dge' Z,d ge' Z-d!ge' Z.d"ge' Z/e Z0e j1G d#d$ d$Z2G d%d& d&Z3e3 Z4e j1G d'd( d(Z5					)d;d*e6d+eee6ef  d,eee6  d-eee6  d.eee6  d/eeee6ef   d0e7d1e5fd2d3Z8d1efd4d5Z9	)	d<d6ee5 d7e7d8e7d1dfd9d:Z:dS )=    N)nullcontext)datetimePath)DictListOptionalSequenceUnionHashable)FileLock   )CompilationContext   )env)generate_ninja_build_for_op	run_ninja)write_if_differentT)exist_okc                       s0   e Zd ZdZddeded f fddZ  ZS )	MissingJITCacheErroraC  
    Exception raised when JIT compilation is disabled and the JIT cache
    does not contain the required precompiled module.

    This error indicates that a module needs to be added to the JIT cache
    build configuration.

    Attributes:
        spec: JitSpec of the missing module
        message: Error message
    NmessagespecJitSpecc                    s   || _ t | d S N)r   super__init__)selfr   r   	__class__ P/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/flashinfer/jit/core.pyr   #   s   zMissingJITCacheError.__init__r   )__name__
__module____qualname____doc__strr   r   __classcell__r   r   r   r    r      s    $r   c                       s   e Zd Z fddZdededdfddZdededdfd	d
ZdededdfddZe	j
dddededdfddZ  ZS )FlashInferJITLoggerc                    s   t  | tdd}| |  | t  t	j
d }tj|s:t|d}W d    n1 s5w   Y  | t| | jd td | jd td d S )NFLASHINFER_LOGGING_LEVELinfozflashinfer_jit.logwr   zS%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - flashinfer.jit: %(message)sr   )r   r   osgetenvsetLevelupper
addHandlerloggingStreamHandlerjit_envFLASHINFER_WORKSPACE_DIRpathexistsopenFileHandlerhandlerssetFormatter	Formatter)r   namelogging_levellog_pathfr   r   r    r   )   s(   


zFlashInferJITLogger.__init__msgargsreturnNc                 G      | j | j|g|R   dS )z~
        As [`debug`][logging.Logger.debug], but subsequent calls with
        the same message are silently dropped.
        N)_print_oncedebugr   r?   r@   r   r   r    
debug_once@      zFlashInferJITLogger.debug_oncec                 G   rB   )z|
        As [`info`][logging.Logger.info], but subsequent calls with
        the same message are silently dropped.
        N)rC   r)   rE   r   r   r    	info_onceG   rG   zFlashInferJITLogger.info_oncec                 G   rB   )z
        As [`warning`][logging.Logger.warning], but subsequent calls with
        the same message are silently dropped.
        N)rC   warningrE   r   r   r    warning_onceN   rG   z FlashInferJITLogger.warning_once)maxsizec                 G   s   ||g|R ddi dS )zKHelper method to log messages only once per unique (msg, args) combination.
stacklevel   Nr   )r   
log_methodr?   r@   r   r   r    rC   U   s   zFlashInferJITLogger._print_once)r!   r"   r#   r   r%   r   rF   rH   rJ   	functools	lru_cacherC   r&   r   r   r   r    r'   (   s    
 r'   zflashinfer.jitc                  C   sR   d} t jD ]\}}|dkrd} q|dkr | r t|dkr d} q| s'tdd S )NF   T      z,FlashInfer requires GPUs with sm75 or higher)current_compilation_contextTARGET_CUDA_ARCHSisdigitintRuntimeError)eligiblemajorminorr   r   r    check_cuda_arch_   s   r\   c                  C   s*   t jtjrdd l} | tj d S d S )Nr   )r+   r4   r5   r2   FLASHINFER_JIT_DIRshutilrmtree)r^   r   r   r    clear_cache_dirn   s   r`   z-DFLASHINFER_ENABLE_FP8_E8M0z-DFLASHINFER_ENABLE_FP4_E2M1z#-gencode=arch=compute_89,code=sm_89z%-gencode=arch=compute_90a,code=sm_90az'-DCUTE_SM90_EXTENDED_MMA_SHAPES_ENABLEDz'-gencode=arch=compute_100a,code=sm_100az'-gencode=arch=compute_103a,code=sm_103az'-gencode=arch=compute_100f,code=sm_100fz'-gencode=arch=compute_110a,code=sm_110az'-gencode=arch=compute_120a,code=sm_120az'-gencode=arch=compute_121a,code=sm_121ac                   @   s\   e Zd ZU dZeed< eed< eed< ee	 ed< e
e	 ed< eed< edefd	d
ZdS )JitSpecStatusz Status information for a JitSpecr;   
created_atis_compiledlibrary_pathsourcesneeds_device_linkingrA   c                 C   s   | j rdS dS )NCompiledzNot Compiledrc   r   r   r   r    status   s   zJitSpecStatus.statusN)r!   r"   r#   r$   r%   __annotations__r   boolr   r   r   propertyrj   r   r   r   r    ra      s   
 ra   c                   @   sv   e Zd ZdZdd Zddd	Zdeedf fd
dZdede	e
 fddZdee
 fddZdeeef fddZdS )JitSpecRegistryz%Global registry to track all JitSpecsc                 C   s   i | _ i | _d S r   )_specs_creation_timesri   r   r   r    r      s   
zJitSpecRegistry.__init__r   r   rA   Nc                 C   s0   |j | jvr|| j|j < t | j|j < dS dS )zRegister a new JitSpecN)r;   ro   r   nowrp   )r   r   r   r   r    register   s   zJitSpecRegistry.registerc                 C   
   | j  S )zGet all registered JitSpecs)ro   copyri   r   r   r    get_all_specs      
zJitSpecRegistry.get_all_specsr;   c                 C   sL   || j vrdS | j | }|jr| nd}t|j| j| |j||j|jdS )z!Get status for a specific JitSpecN)r;   rb   rc   rd   re   rf   )ro   rc   get_library_pathra   r;   rp   re   rf   )r   r;   r   rd   r   r   r    get_spec_status   s   

zJitSpecRegistry.get_spec_statusc                 C   s,   g }| j D ]}| |}|r|| q|S )z&Get status for all registered JitSpecs)ro   rx   append)r   statusesr;   rj   r   r   r    get_all_statuses   s   


z JitSpecRegistry.get_all_statusesc                 C   s4   |   }t|tdd |D tdd |D dS )zGet compilation statisticsc                 s   s    | ]}|j rd V  qdS r   Nrh   .0sr   r   r    	<genexpr>       z,JitSpecRegistry.get_stats.<locals>.<genexpr>c                 s   s    | ]}|j sd V  qdS r|   rh   r}   r   r   r    r      r   )totalcompilednot_compiled)r{   lensum)r   rz   r   r   r    	get_stats   s
   zJitSpecRegistry.get_stats)r   r   rA   N)r!   r"   r#   r$   r   rr   r   r%   ru   r   ra   rx   r   r{   rW   r   r   r   r   r    rn      s    
	rn   c                   @   st  e Zd ZU eed< ee ed< eee  ed< eee  ed< eee  ed< eee  ed< dZe	ed< dZ
e	ed	< ed
efddZed
efddZed
efddZd
efddZd
ee fddZed
efddZed
e	fddZed
e	fddZed
efddZd.ddZed
e	fd d!Zd/d#e	d$e	d
dfd%d&Zd'efd(d)Zd*d+ Zd
ee fd,d-ZdS )0r   r;   re   extra_cflagsextra_cuda_cflagsextra_ldflagsextra_include_dirsFis_classrf   rA   c                 C   s   t j| j d S )Nzbuild.ninjar2   r]   r;   ri   r   r   r    
ninja_path   s   zJitSpec.ninja_pathc                 C   s   t j| j S r   r   ri   r   r   r    	build_dir      zJitSpec.build_dirc                 C      t j| j | j d S Nz.sor   ri   r   r   r    jit_library_path      zJitSpec.jit_library_pathc                 C   s   | j r| jS | jS r   )is_aotaot_pathr   ri   r   r   r    rw      s   zJitSpec.get_library_pathc                 C   sJ   g }| j }| jD ]}|jdk}|rdnd}||j}|||  q|S )N.cu.cuda.o.o)r   re   suffixwith_suffixr;   ry   )r   object_pathsjit_dirsourceis_cudaobject_suffixobj_namer   r   r    get_object_paths   s   

zJitSpec.get_object_pathsc                 C   r   r   )r2   FLASHINFER_AOT_DIRr;   ri   r   r   r    r      r   zJitSpec.aot_pathc                 C   rs   r   )r   r5   ri   r   r   r    r     rv   zJitSpec.is_aotc                 C   s   |    S r   )rw   r5   ri   r   r   r    rc     r   zJitSpec.is_compiledc                 C   s   t  | j d S )Nz.lock)
get_tmpdirr;   ri   r   r   r    	lock_path	  s   zJitSpec.lock_pathNc              	   C   sH   | j }| jjddd t| j| j| j| j| j| j	| j
d}t|| d S )NTparentsr   r;   re   r   r   r   r   rf   )r   r   mkdirr   r;   re   r   r   r   r   rf   r   )r   r   contentr   r   r    write_ninja  s   	zJitSpec.write_ninjac                 C   rs   r   )r   r5   ri   r   r   r    is_ninja_generated  rv   zJitSpec.is_ninja_generatedTverbose	need_lockc                 C   sx   t jdrtd| d|rt| jddnt }| | js"|   t	| j
| j| W d    d S 1 s5w   Y  d S )NFLASHINFER_DISABLE_JITzJIT compilation is disabled via FLASHINFER_DISABLE_JIT environment variable, but the required module is not found in the JIT cache. Please add the missing module to the JIT cache build configuration.)r   Fthread_local)r+   environgetr   r   r   r   r   r   r   r   r   )r   r   r   lockr   r   r    build  s   "zJitSpec.buildso_pathc                 C   s   t t|S r   )tvm_ffiload_moduler%   )r   r   r   r   r    load0  s   zJitSpec.loadc                 C   sv   | j r	| | jS t| jdd! | j}tjdddk}| j	|dd | |}W d    |S 1 s4w   Y  |S )NFr   FLASHINFER_JIT_VERBOSE01)r   )
r   r   r   r   r   r   r+   r   r   r   )r   r   r   resultr   r   r    build_and_load3  s   
zJitSpec.build_and_loadc                    sZ  ddl m}m}m}m} |  | | j}||| j}||| j}dtt	 dtt	 dtt	 f fdd} fdd	|D }	|||	}
|||	}t
jd
d}t
jd  d}t	| j }g }| jD ]F}|jdk}|rt|}|}d}n|}|
}d}||j}t
j||}|dt	| g}||7 }|d|g7 }||d|t	| d qd|S )z
        Generate compile_commands.json entries for this JitSpec.

        Returns:
            A list of dictionaries, each representing a compile command entry
            for a source file in this JitSpec.
        r   )get_cuda_pathbuild_common_cflagsbuild_cflagsbuild_cuda_cflagsflagscommon_cflags_expandedrA   c                    sL   g }| D ]}|dkr| | qd|v r||d  q|| q|S )Nz$common_cflags
$cuda_home)extendry   replace)r   r   expandedflag	cuda_homer   r    expand_flagsX  s   z2JitSpec.get_compile_commands.<locals>.expand_flagsc                    s   g | ]}| d  qS )r   )r   )r~   r   r   r   r    
<listcomp>f  s    z0JitSpec.get_compile_commands.<locals>.<listcomp>CXXzc++FLASHINFER_NVCCz	/bin/nvccr   r   r   z-cz-o )	directorycommandfile)cpp_extr   r   r   r   r   r   r   r   r%   r+   r   r   r   resolvere   r   r   r;   r4   joinry   )r   r   r   r   r   common_cflagscflagscuda_cflagsr   r   cflags_expandedcuda_cflags_expandedcxxnvccr   compile_commandsr   r   compilerr   r   r   output_filecommand_partsr   r   r    get_compile_commandsA  sT   





zJitSpec.get_compile_commands)rA   N)T)r!   r"   r#   r%   rk   r   r   r   r   rl   rf   rm   r   r   r   rw   r   r   r   rc   r   r   r   r   r   r   dictr   r   r   r   r    r      s@   
 

r   Fr;   re   r   r   r   extra_include_pathsrf   rA   c              	   C   s  t   tjd}tjdd}|d ur|n|dk}	ddg}
ddtjdd d	d
dddg}|	r>|
ddg7 }
|g d7 }n|ddg7 }|
dg7 }
tjdddkrW|dg7 }|d ur_|
|7 }
|d urg||7 }t| dd |D |
|||d ur}dd |D nd |d}t| |S )NFLASHINFER_JIT_DEBUGr   r   r   z
-std=c++17z-Wno-switch-boolz
--threads=FLASHINFER_NVCC_THREADSz-use_fast_mathz-DFLASHINFER_ENABLE_F16z-DFLASHINFER_ENABLE_BF16z-DFLASHINFER_ENABLE_FP8_E4M3z-DFLASHINFER_ENABLE_FP8_E5M2-O0-g)r   r   z-G	-lineinfoz--ptxas-options=-vz-DCUTLASS_DEBUG_TRACE_LEVEL=2z-DNDEBUGz-O3FLASHINFER_JIT_LINEINFOr   c                 S      g | ]}t |qS r   r   r~   xr   r   r    r         z gen_jit_spec.<locals>.<listcomp>c                 S   r   r   r   r   r   r   r    r     r   r   )r\   r+   r   r   r   jit_spec_registryrr   )r;   re   r   r   r   r   rf   	debug_envverbose_envrD   r   r   r   r   r   r    gen_jit_spec  sJ   		



r   c                  C   s$   t jd } |  s| jddd | S )NtmpTr   )r2   r]   r5   r   )tmpdirr   r   r    r     s   
r   specsr   skip_prebuiltc              	   C   s   g }| D ]1}|r|j  rq|d|j  |js5t|jdd |  W d    n1 s0w   Y  q|s:d S dg| dg }t }t|d dd |d }t	|d
| ttj|| W d    d S 1 slw   Y  d S )	Nz	subninja Fr   zninja_required_version = 1.3 zflashinfer_jit.lockzflashinfer_jit.ninja
)r   r5   ry   r   r   r   r   r   r   r   r   r   r2   r]   )r   r   r   linesr   r   r   r   r   r    build_jit_specs  s&   
"r   )NNNNF)FT);dataclassesrO   r0   r+   
contextlibr   r   pathlibr   typingr   r   r   r	   r
   r   r   filelockr   compilation_contextr   r   r   r2   r   r   r   utilsr   makedirsr3   FLASHINFER_CSRC_DIRrX   r   Loggerr'   loggerr\   r`   common_nvcc_flagssm89_nvcc_flagssm90a_nvcc_flagssm100a_nvcc_flagssm103a_nvcc_flagssm100f_nvcc_flagssm110a_nvcc_flagssm120a_nvcc_flagssm121a_nvcc_flagsrT   	dataclassra   rn   r   r   r%   rl   r   r   r   r   r   r   r    <module>   s     4





6 @



E
