U
    hāĖd   ć                   @   s.  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 Z	d	d
 Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4d5d6d7d8d9d:d;d<d=d>d?d@dAZdBdC Z G dDdE dEe!Z"dFdG Z#dS )Hé    N)Śir)Ścgutilsé   )Śnvvm)Ścurrent_contextc                 C   sN   dt | d }t t |”t t |””t |”t |”f”}t | ||”S )NZ___numba_atomic_iZ	_cas_hack)Śstrr   ŚFunctionTypeŚIntTypeŚPointerTyper   Śget_or_insert_function)ŚlmodŚisizeŚfnameŚfnty© r   śM/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/cuda/nvvmutils.pyŚdeclare_atomic_cas_int   s    ž’r   c                 C   sD   t  ” jr(|  |||dd”}|  |d”S |  t|||||f”S d S )NŚ	monotonicr   )r   ZNVVMZ	is_nvvm70ZcmpxchgZextract_valueŚcallr   )Śbuilderr   r   ZptrŚcmpŚvalŚoutr   r   r   Śatomic_cmpxchg   s    
’r   c                 C   s6   d}t  t  ” t  t  ” d”t  ” f”}t | ||”S )Nz#llvm.nvvm.atomic.load.add.f32.p0f32r   ©r   r   Z	FloatTyper
   r   r   ©r   r   r   r   r   r   Śdeclare_atomic_add_float32   s
    
’r   c                 C   sH   t  jjdkrd}nd}t t ” t t ” ”t ” f”}t | ||”S )N)é   r   z#llvm.nvvm.atomic.load.add.f64.p0f64Z___numba_atomic_double_add)	r   ZdeviceZcompute_capabilityr   r   Ś
DoubleTyper
   r   r   r   r   r   r   Śdeclare_atomic_add_float64!   s    
’r   c                 C   s4   d}t  t  ” t  t  ” ”t  ” f”}t | ||”S )NZ___numba_atomic_float_subr   r   r   r   r   Śdeclare_atomic_sub_float32+   s
    
’r    c                 C   s4   d}t  t  ” t  t  ” ”t  ” f”}t | ||”S )NZ___numba_atomic_double_sub©r   r   r   r
   r   r   r   r   r   r   Śdeclare_atomic_sub_float642   s
    
’r"   c                 C   s:   d}t  t  d”t  t  d””t  d”f”}t | ||”S )Nz"llvm.nvvm.atomic.load.inc.32.p0i32é    ©r   r   r	   r
   r   r   r   r   r   r   Śdeclare_atomic_inc_int329   s
    ’r%   c                 C   s:   d}t  t  d”t  t  d””t  d”f”}t | ||”S )NZ___numba_atomic_u64_incé@   r$   r   r   r   r   Śdeclare_atomic_inc_int64@   s
    ’r'   c                 C   s:   d}t  t  d”t  t  d””t  d”f”}t | ||”S )Nz"llvm.nvvm.atomic.load.dec.32.p0i32r#   r$   r   r   r   r   Śdeclare_atomic_dec_int32G   s
    ’r(   c                 C   s:   d}t  t  d”t  t  d””t  d”f”}t | ||”S )NZ___numba_atomic_u64_decr&   r$   r   r   r   r   Śdeclare_atomic_dec_int64N   s
    ’r)   c                 C   s4   d}t  t  ” t  t  ” ”t  ” f”}t | ||”S )NZ___numba_atomic_float_maxr   r   r   r   r   Śdeclare_atomic_max_float32U   s
    
’r*   c                 C   s4   d}t  t  ” t  t  ” ”t  ” f”}t | ||”S )NZ___numba_atomic_double_maxr!   r   r   r   r   Śdeclare_atomic_max_float64\   s
    
’r+   c                 C   s4   d}t  t  ” t  t  ” ”t  ” f”}t | ||”S )NZ___numba_atomic_float_minr   r   r   r   r   Śdeclare_atomic_min_float32c   s
    
’r,   c                 C   s4   d}t  t  ” t  t  ” ”t  ” f”}t | ||”S )NZ___numba_atomic_double_minr!   r   r   r   r   Śdeclare_atomic_min_float64j   s
    
’r-   c                 C   s4   d}t  t  ” t  t  ” ”t  ” f”}t | ||”S )NZ___numba_atomic_float_nanmaxr   r   r   r   r   Śdeclare_atomic_nanmax_float32q   s
    
’r.   c                 C   s4   d}t  t  ” t  t  ” ”t  ” f”}t | ||”S )NZ___numba_atomic_double_nanmaxr!   r   r   r   r   Śdeclare_atomic_nanmax_float64x   s
    
’r/   c                 C   s4   d}t  t  ” t  t  ” ”t  ” f”}t | ||”S )NZ___numba_atomic_float_nanminr   r   r   r   r   Śdeclare_atomic_nanmin_float32   s
    
’r0   c                 C   s4   d}t  t  ” t  t  ” ”t  ” f”}t | ||”S )NZ___numba_atomic_double_nanminr!   r   r   r   r   Śdeclare_atomic_nanmin_float64   s
    
’r1   c                 C   s,   d}t  t  d”t  d”f”}t | ||”S )NZcudaCGGetIntrinsicHandler&   r#   ©r   r   r	   r   r   r   r   r   r   Ś declare_cudaCGGetIntrinsicHandle   s
    
’r3   c                 C   s4   d}t  t  d”t  d”t  d”f”}t | ||”S )NZcudaCGSynchronizer#   r&   r2   r   r   r   r   Śdeclare_cudaCGSynchronize   s
    ’r4   c                 C   s`   | j jj}t | d”d ”}tj||jdtj	d}d|_
d|_||_|  |t t d””d”S )	Nzutf-8ó    Ś_str)ŚnameZ	addrspaceZinternalTé   Zgeneric)Zbasic_blockŚfunctionŚmoduler   Zmake_bytearrayŚencodeZadd_global_variableŚtyper   ZADDRSPACE_CONSTANTŚlinkageZglobal_constantZinitializerZaddrspacecastr   r
   r	   )r   Śvaluer   ŚcvalŚglr   r   r   Śdeclare_string   s    
’rA   c                 C   s8   t  t  d””}t  t  d”||g”}t | |d”}|S )Nr8   r#   Śvprintf)r   r
   r	   r   r   r   )r   Z	voidptrtyZ	vprintftyrB   r   r   r   Śdeclare_vprint§   s    rC   zllvm.nvvm.read.ptx.sreg.tid.xzllvm.nvvm.read.ptx.sreg.tid.yzllvm.nvvm.read.ptx.sreg.tid.zzllvm.nvvm.read.ptx.sreg.ntid.xzllvm.nvvm.read.ptx.sreg.ntid.yzllvm.nvvm.read.ptx.sreg.ntid.zzllvm.nvvm.read.ptx.sreg.ctaid.xzllvm.nvvm.read.ptx.sreg.ctaid.yzllvm.nvvm.read.ptx.sreg.ctaid.zz llvm.nvvm.read.ptx.sreg.nctaid.xz llvm.nvvm.read.ptx.sreg.nctaid.yz llvm.nvvm.read.ptx.sreg.nctaid.zz llvm.nvvm.read.ptx.sreg.warpsizezllvm.nvvm.read.ptx.sreg.laneid)ztid.xztid.yztid.zzntid.xzntid.yzntid.zzctaid.xzctaid.yzctaid.zznctaid.xznctaid.yznctaid.zZwarpsizeZlaneidc                 C   s6   | j }t t d”d”}t ||t| ”}|  |d”S )Nr#   r   )r:   r   r   r	   r   r   ŚSREG_MAPPINGr   )r   r7   r:   r   Śfnr   r   r   Ś	call_sregČ   s    rF   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )ŚSRegBuilderc                 C   s
   || _ d S ©N)r   )Śselfr   r   r   r   Ś__init__Š   s    zSRegBuilder.__init__c                 C   s   t | jd| S )Nztid.%s©rF   r   ©rI   Śxyzr   r   r   ŚtidÓ   s    zSRegBuilder.tidc                 C   s   t | jd| S )Nzctaid.%srK   rL   r   r   r   ŚctaidÖ   s    zSRegBuilder.ctaidc                 C   s   t | jd| S )Nzntid.%srK   rL   r   r   r   ŚntidŁ   s    zSRegBuilder.ntidc                 C   s   t | jd| S )Nz	nctaid.%srK   rL   r   r   r   ŚnctaidÜ   s    zSRegBuilder.nctaidc                 C   s:   |   |”}|  |”}|  |”}| j | j ||”|”}|S rH   )rN   rP   rO   r   ŚaddŚmul)rI   rM   rN   rP   rQ   Śresr   r   r   Śgetdimß   s
    


zSRegBuilder.getdimN)	Ś__name__Ś
__module__Ś__qualname__rJ   rN   rO   rP   rQ   rU   r   r   r   r   rG   Ļ   s   rG   c                    sD   t |   fdddD }tt |d |”}|dkr<|d S |S d S )Nc                 3   s   | ]}   |”V  qd S rH   )rU   )Ś.0rM   ©Zsregr   r   Ś	<genexpr>é   s     z get_global_id.<locals>.<genexpr>rM   r   r   )rG   ŚlistŚ	itertoolsŚislice)r   ŚdimŚitŚseqr   rZ   r   Śget_global_idē   s    rb   )$r]   Zllvmliter   Z
numba.corer   Zcudadrvr   Śapir   r   r   r   r   r    r"   r%   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r3   r4   rA   rC   rD   rF   ŚobjectrG   rb   r   r   r   r   Ś<module>   sX   		
ī