Ë
    üÇ: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j6                  «      Z G d„ de«      Zy)é    )ÚcontextmanagerNé   )ÚFakeCUDAArrayÚFakeWithinKernelCUDAArray)ÚDim3ÚFakeCUDAModuleÚswapped_cuda_moduleé   )Únormalize_kernel_dimensions)Úwrap_argÚArgHintc              #   óF   K  — t         �J d«       ‚| a 	 d–— da y# da w xY w­w)z*
    Push the current kernel context.
    Nz)concurrent simulated kernel not supported©Ú_kernel_context)Úmods    úp/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/numba/cuda/simulator/kernel.pyÚ_push_kernel_contextr      s1   è ø€ ô Ð"ÐOÐ$OÓ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y)ÚFakeOverloadzE
    Used only to provide the max_cooperative_grid_blocks method
    c                  ó   — y)Nr   r   )ÚselfÚblockdims     r   Úmax_cooperative_grid_blocksz(FakeOverload.max_cooperative_grid_blocks/   s   € ð r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   +   s   „ ñór   r   c                   ó   — e Zd Zd„ Zy)Ú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                   óZ   — 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y)ÚFakeCUDAKernelz(
    Wraps a @cuda.jit-ed function.
    Nc                 óÈ   — |€g }|| _         || _        || _        || _        t	        |«      | _        d | _        d | _        d| _        d| _	        t        j                  | |«       y )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   sf   € ð ÐØˆJØˆŒØˆŒØ!ˆŒØˆŒÜ˜zÓ*ˆŒð ˆŒØˆŒØˆŒØˆÔÜ× Ñ   rÕ*r   c           	      ó¬  ‡ ‡— ‰ j                   r7t        ‰ j                  t        «       «      5   ‰ j                  |Ž cd d d «       S t	        ‰ j
                  ‰ j                  «      \  }}t        ||‰ j                  «      }t        |«      5  g Šˆˆ fd„}|D �cg c]
  } ||«      ‘Œ }}t        ‰ j                  |«      5  t        j                  |Ž D ]7  }t        ‰ j                  ||‰ j                  «      }	 |	j                  |g|¢­Ž  Œ9 	 d d d «       ‰D ]	  }
 |
«        Œ 	 d d d «       y # 1 sw Y   ŒðxY wc c}w # 1 sw Y   Œ2xY w# 1 sw Y   y xY w)Nc                 ó¬  •— t        j                  ˆfd„‰j                  d | f«      \  }} t        | t        j
                  «      r*| j                  dkD  rt        | «      j                  ‰«      }nJt        | t        «      r| j                  ‰«      }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Ñ.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‘OØ˜3�Kó‘��3ô ˜c¤2§:¡:Ô.°3·8±8¸a²<Ü" 3›-×1Ñ1°$Ó7‘CÜ ¤WÔ-ØŸ-™-¨Ó-‘CÜ ¤R§W¡WÔ-Ü'¨Ó,‘Cà�CÜ˜c¤=Ô1Ü4°SÓ9Ð9Ø�
r   )r,   r	   r+   r   r   r1   r2   r   r4   r   rE   ÚndindexÚBlockManagerr.   Úrun)r   Úargsr1   r2   Úfake_cuda_modulerM   rJ   Ú	fake_argsÚ
grid_pointÚbmÚwbr>   s   `          @r   Ú__call__zFakeCUDAKernel.__call__S   sG  ù€ Ø�<Š<Ü$ T§W¡WÔ.AÓ.CÓDñ &Ø�t—w‘w �~÷&ñ &ô :¸$¿-¹-Ø:>¿.¹.óJÑˆ�)ô *¨(°IØ*.×*=Ñ*=ó?Ðä!Ð"2Ó3ñ $	ð ˆDõð. 37Ö7¨3™ #�Ð7ˆIÐ7Ü$ T§W¡WÐ.>Ó?ñ 3ä"$§*¡*¨hÐ"7ò 3�JÜ% d§g¡g¨x¸ÀDÇKÁKÓP�BØ�B—F‘F˜:Ð2¨	Ô2ñ3÷3ð ò �Ù•ñ÷G$	ð $	÷&ð &üòJ 8÷3ð 3ú÷;$	ð $	úsB   ­D-ÂE
ÂD9Â'E
Â?AD>ÄE
Ä-D6Ä9E
Ä>E	ÅE
Å
Ec                 óf   — t        |d d Ž \  | _        | _        t        |«      dk(  r
|d   | _        | S )Nr
   é   é   )r   r1   r2   Úlenr4   )r   Úconfigurations     r   r'   zFakeCUDAKernel.__getitem__„   s?   € ä'¨°r¸Ð):Ð;ñ 	&ˆŒ�t”~ô ˆ}Ó Ò"Ø"/°Ñ"2ˆDÔàˆr   c                  ó   — y r%   r   ©r   s    r   ÚbindzFakeCUDAKernel.bind�   s   € Ør   c                 ó   — | S r%   r   )r   rQ   s     r   Ú
specializezFakeCUDAKernel.specialize�   s   € Øˆr   c                 ó:   — |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“   s5   € Ø�AŠ:ÜÐOØ%ñ&ó 'ð 'à�F˜A˜v yÐ0Ñ1Ð1r   c                 ó   — t        «       S r%   )r#   r^   s    r   Ú	overloadszFakeCUDAKernel.overloads™   s   € äÓ!Ð!r   c                 ó   — | j                   S r%   )r+   r^   s    r   Úpy_funczFakeCUDAKernel.py_func�   s   € à�w‰wˆr   )FNF)r   r   r   )r   r   r    r!   r:   rW   r'   r_   ra   rg   Úpropertyri   rk   r   r   r   r)   r)   <   sU   „ ñð
 BGó+ò$/òbòòó2ð ñ"ó ð"ð ñó ñ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   | _        y )Nc                  óB   •— t        j                  d¬«        ‰| i |¤Ž y )NÚraise)Údivide)rE   Úseterr)rQ   ÚkwargsÚfs     €r   Údebug_wrapperz+BlockThread.__init__.<locals>.debug_wrapperª   s   ø€ Ü—	‘	 Õ)Ù�4Ð"˜6Ó"r   )ÚtargetFT)Úsuperrn   r:   Ú	threadingÚEventÚsyncthreads_eventÚsyncthreads_blockedÚ_managerr   ÚblockIdxÚ	threadIdxÚ	exceptionÚdaemonÚabortr9   Ú
_block_dimÚxÚyÚzÚ	thread_id)
r   ru   Úmanagerr~   r   r9   rv   rw   ÚblockDimÚ	__class__s
    `       €r   r:   zBlockThread.__init__¨   sÝ   ù€ Ùô#ð #‰FàˆFäŒk˜4Ñ)°Ð)Ô8Ü!*§¡Ó!2ˆÔØ#(ˆÔ ØˆŒÜ˜h˜ˆŒÜ˜yÐ)ˆŒØˆŒØˆŒØˆŒ
ØˆŒ
Ü˜Ÿ™×1Ñ1Ð2ˆØŸ™×)Ñ)¨X¯Z©Z¸4¿>¹>×;KÑ;KØ;C¿:¹:Ø;?¿>¹>×;KÑ;Kñ<Lñ<Lñ .Mñ Nˆ�r   c                 óV  •— 	 t         t        | �  «        y # 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 }~y d }~ww xY w)Nztid=%szctaid=%sÚ ú z: r
   )rx   rn   rP   Ú	Exceptionr/   r   r~   ÚstrÚsysÚexc_infoÚtyper€   )r   ÚeÚtidÚctaidÚmsgÚtbrŠ   s         €r   rP   zBlockThread.runÀ   s–   ø€ ð	0Ü”+˜tÑ(Õ*øÜò 
	0ØœT $§.¡.Ó1Ñ1ˆCØ¤ d§m¡mÓ!4Ñ4ˆEÜ�1‹v˜Š|Ú!$¡eÐ,‘â%(ª%±Ð3�Ü—‘“ Ñ"ˆBð &œd 1›g c›l¨BÐ/ˆD�N‰Nûð
	0ús   ƒ –	B(ŸA?B#Â#B(c                 óÖ   — | j                   rt        d«      ‚d| _        | j                  j	                  «        | j                  j                  «        | j                   rt        d«      ‚y )Nz"abort flag set on syncthreads callTz#abort flag set on syncthreads clear)r‚   ÚRuntimeErrorr|   r{   ÚwaitÚclearr^   s    r   ÚsyncthreadszBlockThread.syncthreadsÏ   sY   € à�:Š:ÜÐCÓDÐDà#'ˆÔ Ø×Ñ×#Ñ#Ô%Ø×Ñ×$Ñ$Ô&à�:Š:ÜÐDÓEÐEð r   c                 óL  — | j                   j                  | j                   j                  | j                   j                  f}|| j                  j
                  |<   | j                  «        t        j                  | 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Û   sw   € Ø�n‰n×Ñ §¡× 0Ñ 0°$·.±.×2BÑ2BÐBˆØ).ˆ�‰×!Ñ! #Ñ&Ø×ÑÔÜ× Ñ  §¡×!:Ñ!:Ó;ˆØ×ÑÔØˆr   c                 óT  — | j                   j                  | j                   j                  | j                   j                  f}|| j                  j
                  |<   | j                  «        t        j                  | j                  j
                  «      }| j                  «        |rdS dS ©Nr   r   )	r   r„   r…   r†   r}   rž   rœ   rE   Úall©r   r    r¡   Útests       r   Úsyncthreads_andzBlockThread.syncthreads_andã   ó}   € Ø�n‰n×Ñ §¡× 0Ñ 0°$·.±.×2BÑ2BÐBˆØ).ˆ�‰×!Ñ! #Ñ&Ø×ÑÔÜ�v‰v�d—m‘m×/Ñ/Ó0ˆØ×ÑÔÙˆqÐ˜aÐr   c                 óT  — | j                   j                  | j                   j                  | j                   j                  f}|| j                  j
                  |<   | j                  «        t        j                  | j                  j
                  «      }| j                  «        |rdS 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   r^   s    r   Ú__str__zBlockThread.__str__ó   s   � Ø(,¯«°t·~³~ÐFÐFr   )r   r   r    r!   r:   rP   rœ   r£   r©   r­   r¯   Ú__classcell__)rŠ   s   @r   rn   rn   ¤   s.   ø„ ñôNô00ò
Fòò ò öGr   rn   c                   ó   — e Zd ZdZd„ Zd„ Zy)rO   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                  ¬«      | _        y )N)Údtype)Ú	_grid_dimrƒ   Ú_fr.   rE   ÚzerosÚbool_rž   )r   ru   r1   r2   r9   s        r   r:   zBlockManager.__init__	  s5   € Ø!ˆŒØ#ˆŒØˆŒØˆŒÜŸ8™8 I´R·X±XÔ>ˆÕr   c                 ó�  ‡ ‡— t        «       }t        «       }t        «       }t        j                  ‰ j                  Ž D ]S  }ˆˆ fd„}t	        |‰ ||‰ j
                  «      }|j                  «        |j                  |«       |j                  |«       ŒU |rï|D ]†  }|j                  r|j                  |«       Œ!|j                  sŒ.|D ]*  }	d|	_
        d|	_        |	j                  j                  «        Œ, |j                  d   j                  |j                  d   «      ‚ ||k(  r2|D ]#  }d|_        |j                  j                  «        Œ% t        «       }t        |D �cg c]  }|j                  «       sŒ|‘Œ c}«      }|rŒï|D ]9  }|j                  sŒ|j                  d   j                  |j                  d   «      ‚ y c c}w )Nc                  ó$   •—  ‰j                   ‰ Ž  y r%   )rµ   )rQ   r   s   €€r   rw   z BlockManager.run.<locals>.target  s   ø€ Ø�—‘˜’r   TFr   r   )ÚsetrE   rN   rƒ   rn   r.   ÚstartÚaddr|   r€   r‚   r{   Úwith_tracebackÚis_alive)
r   rT   rQ   ÚthreadsÚlivethreadsÚblockedthreadsÚblock_pointrw   ÚtÚt_others
   ` `       r   rP   zBlockManager.run  s—  ù€ ä“%ˆÜ“eˆÜ›ˆÜŸ:™: t§¡Ð7ò 	ˆKõä˜F D¨*°kÀ4Ç;Á;ÓOˆAØ�G‰GŒIØ�K‰K˜ŒNØ�O‰O˜AÕð	ñ Ø ò H�Ø×(Ò(Ø"×&Ñ& qÕ)Ø—[“[ð $+ò 8˜Ø(,˜œØ6;˜Ô3Ø×1Ñ1×5Ñ5Õ7ð8ð
 Ÿ+™+ a™.×7Ñ7¸¿¹ÀA¹ÓGÐGðHð ˜nÒ,Ø'ò .�AØ,1�AÔ)Ø×'Ñ'×+Ñ+Õ-ð.ô "%£�Ü¨;ÖH a¸!¿*¹*½,¢ÒHÓIˆKò' ð, ò 	DˆAØ�{‹{Ø—k‘k !‘n×3Ñ3°A·K±KÀ±NÓCÐCñ	Dùò Is   Å GÅ6GN)r   r   r    r!   r:   rP   r   r   r   rO   rO   ÷   s   „ ñò"?ó(Dr   rO   )Ú
contextlibr   r5   r�   ry   ÚnumpyrE   Úcudadrv.devicearrayr   r   Ú	kernelapir   r   r	   Úerrorsr   rQ   r   r   r   r   r   r   Údictr#   Úobjectr)   ÚThreadrn   rO   r   r   r   ú<module>rÍ      s”   ðÝ %Û Û 
Û ã ç Iß @Ñ @Ý 0ß $ðð
 €ð ñ
ó ð
ò÷ñ ô�tô ôc�Vô côPPG�)×"Ñ"ô PGôfAD�6õ ADr   