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

KonstantinMinor, micro-optimization15dbcac

master
2.2 KiB84 linesraw
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{
8	if( SUCCEEDED( hr ) )
9		return;
10	throw hr;
11}
12
13inline __m128i __vectorcall load16( const int* rsi )
14{
15	return _mm_loadu_si128( ( const __m128i* )rsi );
16}
17inline __m128i __vectorcall load16( const uint32_t* rsi )
18{
19	return _mm_loadu_si128( ( const __m128i* )rsi );
20}
21inline __m128i __vectorcall load( const std::array<uint32_t, 4>& arr )
22{
23	return load16( arr.data() );
24}
25inline void __vectorcall store16( void* rdi, __m128i v )
26{
27	_mm_storeu_si128( ( __m128i* )rdi, v );
28}
29inline void __vectorcall store12( void* rdi, __m128i v )
30{
31	_mm_storel_epi64( ( __m128i* )rdi, v );
32	( (int*)rdi )[ 2 ] = _mm_extract_epi32( v, 2 );
33}
34inline void __vectorcall store( std::array<uint32_t, 4>& arr, __m128i v )
35{
36	store16( arr.data(), v );
37}
38inline bool __vectorcall vectorEqual( __m128i a, __m128i b )
39{
40	__m128i xx = _mm_xor_si128( a, b );
41	return (bool)_mm_testz_si128( xx, xx );
42}
43
44inline __m128i __vectorcall setLow_size( size_t low )
45{
46	return _mm_cvtsi64_si128( (int64_t)low );
47}
48inline __m128i __vectorcall setr_size( size_t low, size_t high )
49{
50	__m128i v = setLow_size( low );
51	v = _mm_insert_epi64( v, (int64_t)high, 1 );
52	return v;
53}
54inline __m128i __vectorcall setHigh_size( size_t high )
55{
56	__m128i v = _mm_setzero_si128();
57	v = _mm_insert_epi64( v, (int64_t)high, 1 );
58	return v;
59}
60
61void setCurrentThreadName( const char* name );
62
63inline HRESULT getLastHr()
64{
65	return 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{
72	mul *= 10'000'000;
73	mul += ( ( div / 2 ) - 1 );
74	return mul / div;
75}
76
77template<class E>
78inline size_t vectorMemoryUse( const std::vector<E>& vec )
79{
80	return sizeof( E ) * vec.capacity();
81}
82
83// The formula is pow( mul / div, -0.25 )
84float computeScaling( int mul, int div );