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// ggml_compute_forward_soft_max_f32 2// Dispatch [ ( nr + 31 ) / 32, 1, 1 ] thread groups of this shader 3RWBuffer < float > result :register ( u0 ); 4 5// table_exp_f16 6Buffer < uint > lookupTable :register ( t0 ); 7 8cbuffer Constants :register ( b0 ) 9{ 10uint4 elements :packoffset ( c0 ); 11uint4 strides :packoffset ( c1 ); 12uint nr :packoffset ( c2 . x ); 13} 14 15#include "miscUtils.hlsli" 16#include "fp64Utils.hlsli" 17 18static const float negativeInfinity = asfloat ( 0xff800000 ); 19 20[ numthreads ( 32 , 1 , 1 ) ] 21void main ( uint3 dtid : SV_DispatchThreadID ) 22{ 23if ( dtid . x >= nr ) 24return ; 25 26const uint p = dtid . x * strides [ 1 ]; 27const uint nc = elements [ 0 ]; 28const uint pEnd = p + nc ; 29uint i ; 30 31float m = negativeInfinity ; 32for ( i = p ; i < pEnd ; i ++ ) 33m = max ( m , result [ i ] ); 34 35double sum = 0 ; 36for ( i = p ; i < pEnd ; i ++ ) 37{ 38float f = result [ i ]; 39 40[ branch ] 41if ( f != negativeInfinity ) 42{ 43uint s = fp16Rounded ( f - m ); 44s = lookupTable [ s ]; 45f = f16tof32 ( s ); 46sum += f ; 47} 48else 49f = 0 ; 50 51result [ i ] = f ; 52} 53 54const float scale = ( float ) div64 ( 1.0 , sum ); 55// ggml_vec_scale_f32 56for ( i = p ; i < pEnd ; i ++ ) 57{ 58float f = result [ i ]; 59f *= scale ; 60result [ i ] = f ; 61} 62}