Vulkan: buffer uniformi rispetto a costanti push per dati statici


8

Faccio fatica a capire la differenza concettuale tra buffer uniformi e costanti push. Da quello che posso raccogliere leggendo le specifiche, le differenze principali sono:

  1. I buffer uniformi possono essere molto più grandi delle costanti push.
  2. Gli UBO usano std140, i PC usano std430.
  3. Gli UBO possono essere aggiornati in qualsiasi momento con vkCmdUpdateBuffer (o mappatura host) e persistono i loro valori in caso contrario, i PC devono essere rinviati per ogni passaggio di rendering. (Il che mi ha sorpreso - in base al nome. Pensavo che avrei letteralmente aggiornato le costanti nella pipeline sul posto e che quei cambiamenti persistessero)

Nel mio scenario, ho circa ~ 200 byte di dati che mi aspetto siano per lo più costanti . Cioè, li cambierò molto raramente. Sarebbe meglio (supponendo le dimensioni consentite) usare le costanti push anche se devo rispedirle in ogni buffer di comando? O sarebbe meglio usare un UBO a 200 byte e aggiornarlo di rado con vkCmdUpdatebuffer?

Anche. cosa succede se ho, ad esempio, un float random_seedaggiornamento che aggiornerò ogni volta che lo shader viene eseguito? Supponendo che io abbia già un UBO, sarebbe meglio raggrupparlo con l'UBO, anche se il resto dell'UBO è costante, o trarrebbe beneficio dall'uso delle costanti push in particolare per questa variabile, quindi posso evitare di dover vkCmdUpdateBuffer prima di ogni passaggio di rendering?


Benvenuti nel sito di scambio di stack di computer grafica! Non conosco Vulkan ma sembra che usare un UBO sarebbe più efficiente nel tuo caso (puoi provare a confrontare le prestazioni di entrambi gli approcci in un programma di esempio). Con quali API grafiche hai familiarità? Inoltre potresti essere interessato a questa presentazione del GDC 2012: non buttare via tutto: gestione efficiente del buffer
pulire il

Dalla documentazione Vulkan : mentre un UBO alloca un blocco di memoria video sulla GPU (che è possibile aggiornare in un momento successivo), la Costante Push non utilizza la memoria video (motivo per cui deve essere fornita durante ogni chiamata di disegno / calcolo, altrimenti lo shader non saprebbe quale valore usare). Immagino che sia archiviato in un'altra area di archiviazione veloce a breve termine sulla GPU, anche se i dettagli potrebbero dipendere dal tuo fornitore di GPU.
pulire il

Risposte:


8

Gli UBO possono essere aggiornati in qualsiasi momento con vkCmdUpdateBuffer

Dalla specifica: "vkCmdUpdateBuffer è consentito solo al di fuori di un passaggio di rendering." Quindi "in qualsiasi momento" non è il caso.

Anche se è stato consentito all'interno di un passaggio di rendering, è comunque un'operazione di trasferimento. Ciò significa che è necessario sincronizzare il trasferimento di memoria con i comandi che lo utilizzano. Che rallenta le prestazioni.

Per la cosa generale Push Constant vs. Uniform, usa il tuo giudizio. Per "giudizio", intendo solo guardare come funzionano. Le costanti push consentono di modificare i propri dati in qualsiasi momento senza eseguire processi pesanti come operazioni di memoria, sincronizzazione o modifica dello stato del descrittore. Chiaramente, sono per i dati che cambiano frequentemente. Quanto spesso è "frequentemente"? Bene, questa è una chiamata di giudizio.

In caso contrario, profila la differenza di prestazioni.


2

Ho circa ~ 200 byte di dati che mi aspetto siano per lo più costanti. Cioè, li cambierò molto raramente.

Se i dati cambiano raramente, è possibile utilizzare Costanti di specializzazione . Vengono impostati al momento della creazione della pipeline e se è necessario modificare i valori è necessario creare una nuova pipeline. Per un evento raro, come un ridimensionamento della finestra, questo può essere un costo accettabile.

cosa succede se ad esempio ho un float random_seed che aggiornerò ogni volta che lo shader viene eseguito?

È un caso d'uso perfetto per le Costanti Push. È possibile conservare tutti gli altri dati nell'UBA (o nelle Costanti di specializzazione) e modificare questo valore con VkCmdPushConstants.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.