U
    hâËd©  ã                   @   sÂ   d 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 ejdkrddZd	Znejd
krxdZdZndZdZdd„ Zdd„ Zddd„Zdd„ Zdd„ Zddd„Zd dd„ZdS )!a2  Cudatoolkit libraries lookup utilities.

Cudatoolkit libraries can be available via either:

- the `cudatoolkit` conda package,
- a user supplied location from CUDA_HOME,
- a system wide location,
- package-specific locations (e.g. the Debian NVIDIA packages),
- or can be discovered by the system loader.
é    N)Úfind_lib)Úget_cuda_paths)Úlocate_driver_and_loaderÚload_driver)ÚCudaSupportErrorÚwin32z%s.dllz%s.libÚdarwinzlib%s.dylibzlib%s.azlib%s.soc                  C   s   t ƒ } | d j}|S )NÚ	libdevice)r   Úinfo)ÚdÚpaths© r   úP/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/cuda/cudadrv/libs.pyÚget_libdevice!   s    
r   c               
   C   s,   t tƒ dƒ�} |  ¡ W  5 Q R £ S Q R X d S )NÚrb)Úopenr   Úread)Zbcfiler   r   r   Úopen_libdevice'   s    r   Fc                 C   sd   | dkrt ƒ d jptd S |r$dnd}t ƒ | j}t| |||d�}|rLtnt}|r\t|ƒS ||  S )a  
    Find the path of a CUDA library based on a search of known locations. If
    the search fails, return a generic filename for the library (e.g.
    'libnvvm.so' for 'nvvm') so that we may attempt to load it using the system
    loader's search mechanism.
    ÚnvvmÚstatic_cudalib_dirÚcudalib_dir)ÚplatformÚstatic)r   r
   Ú_dllnamepatternr   Ú_staticnamepatternÚmax)Úlibr   r   Údir_typeZlibdirÚ
candidatesZnamepatternr   r   r   Úget_cudalib,   s    r   c                 C   s   t | ƒ}t |¡S )N)r   ÚctypesÚCDLL©r   Úpathr   r   r   Úopen_cudalib>   s    r$   c                 C   s*   t | dd�}tj |¡s&t|› d�ƒ‚d S )NT©r   z
 not found)r   Úosr#   ÚisfileÚFileNotFoundErrorr"   r   r   r   Úcheck_static_libC   s    r)   c                 C   sD   | dkrt ƒ d jS | dkr(t ƒ d jS |r0dnd}t ƒ | jS d S )Nr   r	   r   r   )r   Zby)r   r   r   r   r   r   Ú_get_source_variableI   s    r*   Tc                 C   s0  d}z^t ƒ \}}d |¡}td|› d�ƒ td|› �ƒ tddd� t||ƒ\}}td|› �ƒ W n4 tk
r– } ztd	|› �ƒ d
}W 5 d}~X Y nX d ¡ }	|	D ]¬}
t|
| ƒ}td |
t|
ƒ¡ƒ |rÖtd|ƒ ntdt	j
 |¡ƒ | dtjfkr¤z tddd� t|
ƒ tdƒ W q¤ tk
�rN } ztd|
|f ƒ d
}W 5 d}~X Y q¤X q¤d}
t|
| d
d�}td |
t|
d
d�¡ƒ |�rŽtd|ƒ ntdt	j
 |¡ƒ zt|
ƒ W n8 tk
�rä } ztd|
|f ƒ d
}W 5 d}~X Y nX tdƒ}td|› �ƒ tddd� tƒ }|�rtdƒ ntdƒ d
}| S )z:Test library lookup.  Path info is printed to stdout.
    Fz, z Finding driver from candidates: z...zUsing loader z	trying to load driver)Úendz	ok, loaded from z	ERROR: failed to open driver: TNznvvm cudartzFinding {} from {}z	located atz	named z	trying to open libraryz	okz	ERROR: failed to open %s:
%sZ	cudadevrtr%   z	ERROR: failed to find %s:
%sr	   zFinding libdevice from z	ERROR: can't open libdevice)r   ÚjoinÚprintr   r   Úsplitr   Úformatr*   r&   r#   ÚbasenameÚsysr   r$   ÚOSErrorr)   r(   r   )Ú	_platformZprint_pathsÚfailedZdlloaderr   Ú	locationsZdllr#   ÚeZlibsr   Úwherer   r   r   ÚtestS   sb    


ÿ

r8   )NF)F)NT)Ú__doc__r&   r1   r    Znumba.misc.findlibr   Znumba.cuda.cuda_pathsr   Znumba.cuda.cudadrv.driverr   r   Znumba.cuda.cudadrv.errorr   r   r   r   r   r   r   r$   r)   r*   r8   r   r   r   r   Ú<module>   s,   




