U
    yÊ¹já  ã                   @   sv   d dl Z d dlZddlmZ ddlmZ ddlmZ ddlmZm	Z	m
Z
 dd„ Zd	d
„ Zdd„ Zddd„Zdd„ ZdS )é    Né   )Úcdiv)Úruntime)Údriver)Úget_dram_gbpsÚget_max_simd_tflopsÚget_max_tensorcore_tflopsc                 C   s@   |t |dƒ }tj |¡d d }t ||ƒ| t|| |ƒ }|S ©z# return compute throughput in TOPS é   Úmultiprocessor_count)Úminr   ÚutilsÚget_device_propertiesr   ©ÚbackendÚdeviceÚnum_ctasÚ	num_warpsÚdtypeZtotal_warpsZnum_subcoresZtflops© r   ú[/var/www/html/bwave/python/venv/lib/python3.8/site-packages/triton/ops/matmul_perf_model.pyÚget_tensorcore_tflops   s    r   c                 C   s@   |t |dƒ }tj |¡d d }t ||ƒ| t|| |ƒ }|S r	   )r   r   r   r   r   r   r   r   r   Úget_simd_tflops   s    r   c                 C   sB   t j |¡}|d dk r2|t jkr2t| ||||ƒS t| ||||ƒS )Nr   é   )ÚtorchÚcudaÚget_device_capabilityÚfloat32r   r   )r   r   r   r   r   Ú
capabilityr   r   r   Ú
get_tflops   s    r   Fc           ,      K   s  t jj}tj ¡ }|j}| ¡ }t||ƒ}t||	ƒ}|}|| | }t	||ƒt	||	ƒ }}d| | | d }t
|||| |ƒ}|| }tj |¡d }td|| ƒ}td|d ƒ}t	td|d d ƒdƒ}t||ƒ|d |d	   }|d
 }|| | dd|d    }|| | d |d  } || | dd|d    }!|| | d |d  }"||! d }#| |" d }$|#| |$|  }%|d }&|| | | d }'|dk�r¬|'|& }(n(|&})|'|) }(|| d d |& }*|(|*7 }(t	||%ƒ|( }+|�rtd|+› d|› d|%› d|(› d|d › d�ƒ |+S )zO return estimated running time in ms
          = max(compute, loading) + store r   i   @r   é   é    éL   r   gffffffî?gš™™™™™©?r
   gš™™™™™É?gš™™™™™é?i   g333333ã?zTotal time: zms, compute time: zms, loading time: zms, store time: zms, Activate CTAs: éd   ú%)r   r   ÚCUDAr   r   Úcurrent_devicer   Úelement_sizer   Úmaxr   r   r   r   r   r   Úprint),r   Ú
num_stagesÚAÚBÚCÚMÚNÚKÚBLOCK_MÚBLOCK_NÚBLOCK_KÚSPLIT_KÚdebugÚkwargsr   r   r   ÚdtsizeZ	num_cta_mZ	num_cta_nZ	num_cta_kr   Z	total_opsZtputZ
compute_msZnum_smZactive_cta_ratioZactive_cta_ratio_bw1Zactive_cta_ratio_bw2Zdram_bwZl2_bwZload_a_dramZ	load_a_l2Zload_b_dramZ	load_b_l2Z
total_dramZtotal_l2Zload_msZstore_bwZstore_c_dramZstore_msZ	reduce_bwZzero_msZtotal_time_msr   r   r   Úestimate_matmul_time"   sJ    





,r8   c                    sì  t j ¡ }t j ¡ }|d  ¡ }|d j}g }| D ]b}|j}|d |d |d |jf\}	}
}}tj	 
|¡d }|	|
 | | | }||kr2| |¡ q2|} |t jt jfkr¸dd„ | D ƒ} i }| D ]t}|j}|d |d |d |d |j|jf\}	}
}}}}|	|
|||f}||k�r&||  ||f¡ qÀ||fg||< qÀg }| ¡ D ]¤\}}|\}	}
}}}|d	 d
k�rÈ|	|
 | d }|td|ƒ d
 }d}|| ‰ tjd|‡ fdd„d�}|D ]}| |d	 ¡ �q°n|d	 d	 }d|_| |¡ �qB|S )Nr+   r1   r2   r3   Zmax_shared_memc                 S   s   g | ]}|j d  dkr|‘qS )r4   r    )r6   )Ú.0Úconfigr   r   r   Ú
<listcomp>z   s      z&early_config_prune.<locals>.<listcomp>r4   r   r   i   r
   i,  r   c                    s0   | d ˆ  dk r$dt | d ˆ  ƒ S | d ˆ  S )Nr    r   é
   )Úabs)Úx©Zoptimal_num_stagesr   r   Ú<lambda>•   s    ÿz$early_config_prune.<locals>.<lambda>)Úkey)r   r   r&   r   r'   r   r6   r*   r   r   r   ÚappendZfloat16r   r   Úitemsr   ÚheapqÚ	nsmallest)ZconfigsZ
named_argsr   r   r7   r   Zpruned_configsr:   Úkwr1   r2   r3   r*   Zmax_shared_memoryZrequired_shared_memoryZconfigs_mapr4   r   rA   ÚkÚvZmmasZ
mma_cyclesZldgsts_latencyZnearestÚnZrandom_configr   r?   r   Úearly_config_pruned   sP    


ÿ
"ÿ
rJ   )F)rD   r   Ú r   Z_C.libtriton.tritonr   r   Ztestingr   r   r   r   r   r   r8   rJ   r   r   r   r   Ú<module>   s    ú
B