o
    eGI                     @  s   d dl mZ d dlZd dlZddlmZ ddlmZ ddl	m
Z
mZ ddlmZmZmZmZ ejr=dd	l	mZ dd
lmZ G dd de
Zdd ZdS )    )annotationsN   )version_compare)CudaCompiler   )NewExtensionModule
ModuleInfo)flattenpermittedKwargsnoKwargsInvalidArguments)ModuleState)Compilerc                      s   e Zd ZeddddZ fddZed'ddZedgd(ddZ	edgd(ddZ
edd Zedd Zedd Zdd Zd)d!d"Zd*d%d&Z  ZS )+
CudaModuleZCUDAz0.50.0T)Zunstablec                   s(   t    | j| j| j| jd d S )N)min_driver_versionnvcc_arch_flagsnvcc_arch_readable)super__init__methodsupdater   r   r   )selfargskwargs	__class__ </usr/lib/python3.10/site-packages/mesonbuild/modules/cuda.pyr   %   s   
zCudaModule.__init__state'ModuleState'r   T.Tuple[str]r   T.Dict[str, T.Any]returnstrc           	      C  s  t d}t|dkst|d ts||d }g 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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d0d1d2dd3d4d5dd6d7d8dd9d:d;dd<d=d>dd?d@dAddBdCdDddEdFdGddHdIdJddKdLdMddNdOdPddQdRdSddTdUdVddWdXdYddZd[d\dd]d^d_d}d`}|D ]}t||da r||jj|db } |S q|S )cNzmin_driver_version must have exactly one positional argument: a CUDA Toolkit version string. Beware that, since CUDA 11.0, the CUDA Toolkit's components (including NVCC) are versioned independently from each other (and the CUDA Toolkit as a whole).r   r   z>=12.0.0z527.41z	525.60.13)cuda_versionwindowslinuxz>=11.8.0z522.06z	520.61.05z>=11.7.1z516.31z	515.48.07z>=11.7.0z516.01z	515.43.04z>=11.6.1z511.65z	510.47.03z>=11.6.0z511.23z	510.39.01z>=11.5.1z496.13z	495.29.05z>=11.5.0z496.04z>=11.4.3z472.50z	470.82.01z>=11.4.1z471.41z	470.57.02z>=11.4.0z471.11z	470.42.01z>=11.3.0z465.89z	465.19.01z>=11.2.2z461.33z	460.32.03z>=11.2.1z461.09z>=11.2.0z460.82z	460.27.03z>=11.1.1z456.81z455.32z>=11.1.0z456.38z455.23z>=11.0.3z451.82z	450.51.06z>=11.0.2z451.48z	450.51.05z>=11.0.1z451.22z	450.36.06z	>=10.2.89z441.22z440.33z
>=10.1.105z418.96z418.39z
>=10.0.130z411.31z410.48z	>=9.2.148z398.26z396.37z>=9.2.88z397.44z396.26z>=9.1.85z391.29z390.46z>=9.0.76z385.54z384.81z>=8.0.61z376.51z375.26z>=8.0.44z369.30z367.48z>=7.5.16z353.66z352.31z>=7.0.28z347.62z346.46unknownr$   r&   )r   len
isinstancer#   r   getZhost_machinesystem)	r   r   r   r   argerrorr$   Zdriver_version_tableZdriver_versiondr   r   r   r   -   s   








	






















"zCudaModule.min_driver_versiondetected-T.Tuple[T.Union[Compiler, CudaCompiler, str]]T.List[str]c                 C     |  ||}| j| d }|S )Nr   _validate_nvcc_arch_args_nvcc_arch_flagsr   r   r   r   Znvcc_arch_argsretr   r   r   r   d      zCudaModule.nvcc_arch_flagsc                 C  r1   )Nr   r2   r5   r   r   r   r   l   r7   zCudaModule.nvcc_arch_readablec                 C  s"   t dd| } | dd} | S )Nz	[ 	
,;]+;)resubstripsplit)sr   r   r   _break_arch_stringt   s   zCudaModule._break_arch_stringc                 C  s   t | tr| jS dS )N )r)   r   Zdetected_cccr   r   r   _detected_cc_from_compilerz   s   
z%CudaModule._detected_cc_from_compilerc                 C  s"   t | tr| jS t | tr| S dS )Nr'   )r)   r   versionr#   r@   r   r   r   _version_from_compiler   s
   

z!CudaModule._version_from_compilerc                   s  t d}t|dk r||d } |}|dkr|t|dkr#g nt|dd  } fdd|D }t|}t|dkrKt|h dsKt dt|dkrU|d n|}|d	 |}t|g} fd
d|D }t|}t|h dst d|||fS )NzJThe first argument must be an NVCC compiler object, or its version string!r   r   r'   c                      g | ]}  |qS r   r>   .0ar   r   r   
<listcomp>       z7CudaModule._validate_nvcc_arch_args.<locals>.<listcomp>>   AllAutoCommonzaThe special architectures 'All', 'Common' and 'Auto' must appear alone, as a positional argument!r.   c                   rE   r   rF   rG   rJ   r   r   rK      rL   )r   r(   rD   r	   set
isdisjointr*   rB   )r   r   r   r,   compilerr$   Z	arch_listr.   r   rJ   r   r3      s(   
 

z#CudaModule._validate_nvcc_arch_argsNc                 C  sX   g }|D ]%}|r)|rt |d| rq|r t |d| r |sq|}||vr)|| q|S )z
        Filter CUDA arch list (no codenames) for >= low and < hi architecture
        bounds, and deduplicate.
        If saturate is provided, architectures >= hi are replaced with saturate.
        <>=)r   append)r   cuda_arch_listlohiZsaturateZfiltered_cuda_arch_listarchr   r   r   _filter_cuda_arch_list   s   
z!CudaModule._filter_cuda_arch_listrN   r?   c                 C  sv  g d}g d}d}d}g d}t |drd}t |dr3|g d	7 }|dg7 }t |d
r3|dg7 }d}t |drV|ddg7 }|ddg7 }|g d7 }t |drV|dg7 }d}t |drz|ddg7 }|dg7 }|ddg7 }d}t |drz|dg7 }d}t |dr|dg7 }|dg7 }|dg7 }t |d r|d!g7 }d}dg}	dg}
t |d"r|d#g7 }|dg7 }|dg7 }d$}t |d%r|d&g7 }d'}t |d(r|	d'g7 }	d'g}
|d'g7 }|d'g7 }t |d)r|d*g7 }d+}t |d,r|g d-7 }|g d.7 }|g d/7 }t |d0rd1}t |d2rd3}t |d4rd5}|sd6}|d7kr"|}n7|d8kr*|}n/|d6krN|rKt|tr;|}n| |}| ||||d9 }n|}nt|trY| |}td:d; t|D }g }g }|D ]}g }g }|d<}|r|dt	d<  }t
d=|r|g|g}}nOdd>gg fd?gg fd@gg fdd$gd$gfdAgg fd3dgdgfddgdgfdBgg fdgdgfdgg fdgdgf|	|
fd+gg fdCgdCgfdDgdDgfdE|dF\}}|du rtdG| dH||7 }|r|s|}||7 }qjtt|}tt|}g }g }|D ]a}t
dI| \}}t |dJ| r&q|r3t |dK| r3q|rW|dLdM}|dLdM}|dNdO| dP | g7 }|dQ| g7 }q|dLdM}|dNdO| dP | g7 }|dQ| g7 }q|D ]B}t
dI| \}}|r|}t |dJ| rqt|rt |dK| rqt|dLdM}|dNdO| dR | g7 }|dS| g7 }qt||fS )Tz{
        Using the CUDA Toolkit version and the target architectures, compute
        the NVCC architecture flags.
        )FermiKeplerMaxwell)3.03.55.0Nz2.0)r^   3.2r_   r`   z<7.0z5.2z>=7.0)Kepler+TegraKepler+TeslaMaxwell+Tegraz<8.0z5.2+PTX6.0z>=8.0PascalPascal+Tegra6.1)re   rh   6.2z<9.0z6.1+PTXz7.0z>=9.0VoltaXavierz7.2r^   z<10.0z7.2+PTXz8.0z>=10.0Turingz7.5z<11.0z7.5+PTXz>=11.0Amperer_   z<11.1z8.0+PTXz8.6z>=11.1z<11.8z8.6+PTX8.7z>=11.8)OrinLovelaceHopper)8.99.0z9.0+PTX)rn   rr   rs   z<12z9.1z>=12.0r`   z<13z10.0rN   rM   rO   c                 s  s    | ]}|r|V  qd S Nr   )rH   xr   r   r   	<genexpr>0  s    z.CudaModule._nvcc_arch_flags.<locals>.<genexpr>z+PTXz![0-9]+\.[0-9](\([0-9]+\.[0-9]\))?z2.1(2.0)ra   z3.7z5.3ri   rr   rs   )r[   rb   rc   r\   rd   r]   rf   rg   rj   rk   rl   rm   ro   rp   rq   )NNzUnknown CUDA Architecture Name !z'([0-9]+\.[0-9])(?:\(([0-9]+\.[0-9])\))?rS   rT   .r?   z-gencodezarch=compute_z	,code=sm_Zsm_z,code=compute_Zcompute_)r   r)   listr>   rZ   r#   sortedrP   endswithr(   r9   	fullmatchr*   r   groupsreplace)r   r$   rV   r.   Zcuda_known_gpu_architecturesZcuda_common_gpu_architecturesZcuda_hi_limit_gpu_architectureZcuda_lo_limit_gpu_architectureZcuda_all_gpu_architecturesZcuda_ampere_binZcuda_ampere_ptxZcuda_arch_binZcuda_arch_ptxZ	arch_nameZarch_binZarch_ptxZadd_ptxZ
nvcc_flagsZnvcc_archs_readablerY   Zcodevr   r   r   r4      s:  









































zCudaModule._nvcc_arch_flags)r   r   r   r    r   r!   r"   r#   )r   r   r   r/   r   r!   r"   r0   )NNN)rN   r?   )__name__
__module____qualname__r   INFOr   r   r   r
   r   r   staticmethodr>   rB   rD   r3   rZ   r4   __classcell__r   r   r   r   r   !   s$    6



r   c                  O  s   t | i |S ru   )r   )r   r   r   r   r   
initialize  s   r   )
__future__r   typingTr9   Zmesonlibr   Zcompilers.cudar   r?   r   r   Zinterpreterbaser	   r
   r   r   TYPE_CHECKINGr   	compilersr   r   r   r   r   r   r   <module>   s     f