我可以同时从多个线程使用 VkDevice 吗?
Can I use VkDevice from multiple threads concurrently?
特别是,我可以从同一 VkDevice 同时创建管道、分配设备内存以及创建图像和缓冲区吗?
规范中的何处指定了此内容?
"host access to X must be externally synchronized" 形式的 Vulkan 规范中的语句意味着您不能在访问 X 的同时调用具有此要求的函数。如果函数的规范 没有 说明特定参数,那么可以从多个线程访问该参数。当然,只要所有可以并发访问它的函数都没有这个规范。
请注意,各种函数的有效使用部分可能有额外的并发要求。
在规范中我们可以看到:
Vulkan is intended to provide scalable performance when used on multiple host threads. All commands support being called concurrently from multiple threads, but certain parameters, or components of parameters are defined to be externally synchronized. This means that the caller must guarantee that no more than one thread is using such a parameter at a given time.
然后是不同Vulkan函数的参数列表,其中它们必须是外部同步的(意味着它们不能被多个线程同时访问)。如果是 VkDevice
个对象,我们可以发现只有 vkDestroyDevice()
个。因此,VkDevice
对象的所有其他用法都可以发生在多个线程上。
而且该列表中几乎没有 vkCreate...()
函数(只有 3 个与交换链相关的函数)。这意味着您可以同时从多个线程创建对象。
特别是,我可以从同一 VkDevice 同时创建管道、分配设备内存以及创建图像和缓冲区吗?
规范中的何处指定了此内容?
"host access to X must be externally synchronized" 形式的 Vulkan 规范中的语句意味着您不能在访问 X 的同时调用具有此要求的函数。如果函数的规范 没有 说明特定参数,那么可以从多个线程访问该参数。当然,只要所有可以并发访问它的函数都没有这个规范。
请注意,各种函数的有效使用部分可能有额外的并发要求。
在规范中我们可以看到:
Vulkan is intended to provide scalable performance when used on multiple host threads. All commands support being called concurrently from multiple threads, but certain parameters, or components of parameters are defined to be externally synchronized. This means that the caller must guarantee that no more than one thread is using such a parameter at a given time.
然后是不同Vulkan函数的参数列表,其中它们必须是外部同步的(意味着它们不能被多个线程同时访问)。如果是 VkDevice
个对象,我们可以发现只有 vkDestroyDevice()
个。因此,VkDevice
对象的所有其他用法都可以发生在多个线程上。
而且该列表中几乎没有 vkCreate...()
函数(只有 3 个与交换链相关的函数)。这意味着您可以同时从多个线程创建对象。