Устройство для копирования устройства в Vulkan - PullRequest
0 голосов
/ 03 октября 2018

Я хочу скопировать изображение / буфер между двумя графическими процессорами / физическими устройствами в моем приложении Vulkan (один vkInstance, два vkDevice с).Это возможно без размещения изображения на процессоре или есть такая функция, как CUDA p2p?Как бы это выглядело?

Если требуется размещение на хосте, какой метод будет оптимальным для этого?

1 Ответ

0 голосов
/ 03 октября 2018

есть ли такая функция, как CUDA p2p?

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

Возможно ли это без размещения изображения на процессоре

Если ваши устройства не поддерживают extenson VK_KHR_device_group, то нет.Вы должны передать содержимое через ЦП и системную память.

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

Вам нужно будет выполнить 3 операции с ручной синхронизацией.

  • НаИсходный графический процессор выполняет копирование из локального буфера устройства в видимый буфер хоста для того же устройства.

  • При копировании ЦП из видимого буфера исходного хоста графического процессора в целевой хост графического процессора.видимый буфер

  • На целевой копии графического процессора скопируйте из видимого хоста буфера в локальный буфер устройства

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

Если требуется размещение на хосте, какой метод будет оптимальным для этого?

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

Если вы передаете буферы, то, вероятно, вам не о чем беспокоиться с точки зрения оптимальной передачи, но если вы работаете с изображениями, то вам придется столкнуться с целым беспорядком мозаичного изображения линейных и оптимальных изображений.Во избежание этого я бы предложил использовать для размещения промежуточные буферы, видимые для хоста, независимо от того, передаете ли вы изображения или буферы, и поэтому используйте vkCmdCopyImageToBuffer и vkCmdCopyBufferToImage для передачи между локальным устройством и видимым хостом.память * 1 050 *

...