C++ vulkan是否具有逻辑设备创建的最大数量限制?

C++ vulkan是否具有逻辑设备创建的最大数量限制?,c++,nvidia,vulkan,C++,Nvidia,Vulkan,我编写了以下代码来测试最大逻辑设备数 #include "vulkan/vulkan.hpp" #include <cassert> #include <vector> #include <iostream> int main() { std::vector<vk::Instance> instances; std::vector<vk::Device> devices; try {

我编写了以下代码来测试最大逻辑设备数

#include "vulkan/vulkan.hpp"
#include <cassert>
#include <vector>
#include <iostream>

int main() {

    std::vector<vk::Instance> instances;
    std::vector<vk::Device>   devices;

    try {

        for( ; true; ) {

            vk::InstanceCreateInfo instanceInfo {};
            instances.push_back( vk::createInstance( instanceInfo ) );

            auto physicalDevices = instances.back().enumeratePhysicalDevices();
            if( 0 == physicalDevices.size() )
                return 0;

            vk::DeviceQueueCreateInfo deviceQueueCreateInfo {};
            deviceQueueCreateInfo.queueFamilyIndex = 0;
            deviceQueueCreateInfo.queueCount = 1;

            vk::DeviceCreateInfo deviceCreateInfo {};
            deviceCreateInfo.queueCreateInfoCount = 1;
            deviceCreateInfo.pQueueCreateInfos = &deviceQueueCreateInfo;
            auto device = physicalDevices.front().createDevice( deviceCreateInfo );
            if( !device ) {
                throw 0;
            }
            devices.push_back( device );
        }
    }
    catch( std::system_error e ) {
        std::cout << e.what() << std::endl
            << e.code() << std::endl;
    }
    catch( ... ) {
    }

    for( auto device : devices )
        device.destroy();
    for( auto instance : instances )
        instance.destroy();
    printf( "Maximum device is %d\n", devices.size() );
    return static_cast<int>( devices.size() );
}
#包括“vulkan/vulkan.hpp”
#包括
#包括
#包括
int main(){
std::向量实例;
std::矢量设备;
试一试{
因为(;真;){
vk::InstanceCreateInfo instanceInfo{};
push_back(vk::createInstance(instanceInfo));
auto physicalDevices=instances.back().enumeratePhysicalDevices();
如果(0==physicalDevices.size())
返回0;
vk::DeviceQueueCreateInfo DeviceQueueCreateInfo{};
deviceQueueCreateInfo.queueFamilyIndex=0;
deviceQueueCreateInfo.queueCount=1;
vk::DeviceCreateInfo DeviceCreateInfo{};
deviceCreateInfo.queueCreateInfoCount=1;
deviceCreateInfo.pqueCreateInfos=&deviceQueueCreateInfo;
自动设备=physicalDevices.front().createDevice(deviceCreateInfo);
如果(!设备){
掷0;
}
设备。推回(设备);
}
}
捕获(标准::系统错误e){

Vulkan规范仅说明了以下内容:

可以从同一物理设备创建多个逻辑设备。由于缺少设备特定资源(以及其他错误),逻辑设备创建可能会失败。如果出现这种情况,vkCreateDevice将返回VK_ERROR_TOO_MANY_对象

因此,您可以创建的设备数量是有限的(显然,因为每个设备都必须使用一些资源,而所有资源都是有限的),但数量取决于实现

Vulkan一致性测试要求您能够

有些资源可能是每个进程使用的,而不是整个系统使用的。您是否尝试过生成一组进程,每个进程创建一个VkDevice


但如果不能做到这一点:您唯一的选择是使用具有更高限制的不同实现,或者游说硬件供应商减少每个设备(或任何设备)的资源使用量,以支持更高的限制。

Vulkan规范仅说明:

可以从同一物理设备创建多个逻辑设备。由于缺少设备特定资源(以及其他错误),逻辑设备创建可能会失败。如果出现这种情况,vkCreateDevice将返回VK_ERROR_TOO_MANY_对象

因此,您可以创建的设备数量是有限的(显然,因为每个设备都必须使用一些资源,而所有资源都是有限的),但数量取决于实现

Vulkan一致性测试要求您能够

有些资源可能是每个进程使用的,而不是整个系统使用的。您是否尝试过生成一组进程,每个进程创建一个VkDevice


但失败的是:您唯一的选择是使用具有更高限制的不同实现,或游说硬件供应商减少每个设备(或任何设备)的资源以支持更高的限制。

“如果我想在服务器上运行大量vulkan应用程序,我如何克服此限制?”到底是为了什么目的?除非服务器有多个GPU,否则我不确定这有什么意义。每个设备都必须与其他每个设备共享计算资源。用一个设备共享一个进程可能会更有效,并将作业分配给它,让它决定给每个设备多少资源。我还应注意的是,您的代码还测试实例计数,而不仅仅是逻辑设备的数量。“如果我想在服务器上运行大量vulkan应用程序,我如何克服这一限制?”到底是为了什么目的?除非服务器有多个GPU,否则我不确定这有什么意义。每个设备都必须与其他每个设备共享计算资源。用一个设备共享一个进程可能会更有效,并将作业分配给它,让它决定给每个设备多少资源。我还应注意,您的代码还测试实例计数,而不仅仅是逻辑设备的数量。