2016-04-05 23 views
9

Sto cercando di capirlo, ma sto diventando un po 'bloccato.Qualcuno potrebbe aiutarmi a capire VkPhysicalDeviceMemoryProperties?

Il modo in cui i tipi e gli heap sono correlati è semplice, anche se un po 'strano. (Perché non solo dare VkMemoryHeap un membro VkMemoryType?)

credo di aver capito che cosa tutto il VkMemoryPropertyFlags media, sembrano abbastanza semplice.

Ma cosa succede al membro VkMemoryHeap.flags? Apparentemente ha solo un valore valido diverso da zero, VkMemoryHeapFlagBits.VK_MEMORY_HEAP_DEVICE_LOCAL_BIT, e anche se non sarebbe troppo strano, ma c'è anche un VkMemoryPropertyFlagBits.VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT che potrebbe essere presente sul tipo di memoria dell'heap.

Che cosa significa il membro VkMemoryHeap.flags e in che modo si riferisce al membro VkMemoryType.flags?

+0

Ho avuto la stessa identica domanda dopo aver letto quella sezione, e evviva! È già stato chiesto e risposto! –

risposta

12

Vulkan riconosce due concetti distinti quando si tratta di memoria. Ci sono i pezzi fisici reali di RAM con cui il dispositivo può parlare. Quindi ci sono vie per allocare memoria da uno di quei pool di RAM.

Un heap rappresenta un pezzo specifico di RAM. VkMemoryHeap è l'oggetto che descrive uno degli heap di RAM disponibili a cui il dispositivo può comunicare. Non ci sono davvero molte cose che definiscono un mucchio particolare. Solo due: il numero di byte di quella memoria RAM e la posizione dello storage relativa al dispositivo Vulkan (locale e non locale).

Un tipo di memoria è un particolare significa di allocare memoria da un heap specifico. VkMemoryType è l'oggetto che descrive un modo particolare di allocare memoria. E ci sono molti altri flag descrittivi su come allocare memoria da un heap.

Per un esempio più concreto, prendere in considerazione una configurazione PC standard con una GPU discreta. Il dispositivo ha una propria RAM locale, ma la GPU discreta può anche accedere alla memoria della CPU. Quindi un dispositivo Vulkan avrà due heap: uno sarà locale, l'altro non locale.

Tuttavia, di solito ci sono più di due tipi di memoria . Di solito hai un tipo di memoria che rappresenta la memoria locale, che non ha il set VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT. Ciò significa che non puoi mappare la memoria; puoi accedervi solo tramite operazioni di trasferimento da un altro tipo di memoria (o da operazioni di rendering o altro).

Ma spesso si hanno due tipi di memoria che utilizzano entrambi lo stesso heap non locale. Entrambi saranno VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, consentendo così la mappatura. Tuttavia, uno di essi avrà probabilmente il flag VK_MEMORY_PROPERTY_HOST_CACHED_BIT impostato, mentre l'altro sarà VK_MEMORY_PROPERTY_HOST_COHERENT_BIT. Ciò consente di scegliere se si desidera l'accesso alla cache memorizzato nella cache (che richiede quindi un flusso esplicito di intervalli di memoria modificata) o l'accesso alla CPU non collegato.

Ma mentre sono due tipi di memoria separati, entrambi allocano dallo stesso heap. Questo è il motivo per cui VkMemoryType ha un indice che fa riferimento all'heap di cui si sta allocando la memoria.


unica cosa che non sto ottenendo è come le due bandiere DEVICE_LOCAL interagiscono.

Hai visto le specifiche? Non è esattamente nascondendo come funziona:

se propertyFlags ha la VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT bit impostato, memoria allocata con questo tipo è il più efficiente per l'accesso al dispositivo. Questa proprietà verrà impostata solo per i tipi di memoria appartenenti agli heap con il set VK_MEMORY_HEAP_DEVICE_LOCAL_BIT.

Sta dicendo che se la memoria è locale allora tutti i tipi corrispondenti a quella memoria sono locali o possono essere locali?

Sembra che tu stia cercando di imporre il significato sbagliato a queste cose. Basta vedere cosa dice la specifica e prenderla al valore nominale.

PROPERTY_DEVICE_LOCAL indica un tipo di memoria che consente di ottenere le migliori prestazioni di accesso al dispositivo. L'unica connessione tra questo e MEMORY_DEVICE_LOCAL è che i tipi di memoria con PROPERTY_DEVICE_LOCAL verranno associati solo agli heap di memoria che utilizzano MEMORY_DEVICE_LOCAL.

Questo è l'unico significato rilevante qui.

Se si desidera un esempio di quando un heap di memoria è un dispositivo locale, e tuttavia ha tipi di memoria che non lo sono, si consideri una GPU che non ha memoria propria. C'è solo un heap, che è quindi MEMORY_DEVICE_LOCAL.

Tuttavia, allocare memoria da quel pool in modo da renderlo visibile all'host può ridurre le prestazioni dell'accesso del dispositivo a tale memoria. Pertanto, for such hardware, i tipi di memoria visibile host per lo stesso heap non verranno utilizzati PROPERTY_DEVICE_LOCAL.

Quindi, ancora una volta, other hardware non perde prestazioni rendendo l'host di memoria visibile. Quindi hanno solo un tipo di memoria, che ha tutte le proprietà disponibili. Per Intel, le loro GPU su chip apparentemente hanno accesso a un certo livello di cache della CPU.

+0

Seguito rapido, sarebbe corretto dire che se l'heap non ha il flag 'VK_MEMORY_HEAP_DEVICE_LOCAL_BIT', allora nessun tipo di memoria ad esso associato può avere il flag' VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT' impostato? L'unica cosa che non capisco è come interagiscono i due flag 'DEVICE_LOCAL'. – AlphaModder

+0

@AlphaModder: aggiornato. –

+0

Whoops, in qualche modo lo perse. Sta dicendo che se la memoria è locale allora tutti i tipi corrispondenti a quella memoria sono locali, o che possono essere locali? – AlphaModder