ó
Û³Y]c           @  s#  d  d l  m Z d  d l m 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 m Z d d l m Z m Z m Z d	 d
 l m Z d	 d l m Z m Z d a e d „  ƒ Z d „  Z d e f d „  ƒ  YZ d e j f d „  ƒ  YZ d e f d „  ƒ  YZ  d S(   iÿÿÿÿ(   t   print_function(   t   contextmanagerN(   t   six(   t   reraisei   (   t	   to_devicet   auto_device(   t   Dim3t   FakeCUDAModulet   swapped_cuda_modulei   (   t   normalize_kernel_dimensions(   t   wrap_argt   ArgHintc         c  s5   t  d k s t d ƒ ‚ |  a  z	 d VWd d a  Xd S(   s*   
    Push the current kernel context.
    s'   conrrent simulated kernel not supportedN(   t   _kernel_contextt   Nonet   AssertionError(   t   mod(    (    s:   lib/python2.7/site-packages/numba/cuda/simulator/kernel.pyt   _push_kernel_context   s
    	c           C  s   t  S(   sT   
    Get the current kernel context. This is usually done by a device function.
    (   R   (    (    (    s:   lib/python2.7/site-packages/numba/cuda/simulator/kernel.pyt   _get_kernel_context'   s    t   FakeCUDAKernelc           B  sb   e  Z d  Z e g  d „ Z d „  Z d „  Z d „  Z d „  Z d d d d „ Z	 e
 d „  ƒ Z RS(	   s(   
    Wraps a @cuda.jit-ed function.
    c         C  s6   | |  _  | |  _ | |  _ t | ƒ |  _ |  d d  S(   Ni   i    (   i   i   i    i    (   t   fnt   _devicet	   _fastmatht   listt
   extensions(   t   selfR   t   devicet   fastmathR   (    (    s:   lib/python2.7/site-packages/numba/cuda/simulator/kernel.pyt   __init__3   s
    			c   	        s  ˆ j  r5 t ˆ j t ƒ  ƒ  ˆ j | Œ  SWd  QXn  t ˆ j ˆ j ˆ j ƒ } t | ƒ µ g  ‰  ‡  ‡ f d †  } g  | D] } | | ƒ ^ q| } t ˆ j | ƒ M xE t	 j
 ˆ j Œ  D]1 } t ˆ j ˆ j ˆ j ƒ } | j | | Œ qº WWd  QXx ˆ  D] } | ƒ  qü WWd  QXd  S(   Nc           sˆ   t  j j ‡  f d †  ˆ j d  |  f ƒ \ } }  t |  t j ƒ rd |  j d k rd t	 |  ƒ j
 ˆ  ƒ St |  t ƒ r€ |  j
 ˆ  ƒ S|  Sd  S(   Nc           s   | j  d d d ˆ  |  Œ S(   Nt   streami    t   retr(   t   prepare_args(   t   ty_valt	   extension(   R   (    s:   lib/python2.7/site-packages/numba/cuda/simulator/kernel.pyt   <lambda>K   s   	i    (   R   t   movest   reduceR   R   t
   isinstancet   npt   ndarrayt   ndimR
   R   R   (   t   argt   _(   R   R   (    s:   lib/python2.7/site-packages/numba/cuda/simulator/kernel.pyt   fake_argH   s    	!(   R   R   R   R   R   t   grid_dimt	   block_dimt   dynshared_sizeR   R%   t   ndindext   BlockManagert   run(	   R   t   argst   fake_cuda_moduleR*   R(   t	   fake_argst
   grid_pointt   bmt   wb(    (   R   R   s:   lib/python2.7/site-packages/numba/cuda/simulator/kernel.pyt   __call__<   s    	c         C  sB   t  | d  Œ  \ |  _ |  _ t | ƒ d k r> | d |  _ n  |  S(   Ni   i   i   (   R	   R+   R,   t   lenR-   (   R   t   configuration(    (    s:   lib/python2.7/site-packages/numba/cuda/simulator/kernel.pyt   __getitem__e   s    c         C  s   d  S(   N(    (   R   (    (    s:   lib/python2.7/site-packages/numba/cuda/simulator/kernel.pyt   bindn   s    c         G  s   |  S(   N(    (   R   R1   (    (    s:   lib/python2.7/site-packages/numba/cuda/simulator/kernel.pyt
   specializer   s    i    c         C  s   |  | d | | f S(   Ni   (    (   R   t   ntaskst   tpbR   t	   sharedmem(    (    s:   lib/python2.7/site-packages/numba/cuda/simulator/kernel.pyt   forallu   s    c         C  s*   d } | d 7} |  j  r& | d 7} n  | S(   sl   
        Required in order to proceed through some tests, but serves no functional
        purpose.
        s   .consts   
.locals   
div.full.ftz.f32(   R   (   R   t   res(    (    s:   lib/python2.7/site-packages/numba/cuda/simulator/kernel.pyt   ptxx   s
    
	(   t   __name__t
   __module__t   __doc__t   FalseR   R7   R:   R;   R<   R@   t   propertyRB   (    (    (    s:   lib/python2.7/site-packages/numba/cuda/simulator/kernel.pyR   .   s   		)				t   BlockThreadc           B  sM   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 RS(   sG   
    Manages the execution of a function for a single CUDA thread.
    c         C  sº   t  t |  ƒ j d | ƒ t j ƒ  |  _ t |  _ | |  _ t	 | Œ  |  _
 t	 | Œ  |  _ d  |  _ t |  _ t |  _ t	 |  j j Œ  } |  j j | j |  j j | j |  j j |  _ d  S(   Nt   target(   t   superRH   R   t	   threadingt   Eventt   syncthreads_eventRF   t   syncthreads_blockedt   _managerR   t   blockIdxt	   threadIdxR   t	   exceptiont   Truet   daemont   abortt
   _block_dimt   xt   yt   zt	   thread_id(   R   t   ft   managerRP   RQ   t   blockDim(    (    s:   lib/python2.7/site-packages/numba/cuda/simulator/kernel.pyR   Ž   s    					c         C  sÃ   y t  t |  ƒ j ƒ  Wn¥ t k
 r¾ } d t |  j ƒ } d t |  j ƒ } t | ƒ d k rt d | | f } n d | | | f } t j	 ƒ  d } t
 | ƒ t
 | ƒ | ƒ | f |  _ n Xd  S(   Ns   tid=%ss   ctaid=%st    s   %s %ss	   %s %s: %si   (   RJ   RH   R0   t	   ExceptionR   RQ   RP   t   strt   syst   exc_infot   typeRR   (   R   t   et   tidt   ctaidt   msgt   tb(    (    s:   lib/python2.7/site-packages/numba/cuda/simulator/kernel.pyR0   ›   s    c         C  sW   |  j  r t d ƒ ‚ n  t |  _ |  j j ƒ  |  j j ƒ  |  j  rS t d ƒ ‚ n  d  S(   Ns"   abort flag set on syncthreads calls#   abort flag set on syncthreads clear(   RU   t   RuntimeErrorRS   RN   RM   t   waitt   clear(   R   (    (    s:   lib/python2.7/site-packages/numba/cuda/simulator/kernel.pyt   syncthreads¨   s    			c         C  sX   | |  j  j |  j j |  j j |  j j f <|  j ƒ  t j |  j  j ƒ } |  j ƒ  | S(   N(	   RO   t   block_stateRQ   RW   RX   RY   Rl   R%   t   count_nonzero(   R   t   valuet   count(    (    s:   lib/python2.7/site-packages/numba/cuda/simulator/kernel.pyt   syncthreads_count´   s
    +

c         C  sb   | |  j  j |  j j |  j j |  j j f <|  j ƒ  t j |  j  j ƒ } |  j ƒ  | r^ d Sd S(   Ni   i    (	   RO   Rm   RQ   RW   RX   RY   Rl   R%   t   all(   R   Ro   t   test(    (    s:   lib/python2.7/site-packages/numba/cuda/simulator/kernel.pyt   syncthreads_and»   s
    +

c         C  sb   | |  j  j |  j j |  j j |  j j f <|  j ƒ  t j |  j  j ƒ } |  j ƒ  | r^ d Sd S(   Ni   i    (	   RO   Rm   RQ   RW   RX   RY   Rl   R%   t   any(   R   Ro   Rs   (    (    s:   lib/python2.7/site-packages/numba/cuda/simulator/kernel.pyt   syncthreads_orÂ   s
    +

c         C  s   d |  j  |  j f S(   Ns   Thread <<<%s, %s>>>(   RP   RQ   (   R   (    (    s:   lib/python2.7/site-packages/numba/cuda/simulator/kernel.pyt   __str__É   s    (
   RC   RD   RE   R   R0   Rl   Rq   Rt   Rv   Rw   (    (    (    s:   lib/python2.7/site-packages/numba/cuda/simulator/kernel.pyRH   Š   s   						R/   c           B  s    e  Z d  Z d „  Z d „  Z RS(   sç  
    Manages the execution of a thread block.

    When run() is called, all threads are started. Each thread executes until it
    hits syncthreads(), at which point it sets its own syncthreads_blocked to
    True so that the BlockManager knows it is blocked. It then waits on its
    syncthreads_event.

    The BlockManager polls threads to determine if they are blocked in
    syncthreads(). If it finds a blocked thread, it adds it to the set of
    blocked threads. When all threads are blocked, it unblocks all the threads.
    The thread are unblocked by setting their syncthreads_blocked back to False
    and setting their syncthreads_event.

    The polling continues until no threads are alive, when execution is
    complete.
    c         C  s:   | |  _  | |  _ | |  _ t j | d t j ƒ|  _ d  S(   Nt   dtype(   t	   _grid_dimRV   t   _fR%   t   zerost   boolRm   (   R   R[   R+   R,   (    (    s:   lib/python2.7/site-packages/numba/cuda/simulator/kernel.pyR   ß   s    			c   
        s›  t  ƒ  } t  ƒ  } t  ƒ  } xe t j ˆ j Œ  D]Q } ‡  ‡ f d †  } t | ˆ | | ƒ } | j ƒ  | j | ƒ | j | ƒ q. Wxç | rlxp | D]h } | j r² | j | ƒ q“ | j r“ x- | D]% }	 t	 |	 _
 t |	 _ |	 j j  ƒ  qÂ Wt | j Œ  q“ q“ W| | k r>x$ | D] } t | _ | j j  ƒ  qWt  ƒ  } n  t  g  | D] } | j ƒ  rH| ^ qHƒ } q† Wx' | D] } | j rtt | j Œ  qtqtWd  S(   Nc             s   ˆ j  ˆ  Œ  d  S(   N(   Rz   (    (   R1   R   (    s:   lib/python2.7/site-packages/numba/cuda/simulator/kernel.pyRI   ë   s    (   t   setR%   R.   RV   RH   t   startt   addRN   RR   RS   RU   RF   RM   R   t   is_alive(
   R   R4   R1   t   threadst   livethreadst   blockedthreadst   block_pointRI   t   tt   t_other(    (   R1   R   s:   lib/python2.7/site-packages/numba/cuda/simulator/kernel.pyR0   å   s8    			
						/	(   RC   RD   RE   R   R0   (    (    (    s:   lib/python2.7/site-packages/numba/cuda/simulator/kernel.pyR/   Í   s   	(!   t
   __future__R    t
   contextlibR   Ra   RK   t   numpyR%   t   numbaR   t	   numba.sixR   t   cudadrv.devicearrayR   R   t	   kernelapiR   R   R   t   errorsR	   R1   R
   R   R   R   R   R   t   objectR   t   ThreadRH   R/   (    (    (    s:   lib/python2.7/site-packages/numba/cuda/simulator/kernel.pyt   <module>   s    	\C