`

DirectCompute

 
阅读更多

 DirectCompute网上各种介绍,特性很简单就是用GPU进行计算,注意资源并不是从管线里面获取的。

 

创建:

1.编译:D3DCompileFromFile

2.创建:ID3D11Device :: CreateComputeShader

 

资源(dx) :

CSSetConstantBuffers :设置恒定的缓冲区所使用的计算着色器的阶段。

CSSetSamplers :设置一个数组,计算着色器阶段的采样状态。

CSSetShader :设置一个计算着色到该设备。

CSSetShaderResources :数组绑定的着色器资源的计算着色器阶段。

CSSetUnorderedAccessViews :设置一个数组,无序的资源的观点。

除增加一个无序的view其他的跟别的shader一样。

资源(hlsl) :

RWBuffer

RWTexture1DRWTexture1DArray

RWTexture2DRWTexture2DArray

RWTexture3D

StructuredBuffer

RWStructuredBuffer

由于之前都是只读的,为CS增加了一组读写的。

 

执行:

ID3D11DeviceContext::Dispatch :一个三维的阵列,记录着要调度的线程组的次数。

ID3D11DeviceContext::DispatchIndirect

// C++ application code 
pImmediateContext->Dispatch(Width / THREADSX, Height / THREADSY, 1 ); 

// HLSL compute shader code 
[numthreads(THREADSX, THREADSY, 1)] 
void CS_QJulia4D( uint3 Gid : SV_GroupID, uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint GI : SV_GroupIndex )

的Dispatch的参数与hlsl里面的numthreads是有联系的,表示的是线程组X,Y,Z三个维度的数组,目前shader model5 是x :1024 y:1024 z:64 超出就废了。

 

系统语义:

SV_GroupID :一个xyz三维向量,描述的是当前线程组在整个调度中的位置[0,n-1]

SV_GroupThreadID :一个xyz的三维向量,记录当前线程在线程组中的三维位置[0,n-1]

SV_DispatchThreadID :一个xyz的三维向量,它记录的是当前线程在整个调度中的位置,如果说groupthreadID是相对当前线程组的,那么dispatchthreadID就是全局的一个位置。

SV_GroupIndex :它是一个索引,记录当前线程在当前线程组中的索引位置,它是一维的。

 

下图显示了关系之间的参数传递给ID3D11DeviceContext::Dispatch,调度(5,3,2),指定的值在numthreads属性,numthreads(10,8,3),和值将传递到计算着色器线程相关的系统的值(SV_GroupIndex,SV_DispatchThreadIDSV_GroupThreadIDSV_GroupID)。

插图调度,线程组和线程之间的关系

 

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics