Compute Shader nell'hardware a livello inferiore
Direct3D 11 offre la possibilità di usare gli shader di calcolo 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 gli shader di calcolo in un'app Direct3D 11 nell'hardware Direct3D 10.
Il supporto per gli shader di calcolo nell'hardware a livello inferiore è solo per i dispositivi compatibili con Direct3D 10.x. Impossibile usare gli shader di calcolo nell'hardware Direct3D 9.x.
Per verificare se Direct3D 10.x hardware 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 strutturaD3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS al parametro pFeatureSupportData e passare le dimensioni 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 gli shader di calcolo.
La sezione Riferimenti 10Level9 elenca le differenze tra i vari metodi ID3D11Device e ID3D11DeviceContext a vari livelli di funzionalità 10Level9.
- Visualizzazioni di accesso non ordinate (UAV)
- Visualizzazioni risorse shader (SRV)
- Gruppi di thread
- D3DCompile con D3DCOMPILE_SKIP_OPTIMIZATION
- Argomenti correlati
Visualizzazioni di accesso non ordinate (UAV)
Le visualizzazioni di accesso non ordinate (RWByteAddressBuffer) e Strutturate (RWStructuredBuffer) sono supportate nell'hardware a livello inferiore, con le limitazioni seguenti:
- Solo un singolo UAV può essere associato a una pipeline alla volta tramite ID3D11DeviceContext::CSSetUnorderedAccessViews.
- L'offset di base per un UAV non elaborato deve essere allineato a un limite di 256 byte (anziché l'allineamento a 16 byte richiesto per l'hardware Direct3D 11).
Le UAV digitate non sono supportate nell'hardware a livello inferiore. Include Texture1D, Texture2D e Texture3D UAV.
Pixel Shader nell'hardware a livello inferiore non supporta l'accesso non ordinato.
Visualizzazioni risorse shader (SRV)
I buffer non elaborati e strutturati come visualizzazioni risorse shader sono supportati nell'hardware a livello inferiore per l'accesso in sola lettura, poiché sono in hardware Direct3D 11. Questi tipi di risorse sono supportati per Vertex Shader, Geometry Shader, Pixel Shader e Compute Shader.
Gruppi di thread
Un shader di calcolo può essere eseguito in molti thread in parallelo, all'interno di un gruppo di thread.
I gruppi di thread sono supportati nell'hardware a livello inferiore, con le limitazioni seguenti:
Dimensioni del gruppo di thread
I gruppi di thread definiti per l'hardware a livello inferiore sono limitati alle dimensioni X e Y di 768. Questo valore è minore dei 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 è minore del limite di 1024 per l'hardware Direct3D 11.
Se questi numeri vengono superati, la compilazione 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 sull'hardware a 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::D ispatch: l'argomento ThreadGroupCountZ deve essere 1.
- ID3D11DeviceContext::D ispatchIndirect: questa funzione non è supportata nell'hardware a livello inferiore.
- 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 a livello inferiore. Questo è minore di 32 Kb disponibile per l'hardware Direct3D 11.
Un thread di 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 al 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 | Dimensioni massime 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 di 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 shader insieme all'opzione di compilazione D3DCOMPILE_SKIP_OPTIMIZATION . La destinazione cs_5_0 shader funziona con D3DCOMPILE_SKIP_OPTIMIZATION.
Argomenti correlati