U
    <c                     @   s  d Z ddlZddlZddlZddlmZmZmZ ddlZddl	Z	ddl
mZ ej Zeofej dkZervedndZeoejjejdedZerejj ndZejjoeejjd	kZejjoejjd
Zej oej dkZej oej dkZej o"ej dkZ eZ!erDe"d  ejj#Z!er^ddl$Z%e%j Z&ndZ&da'dd Z(dd Z)e	j*dd Z+e	j*d%ddZ,d&ddZ-dd Z.dd Z/dd  Z0d!d" Z1d#d$ Z2e1 Z3e2 Z4dS )'z>This file is allowed to initialize CUDA context when imported.    N)
TEST_NUMBA
IS_WINDOWSTEST_WITH_ROCM)LooseVersion   zcuda:0g      ?devicez11.0z9.)      )   r   )   r      Fc                  C   s@   t stdts<ttj D ]} tjdd| d qdad S )Nz?CUDA must be available when calling initialize_cuda_context_rngr   zcuda:{}r   T)		TEST_CUDAAssertionError__cuda_ctx_rng_initializedrangetorchcudadevice_countZrandnformat)i r   G/tmp/pip-unpacked-wheel-gikjz4vx/torch/testing/_internal/common_cuda.pyinitialize_cuda_context_rng*   s
    r   c                   C   sX   t j rt jjd krdS t jt j jdk r6dS tt jjdd dk rTdS dS )NFr   .r      T)	r   r   is_availableversionZget_device_propertiesZcurrent_devicemajorintsplitr   r   r   r   tf32_is_not_fp327   s    r!   c               	   c   sX   t jjjj} z8dt jjj_t jjjd d d dd d V  W 5 Q R X W 5 | t jjj_X d S )NFZenabledZ	benchmarkZdeterministic
allow_tf32)r   backendsr   matmulr#   cudnnflags)old_allow_tf32_matmulr   r   r   tf32_offA   s    r)   h㈵>c              	   c   sj   t jjjj}| j}z>dt jjj_|| _t jjjd d d dd d V  W 5 Q R X W 5 |t jjj_|| _X d S )NTr"   )r   r$   r   r%   r#   Z	precisionr&   r'   )selftf32_precisionr(   Zold_precisionr   r   r   tf32_onL   s    r-   c                    s&   dd  fddfdd}|S )Nc              	   S   s   t   |  W 5 Q R X d S Nr)   r+   Zfunction_callr   r   r   with_tf32_disabledw   s    z+tf32_on_and_off.<locals>.with_tf32_disabledc              	      s    t |   |  W 5 Q R X d S r.   )r-   r0   )r,   r   r   with_tf32_enabled{   s    z*tf32_on_and_off.<locals>.with_tf32_enabledc                    s8   t j}t|  t fdd}|S )Nc                     s   t | D ]\}}| |< q
t }d krB|o@t d jdk}d krb|o` d tjtjhk}|r d  fdd  d  fdd n
f   d S )Nr   r   Zdtyper+   c                      s
    f S r.   r   r   fkwargsr   r   <lambda>       zCtf32_on_and_off.<locals>.wrapper.<locals>.wrapped.<locals>.<lambda>c                      s
    f S r.   r   r   r3   r   r   r6      r7   )zipr!   r   r   typeZfloat32Z	complex64)argsr5   kvZcond)	arg_namesr4   r1   r2   )r5   r   wrapped   s    
z1tf32_on_and_off.<locals>.wrapper.<locals>.wrapped)inspect	signature
parameterstuplekeys	functoolswraps)r4   paramsr>   )r1   r2   )r=   r4   r   wrapper   s
    z tf32_on_and_off.<locals>.wrapperr   )r,   rG   r   )r,   r1   r2   r   tf32_on_and_offv   s    rH   c                    s   t   fdd}|S )Nc               
      s(   t    | |W  5 Q R  S Q R X d S r.   r/   )r:   r5   r4   r   r   r>      s    zwith_tf32_off.<locals>.wrapped)rD   rE   )r4   r>   r   rI   r   with_tf32_off   s    rJ   c                  C   s^   dt j krdS t j d} t j | td d  dd }tdd |dD S )	NZMagmar   r   zMagma 
r   c                 s   s   | ]}t |V  qd S r.   r   .0xr   r   r   	<genexpr>   s     z%_get_magma_version.<locals>.<genexpr>r   )r   Z
__config__showfindlenr    rB   )positionversion_strr   r   r   _get_magma_version   s
    $rW   c                  C   s4   t jjd krdS tt jj} tdd | dD S )NrK   c                 s   s   | ]}t |V  qd S r.   rM   rN   r   r   r   rQ      s     z*_get_torch_cuda_version.<locals>.<genexpr>r   )r   r   r   strrB   r    )Zcuda_versionr   r   r   _get_torch_cuda_version   s    rY   c                  C   s   t  } d}trd}| |kS )N)
   r   )r   r   )rY   r   )r   Zmin_supported_versionr   r   r   !_check_cusparse_generic_available   s
    r[   c                  C   sL   t sdS ttjj} | dd } tdd | dD }|d kpH|dk  S )NF-r   c                 s   s   | ]}t |V  qd S r.   rM   rN   r   r   r   rQ      s     z5_check_hipsparse_generic_available.<locals>.<genexpr>r   )r	   r   )r   rX   r   r   Zhipr    rB   )Zrocm_versionZrocm_version_tupler   r   r   "_check_hipsparse_generic_available   s    r]   )r*   )r*   )5__doc__rD   r   Z
torch.cudaZ$torch.testing._internal.common_utilsr   r   r   r?   
contextlibZdistutils.versionr   r   r   r   r   ZTEST_MULTIGPUr   ZCUDA_DEVICEr$   r&   Zis_acceptableZtensorZ
TEST_CUDNNr   ZTEST_CUDNN_VERSIONZCUDA11OrLater
startswithZCUDA9Zget_device_capabilityZSM53OrLaterZSM60OrLaterZSM80OrLaterZ
TEST_MAGMAZonesZ	has_magmaZ
numba.cudaZnumbaZTEST_NUMBA_CUDAr   r   r!   contextmanagerr)   r-   rH   rJ   rW   rY   r[   r]   ZTEST_CUSPARSE_GENERICZTEST_HIPSPARSE_GENERICr   r   r   r   <module>   sP   



)
%
