yum-archive/TaSTT-Whisper
High-performance GPGPU inference of OpenAI's Whisper automatic speech recognition (ASR) model
git clone https://git.yummers.dev/yum-archive/TaSTT-Whisper
8c4603c
master
1// Matrix * row product, like [ E0, E1, E2, E3 ] * [ E0, 1, E2, E3 ] = [ E1, 1, E2, E3 ] 2// Dispatch [ E1, E2, E3 ] groups of this shader 3Buffer < float > arg0 :register ( t0 ); 4Buffer < float > arg1 :register ( t1 ); 5RWBuffer < float > result :register ( u0 ); 6 7cbuffer Constants :register ( b0 ) 8{ 9uint4 arg0Size :packoffset ( c0 ); 10uint4 arg0Strides :packoffset ( c1 ); 11uint4 arg1Size :packoffset ( c2 ); 12uint4 arg1Strides :packoffset ( c3 ); 13uint4 resultSize :packoffset ( c4 ); 14uint4 resultStrides :packoffset ( c5 ); 15} 16 17#include "groupReduce.hlsli" 18 19inline uint hadd ( uint3 vec ) 20{ 21return vec . x + vec . y + vec . z ; 22} 23inline uint hadd ( uint2 vec ) 24{ 25return vec . x + vec . y ; 26} 27 28[ numthreads ( 32 , 1 , 1 ) ] 29void main ( uint3 group : SV_GroupID , uint thread : SV_GroupIndex ) 30{ 31uint s0 = hadd ( group * arg0Strides . yzw ); 32uint s1 = hadd ( group . yz * arg1Strides . zw ); 33const uint s0End = s0 + arg0Size . x * arg0Strides . x ; 34const uint s0Inc = 32 * arg0Strides . x ; 35const uint s1Inc = 32 * arg1Strides . x ; 36 37s0 += thread * arg0Strides . x ; 38s1 += thread * arg1Strides . x ; 39float dp = 0 ; 40for ( ; s0 < s0End ; s0 += s0Inc , s1 += s1Inc ) 41dp = mad ( arg0 [ s0 ], arg1 [ s1 ], dp ); 42 43horizontalSum ( thread , dp ); 44if ( 0 != thread ) 45return ; 46 47const uint rdi = group . x + hadd ( group . yz * resultStrides . zw ); 48result [ rdi ] = dp ; 49}