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#include "stdafx.h" 2#include "TempBuffers.h" 3#include "../D3D/createBuffer.h" 4#include "../D3D/MappedResource.h" 5#include "../D3D/shaders.h" 6using namespace DirectCompute ; 7 8#define CHECK (hr ) { const HRESULT __hr = ( hr ); if( FAILED( __hr ) ) return __hr; } 9 10HRESULT TempBuffers ::Buffer ::resize (DXGI_FORMAT format ,size_t elements ,size_t cbElement ,bool zeroMemory ,CComPtr < ID3D11Buffer >& cb ) 11{ 12if (elements <=capacity ) 13 { 14if (zeroMemory ) 15TempBuffers ::zeroMemory (* this , (uint32_t )elements ,cb ); 16return S_OK ; 17 } 18clear (); 19 20CComPtr < ID3D11Buffer > buffer ; 21const size_t totalBytes = elements * cbElement ; 22CHECK (createBuffer ( eBufferUse::ReadWrite ,totalBytes ,& buffer ,nullptr ,nullptr ) ); 23CHECK (TensorGpuViews ::create (buffer ,format ,elements , true ) ); 24capacity = elements ; 25return S_OK ; 26} 27 28void TempBuffers ::zeroMemory (ID3D11UnorderedAccessView * uav ,uint32_t length ,CComPtr < ID3D11Buffer >& cb ) 29{ 30const __m128i cbData = _mm_cvtsi32_si128 ( (int )length ); 31if (cb ) 32 { 33MappedResource mapped ; 34check (mapped .map (cb , false ) ); 35store16 (mapped .data (),cbData ); 36 } 37else 38 { 39CD3D11_BUFFER_DESC desc {16 ,D3D11_BIND_CONSTANT_BUFFER ,D3D11_USAGE_DYNAMIC ,D3D11_CPU_ACCESS_WRITE }; 40 std::array < uint32_t ,4 > cbBuffer ; 41store (cbBuffer ,cbData ); 42D3D11_SUBRESOURCE_DATA srd {cbBuffer .data (),0 ,0 }; 43check (device ()-> CreateBuffer (& desc ,& srd ,& cb ) ); 44 } 45 46ID3D11DeviceContext * ctx = context (); 47ctx -> CSSetUnorderedAccessViews (0 ,1 ,& uav ,nullptr ); 48csSetCB (cb ); 49 50constexpr uint32_t THREADS = 512 ; 51constexpr uint32_t ITERATIONS = 128 ; 52constexpr uint32_t elementsPerGroup = THREADS * ITERATIONS ; 53const uint32_t countGroups = (length + elementsPerGroup - 1 ) /elementsPerGroup ; 54bindShader ( eComputeShader::zeroMemory ); 55ctx -> Dispatch (countGroups ,1 ,1 ); 56} 57 58const TensorGpuViews & TempBuffers ::fp16 (size_t countElements ,bool zeroMemory ) 59{ 60HRESULT hr = m_fp16 .resize (DXGI_FORMAT_R16_FLOAT ,countElements ,2 ,zeroMemory ,smallCb ); 61if (FAILED (hr ) ) 62throw hr ; 63return m_fp16 ; 64} 65 66const TensorGpuViews & TempBuffers ::fp16_2 (size_t countElements ,bool zeroMemory ) 67{ 68HRESULT hr = m_fp16_2 .resize (DXGI_FORMAT_R16_FLOAT ,countElements ,2 ,zeroMemory ,smallCb ); 69if (FAILED (hr ) ) 70throw hr ; 71return m_fp16_2 ; 72} 73 74const TensorGpuViews & TempBuffers ::fp32 (size_t countElements ,bool zeroMemory ) 75{ 76HRESULT hr = m_fp32 .resize (DXGI_FORMAT_R32_FLOAT ,countElements ,4 ,zeroMemory ,smallCb ); 77if (FAILED (hr ) ) 78throw hr ; 79return m_fp32 ; 80} 81 82__m128i TempBuffers ::getMemoryUse ()const 83{ 84size_t cb = m_fp16 .getCapacity ()* 2 ; 85cb += m_fp16_2 .getCapacity ()* 2 ; 86cb += m_fp32 .getCapacity ()* 4 ; 87return setHigh_size (cb ); 88}