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

KonstantinSource codes8c4603c

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