o
     i                  
   @   s  d dl Z d dlZd dlmZmZmZ d dlmZ dZ	e
dZ
eeeddddfeddd	d
fgddgejgdeeedddd
fedddd
fedddd
fedddd
fgdgejgd Zeedgd
gdgejgdZG dd dZG dd deZG dd dZG dd  d eZed!deed"ee	d# ed$ddeed"ee	d% ed&deed"ee	d# ed'ddeed"ee	d% dS )(    N)	DTYPE2STRbenchmark_main_helper2product_dictg?cudag<@0      i    i   FT)shapescalingdtypeg\@   2   g@i00  g     @i%  gfffffF@))r   r   )r   r   g333333?)batchesD
keep_ratior   c                   @   s4   e Zd ZdededdfddZdddZd	d
 ZdS )ScaledIndexAddBenchmarkr
   bwreturnNc           
      C   s  |\}}}}t ||  t||}	|	 d| d| d| d| d|r&dnd | _d| _d	| _t j|||gd
||d| _t j|||gd
||d| _	|rWt j|gd
||dnd | _
t jdd t| j	jd D t jd
d| _t j|||gd
|d| _t  | _d S )Nz B_src=z, B_out=z, M=z, D=z s=YNscaled_index_addg\(\?r   )devicer   requires_gradc                 S      g | ]}|qS  r   .0ir   r   Z/home/ubuntu/.local/lib/python3.10/site-packages/xformers/benchmarks/benchmark_indexing.py
<listcomp>G       z4ScaledIndexAddBenchmark.__init__.<locals>.<listcomp>r   r   r   )r   r   )torchmanual_seedr   get	sub_labellabelalpharandninpsrcr
   tensorranger	   int64indexgradTensorout)
selfr   r
   r	   r   B_srcB_outMr   	dtype_strr   r   r   __init__3   s*   0z ScaledIndexAddBenchmark.__init__c                 C   s(   t j| j | j| j| j| jd| _d S )N)inputr.   sourcer
   r'   )	xopsr   r)   cloner.   r*   r
   r'   r1   r2   r   r   r   fwL   s   zScaledIndexAddBenchmark.fwc                 C   s8   d | j _d | j_| jd urd | j_| jj| jdd d S NT)retain_graph)r)   r/   r*   r
   r1   backwardr<   r   r   r   r   U   s
   
zScaledIndexAddBenchmark.bwr   N__name__
__module____qualname__boolr7   r=   r   r   r   r   r   r   2   s    
	r   c                   @      e Zd ZdddZdS )ScaledIndexAddBenchmarkBaseliner   Nc                 C   sD   | j }| jd ur|| jdd  | jjd|| j| jd| _d S )Nr   )dimr9   r.   r'   )r*   r
   	unsqueezer)   	index_addr.   r'   r1   )r2   
src_scaledr   r   r   r=   ^   s   
z"ScaledIndexAddBenchmarkBaseline.fwrA   rC   rD   rE   r=   r   r   r   r   rH   ]       rH   c                   @   s0   e Zd ZdeddfddZd
ddZdd	 ZdS )IndexSelectBenchmarkr   r   Nc                 C   s   t ||}| d| d| d| | _d| _g }g }|D ]9\}	}
dd t|	D }t|	| |t	j
|t||	  t	jdd t	j|	|
| g|d|d	}|| q||| _| _t	 | _d S )
Nz D=z	 batches=z keep=index_selectc                 S   r   r   r   r   r   r   r   r   s   r    z1IndexSelectBenchmark.__init__.<locals>.<listcomp>r   r!   )r   r   r   )r   r$   r%   r&   r,   randomRandomshuffleappendr"   zerosintr-   r(   indicessourcesr0   r1   )r2   r   r   r   r   r   r6   rW   rX   Bseqlenr.   source_ir   r   r   r7   k   s*   zIndexSelectBenchmark.__init__c                 C   s   t | j| j| _d S )N)r:   index_select_catrX   rW   r1   r<   r   r   r   r=      s   zIndexSelectBenchmark.fwc                 C   s(   | j D ]}d |_q| jj| jdd d S r>   )rX   r/   r1   r@   )r2   r*   r   r   r   r      s   
zIndexSelectBenchmark.bwrA   rB   r   r   r   r   rO   j   s    
rO   c                   @   rG   )IndexSelectBenchmarkBaseliner   Nc                 C   s(   t jdd t| j| jD dd| _d S )Nc                 S   s   g | ]
\}}||   qS r   )flatten)r   sr   r   r   r   r      s    z3IndexSelectBenchmarkBaseline.fw.<locals>.<listcomp>r   )rI   )r"   catziprX   rW   r1   r<   r   r   r   r=      s   zIndexSelectBenchmarkBaseline.fwrA   rM   r   r   r   r   r]      rN   r]   scaled_index_add_fw)xformerspytorch)r=   	functionscasesmin_run_timescaled_index_add_fwbw)r=   r   re   rf   rg   index_select_fwindex_select_fwbw)rQ   r"   utilsr   r   r   xformers.opsopsr:   rg   r   listrV   half
CASES_IADDCASES_ISELECTr   rH   rO   r]   r   r   r   r   <module>   s   
	
+"
