2017-07-07 76 views
0

我寫了下面的代碼來測試最大邏輯器件編號。Vulkan是否具有邏輯器件創建的最大數量限制?

#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()); 
} 

以下是我的測試結果: 視窗10的64位8G RAM GTX 750Ti:最大設備是42, Ubuntu的8G RAM GTX 750Ti:最大設備是63, 視窗10的64位16G RAM GTX 1080:最大設備是42, Ubuntu 64G RAM泰坦X:最大設備是31,

測試結果表明vulkan具有邏輯設備創建的最大數量限制,並且這些限制可能因操作系統而異。我沒有找到任何有關限制的文件,有什麼辦法可以達到這個限制?另一個問題,如果我想在服務器上運行大量的vulkan應用程序,我該如何克服這個限制?

+0

「*如果我想在服務器上運行大量的vulkan應用程序,我該如何克服這個限制?*」到底是什麼?除非服務器有多個GPU,否則我不確定這點是什麼。每臺設備都必須與其他設備共享計算資源。使用單個設備進行單個進程可能更高效,並將作業存入其中,從而可以決定爲每個設備分配多少資源。 –

+0

還應該注意的是,您的代碼也會測試* instance *計數,而不僅僅是邏輯設備的數量。 –

回答

4

的福爾康規範只是說這樣的:可以從同一物理設備創建

多個邏輯設備。由於缺少設備特定的資源(除了其他錯誤),邏輯設備創建可能會失敗。如果發生這種情況,vkCreateDevice將返回VK_ERROR_TOO_MANY_OBJECTS。

所以,你可以創建只限於設備的數量(顯然,因爲每一個都必須使用一些資源,所有資源都是有限的),但數量是實現相關的。

Vulkan符合性測試要求您能夠create at least five devices

所使用的某些資源可能是按進程而不是系統範圍的。你是否嘗試過產生一堆進程,每個進程都創建一個VkDevice?

但是做不到這一點:你唯一的選擇是使用具有更高限制的不同實現,或者讓硬件供應商爲每個設備(或其他)使用更少的資源來支持更高的限制。

相關問題