我想在 Vulkan 应用程序中的两个 GPU/物理设备之间复制图像/缓冲区(一个vkInstance
,两个vkDevice
)。如果不在 CPU 上暂存图像,这是否可行,或者是否有像 CUDA p2p 这样的功能?这看起来如何?
如果需要在主机上暂存,那么最佳方法是什么?
有没有像 CUDA p2p 这样的功能?
Vulkan 1.1 支持设备组的概念来涵盖这种情况。它允许您将一组物理设备视为单个逻辑设备,还允许您查询如何在设备组内操作内存,以及执行诸如在设备子集上分配内存之类的操作。检查完整功能集的规格。
这是否可以不暂存 CPU 上的图像
如果您的设备不支持扩展名VK_KHR_device_group
,则不支持。您必须通过 CPU 和系统内存传输内容。
由于缓冲区是针对每个设备的,因此您需要两个主机可见的暂存缓冲区,一个用于读取操作,另一个用于写入操作。您还需要两个队列、两个命令缓冲区等,等等……
您必须通过手动同步执行 3 个操作。
在源 GPU 上执行从设备本地缓冲区到同一设备的主机可见缓冲区的副本。
在 CPU 从源 GPU 主机可见缓冲区复制到目标 GPU 主机可见缓冲区
在目标 GPU 上从主机可见缓冲区复制到设备本地缓冲区
确保检查您的设备队列系列属性,如果可能,请使用标记为可传输但不支持图形或计算的队列系列中的队列。Vulkan 队列系列具有的标志越少,它就越适合它确实具有标志的操作。大多数现代独立 GPU都有专用的传输队列,但同样,队列是特定于设备的,因此您需要与每个设备的一个队列进行交互才能执行传输。
如果需要在主机上暂存,那么最佳方法是什么?
具体如何执行取决于您的用例。如果您想在单个线程中同步执行整个事情,那么您只需要做一堆提交,然后在栅栏上等待。如果您想在继续渲染帧的同时在后台异步执行此操作,那么您仍将进行提交,但您必须在移动到下一部分。
如果您正在传输缓冲区,则在最佳传输方面可能没有什么可担心的,但是如果您正在处理图像,那么您必须进入整个线性与最佳图像平铺混乱。为了避免这种情况,我建议使用主机可见缓冲区进行暂存,无论您是传输图像还是缓冲区,并且因此使用vkCmdCopyImageToBuffer
并vkCmdCopyBufferToImage
在设备本地内存和主机可见内存之间进行传输
归档时间: |
|
查看次数: |
971 次 |
最近记录: |