Shader di Calcolo su Hardware di Livello Inferiore
Direct3D 11 offre la possibilità di usare compute shader che operano sulla maggior parte dell'hardware Direct3D 10.x, con alcune limitazioni per l'operazione. La tecnologia compute shader è nota anche come tecnologia DirectCompute. Questo argomento illustra come usare compute shader in un'app Direct3D 11 nell'hardware Direct3D 10.
Il supporto per gli shader di calcolo nell'hardware di livello inferiore è solo per i dispositivi compatibili con Direct3D 10.x. Non è possibile usare gli shader di calcolo nell'hardware Direct3D 9.x.
Per verificare se l'hardware Direct3D 10.x supporta gli shader di calcolo, chiamare ID3D11Device::CheckFeatureSupport. Nella chiamata CheckFeatureSupport, passare il valore D3D11_FEATURE_D3D10_X_HARDWARE_OPTIONS al parametro Feature, passare un puntatore alla struttura D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS al parametro pFeatureSupportData e passare la dimensione della struttura D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS al parametro FeatureSupportDataSize. CheckFeatureSupport restituisce TRUE nel membro ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x di D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS se l'hardware Direct3D 10.x supporta i compute shader.
La sezione 10Level9 Reference elenca le differenze tra il comportamento dei vari metodi di ID3D11Device e ID3D11DeviceContext a vari livelli di funzionalità 10Level9.
- viste di accesso non ordinate (UAV)
- viste delle risorse shader
-
Gruppi di Thread
- dimensioni del gruppo di thread
- Two-Dimensional Indici di thread
- TGSM (Thread Group Shared Memory)
- D3DCompile con D3DCOMPILE_SKIP_OPTIMIZATION
- argomenti correlati
Viste di accesso non ordinate (UAV)
Raw (RWByteAddressBuffer) e Structured (RWStructuredBuffer) Le viste di accesso non ordinate sono supportate nell'hardware di livello inferiore, con le limitazioni seguenti:
- Solo un UAV può essere collegato a una pipeline alla volta tramite ID3D11DeviceContext::CSSetUnorderedAccessViews.
- L'offset di base per un UAV non elaborato deve essere allineato su un limite di 256 byte (anziché l'allineamento a 16 byte richiesto per l'hardware Direct3D 11).
Gli UAV tipizzato non sono supportati nell'hardware di livello inferiore. Sono inclusi Texture1D, Texture2De Texture3D UAV.
I pixel shader nell'hardware di livello inferiore non supportano l'accesso non ordinato.
Visualizzazioni risorse shader (SRV)
I buffer grezzi e strutturati come viste delle risorse dello shader vengono supportati sull'hardware meno recente per l'accesso in sola lettura, così come sull'hardware Direct3D 11. Questi tipi di risorse sono supportati per vertex shader, geometry shader, pixel shader e compute shader.
Gruppi di thread
Un compute shader può essere eseguito in molti thread in parallelo, all'interno di un gruppo di thread.
I gruppi di thread sono supportati nell'hardware di livello inferiore, con le limitazioni seguenti:
Dimensioni del gruppo di thread
I gruppi di thread definiti per l'hardware di livello inferiore sono limitati alle dimensioni X e Y di 768. Questo valore è inferiore ai valori massimi di 1024 per l'hardware Direct3D 11. La dimensione Z massima di 64 è invariata.
Il numero totale di thread nel gruppo (X × Y × Z) è limitato a 768. Questo valore è inferiore al limite di 1024 per l'hardware Direct3D 11.
Se questi numeri vengono superati, la compilazione dello shader avrà esito negativo.
indici di thread Two-Dimensional
Un thread specifico all'interno di un gruppo di thread viene indicizzato usando un vettore 3D specificato da (x,y,z).
Per gli shader di calcolo che operano su hardware di livello inferiore, i gruppi di thread supportano solo due dimensioni. Ciò significa che il valore Z nel vettore 3D deve essere sempre 1.
Questa limitazione si applica in modo specifico ai seguenti:
- ID3D11DeviceContext::Dispatch— L'argomento ThreadGroupCountZ deve essere 1.
- ID3D11DeviceContext::DispatchIndirect: questa funzione non è supportata sull'hardware downlevel.
- numthreads: il valore Z deve essere 1.
Memoria condivisa del gruppo di thread (TGSM)
La memoria condivisa del gruppo di thread è limitata a 16 KB nell'hardware di livello inferiore. Questo valore è inferiore a 32 Kb disponibile per l'hardware Direct3D 11.
Un thread compute shader può scrivere solo nella propria area di TGSM. Questa area di sola scrittura ha una dimensione massima di 256 byte o minore, con la riduzione massima in base all'aumento del numero di thread dichiarati per il gruppo.
La tabella seguente definisce le dimensioni massime per thread di un'area TGSM per il numero di thread nel gruppo:
Numero di thread nel gruppo | Dimensione massima di TGSM per thread |
---|---|
0-64 | 256 |
65-68 | 240 |
69-72 | 224 |
73-76 | 208 |
77-84 | 192 |
85-92 | 176 |
93-100 | 160 |
101-112 | 144 |
113-128 | 128 |
129-144 | 112 |
145-168 | 96 |
169-204 | 80 |
205-256 | 64 |
257-340 | 48 |
341-512 | 32 |
513-768 | 16 |
Un thread compute shader può leggere il TGSM da qualsiasi posizione.
D3DCompile con D3DCOMPILE_SKIP_OPTIMIZATION
D3DCompile restituisce E_NOTIMPL quando si passa cs_4_0 come destinazione dello shader insieme all'opzione di compilazione D3DCOMPILE_SKIP_OPTIMIZATION. La destinazione dello shader cs_5_0 funziona con D3DCOMPILE_SKIP_OPTIMIZATION.
Argomenti correlati