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
15dbcac
master
1#pragma once 2 3#define CHECK (hr ) { const HRESULT __hr = ( hr ); if( FAILED( __hr ) ) return __hr; } 4#define CHECK_LOG (hr ) { const HRESULT __hr = ( hr ); if( FAILED( __hr ) ) { logErrorHr(__hr, u8"%s failed", #hr ); return __hr; } } 5 6inline void check (HRESULT hr ) 7{ 8if (SUCCEEDED (hr ) ) 9return ; 10throw hr ; 11} 12 13inline __m128i __vectorcallload16 (const int * rsi ) 14{ 15return _mm_loadu_si128 ( (const __m128i * )rsi ); 16} 17inline __m128i __vectorcallload16 (const uint32_t * rsi ) 18{ 19return _mm_loadu_si128 ( (const __m128i * )rsi ); 20} 21inline __m128i __vectorcallload (const std ::array < uint32_t ,4 >& arr ) 22{ 23return load16 (arr .data () ); 24} 25inline void __vectorcallstore16 (void * rdi ,__m128i v ) 26{ 27_mm_storeu_si128 ( (__m128i * )rdi ,v ); 28} 29inline void __vectorcallstore12 (void * rdi ,__m128i v ) 30{ 31_mm_storel_epi64 ( (__m128i * )rdi ,v ); 32 ( (int * )rdi )[2 ]= _mm_extract_epi32 (v ,2 ); 33} 34inline void __vectorcallstore (std ::array < uint32_t ,4 >& arr ,__m128i v ) 35{ 36store16 (arr .data (),v ); 37} 38inline bool __vectorcallvectorEqual (__m128i a ,__m128i b ) 39{ 40__m128i xx = _mm_xor_si128 (a ,b ); 41return (bool )_mm_testz_si128 (xx ,xx ); 42} 43 44inline __m128i __vectorcallsetLow_size (size_t low ) 45{ 46return _mm_cvtsi64_si128 ( (int64_t )low ); 47} 48inline __m128i __vectorcallsetr_size (size_t low ,size_t high ) 49{ 50__m128i v = setLow_size (low ); 51v = _mm_insert_epi64 (v , (int64_t )high ,1 ); 52return v ; 53} 54inline __m128i __vectorcallsetHigh_size (size_t high ) 55{ 56__m128i v = _mm_setzero_si128 (); 57v = _mm_insert_epi64 (v , (int64_t )high ,1 ); 58return v ; 59} 60 61void setCurrentThreadName (const char * name ); 62 63inline HRESULT getLastHr () 64{ 65return HRESULT_FROM_WIN32 (GetLastError () ); 66} 67 68// Scale time in seconds from unsigned 64 bit rational number ( mul / div ) into 100-nanosecond ticks 69// These 100-nanosecond ticks are used in NTFS, FILETIME, .NET standard library, media foundation, and quite a few other places 70inline uint64_t makeTime (uint64_t mul ,uint64_t div ) 71{ 72mul *=10'000'000 ; 73mul += ( (div /2 )- 1 ); 74return mul /div ; 75} 76 77template < class E > 78inline size_t vectorMemoryUse (const std ::vector < E >& vec ) 79{ 80return sizeof (E )* vec .capacity (); 81} 82 83// The formula is pow( mul / div, -0.25 ) 84float computeScaling (int mul ,int div );