Ë
    M²jx  ã                   ó2   — d dl Z d dlmZ dgZ G d„ d«      Zy)é    N)ÚdtypeÚ	GPULimitsc                   ó€   — e Zd ZdZdej
                  fd„Zdedefd„Z	dedefd„Z
	 ddededefd	„Zdefd
„Zdefd„Zy)r   a  Utility class that provides the theoretical limits of Nvidia GPU devices. The
    limits don't take into account thermal throttling (assume that the GPU run at its
    peak rated frequency). This is because user hardware configuration may influence
    power behavior.
    Útarget_devicec                 óÄ   — t         j                  j                  |«      | _        t	        | j                  j
                  › | j                  j                  › �«      | _        y )N)ÚtorchÚcudaÚget_device_propertiesÚdevice_propertiesÚintÚmajorÚminorÚcompute_capability)Úselfr   s     úX/var/www/html/ia-enhanced/venv/lib/python3.12/site-packages/torch/cuda/_device_limits.pyÚ__init__zGPULimits.__init__   sP   € ô "'§¡×!AÑ!AÀ-Ó!PˆÔô #&Ø×%Ñ%×+Ñ+Ð,¨T×-CÑ-C×-IÑ-IÐ,JÐKó#
ˆÕó    Ú	data_typeÚreturnc           
      ó8  — ddddddddddœ	}d}|t         j                  u rd| j                  › �}nF|t         j                  u rd| j                  › �}n$|t         j                  u rd	| j                  › �}nd
}||vrt        d| j                  › d|› d�«      ‚||   S )Né   é@   é    é€   )	Úfp16_80Úfp32_80Úfp64_80Úfp16_90Úfp32_90Úfp64_90Úfp16_100Úfp32_100Úfp64_100Ú Úfp16_Úfp32_Úfp64_ÚunknownúNo data for sm_ú and ú.)r   Úfloat16r   Úfloat32Úfloat64ÚRuntimeError©r   r   Úhardcoded_device_valuesÚdict_keys       r   Ú#get_fma_per_cycle_per_sm_cuda_coresz-GPULimits.get_fma_per_cycle_per_sm_cuda_cores   sÌ   € ð ØØàØØàØØñ#
Ðð ˆØœŸ™Ñ%Ø˜t×6Ñ6Ð7Ð8‰HØœ%Ÿ-™-Ñ'Ø˜t×6Ñ6Ð7Ð8‰HØœ%Ÿ-™-Ñ'Ø˜t×6Ñ6Ð7Ð8‰Hà ˆHàÐ2Ñ2ÜØ! $×"9Ñ"9Ð!:¸%À	¸{È!ÐLóð ð ' xÑ0Ð0r   c                 óÈ  — ddddddddddddddœ}d	}|t         j                  u rd
| j                  › �}nŠ|t         j                  u rd
| j                  › �}nh|t         j                  u rd| j                  › �}nF|t         j
                  u rd| j                  › �}n$|t         j                  u rd| j                  › �}nd}||vrt        d| j                  › d|› d�«      ‚||   S )Ni   i   i   r   i   r   i    )Úint8_80r   r   r   Úint8_90Úfp8_90r   r   r    Úint8_100Úfp8_100r!   r"   r$   r%   r&   Úint8_r'   r(   r)   r*   r+   )r   r,   r   Úbfloat16r-   Úint8r.   r/   r0   s       r   Ú%get_fma_per_cycle_per_sm_tensor_coresz/GPULimits.get_fma_per_cycle_per_sm_tensor_coresA   s  € ð ØØØàØØØØàØØØñ!#
Ðð$ ˆØœŸ™Ñ%Ø˜t×6Ñ6Ð7Ð8‰HØœ%Ÿ.™.Ñ(à˜t×6Ñ6Ð7Ð8‰HØœ%Ÿ-™-Ñ'Ø˜t×6Ñ6Ð7Ð8‰HØœ%Ÿ*™*Ñ$Ø˜t×6Ñ6Ð7Ð8‰HØœ%Ÿ-™-Ñ'Ø˜t×6Ñ6Ð7Ð8‰Hà ˆHàÐ2Ñ2ÜØ! $×"9Ñ"9Ð!:¸%À	¸{È!ÐLóð ð ' xÑ0Ð0r   Úuse_tensor_coresc                 óÈ   — | j                   j                  }| j                   j                  }d}|r| j                  |«      }n| j	                  |«      }||z  dz  |z  dz  }|S )Nr   é   g    eÍÍA)r   Úmulti_processor_countÚ
clock_rater=   r3   )r   r   r>   Únum_smsrB   Úfma_per_cycleÚtflops_per_seconds          r   Úget_tflops_per_secondzGPULimits.get_tflops_per_secondj   sp   € ð ×(Ñ(×>Ñ>ˆØ×+Ñ+×6Ñ6ˆ
àˆÙØ ×FÑFÀyÓQ‰Mà ×DÑDÀYÓOˆMð $ mÑ3°aÑ7¸*ÑDÀsÑJÐØ Ð r   c                 óŒ   — t        d| j                  j                  z  dz  «      }| j                  j                  dz  }||z  }|S )Nr@   é   éè  )r   r   Úmemory_bus_widthÚmemory_clock_rate)r   Úbus_bytes_per_cycleÚmem_clock_rate_HzÚbytes_per_seconds       r   Úget_memory_bandwidth_Bpsz"GPULimits.get_memory_bandwidth_Bps{   sO   € ô " ! d×&<Ñ&<×&MÑ&MÑ"MÐPQÑ"QÓRÐØ ×2Ñ2×DÑDÀtÑKÐØ.Ð1BÑBÐØÐr   c                 óx   — | j                   j                  }d}||z  }|| j                   j                  z  dz  }|S )Nr   rI   )r   rA   rB   )r   rC   Úbytes_per_cycle_per_smÚbytes_per_cycle_per_devicerN   s        r   Úget_shared_memory_bandwidth_Bpsz)GPULimits.get_shared_memory_bandwidth_Bpsƒ   sM   € ð ×(Ñ(×>Ñ>ˆØ!$ÐØ%,Ð/EÑ%EÐ"à&¨×)?Ñ)?×)JÑ)JÑJÈTÑQð 	ð  Ðr   N)T)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Údevicer   r   r   r3   r=   ÚboolÚfloatrF   rO   rS   © r   r   r   r      sy   „ ñð	
 e§l¡ló 	
ð 1¸Uð 1Àsó 1ðD'1¸uð '1Èó '1ðT :>ñ!Øð!Ø26ð!à	ó!ð" ¨#ó  ð	 °ô 	 r   )r   Útorch._Cr   Ú__all__r   r[   r   r   ú<module>r^      s    ðÛ Ý ð ˆ-€÷D ò D r   