
    `i$                        d dl Z d dlmZ d dlZd dlZd dlmZ d dlmc m	Z
  ej                  d       ej                  j                  d        ej                   ed ej                                       d\  ZZZZd\  ZZZdZ ej2                  eeeeej4                        Z ej2                  eeeeej4                        Zd(d	Zd
 Zd Zd Z d Z!d Z"d Z#d Z$ G d dejJ                        Z&d)dZ'd Z(d Z)d Z*d Z+d*dZ,d Z-d Z.d Z/d Z0d Z1d Z2d Z3d  Z4d! Z5d" Z6d# Z7d$ Z8d% Z9d& Z:e;d'k(  r e:         e9        yy)+    N)ThreadPoolExecutor*      )          r   )r      r	      dtypec                 >   t        j                         5  t        |      D ]	  } |          t        j                         }t        |      D ]	  } |        } 	 d d d        t        j                         z
  |z  dz  }t        |dd|dd       S # 1 sw Y   ;xY w)Ni  45 z8.2fz ms)torchinference_moderangetimeperf_counterprint)funcnamerunswarmup_startresultelapseds           ex03.py	benchmarkr      s    				 v 	AF	 !!#t 	AVF	   "U*d2T9G	T"IQwtnC
()M s   ABBc                  J    t        j                  t        t        t              S NpaddingFconv2dxwPADDING     r   baseliner,   %       88Aq'**r+   c                  8   t        j                  t        t        t        ft
              } t        j                  t        d      }| j                  dd      |j                         z  }|j                  dd      j                  t        t        t        t              S Nkernel_sizer#   r
   r   r%   unfoldr'   kHkWr)   r(   reshapeK	transposetBHW)col_xw_flatouts      r   method_vedic_im2colrA   )   se    HHQRHg>EYYq"F
//!Q
&((*
,C==A&&q!Q22r+   c                  J    t        j                  t        t        t              S r!   r$   r*   r+   r   method_nikhilam_quantizedrC   0       88Aq'**r+   c                  (   t        dt              } t        j                  t        j                  t              |       }d }t        |       5 }t        |j                  ||            }d d d        t        j                  d      S # 1 sw Y    xY w)Nr   c                     t        j                  | t         j                        }t        j                  t
        t        j                  d|      t              S Nr   r   r"   )	r   	as_tensorlongr%   r&   r'   r(   index_selectr)   )	group_idsidss     r   
conv_groupz,method_dhwajank_parallel.<locals>.conv_group9   s4    ooiuzz:xx1>>!S17CCr+   max_workersr
   dim)
minr8   nparray_splitaranger   listmapr   cat)	n_workerschannel_groupsrM   executorpartss        r   method_dhwajank_parallelr]   5   sr    Aq	I^^BIIaL)<ND 
		2 ?hX\\*n=>?99U""? ?s   BBc                  Z   t         j                  dddd      j                         } t        j                  dddd      j                         }| j                  dddd      j                         }|j                  dddd      j                         }t	        j
                  ||t              S )Nr   r   r	   r
   r"   )r'   permute
contiguousr(   r%   r&   r)   )x_nhwcw_hwckx_nchww_oihws       r   method_paravartya_transposere   B   s    YYq!Q"--/FYYq!Q"--/F^^Aq!Q'224F^^Aq!Q'224F88FFG44r+   c                  J    t        j                  t        t        t              S r!   r$   r*   r+   r   method_anurupyena_depthwiserg   J        88Aq'**r+   c                  J    t        j                  t        t        t              S r!   r$   r*   r+   r   method_depthwise_separablerj   P   r-   r+   c                   *     e Zd ZdZd fd	Zd Z xZS ) AnurupyenaDepthwiseSeparableConvzg
    Depthwise 3x3 followed by pointwise 1x1.
    This is the form typically used in compact CNNs.
    c           	          t         |           t        j                  |||||||      | _        t        j                  ||d|      | _        y )N)r1   strider#   groupsbiasr
   )r1   rp   )super__init__nnConv2d	depthwise	pointwise)selfin_channelsout_channelsr1   rn   r#   rp   	__class__s          r   rr   z)AnurupyenaDepthwiseSeparableConv.__init__Z   sL    #
 ;!RVWr+   c                 B    | j                  | j                  |            S N)rv   ru   )rw   inputss     r   forwardz(AnurupyenaDepthwiseSeparableConv.forwardg   s    ~~dnnV455r+   )r	   r
   r
   F)__name__
__module____qualname____doc__rr   r~   __classcell__)rz   s   @r   rl   rl   T   s    
X6r+   rl   c           
         t        j                  t        t        t        t
        t        j                        }t        j                  t        t        t        t        t        f      }t        dt        |       D ]  }t        dt
        |      D ]x  }t        || z   t              }t        ||z   t
              }|d d d d ||dt        z  z   ||dt        z  z   f   }t        j                  |t        d      |d d d d ||||f<   z  |S Nr   r   r   r"   r   emptyr;   r8   r<   r=   r'   r   r%   padr)   r   rR   r&   r(   )	block_hblock_wr   x_padtopleftbottomrightx_blocks	            r   method_chakra_blockingr   k   s    [[Aq!1773FEE!gw9:EQ7# S!Q( 	SDw*Fw*EAq#W(<"<dUQQX[EX>XXYG3488GQPQ3RF1aVT%Z/0		SS Mr+   c                 x    | dk  rdS dt        t        j                  t        j                  |                   z  S )Nr
   r   )intrS   ceillog2)ns    r   next_power_of_2r   x   s.    Q19ARWWRWWQZ%8!999r+   c                  J    t        j                  t        t        t              S r!   r$   r*   r+   r   method_fft_convolutionr   |   rh   r+   c                  J    t        j                  t        t        t              S r!   r$   r*   r+   r   method_winogradr      rD   r+   c                  @   t        j                  t        j                  t              t	        t        d            } d }t        t	        t        d            5 }t        |j                  ||             }d d d        t        j                  d      S # 1 sw Y    xY w)Nr   c                     t        j                  | t         j                        }t        j                  t
        j                  d|      t        t              S rG   )	r   rH   rI   r%   r&   r'   rJ   r(   r)   )	batch_idsrL   s     r   
conv_batchz+method_coconut_parallel.<locals>.conv_batch   s4    ooiuzz:xxq#.7CCr+   rN   r   rP   )
rS   rT   rU   r;   rR   r   rV   rW   r   rX   )batchesr   r[   r\   s       r   method_coconut_parallelr      ss    nnRYYq\3q!95GD 
Aq		2 8hX\\*g67899U""8 8s   BBc           
         t        j                  t        t        t        t
        t        j                        }t        j                  t        t        t        t        t        f      }t        dt        |       D ]  }t        dt
        |      D ]x  }t        || z   t              }t        ||z   t
              }|d d d d ||dt        z  z   ||dt        z  z   f   }t        j                  |t        d      |d d d d ||||f<   z  |S r   r   )	tile_htile_wr   r   r   r   r   r   x_tiles	            r   method_monkey_elephant_tilingr      s    [[Aq!1773FEE!gw9:EQ6" R!Q' 	RDvq)Fvq)E1avG';!;TEAPWKDW=WWXF3488FAq3QF1aVT%Z/0		RR Mr+   c                      t        j                  t        t        t        ft
              } t        j                  t        d      }t        j                  d| |      }|j                  t        t        t        t              S )Nr0   r2   zbpl,kp->bkl)r%   r4   r'   r5   r6   r)   r(   r7   r8   r   einsumr;   r<   r=   patcheskernelsr@   s      r   method_krishna_einsumr      sO    hhqr2h@Gii2G
,,}gw
7C;;q!Q""r+   c                      t               S r|   )r   r*   r+   r   method_krishna_einsum_v2r      s     ""r+   c                  8   t        j                  t        t        t        ft
              } t        j                  t        d      }| j                  dd      |j                         z  }|j                  dd      j                  t        t        t        t              S r/   r3   r   s      r   method_lotus_gemmr      sg    hhqr2h@Gii2G


Aq
!GIIK
/C==A&&q!Q22r+   c                  J    t        j                  t        t        t              S r!   r$   r*   r+   r   method_abacus_strassenr      r-   r+   c                  J    t        j                  t        t        t              S r!   r$   r*   r+   r   method_gunita_precomputedr      r-   r+   c                      t        j                  t        j                         t        j                         t
              S r!   )r%   r&   r'   r`   r(   r)   r*   r+   r   method_memory_palacer      s!    88ALLNALLNGDDr+   c                  D   t        j                  t        t        t        t
        t        j                        } t        t        j                  t        dd      t        j                  t        dd            D ]$  \  }}| t        j                  ||t              z  } & | S )Nr   r   r
   rP   r"   )r   zerosr;   r8   r<   r=   r'   r   zipchunkr(   r%   r&   r)   )r   x_chunkw_chunks      r   method_triangular_fft_hybridr      sn    [[Aq!1773FAqa 8%++aPQ:RS >!((7GW==>Mr+   c                  J    t        j                  t        t        t              S r!   r$   r*   r+   r   method_vedic_cross_correlationr      rD   r+   c                      t         j                         j                         dz  } t        j                  t
        t         t         j                         | kD  z  t              S )Ng      ?r"   )r(   absmeanr%   r&   r'   r)   )	thresholds    r   method_nikhilam_sparser      s;    $I88AqAEEGi/0'BBr+   c                  J    t        j                  t        t        t              S r!   r$   r*   r+   r   method_dhwajank_treer      r-   r+   c            	      @   d} t        j                  t        | d      }t        j                  t        | d      }t	        ||      D cg c]!  \  }}t        j                  ||t              # }}}t        j                  |d      j                  d      S c c}}w )Nr   r
   rP   r"   r   )
r   r   r'   r(   r   r%   r&   r)   stacksum)ro   x_groupsw_groupsx_gw_gpartialss         r   method_paravartya_groupedr      s|    F{{1f!,H{{1f!,HDGRZD[\Sc73\H\;;xQ'+++22 ]s   
&Bc                      t               S r|   )r   r*   r+   r   method_ultimater      s    r+   c                     t        d       t        d       t        d       t        j                         5  t               } dt        fdt
        fdt        fdt        fdt        fd	t        fd
t        fdt        fdt        fdt        fdt        fdt        fdt         fdt"        fg}|D ]q  \  }}	  |       }t        j$                  | |dd      }| |z
  j'                         j)                         j+                         }|rdnd|dd}t        |dd|        s 	 d d d        y # t,        $ r}t        |dd|        Y d }~d }~ww xY w# 1 sw Y   y xY w)NzG
======================================================================z0VERIFICATION: selected exact methods vs baselinezF======================================================================zVedic im2colzNikhilam quantizedzDhwajank parallelzParavartya transposezAnurupyena depthwisezChakra blockingzFFT convolutionzCoconut parallelzMonkey-Elephant tilingzKrishna einsumz
Lotus GEMMzMemory palacezVedic cross-correlationzParavartya groupedgMbP?)rtolatolOKzFAIL (max diff z.2e)35r   z ERROR: )r   r   r   r,   rA   rC   r]   re   rj   r   r   r   r   r   r   r   r   r   allcloser   maxitem	Exception)	baseline_resultmethodsr   r   r   closemax_diffstatusexcs	            r   verify_methodsr      sz   	/	
<=	(O				 1"*01!#<= ":;#%@A#%?@ 67 67!89%'DE45,-23&(FG!#<=
" " 	1JD$1TPTU+f499;??AFFH!&ohs^1,Mb	6(+,	1'1 14  1b	#/00151 1s7   A7E.A+D%E%	E	.E?EE		EEc                     t        t        d       t        t        d       t        t        d       t        t        d       t        t
        d       t        t        d       t        t        dd	       t        t        d
d	       t        t        d       t        t        dd	       t        t        d       t        t        d       t        t        d       t        t        d       t        t        d       y )NzPyTorch Conv2d (baseline)zVedic im2col (manual unfold)zNikhilam quantized (int8)z$Dhwajank parallel (4 channel groups)zParavartya transpose layoutzAnurupyena depthwise separablezChakra multi-level blockingr	   )r   z"FFT convolution (frequency domain)z Coconut sellers (batch parallel)zMonkey-Elephant spatial tilingzKrishna einsum vectorizationzLotus GEMM (im2col)zMemory palace contiguouszParavartya grouped convolutionzUltimate (Lotus GEMM))r   r,   rA   rC   r]   re   rj   r   r   r   r   r   r   r   r   r   r*   r+   r   run_benchmarksr     s    h34!#AB')DE&(NO)+HI(*JK$&C!L$&JQRS%'IJ+-MTUV#%CD!67"$>?')IJo67r+   __main__)Method   r
   )   r   )r   r   )<r   concurrent.futuresr   numpyrS   r   torch.nnrs   torch.nn.functional
functionalr%   manual_seedrandomseedset_num_threadsrR   get_num_threadsr;   Cr<   r=   r8   r5   r6   r)   randnfloat32r'   r(   r   r,   rA   rC   r]   re   rg   rj   Modulerl   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r*   r+   r   <module>r      sp    1        "  		r    c!2U2245 6 
1a	2r
EKK1a%--0EKK1b"EMM2
+3+

#5++6ryy 6.
:++
	#
##3++E+
C
+3 1F8$ z r+   