B
     \                 @   s   d Z ddlmZmZmZ ddlZddlmZ ddlm	Zm
Z G dd deZe Z[G d	d
 d
eZdadd Zdd Zdd Ze ZdddZdddZdd Zdd Zdd ZdS )z!
Expose each GPU device directly
    )print_functionabsolute_importdivisionN)
servicelib   )hsaContextc               @   sl   e Zd ZdZdd Zedd Zdd Zdd	 Zd
d Z	dd Z
dd Zdd ZeZdd Zedd ZdS )_culistz)A thread local list of GPU instances
    c             C   s
   d | _ d S )N)_lst)self r   7lib/python3.7/site-packages/numba/roc/hsadrv/devices.py__init__   s    z_culist.__init__c             C   s   | j s|  | _ | j S )N)r
   
_init_gpus)r   r   r   r   _gpus   s    
z_culist._gpusc             C   s&   g }xt jD ]}|t| qW |S )N)driverZ
componentsappendCU)r   ZgpusZcomr   r   r   r      s    z_culist._init_gpusc             C   s
   | j | S )N)r   )r   itemr   r   r   __getitem__   s    z_culist.__getitem__c             C   s   | j |S )N)r   r   )r   r   r   r   r   r       s    z_culist.appendc             C   s
   t | jS )N)lenr   )r   r   r   r   __len__#   s    z_culist.__len__c             C   s
   t | jS )N)boolr   )r   r   r   r   __nonzero__&   s    z_culist.__nonzero__c             C   s
   t | jS )N)iterr   )r   r   r   r   __iter__)   s    z_culist.__iter__c             C   s   x| D ]}|   qW d S )N)reset)r   Zgpur   r   r   r   .   s    
z_culist.resetc             C   s   t jS )z>Get the current GPU object associated with the thread
        )_custacktop)r   r   r   r   current2   s    z_culist.currentN)__name__
__module____qualname____doc__r   propertyr   r   r   r   r   r   r   __bool__r   r   r   r   r   r   r	   
   s   r	   c               @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )r   c             C   s   || _ d | _d S )N)_cu_context)r   Zcur   r   r   r   >   s    zCU.__init__c             C   s   | drt|t| j|S )zRedirect to self._gpu
        _)
startswithAttributeErrorgetattrr&   )r   keyr   r   r   __getattr__B   s    
zCU.__getattr__c             C   s
   t | jS )N)reprr&   )r   r   r   r   __repr__I   s    zCU.__repr__c             C   s   | j dkr| j | _ | j S )z@Associate the context of this GPU to the running thread
        N)r'   r&   Zcreate_context)r   r   r   r   associate_contextL   s    
zCU.associate_contextc             C   s   |    t|  d S )N)r0   r   push)r   r   r   r   	__enter__U   s    zCU.__enter__c             C   s$   t  | kst| j  t  d S )N)_get_deviceAssertionErrorr'   popr   )r   exc_typeZexc_valZexc_tbr   r   r   __exit__Y   s    
zCU.__exit__c             C   s   | j r| j   d | _ d S )N)r'   r   )r   r   r   r   r   ^   s    
zCU.resetN)
r    r!   r"   r   r-   r/   r0   r2   r7   r   r   r   r   r   r   =   s   	r   c              C   s(   t d kr$dd tjD d } t| a t S )Nc             S   s   g | ]}|j s|qS r   )Zis_component).0ar   r   r   
<listcomp>j   s    z#get_cpu_context.<locals>.<listcomp>r   )_cpu_contextr   Zagents_Context)Z	cpu_agentr   r   r   get_cpu_contextg   s    r=   c             C   s   t |  S )N)cus)ir   r   r   get_gpuo   s    r@   c               C   s   t tS )N)r   r>   r   r   r   r   get_num_gpusr   s    rA   c             C   s   t st t|  t jS )z=Get the current device or use a device by device number.
    )r   r1   r@   r   )devnumr   r   r   r3   y   s    r3   c             C   s   t | d S )z]Get the current device or use a device by device number, and
    return the HSA context.
    )rB   )r3   r0   )rB   r   r   r   get_context   s    rC   c               C   s   dd t t D S )Nc             S   s   g | ]}t |qS r   )rC   )r8   r?   r   r   r   r:      s    z$get_all_contexts.<locals>.<listcomp>)rangerA   r   r   r   r   get_all_contexts   s    rE   c                s   t   fdd}|S )z?
    A decorator to ensure a context for the HSA subsystem
    c                 s   t    | |S )N)rC   )argsZkws)fnr   r   _require_cu_context   s    z,require_context.<locals>._require_cu_context)	functoolswraps)rG   rH   r   )rG   r   require_context   s    rK   c               C   s   t   t  d S )N)r>   r   r   clearr   r   r   r   r      s    r   )r   )r   )r#   Z
__future__r   r   r   rI   Znumbar   r   r   r   r<   objectr	   r>   r   r;   r=   r@   rA   ZTLStackr   r3   rC   rE   rK   r   r   r   r   r   <module>   s$   /'

