U
    ?hŽ  ã                   @   s”   d dl Z d dlmZ d dlZd dlmZ d dlmZmZm	Z	 d dl
mZ G dd„ deƒZG dd	„ d	eƒZe	d
ƒG dd„ deƒƒZedkre ¡  dS )é    N)Úbyref©Úcuda)ÚunittestÚCUDATestCaseÚskip_on_cudasim)Údriverc                       s4   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Z‡  ZS )	ÚTestContextStackc                    s   t ƒ  ¡  t ¡  d S ©N)ÚsuperÚsetUpr   Úclose©Úself©Ú	__class__© ú]/var/www/html/venv/lib/python3.8/site-packages/numba/cuda/tests/cudadrv/test_context_stack.pyr      s    
zTestContextStack.setUpc              	   C   s@   |   tjjd ¡ tjd  |  ttjjjƒd¡ W 5 Q R X d S ©Nr   )ZassertIsr   ÚgpusÚcurrentÚassertEqualÚintÚidr   r   r   r   Útest_gpus_current   s    z"TestContextStack.test_gpus_currentc                 C   s   |   ttjƒd¡ d S r   )ÚassertGreaterÚlenr   r   r   r   r   r   Útest_gpus_len   s    zTestContextStack.test_gpus_lenc                 C   s   t tjƒ}|  t|ƒd¡ d S r   )Úlistr   r   r   r   )r   Zgpulistr   r   r   Útest_gpus_iter   s    
zTestContextStack.test_gpus_iter)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   Ú__classcell__r   r   r   r   r	   
   s   r	   c                       sh   e Zd Z‡ fdd„Zdd„ Ze eej	ƒdk d¡e
dƒdd	„ ƒƒZe eej	ƒdk d¡d
d„ ƒZ‡  ZS )ÚTestContextAPIc                    s   t ƒ  ¡  t ¡  d S r
   ©r   ÚtearDownr   r   r   r   r   r   r&      s    
zTestContextAPI.tearDownc                 C   sˆ   zt  ¡  ¡ }W n tk
r.   |  d¡ Y nX |  |jtj¡ |  	|j|d ¡ |  |j
tj¡ |  	|j
|d ¡ |  |j|j
¡ d S )Nz/EMM Plugin does not implement get_memory_info()r   é   )r   Úcurrent_contextZget_memory_infoÚNotImplementedErrorZskipTestZassertIsInstanceÚfreeÚnumbersÚNumberZassertEqualsÚtotalZassertLessEqual)r   Zmemr   r   r   Útest_context_memory#   s    z"TestContextAPI.test_context_memoryé   zneed more than 1 gpusúCUDA HW requiredc              
   C   sV   t jdd„ ƒ}t jd 4 |  t¡}|ƒ  W 5 Q R X |  dt|jƒ¡ W 5 Q R X d S )Nc                	   S   s   t jd  W 5 Q R X d S ©Nr'   )r   r   r   r   r   r   Ú
switch_gpu5   s    z@TestContextAPI.test_forbidden_context_switch.<locals>.switch_gpur   zCannot switch CUDA-context.)r   Zrequire_contextr   ZassertRaisesÚRuntimeErrorÚassertInÚstrÚ	exception)r   r2   Zraisesr   r   r   Útest_forbidden_context_switch1   s    
z,TestContextAPI.test_forbidden_context_switchc              	   C   s8   dd„ }t jd  |ƒ }W 5 Q R X |  t|ƒd¡ d S )Nc                
   S   s.   t jd  t  ¡ jjW  5 Q R £ S Q R X d S r1   )r   r   r(   Zdevicer   r   r   r   r   r2   B   s    z?TestContextAPI.test_accepted_context_switch.<locals>.switch_gpur   r'   )r   r   r   r   )r   r2   Zdevidr   r   r   Útest_accepted_context_switch@   s    z+TestContextAPI.test_accepted_context_switch)r    r!   r"   r&   r.   r   ZskipIfr   r   r   r   r7   r8   r#   r   r   r   r   r$      s   r$   r0   c                       s<   e Zd Z‡ fdd„Zdd„ fdd„Zdd„ Zd	d
„ Z‡  ZS )ÚTest3rdPartyContextc                    s   t ƒ  ¡  t ¡  d S r
   r%   r   r   r   r   r&   M   s    
zTest3rdPartyContext.tearDownc                   C   s   d S r
   r   r   r   r   r   Ú<lambda>Q   ó    zTest3rdPartyContext.<lambda>c              	   C   s¼   t j }t jr$t j d¡}| |¡}nd}t j ¡ }| t|ƒ|¡ z`t  
t | ¡|¡}| ¡  t ¡ }t jr†|  t|jƒt|jƒ¡ n|  |jj|jj¡ |ƒ  W 5 | ¡  | 	|¡ X d S r   )r   ÚUSE_NV_BINDINGÚbindingÚCUdeviceZcuDevicePrimaryCtxRetainÚdrvapiÚ
cu_contextr   ÚpopZcuDevicePrimaryCtxReleaseÚContextÚweakrefÚproxyÚpushr   r(   r   r   ÚhandleÚvalue)r   Z
extra_workÚ
the_driverÚdevÚhctxÚctxZmy_ctxr   r   r   Útest_attached_primaryQ   s"    

z)Test3rdPartyContext.test_attached_primaryc              
   C   s¦   t j }t jr*d}t j d¡}| ||¡}nt j ¡ }| t|ƒdd¡ zNzt	 
¡  W n2 tk
r† } z|  dt|ƒ¡ W 5 d }~X Y nX |  d¡ W 5 | |¡ X d S )Nr   z1Numba cannot operate on non-primary CUDA context zNo RuntimeError raised)r   r<   r=   r>   ZcuCtxCreater?   r@   r   ZcuCtxDestroyr   r(   r3   r4   r5   Zfail)r   rH   ÚflagsrI   rJ   Úer   r   r   Útest_attached_non_primaryk   s    
ÿz-Test3rdPartyContext.test_attached_non_primaryc                    s   ‡ fdd„}ˆ   |¡ d S )Nc                     sP   ddl m}  | jdd„ ƒ}|  d¡}|d |ƒ ˆ  t| ¡ ƒttdƒƒ¡ d S )Nr   r   c                 S   s   t | jƒD ]}|| |< q
d S r
   )ÚrangeÚsize)ÚaÚir   r   r   Úfoo„   s    zUTest3rdPartyContext.test_cudajit_in_attached_primary_context.<locals>.do.<locals>.fooé
   )r'   r'   )Únumbar   ZjitZdevice_arrayr   r   Zcopy_to_hostrP   )r   rT   rR   r   r   r   Údo   s    

zHTest3rdPartyContext.test_cudajit_in_attached_primary_context.<locals>.do)rL   )r   rW   r   r   r   Ú(test_cudajit_in_attached_primary_context€   s    z<Test3rdPartyContext.test_cudajit_in_attached_primary_context)r    r!   r"   r&   rL   rO   rX   r#   r   r   r   r   r9   K   s   r9   Ú__main__)r+   Úctypesr   rC   rV   r   Znumba.cuda.testingr   r   r   Znumba.cuda.cudadrvr   r	   r$   r9   r    Úmainr   r   r   r   Ú<module>   s   .D