§
    1@Äjä*  ã                   ó(  — d dl mZ d dlZd dlZd dlZd dl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 G d„ d¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Z G d„ dej        ¦  «        Z G d„ de¦  «        ZdS )é    )ÚcontextmanagerNé   )ÚFakeCUDAArrayÚFakeWithinKernelCUDAArray)ÚDim3ÚFakeCUDAModuleÚswapped_cuda_moduleé   )Únormalize_kernel_dimensions)Úwrap_argÚArgHintc              #   óL   K  — t           �
J d¦   «         ‚| a 	 dV — da dS # da w xY w)z*
    Push the current kernel context.
    Nz)concurrent simulated kernel not supported©Ú_kernel_context)Úmods    úLC:\Projects\Historical\venv\Lib\site-packages\numba/cuda/simulator/kernel.pyÚ_push_kernel_contextr      sJ   è è € õ Ð"Ð"Ð$OÑ"Ô"Ð"Ø€OðØˆˆˆàˆˆˆø˜$ˆÐÐÐÐs   — Ÿ#c                  ó   — t           S )zT
    Get the current kernel context. This is usually done by a device function.
    r   © ó    r   Ú_get_kernel_contextr   $   s
   € õ Ðr   c                   ó   — e Zd ZdZd„ ZdS )ÚFakeOverloadzE
    Used only to provide the max_cooperative_grid_blocks method
    c                 ó   — dS )Nr   r   )ÚselfÚblockdims     r   Úmax_cooperative_grid_blocksz(FakeOverload.max_cooperative_grid_blocks/   s	   € ð ˆqr   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   +   s-   € € € € € ðð ðð ð ð ð r   r   c                   ó   — e Zd Zd„ ZdS )ÚFakeOverloadDictc                 ó   — t          ¦   «         S ©N)r   )r   Úkeys     r   Ú__getitem__zFakeOverloadDict.__getitem__6   s   € õ ‰~Œ~Ðr   N)r   r   r    r'   r   r   r   r#   r#   5   s#   € € € € € ðð ð ð ð r   r#   c                   óh   — e Zd ZdZ	 dd„Zd„ Zd„ Zd„ Zd„ Zdd
„Z	e
d„ ¦   «         Ze
d„ ¦   «         ZdS )ÚFakeCUDAKernelz(
    Wraps a @cuda.jit-ed function.
    FNc                 óÐ   — |€g }|| _         || _        || _        || _        t	          |¦  «        | _        d | _        d | _        d| _        d| _	        t          j        | |¦  «         d S )Nr   )ÚfnÚ_deviceÚ	_fastmathÚ_debugÚlistÚ
extensionsÚgrid_dimÚ	block_dimÚstreamÚdynshared_sizeÚ	functoolsÚupdate_wrapper)r   r+   ÚdeviceÚfastmathr0   Údebugs         r   Ú__init__zFakeCUDAKernel.__init__A   sr   € ð ÐØˆJØˆŒØˆŒØ!ˆŒØˆŒÝ˜zÑ*Ô*ˆŒð ˆŒØˆŒØˆŒØˆÔÝÔ   rÑ*Ô*Ð*Ð*Ð*r   c           	      ót  ‡ ‡	‡
— ‰ j         rCt          ‰ j        t          ¦   «         ¦  «        5   ‰ j        |Ž cd d d ¦  «         S # 1 swxY w Y   t	          ‰ j        ‰ j        ¦  «        \  }}t          ||‰ j        ¦  «        }t          |¦  «        5  g Š
ˆ
ˆ fd„Š	ˆ	fd„|D ¦   «         }t          ‰ j        |¦  «        5  t          j        |Ž D ],}t          ‰ j        ||‰ j        ¦  «        } |j        |g|¢R Ž  Œ-	 d d d ¦  «         n# 1 swxY w Y   ‰
D ]} |¦   «          Œ	 d d d ¦  «         d S # 1 swxY w Y   d S )Nc                 óÔ  •— t          j        ˆfd„‰j        d | f¦  «        \  }} t          | t          j        ¦  «        r.| j        dk    r#t          | ¦  «                             ‰¦  «        }nWt          | t          ¦  «        r|                      ‰¦  «        }n,t          | t          j
        ¦  «        rt          | ¦  «        }n| }t          |t          ¦  «        rt          |¦  «        S |S )Nc                 ó    •—  |j         | d‰dœŽS )Nr   )r3   Úretr)Úprepare_args)Úty_valÚ	extensionr>   s     €r   ú<lambda>z;FakeCUDAKernel.__call__.<locals>.fake_arg.<locals>.<lambda>f   s%   ø€ Ð.D¨iÔ.DØØ Ø!ð/#ð /#ð /#€ r   r   )r5   Úreducer0   Ú
isinstanceÚnpÚndarrayÚndimr   Ú	to_devicer   Úvoidr   r   )ÚargÚ_Úretr>   r   s      €€r   Úfake_argz)FakeCUDAKernel.__call__.<locals>.fake_argc   sè   ø€ å"Ô)ð#ð #ð #ð #ð ”OØ˜3�Kñô ‘��3õ ˜c¥2¤:Ñ.Ô.ð °3´8¸a²<°<Ý" 3™-œ-×1Ò1°$Ñ7Ô7�C�CÝ ¥WÑ-Ô-ð ØŸ-š-¨Ñ-Ô-�C�CÝ ¥R¤WÑ-Ô-ð Ý'¨Ñ,Ô,�C�Cà�CÝ˜c¥=Ñ1Ô1ð :Ý4°SÑ9Ô9Ð9Ø�
r   c                 ó&   •— g | ]} ‰|¦  «        ‘ŒS r   r   )Ú.0rJ   rM   s     €r   ú
<listcomp>z+FakeCUDAKernel.__call__.<locals>.<listcomp>z   s!   ø€ Ð7Ð7Ð7¨3˜˜ #™œÐ7Ð7Ð7r   )r,   r	   r+   r   r   r1   r2   r   r4   r   rE   ÚndindexÚBlockManagerr.   Úrun)r   Úargsr1   r2   Úfake_cuda_moduleÚ	fake_argsÚ
grid_pointÚbmÚwbrM   r>   s   `        @@r   Ú__call__zFakeCUDAKernel.__call__S   sX  øøø€ ØŒ<ð 	&Ý$ T¤WÕ.AÑ.CÔ.CÑDÔDð &ð &Ø�t”w �~ð&ð &ð &ð &ñ &ô &ð &ð &ð &ð &ð &ð &øøøð &ð &ð &ð &õ :¸$¼-Ø:>¼.ñJô JÑˆ�)õ *¨(°IØ*.Ô*=ñ?ô ?Ðå!Ð"2Ñ3Ô3ð $	ð $	ð ˆDðð ð ð ð ð ð. 8Ð7Ð7Ð7°$Ð7Ñ7Ô7ˆIÝ$ T¤WÐ.>Ñ?Ô?ð 3ð 3å"$¤*¨hÐ"7ð 3ð 3�JÝ% d¤g¨x¸ÀDÄKÑPÔP�BØ�B”F˜:Ð2¨	Ð2Ð2Ð2Ð2Ð2ð3ð3ð 3ð 3ñ 3ô 3ð 3ð 3ð 3ð 3ð 3ð 3øøøð 3ð 3ð 3ð 3ð ð ð �Ø�‘”��ððG$	ð $	ð $	ñ $	ô $	ð $	ð $	ð $	ð $	ð $	ð $	ð $	øøøð $	ð $	ð $	ð $	ð $	ð $	sG   ¬
AÁAÁ
AÂ,D-Â<<DÃ9D-ÄD		Ä	D-ÄD		ÄD-Ä-D1Ä4D1c                 ó‚   — t          |d d…         Ž \  | _        | _        t          |¦  «        dk    r|d         | _        | S )Nr
   é   é   )r   r1   r2   Úlenr4   )r   Úconfigurations     r   r'   zFakeCUDAKernel.__getitem__„   sG   € å'¨°r¸°rÔ):Ð;ñ 	&ˆŒ�t”~õ ˆ}ÑÔ Ò"Ð"Ø"/°Ô"2ˆDÔàˆr   c                 ó   — d S r%   r   ©r   s    r   ÚbindzFakeCUDAKernel.bind�   s   € Øˆr   c                 ó   — | S r%   r   )r   rT   s     r   Ú
specializezFakeCUDAKernel.specialize�   s   € Øˆr   r   c                 óJ   — |dk     rt          d|z  ¦  «        ‚| |d||f         S )Nr   z0Can't create ForAll with negative task count: %sr   )Ú
ValueError)r   ÚntasksÚtpbr3   Ú	sharedmems        r   ÚforallzFakeCUDAKernel.forall“   s<   € Ø�AŠ:ˆ:ÝÐOØ%ñ&ñ 'ô 'ð 'à�F˜A˜v yÐ0Ô1Ð1r   c                 ó   — t          ¦   «         S r%   )r#   ra   s    r   Ú	overloadszFakeCUDAKernel.overloads™   s   € åÑ!Ô!Ð!r   c                 ó   — | j         S r%   )r+   ra   s    r   Úpy_funczFakeCUDAKernel.py_func�   s	   € àŒwˆr   )FNF)r   r   r   )r   r   r    r!   r:   rZ   r'   rb   rd   rj   Úpropertyrl   rn   r   r   r   r)   r)   <   sÀ   € € € € € ðð ð
 BGð+ð +ð +ð +ð$/ð /ð /ðbð ð ðð ð ðð ð ð2ð 2ð 2ð 2ð ð"ð "ñ „Xð"ð ðð ñ „Xðð ð r   r)   c                   óJ   ‡ — e Zd ZdZˆ fd„Zˆ fd„Zd„ Zd„ Zd„ Zd„ Z	d„ Z
ˆ xZS )	ÚBlockThreadzG
    Manages the execution of a function for a single CUDA thread.
    c                 óÌ  •‡— |rˆfd„}|}n‰}t          t          | ¦  «                             |¬¦  «         t          j        ¦   «         | _        d| _        || _        t          |Ž | _	        t          |Ž | _
        d | _        d| _        d| _        || _        t          | j        j        Ž }| j
        j        |j        | j
        j        |j        | j
        j        z  z   z  z   | _        d S )Nc                  óB   •— t          j        d¬¦  «          ‰| i |¤Ž d S )NÚraise)Údivide)rE   Úseterr)rT   ÚkwargsÚfs     €r   Údebug_wrapperz+BlockThread.__init__.<locals>.debug_wrapperª   s1   ø€ Ý”	 Ð)Ñ)Ô)Ð)Ø��4Ð"˜6Ð"Ð"Ð"Ð"Ð"r   )ÚtargetFT)Úsuperrq   r:   Ú	threadingÚEventÚsyncthreads_eventÚsyncthreads_blockedÚ_managerr   ÚblockIdxÚ	threadIdxÚ	exceptionÚdaemonÚabortr9   Ú
_block_dimÚxÚyÚzÚ	thread_id)
r   rx   Úmanagerr�   r‚   r9   ry   rz   ÚblockDimÚ	__class__s
    `       €r   r:   zBlockThread.__init__¨   sõ   øø€ Øð 	ð#ð #ð #ð #ð #ð #ˆFˆFàˆFå�k˜4Ñ Ô ×)Ò)°Ð)Ñ8Ô8Ð8Ý!*¤Ñ!2Ô!2ˆÔØ#(ˆÔ ØˆŒÝ˜h˜ˆŒÝ˜yÐ)ˆŒØˆŒØˆŒØˆŒ
ØˆŒ
Ý˜œÔ1Ð2ˆØœÔ)¨X¬Z¸4¼>Ô;KØ;C¼:Ø;?¼>Ô;Kñ<Lñ<Lñ .Mñ NˆŒˆˆr   c                 óž  •— 	 t          t          | ¦  «                             ¦   «          d S # t          $ r–}dt	          | j        ¦  «        z  }dt	          | j        ¦  «        z  }t          |¦  «        dk    r|›d|›�}n
|›d|›d|›�}t          j	        ¦   «         d         } t          |¦  «        |¦  «        |f| _        Y d }~d S d }~ww xY w)Nztid=%szctaid=%sÚ ú z: r
   )r{   rq   rS   Ú	Exceptionr/   r‚   r�   ÚstrÚsysÚexc_infoÚtyperƒ   )r   ÚeÚtidÚctaidÚmsgÚtbr�   s         €r   rS   zBlockThread.runÀ   sà   ø€ ð	0Ý•+˜tÑ$Ô$×(Ò(Ñ*Ô*Ð*Ð*Ð*øÝð 
	0ð 
	0ð 
	0Ø�T $¤.Ñ1Ô1Ñ1ˆCØ¥ d¤mÑ!4Ô!4Ñ4ˆEÝ�1‰vŒv˜Š|ˆ|Ø!$   e eÐ,��à%( S S¨%¨%¨%°°Ð3�Ý”‘” Ô"ˆBð &�d 1™gœg c™lœl¨BÐ/ˆDŒNˆNˆNˆNˆNˆNˆNøøøøð
	0øøøs   ƒ', ¬
C¶BCÃCc                 óÐ   — | j         rt          d¦  «        ‚d| _        | j                             ¦   «          | j                             ¦   «          | j         rt          d¦  «        ‚d S )Nz"abort flag set on syncthreads callTz#abort flag set on syncthreads clear)r…   ÚRuntimeErrorr   r~   ÚwaitÚclearra   s    r   ÚsyncthreadszBlockThread.syncthreadsÏ   st   € àŒ:ð 	EÝÐCÑDÔDÐDà#'ˆÔ ØÔ×#Ò#Ñ%Ô%Ð%ØÔ×$Ò$Ñ&Ô&Ð&àŒ:ð 	FÝÐDÑEÔEÐEð	Fð 	Fr   c                 óö   — | j         j        | j         j        | j         j        f}|| j        j        |<   |                      ¦   «          t          j        | j        j        ¦  «        }|                      ¦   «          |S r%   )	r‚   r‡   rˆ   r‰   r€   Úblock_staterŸ   rE   Úcount_nonzero)r   ÚvalueÚidxÚcounts       r   Úsyncthreads_countzBlockThread.syncthreads_countÛ   sj   € ØŒnÔ ¤Ô 0°$´.Ô2BÐBˆØ).ˆŒÔ! #Ñ&Ø×ÒÑÔÐÝÔ  ¤Ô!:Ñ;Ô;ˆØ×ÒÑÔÐØˆr   c                 óþ   — | j         j        | j         j        | j         j        f}|| j        j        |<   |                      ¦   «          t          j        | j        j        ¦  «        }|                      ¦   «          |rdndS ©Nr   r   )	r‚   r‡   rˆ   r‰   r€   r¡   rŸ   rE   Úall©r   r£   r¤   Útests       r   Úsyncthreads_andzBlockThread.syncthreads_andã   ós   € ØŒnÔ ¤Ô 0°$´.Ô2BÐBˆØ).ˆŒÔ! #Ñ&Ø×ÒÑÔÐÝŒv�d”mÔ/Ñ0Ô0ˆØ×ÒÑÔÐØÐˆqˆq˜aÐr   c                 óþ   — | j         j        | j         j        | j         j        f}|| j        j        |<   |                      ¦   «          t          j        | j        j        ¦  «        }|                      ¦   «          |rdndS r¨   )	r‚   r‡   rˆ   r‰   r€   r¡   rŸ   rE   Úanyrª   s       r   Úsyncthreads_orzBlockThread.syncthreads_orë   r­   r   c                 ó(   — d| j         ›d| j        ›d�S )Nz
Thread <<<z, z>>>)r�   r‚   ra   s    r   Ú__str__zBlockThread.__str__ó   s   € € Ø(,¬¨¨°t´~°~°~ÐFÐFr   )r   r   r    r!   r:   rS   rŸ   r¦   r¬   r°   r²   Ú__classcell__)r�   s   @r   rq   rq   ¤   sµ   ø€ € € € € ðð ðNð Nð Nð Nð Nð00ð 0ð 0ð 0ð 0ð
Fð 
Fð 
Fðð ð ð ð  ð  ð ð  ð  ðGð Gð Gð Gð Gð Gð Gr   rq   c                   ó   — e Zd ZdZd„ Zd„ ZdS )rR   aç  
    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                 óˆ   — || _         || _        || _        || _        t	          j        |t          j        ¬¦  «        | _        d S )N)Údtype)Ú	_grid_dimr†   Ú_fr.   rE   ÚzerosÚbool_r¡   )r   rx   r1   r2   r9   s        r   r:   zBlockManager.__init__	  s=   € Ø!ˆŒØ#ˆŒØˆŒØˆŒÝœ8 IµR´XÐ>Ñ>Ô>ˆÔÐÐr   c                 ó\  ‡ ‡— t          ¦   «         }t          ¦   «         }t          ¦   «         }t          j        ‰ j        Ž D ]^}ˆˆ fd„}t	          |‰ ||‰ j        ¦  «        }|                     ¦   «          |                     |¦  «         |                     |¦  «         Œ_|rÔ|D ]}}|j        r|                     |¦  «         Œ|j	        rW|D ])}	d|	_
        d|	_        |	j                              ¦   «          Œ*|j	        d                              |j	        d         ¦  «        ‚Œ~||k    r3|D ]"}d|_        |j                              ¦   «          Œ#t          ¦   «         }t          d„ |D ¦   «         ¦  «        }|°Ô|D ]4}|j	        r+|j	        d                              |j	        d         ¦  «        ‚Œ5d S )Nc                  ó   •—  ‰j         ‰ Ž  d S r%   )r¸   )rT   r   s   €€r   rz   z BlockManager.run.<locals>.target  s   ø€ Ø�”˜����r   TFr   r   c                 ó:   — g | ]}|                      ¦   «         ¯|‘ŒS r   )Úis_alive)rO   Úts     r   rP   z$BlockManager.run.<locals>.<listcomp>3  s%   € ÐHÐHÐH a¸!¿*º*¹,¼,ÐH ÐHÐHÐHr   )ÚsetrE   rQ   r†   rq   r.   ÚstartÚaddr   rƒ   r…   r~   Úwith_traceback)
r   rW   rT   ÚthreadsÚlivethreadsÚblockedthreadsÚblock_pointrz   r¿   Út_others
   ` `       r   rS   zBlockManager.run  s  øø€ å‘%”%ˆÝ‘e”eˆÝ™œˆÝœ: t¤Ð7ð 	ð 	ˆKðð ð ð ð ð å˜F D¨*°kÀ4Ä;ÑOÔOˆAØ�GŠG‰IŒIˆIØ�KŠK˜‰NŒNˆNØ�OŠO˜AÑÔÐÐð
 ð 	JØ ð Hð H�ØÔ(ð HØ"×&Ò& qÑ)Ô)Ð)Ð)Ø”[ð 	Hð $+ð 8ð 8˜Ø(,˜œØ6;˜Ô3ØÔ1×5Ò5Ñ7Ô7Ð7Ð7àœ+ aœ.×7Ò7¸¼ÀA¼ÑGÔGÐGð	Hð ˜nÒ,Ð,Ø'ð .ð .�AØ,1�AÔ)ØÔ'×+Ò+Ñ-Ô-Ð-Ð-Ý!$¡¤�ÝÐHÐH¨;ÐHÑHÔHÑIÔIˆKð' ð 	Jð, ð 	Dð 	DˆAØŒ{ð DØ”k !”n×3Ò3°A´KÀ´NÑCÔCÐCðDð	Dð 	Dr   N)r   r   r    r!   r:   rS   r   r   r   rR   rR   ÷   sA   € € € € € ðð ð"?ð ?ð ?ð(Dð (Dð (Dð (Dð (Dr   rR   )Ú
contextlibr   r5   r“   r|   ÚnumpyrE   Úcudadrv.devicearrayr   r   Ú	kernelapir   r   r	   Úerrorsr   rT   r   r   r   r   r   r   Údictr#   Úobjectr)   ÚThreadrq   rR   r   r   r   ú<module>rÑ      så  ðØ %Ð %Ð %Ð %Ð %Ð %Ø Ð Ð Ð Ø 
€
€
€
Ø Ð Ð Ð à Ð Ð Ð à IÐ IÐ IÐ IÐ IÐ IÐ IÐ IØ @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø $Ð $Ð $Ð $Ð $Ð $Ð $Ð $ðð
 €ð ð
ð 
ñ „ð
ðð ð ðð ð ð ð ñ ô ð ðð ð ð ð �tñ ô ð ðcð cð cð cð c�Vñ cô cð cðPPGð PGð PGð PGð PG�)Ô"ñ PGô PGð PGðfADð ADð ADð ADð AD�6ñ ADô ADð ADð ADð ADr   