55
66typedef void (*gpuInfoVulkanWarningLogCallback_t)(const char * message);
77
8- static bool enumerateVulkanDevices (size_t * total, size_t * used, bool addDeviceNames, std::vector<std::string> * deviceNames, gpuInfoVulkanWarningLogCallback_t warningLogCallback) {
8+ static bool enumerateVulkanDevices (size_t * total, size_t * used, size_t * unifiedMemorySize, bool addDeviceNames, std::vector<std::string> * deviceNames, gpuInfoVulkanWarningLogCallback_t warningLogCallback) {
99 vk::ApplicationInfo appInfo (" node-llama-cpp GPU info" , 1 , " llama.cpp" , 1 , VK_API_VERSION_1_2);
1010 vk::InstanceCreateInfo createInfo (vk::InstanceCreateFlags (), &appInfo, {}, {});
1111 vk::Instance instance = vk::createInstance (createInfo);
@@ -14,6 +14,7 @@ static bool enumerateVulkanDevices(size_t* total, size_t* used, bool addDeviceNa
1414
1515 size_t usedMem = 0 ;
1616 size_t totalMem = 0 ;
17+ size_t totalUnifiedMemorySize = 0 ;
1718
1819 for (size_t i = 0 ; i < physicalDevices.size (); i++) {
1920 vk::PhysicalDevice physicalDevice = physicalDevices[i];
@@ -41,43 +42,49 @@ static bool enumerateVulkanDevices(size_t* total, size_t* used, bool addDeviceNa
4142 physicalDevice.getMemoryProperties2 (&memProps2);
4243
4344 for (uint32_t i = 0 ; i < memProps.memoryHeapCount ; ++i) {
44- if (memProps.memoryHeaps [i].flags & vk::MemoryHeapFlagBits::eDeviceLocal) {
45+ const auto flags = memProps.memoryHeaps [i].flags ;
46+
47+ if (flags & vk::MemoryHeapFlagBits::eDeviceLocal) {
4548 const auto size = memProps.memoryHeaps [i].size ;
4649 totalMem += size;
4750 usedMem += memoryBudgetProperties.heapUsage [i];
4851
52+ if (flags & vk::MemoryHeapFlagBits::eMultiInstance) {
53+ totalUnifiedMemorySize += size;
54+ }
55+
4956 if (size > 0 && addDeviceNames) {
5057 (*deviceNames).push_back (std::string (deviceProps.deviceName .data ()));
5158 }
52-
53- break ;
5459 }
5560 }
5661 } else {
5762 // VK_EXT_memory_budget extension is not supported, so we cannot determine used memory
5863 warningLogCallback (
5964 (
6065 " Vulkan VK_EXT_memory_budget extension not supported for device \" " +
61- std::string (deviceProps.deviceName .data ()) + " \" , so VRAM info cannot be determained for it"
62- )
63- .c_str ()
66+ std::string (deviceProps.deviceName .data ()) + " \" , so VRAM info cannot be determined for it"
67+ ).c_str ()
6468 );
6569 return false ;
6670 }
6771 }
6872
6973 *total = totalMem;
7074 *used = usedMem;
75+ *unifiedMemorySize = totalUnifiedMemorySize;
76+
7177 return true ;
7278}
7379
74- bool gpuInfoGetTotalVulkanDevicesInfo (size_t * total, size_t * used, gpuInfoVulkanWarningLogCallback_t warningLogCallback) {
75- return enumerateVulkanDevices (total, used, false , nullptr , warningLogCallback);
80+ bool gpuInfoGetTotalVulkanDevicesInfo (size_t * total, size_t * used, size_t * unifiedMemorySize, gpuInfoVulkanWarningLogCallback_t warningLogCallback) {
81+ return enumerateVulkanDevices (total, used, unifiedMemorySize, false , nullptr , warningLogCallback);
7682}
7783
7884bool gpuInfoGetVulkanDeviceNames (std::vector<std::string> * deviceNames, gpuInfoVulkanWarningLogCallback_t warningLogCallback) {
7985 size_t vulkanDeviceTotal = 0 ;
8086 size_t vulkanDeviceUsed = 0 ;
87+ size_t unifiedMemorySize = 0 ;
8188
82- return enumerateVulkanDevices (&vulkanDeviceTotal, &vulkanDeviceUsed, true , deviceNames, warningLogCallback);
89+ return enumerateVulkanDevices (&vulkanDeviceTotal, &vulkanDeviceUsed, &unifiedMemorySize, true , deviceNames, warningLogCallback);
8390}
0 commit comments