o
    ۾i                     @   s~   d dl mZ d dlmZmZmZ d dlmZmZ d dl	m
Z
 d dlmZ d dlmZ dZdd	d	g dd
d	d	fddZdd ZdS )    )warn)typesconfigsigutils)DeprecationErrorNumbaInvalidConfigWarning)declare_device_function)CUDADispatcherFakeCUDAKernelz`Deprecated keyword argument `{0}`. Signatures should be passed as the first positional argument.NFTc                    s  r	t jr	tddrtdddur"td}	t|	ddur2td}	t|	ddurBtd}	t|	du rIt jndd	d
g rcrcd}	tt	|	 rorod}	tt	|	 rzdrzt
dt| r| g	d
nt| tr| 	d	
nd		durt jrfdd}
|
S  	
fdd}|S | du rt jrÇfdd}|S  fdd}|S t jrt| dS  }|d< |d< |d< |d< |d< |d< |d
< t| |d} r|  |S )a  
    JIT compile a Python function for CUDA GPUs.

    :param func_or_sig: A function to JIT compile, or *signatures* of a
       function to compile. If a function is supplied, then a
       :class:`Dispatcher <numba.cuda.dispatcher.CUDADispatcher>` is returned.
       Otherwise, ``func_or_sig`` may be a signature or a list of signatures,
       and a function is returned. The returned function accepts another
       function, which it will compile and then return a :class:`Dispatcher
       <numba.cuda.dispatcher.CUDADispatcher>`. See :ref:`jit-decorator` for
       more information about passing signatures.

       .. note:: A kernel cannot have any return value.
    :param device: Indicates whether this is a device function.
    :type device: bool
    :param link: A list of files containing PTX or CUDA C/C++ source to link
       with the function
    :type link: list
    :param debug: If True, check for exceptions thrown when executing the
       kernel. Since this degrades performance, this should only be used for
       debugging purposes. If set to True, then ``opt`` should be set to False.
       Defaults to False.  (The default value can be overridden by setting
       environment variable ``NUMBA_CUDA_DEBUGINFO=1``.)
    :param fastmath: When True, enables fastmath optimizations as outlined in
       the :ref:`CUDA Fast Math documentation <cuda-fast-math>`.
    :param max_registers: Request that the kernel is limited to using at most
       this number of registers per thread. The limit may not be respected if
       the ABI requires a greater number of registers than that requested.
       Useful for increasing occupancy.
    :param opt: Whether to compile from LLVM IR to PTX with optimization
                enabled. When ``True``, ``-opt=3`` is passed to NVVM. When
                ``False``, ``-opt=0`` is passed to NVVM. Defaults to ``True``.
    :type opt: bool
    :param lineinfo: If True, generate a line mapping between source code and
       assembly code. This enables inspection of the source code in NVIDIA
       profiling tools and correlation with program counter sampling.
    :type lineinfo: bool
    :param cache: If True, enables the file-based cache for this function.
    :type cache: bool
    z Cannot link PTX in the simulatorboundscheckz)bounds checking is not supported for CUDAargtypesNrestypebindfastmathF
extensionsz{debug=True with opt=True (the default) is not supported by CUDA. This may result in a crash - set debug=False or opt=False.zdebug and lineinfo are mutually exclusive. Use debug to get full debug info (this disables some optimizations), or lineinfo for line info only with code generation unaffected.linkz(link keyword invalid for device functionTc                       t |  dS Ndevicer   r
   funcr    I/home/ubuntu/.local/lib/python3.10/site-packages/numba/cuda/decorators.py
jitwrapperg   s   zjit.<locals>.jitwrapperc              	      s     }|d< |d< |d< |d< |d< |d< |d< t| |d} r,|  	D ]?}t|\}}|rDsD|tjkrDtd	rhd
dlm	} |
| ||| W d    n1 sbw   Y  q.|| q.
|_|  |S )Ndebuglineinfor   optr   r   r   targetoptionsz'CUDA kernel must have void return type.r   )	typeinfer)copyr	   enable_cachingr   normalize_signaturer   void	TypeError
numba.corer!   register_dispatchercompile_devicecompile_specializeddisable_compile)r   r    dispsigr   r   r!   cacher   r   r   r   kwsr   r   r   
signaturesspecializedr   r   _jitk   s2   zjit.<locals>._jitc                    r   r   r
   r   r   r   r   autojitwrapper   s   zjit.<locals>.autojitwrapperc              	      s   t | f dS )N)r   r   r   r   r   r0   )jitr   )r0   r   r   r1   r   r   r   r   r   r5      s
   r   r   r   r   r   r   )r   ENABLE_CUDASIMNotImplementedErrorget_msg_deprecated_signature_argformatr   CUDA_DEBUGINFO_DEFAULTr   r   
ValueErrorr   is_signature
isinstancelistr   r"   r	   r#   )func_or_sigr   inliner   r   r   r   r0   r1   msgr   r4   r5   r    r-   r   r/   r   r6      sv   
+





 !r6   c                 C   s.   t |\}}|du rd}t|t| ||S )a  
    Declare the signature of a foreign function. Returns a descriptor that can
    be used to call the function from a Python kernel.

    :param name: The name of the foreign function.
    :type name: str
    :param sig: The Numba signature of the function.
    Nz4Return type must be provided for device declarations)r   r$   r&   r   )namer.   r   r   rC   r   r   r   declare_device   s
   	rE   )warningsr   r'   r   r   r   numba.core.errorsr   r   numba.cuda.compilerr   numba.cuda.dispatcherr	   numba.cuda.simulator.kernelr   r:   r6   rE   r   r   r   r   <module>   s    

 "