Vulkan: одновременная запись хоста и чтение устройства в отдельные части одного и того же VkMemory

Чтобы передать свои статические данные в графический процессор, я думаю о том, чтобы иметь один промежуточный объект VkMemory (приблизительный размер 64 МБ) и использовать его как вращающуюся очередь. Однако у меня есть несколько потоков, создающих контент (например: рендеринг глифов, загрузка файлов, процедурный), и я бы хотел, чтобы они могли загружать свои данные полностью сами (т.е. писать плюс отправлять команды передачи Vulkan) .

Я намерен постоянно отображать всю промежуточную VkMemory (если это глупо, скажите так) по крайней мере во время загрузки (но, возможно, дольше, если я хочу передавать данные).

Для достижения вышеуказанного, как только данные потока будут полностью записаны / сброшены до промежуточной стадии, я бы хотел, чтобы он мог немедленно отправлять команды передачи графического процессора.

Однако это означает, что графический процессор будет читать из одной части VkMemory, в то время как другие потоки могут писать / сбрасывать в нее.

AFAIK мне также нужно будет использовать барьеры памяти изображений для перехода от VK_IMAGE_LAYOUT_PREINITIALIZED к VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL.

Я не смог найти ничего в спецификации, в котором прямо говорилось бы, что это законно или незаконно, только нужно позаботиться о синхронизации. Однако я не нашел достаточно подробностей, чтобы быть уверенным так или иначе.

ПРИМЕЧАНИЕ. Промежуточная очередь должна гарантировать завершение передачи перед перезаписью чего-либо - я намерен сохранить дополнительную очередь VkFences для этого.


Вопросы:

  1. Это нормально?
  2. Нужно ли выравнивать каждый отдельный объект по границе страницы? Или что-то другое.
  3. Правильно ли я предполагаю, что барьер памяти изображений (см. Выше) не потребует от устройства записи в промежуточную память.

person xaxazak    schedule 18.01.2017    source источник
comment
Для достижения вышеизложенного, как только данные потока будут полностью записаны / сброшены до промежуточной стадии, я бы хотел, чтобы он мог немедленно отправлять команды передачи графического процессора. Я настоятельно не рекомендую этого делать. Отправка команд GPU в очередь, даже просто копий, является тяжелой операцией. Было бы гораздо лучше объединить команды и отправить их все сразу в конце кадра. Для этой цели подойдет хорошая параллельная очередь с несколькими авторами.   -  person Nicol Bolas    schedule 19.01.2017


Ответы (1)


  1. да, в спецификации говорится о регионе, из которого выполняется чтение и запись в который необходимо синхронизировать.

  2. если память некогерентна, вы должны выровнять блоки, которые читаются или записываются в NonCoherentAtomSize

источник: Vulkan spec под примечанием после объявления vkMapMemory

vkMapMemory не проверяет, используется ли в настоящее время память устройства, прежде чем вернуть указатель, доступный для хоста. Приложение должно гарантировать, что любая ранее отправленная команда, которая выполняет запись в этот диапазон, была завершена до того, как хост считывает или записывает в этот диапазон, и что любая ранее отправленная команда, которая читает из этого диапазона, завершилась до того, как хост пишет в этот регион (подробности о выполнении такой гарантии см. здесь). Если память устройства была выделена без набора VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, эти гарантии должны быть предоставлены для расширенного диапазона: приложение должно округлить начало диапазона до ближайшего значения, кратного VkPhysicalDeviceLimits :: nonCoherentAtomSize, и округлить конец диапазона до ближайшее кратное VkPhysicalDeviceLimits :: nonCoherentAtomSize.

  1. переход макета может записывать в память, однако барьеры будут выполнять свою собственную синхронизацию в отношении предыдущих и последующих обращений к памяти.
person ratchet freak    schedule 19.01.2017